@oracle-agent/oracle 0.35.49 → 0.35.50

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 (81) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +19 -19
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  15. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  16. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  17. package/dist/bin/oracle-public-server.mjs +5 -5
  18. package/dist/bin/oracle-route.mjs +27 -27
  19. package/dist/bin/oracle-scan.mjs +3 -3
  20. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  21. package/dist/chains.mjs +1 -1
  22. package/dist/cli/commands/account.mjs +22 -22
  23. package/dist/cli/commands/agent-session.mjs +23 -23
  24. package/dist/cli/commands/auth.mjs +16 -15
  25. package/dist/cli/commands/chain.mjs +5 -5
  26. package/dist/cli/commands/chat.mjs +310 -228
  27. package/dist/cli/commands/data.mjs +37 -37
  28. package/dist/cli/commands/doctor.mjs +5 -5
  29. package/dist/cli/commands/eval.mjs +249 -167
  30. package/dist/cli/commands/farm.mjs +1 -1
  31. package/dist/cli/commands/follow.mjs +4 -4
  32. package/dist/cli/commands/harness.mjs +6 -6
  33. package/dist/cli/commands/mint.mjs +11 -11
  34. package/dist/cli/commands/model.mjs +313 -231
  35. package/dist/cli/commands/project.mjs +8 -7
  36. package/dist/cli/commands/quickstart.mjs +2 -2
  37. package/dist/cli/commands/receipt.mjs +2 -2
  38. package/dist/cli/commands/resolve.mjs +4 -4
  39. package/dist/cli/commands/session-vault.mjs +4 -4
  40. package/dist/cli/commands/setup.mjs +53 -52
  41. package/dist/cli/commands/snipe.mjs +13 -13
  42. package/dist/cli/commands/strategy.mjs +5 -5
  43. package/dist/cli/commands/swap.mjs +11 -11
  44. package/dist/cli/commands/telegram.mjs +7 -7
  45. package/dist/cli/commands/venues.mjs +1 -1
  46. package/dist/cli/project-access.mjs +4 -3
  47. package/dist/data/desk-data.mjs +31 -31
  48. package/dist/data/holder-table.mjs +2 -2
  49. package/dist/data/market-tape.mjs +1 -1
  50. package/dist/data/names.mjs +3 -3
  51. package/dist/data/providers/farming.mjs +2 -2
  52. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  53. package/dist/index.mjs +49 -49
  54. package/dist/launch-radar/index.mjs +5 -5
  55. package/dist/lp/index.mjs +4 -4
  56. package/dist/nft/universal-mint-router.mjs +4 -4
  57. package/dist/notifications/index.mjs +1 -1
  58. package/dist/router/index.mjs +3 -3
  59. package/dist/router/prepare-bridge.mjs +2 -2
  60. package/dist/router/prepare-route.mjs +3 -3
  61. package/dist/scanner/index.mjs +3 -3
  62. package/dist/strategy/index.mjs +4 -4
  63. package/dist/task.mjs +1 -1
  64. package/dist/teams/index.mjs +6 -6
  65. package/dist/telegram/chart-card.mjs +5 -5
  66. package/dist/telegram/market-commands.mjs +1 -1
  67. package/dist/tui/standalone-client.mjs +179 -97
  68. package/package.json +2 -2
  69. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  70. package/public/oracle-splash/docs/connectors/index.html +2 -2
  71. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  72. package/public/oracle-splash/docs/index.html +3 -3
  73. package/public/oracle-splash/docs/reference/index.html +2 -2
  74. package/public/oracle-splash/docs/security/index.html +2 -2
  75. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  76. package/public/oracle-splash/download/index.html +3 -3
  77. package/public/oracle-splash/downloads/index.html +1 -1
  78. package/public/oracle-splash/eval/index.html +19 -19
  79. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  80. package/public/oracle-splash/index.html +9 -9
  81. package/server.json +2 -2
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  var Kr=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 Et=(e,t)=>{for(var r in t)Kr(e,r,{get:t[r],enumerable:!0})};import{AsyncLocalStorage as Jr}from"node:async_hooks";function Ee(e){let t=Yr.getStore();if(!t||t.closed||!Zr.includes(e))return null;if(t.spans.length>=Qr)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var Yr,Zr,Qr,At=v(()=>{Yr=new Jr,Zr=["http","retry","shared"],Qr=512});import ee from"node:net";import en from"node:dns";function Ae(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=a=>{if(!a)return[];let d=a.split(":"),u=d.at(-1);if(u?.includes(".")){let f=u.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;d.splice(d.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return d.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:d.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),s=r(n),i=r(o);if(!s||!i)return null;let c=t.includes("::"),l=8-s.length-i.length;if(!c&&l!==0||c&&l<1)return null;let p=[...s,...Array(Math.max(0,l)).fill(0),...i];return p.length!==8?null:Uint8Array.from(p.flatMap(a=>[a>>8,a&255]))}function We(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 ze(e){if(ee.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(ee.isIPv6(e)){let t=Ae(e);if(!t)return!1;let r=Ae("::ffff:0:0");return We(t,r,96)?ze([...t.slice(12)].join(".")):We(t,Ae("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>We(t,Ae(o),s)):!1}return!1}function rn(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(tn.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ee.isIP(r);return n!==0&&!ze(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Ge(e,{lookupFn:t=en.promises.lookup}={}){let r=rn(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:ee.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};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=>!ze(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function nn(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function Ve({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(f){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${f?.message||f}`);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 s=f=>String(f).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,c=f=>(Array.isArray(f)?f:[f]).map(m=>typeof m=="string"?{address:m}:m).filter(m=>m&&m.address).map(m=>({address:m.address,family:m.family||(ee.isIPv6(m.address)?6:4)})),l=(f,m,w)=>{i.set(s(f),c(typeof m=="string"?[{address:m,family:w}]:m))},p=f=>{let m=s(f);if(ee.isIP(m))return[{address:m,family:ee.isIPv6(m)?6:4}];let w=i.get(m);if(!w||!w.length)throw new Error(`refused: unpinned host ${f} during pinned fetch`);return w},a=nn(),d=a&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:a.uri,token:`Bearer ${a.token}`,connectTimeout:1e4}):new r({connect:{lookup(f,m,w){let g;try{g=p(f)}catch(b){return w(b)}return m?.all?w(null,g):w(null,g[0].address,g[0].family)}}}),u=on((f,m={})=>n(f,{...m,dispatcher:d}),l);return{dispatcher:d,fetch:u,pin:l,resolve:p,async close(){try{await d.destroy()}catch{}}}}function on(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[Xe]=Object.freeze({pin:t}),e}function Ke(e){return typeof e=="function"&&typeof e[Xe]?.pin=="function"}function xt(e,t,r){if(!Ke(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Xe].pin(t,r)}var tn,Xe,St=v(()=>{tn=new Set(["localhost","metadata.google.internal","metadata.goog"]);Xe=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as sn}from"node:crypto";import{types as z}from"node:util";function B(e){return K(`HTTP JSON body refused: ${e}`)}function hn(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof z[t]=="function"&&z[t](e))}function wn(e){let t=[],r=0,n=0,o=0,s=0,i=new WeakSet,c=a=>{if(r+=Buffer.byteLength(a,"utf8"),r>W.bytes)throw B("serialized byte limit exceeded");t.push(a)},l=a=>{if(Buffer.byteLength(a,"utf8")>W.bytes)throw B("serialized byte limit exceeded");return JSON.stringify(a)},p=(a,d)=>{if(n+=1,n>W.nodes)throw B("node limit exceeded");if(d>W.depth)throw B("depth limit exceeded");if(a===null){c("null");return}if(typeof a=="string"){c(l(a));return}if(typeof a=="boolean"){c(a?"true":"false");return}if(typeof a=="number"){if(!Number.isFinite(a))throw B("non-finite number");c(Object.is(a,-0)?"0":String(a));return}if(typeof a!="object")throw B("unsupported non-JSON value");if(z.isProxy(a))throw B("proxy value");if(hn(a))throw B("unsupported exotic object");if(i.has(a))throw B("cyclic value");i.add(a);try{if(Object.getOwnPropertySymbols(a).length>0)throw B("symbol-keyed fields are unsupported");if(Array.isArray(a)){let m=Object.getPrototypeOf(a),w=0;for(;m!==null;){if(z.isProxy(m))throw B("proxy array prototype");if(w+=1,w>W.depth)throw B("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(a.length>W.arrayLength)throw B("array length limit exceeded");for(let b=0;b<a.length;b+=1){let E=Object.getOwnPropertyDescriptor(a,String(b));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw B("array entries must be dense enumerable own data")}let g=0;for(let b in a){if(s+=1,s>W.fields)throw B("enumeration limit exceeded");if(Object.hasOwn(a,b)&&(g+=1,g>a.length))throw B("named array fields are unsupported")}if(g!==a.length)throw B("array entries must be dense enumerable own data");c("[");for(let b=0;b<a.length;b+=1)b&&c(","),p(Object.getOwnPropertyDescriptor(a,String(b)).value,d+1);c("]");return}let u=Object.getPrototypeOf(a);if(u!==Object.prototype&&u!==null)throw B("non-plain object");let f=[];for(let m in a){if(s+=1,s>W.fields)throw B("enumeration limit exceeded");if(!Object.hasOwn(a,m))continue;if(o+=1,o>W.fields)throw B("field limit exceeded");let w=Object.getOwnPropertyDescriptor(a,m);if(!w||!Object.hasOwn(w,"value")||w.enumerable!==!0)throw B("object fields must be enumerable own data");f.push([m,w.value])}c("{");for(let m=0;m<f.length;m+=1)m&&c(","),c(l(f[m][0])),c(":"),p(f[m][1],d+1);c("}")}finally{i.delete(a)}};return p(e,0),t.join("")}function bn(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(z.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let o=n.toLowerCase();if(r.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(o);let s=Object.getOwnPropertyDescriptor(e,n);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=s.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");t[n]=String(i)}return t}function gn(){return Object.assign(Object.create(null),{Accept:"application/json"})}function yn(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 En(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function xe(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Ct.get(e);return t||(t=kt,kt+=1,Ct.set(e,t)),`reference:${t}`}function Nt(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?An.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Pt(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Nt);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Nt(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&xn.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Sn(e,t,r,n={},o=null){let s=sn("sha256"),i=(l,p)=>{let a=String(p);s.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),s.update("=").update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a).update(`
3
- `)};i("method",e),i("url",t),Object.keys(r||{}).map((l,p)=>({name:l.toLowerCase(),order:p,value:String(r[l])})).sort((l,p)=>l.name.localeCompare(p.name)||l.order-p.order).forEach((l,p)=>{i(`header-name-${p}`,l.name),i(`header-value-${p}`,l.value)}),i("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${l}`,n[l]??"-");return s.digest("hex")}function In(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ot):Math.min(250*2**e,Ot)+Math.floor(Math.random()*100)}function K(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ye(e,t,r){return K(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function te(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function _n(e){return e?e.byteLength??e.length??0:0}async function Tn(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&&(te(e),!n))throw Ye(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let d=await e.text(),u=Buffer.byteLength(d,"utf8");if(u>t){if(!n)throw Ye(r,`body ${u} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let c=[],l=0,p=!1;try{for(;;){let{value:d,done:u}=await i.read();if(u)break;if(d&&(c.push(Buffer.from(d)),l+=_n(d),l>t)){p=!0;break}}}finally{if(p)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(p&&(typeof o=="function"&&o(),!n))throw Ye(r,`streamed ${l} bytes`,t);let a=Buffer.concat(c);return(p?a.subarray(0,t):a).toString("utf8")}function Cn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function kn(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:c,untrustedUrl:l=!1,maxResponseBytes:p=null,sameOriginRedirectsOnly:a=!1,importUndici:d,validateResponse:u,signal:f,redirectPolicy:m="follow",maxRedirects:w=Se}){let g=null,b=t,E=i?{lookupFn:i}:{};if(l&&!c&&!Ke(b))throw K(`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 y=new AbortController,A=setTimeout(()=>y.abort(),s),_=f?Tt?Tt([f,y.signal]):f:y.signal,C=async(h,{status:O=null}={})=>{let x=await Ge(h,E);if(!x.ok)throw K(O==null?`HTTP refused ${h}: ${x.error}`:`HTTP redirect to ${h} ${x.error}`,O==null?{}:{status:O});let I=new URL(h).hostname;if(c){if(g&&(await g.close(),g=null),!g)try{g=await Ve({requireUndici:!0,...d?{importUndici:d}:{}})}catch(S){throw K(O==null?`HTTP refused ${h}: ${S?.message||S}`:`HTTP redirect to ${h} refused: ${S?.message||S}`,O==null?{}:{status:O})}g.pin(I,x.addresses),b=g.fetch}else xt(b,I,x.addresses);return x};try{let h=String(e),O=Object.assign(Object.create(null),n||{});l&&await C(h);for(let x=0;x<=w;x+=1){let I=Object.assign(Object.create(null),{method:r,headers:O,body:o,signal:_,redirect:"manual",dispatcher:void 0}),S=await b(h,I);if((m==="error"||w===0)&&S.status>=300&&S.status<400)throw te(S),K(`HTTP ${S.status} ${r} redirect refused`,{status:S.status,redirectRefused:!0});if(mn.has(S.status)){let $=a===!0&&r==="POST"&&[307,308].includes(S.status)&&Pt(r,o);if(r!=="GET"&&r!=="HEAD"&&!$){te(S);let R=new Error(`HTTP ${S.status} ${r} ${h} redirected non-idempotent request`);throw R.status=S.status,R}if(x===w)throw te(S),K(`HTTP ${S.status} ${r} redirect budget exhausted`,{status:S.status,redirectRefused:!0});let ge=S.headers?.get?.("location"),L;try{L=yn(ge,h)}catch(R){throw te(S),R}let U=!En(L,h);if(te(S),U&&r==="POST"){let R=new Error(`HTTP ${S.status} ${r} cross-origin redirect refused`);throw R.status=S.status,R}if(U&&a){let R=new Error(`HTTP ${S.status} ${r} cross-origin redirect refused`);throw R.status=S.status,R.retryable=!1,R}if(U&&(O=gn(O)),l)await C(L,{status:S.status});else if(U){let R=await Ge(L,E);if(!R.ok){let k=new Error(`HTTP redirect from ${h} ${R.error}`);throw k.status=S.status,k.retryable=!1,k}c&&R.addresses?.length&&(g||(g=await Ve(d?{importUndici:d}:{})),g&&(g.pin(new URL(L).hostname,R.addresses),b=g.fetch))}h=L;continue}if(typeof u=="function")try{await u(S,{url:h})}catch($){throw te(S),K($?.message||String($))}let P=await Tn(S,p,{url:h,onOversize:()=>y.abort()}),T=Cn(P);if(!S.ok){let $=new Error(`HTTP ${S.status} ${r} ${h}`);throw $.status=S.status,$.retryAfter=S.headers?.get?.("retry-after")??null,$.body=T??P.slice(0,300),$}return T??P}throw new Error(`HTTP redirect loop for ${e}`)}catch(h){if(y.signal.aborted&&!le(f)){let O=h&&(typeof h=="object"||typeof h=="function")&&!z.isProxy(h)?h:null,x=O?Object.getOwnPropertyDescriptor(O,"oversize"):null;if(!(x&&Object.hasOwn(x,"value")&&x.value===!0))try{if(!O)throw new TypeError("unsafe rejection");Object.defineProperties(O,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let S=new Error("HTTP request timed out");throw Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),S}}throw h}finally{clearTimeout(A),g&&await g.close()}}async function Ie(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&z.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let k of Object.getOwnPropertyNames(t)){let N=Object.getOwnPropertyDescriptor(t,k);if(!(k==="toJSON"&&N&&Object.hasOwn(N,"value")&&N.value===void 0)){if(!r.has(k))throw new TypeError("HTTP options contain unknown fields");if(!N||!N.enumerable||!Object.hasOwn(N,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=k=>{if(t==null||!Object.hasOwn(t,k))return;let N=Object.getOwnPropertyDescriptor(t,k);if(!N||!Object.hasOwn(N,"value"))throw new TypeError("HTTP options must contain own data properties");return N.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let s=n("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=n("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let c=n("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>Se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Se}`);if(c==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let p=c??"follow",a=p==="error"?0:l??Se;for(let k of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let N=n(k);if(N!==void 0&&typeof N!="boolean")throw new TypeError(`HTTP ${k} must be boolean`)}let d=n("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=n("signal");if(u!==void 0){if(z.isProxy(u)||!(u instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{le(u)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let k of["importUndici","lookupFn","validateResponse"]){let N=n(k);if(N!==void 0&&typeof N!="function")throw new TypeError(`HTTP ${k} must be a function`)}let f=n("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let w=s??12e3,g=(o||"GET").toUpperCase(),b=n("headers"),E=bn(b),y=Object.assign(Object.create(null),E);Object.keys(y).some(k=>k.toLowerCase()==="accept")||(y.Accept="application/json");let A=n("body");A!=null&&typeof A!="string"&&(Object.keys(y).find(N=>N.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),A=wn(A));let _=i??cn,C=n("lookupFn"),h=!f,O=n("untrustedUrl")===!0,x=n("sameOriginRedirectsOnly")===!0,I=n("importUndici"),S=n("validateResponse"),P=u,T=d??null,$=async()=>{let k;for(let N=0;N<=_;N++){P&&dn.call(P);let wt=Ee("http");try{let q=await kn(e,{fetchImpl:m,method:g,headers:y,body:A,timeoutMs:w,lookupFn:C,realFetch:h,untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:x,importUndici:I,validateResponse:S,signal:P,redirectPolicy:p,maxRedirects:a});return wt?.("succeeded"),q}catch(q){k=q;let ie=qe=>{if(!q||typeof q!="object"&&typeof q!="function"||z.isProxy(q))return;let ce=Object.getOwnPropertyDescriptor(q,qe);return ce&&Object.hasOwn(ce,"value")?ce.value:void 0},ye=ie("status");wt?.("failed",ye);let zr=ie("oracleTimeout")===!0||ie("name")==="AbortError"||ie("name")==="TimeoutError"||le(P),Gr=new Set([408,425,429]),Vr=ie("retryable")===!1?!1:ye!=null?Gr.has(ye)||an.has(ye)&&It.has(g):!zr&&It.has(g);if(N===_||!Vr)throw q;let bt=In(N,ie("retryAfter")),Xr=Ee("retry"),gt=!1;try{P?await new Promise((qe,ce)=>{let yt,ue=()=>{clearTimeout(yt),_t.call(P,"abort",ue),ce(pn(P)||new DOMException("Aborted","AbortError"))};if(le(P)){ue();return}yt=setTimeout(()=>{_t.call(P,"abort",ue),qe()},bt),fn.call(P,"abort",ue,{once:!0}),le(P)&&ue()}):await On(bt),gt=!0}finally{Xr?.(gt?"succeeded":"failed")}}}throw k};if(!(n("dedupe")!==!1&&!P&&Pt(g,A)))return $();let L=Sn(g,e,y,{untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:x,redirectPolicy:p,maxRedirects:a,timeoutMs:w,retries:_,fetchImpl:xe(m),realFetch:h,lookupFn:xe(C),importUndici:xe(I),validateResponse:xe(S)},A),U=Je.get(L);if(U){let k=Ee("shared");try{let N=await U;return k?.("succeeded"),N}catch(N){throw k?.("failed"),N}}let R=$().finally(()=>Je.delete(L));return Je.set(L,R),R}var an,It,cn,Ot,un,ln,dn,fn,_t,Tt,le,pn,mn,Se,Ts,W,Je,Ct,kt,An,xn,On,Ze=v(()=>{At();St();an=new Set([408,425,429,500,502,503,504]),It=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),cn=2,Ot=4e3,un=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ln=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,dn=AbortSignal.prototype.throwIfAborted,fn=EventTarget.prototype.addEventListener,_t=EventTarget.prototype.removeEventListener,Tt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,le=e=>e?un.call(e):!1,pn=e=>e?ln.call(e):void 0,mn=new Set([301,302,303,307,308]),Se=3,Ts=64*1024,W=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Je=new Map,Ct=new WeakMap,kt=1;An=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),xn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);On=e=>new Promise(t=>setTimeout(t,e))});var Oe,Rt=v(()=>{Oe={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}}});function Qe(e){return Bt.get(Number(e))||null}function $t(e,t=process.env){let r=Qe(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function Lt(e){return Bt.has(Number(e))}var Bt,Dt=v(()=>{Rt();Bt=new Map(Object.values(Oe).map(e=>[e.chainId,e]))});var Wt={};Et(Wt,{PUBLIC_RPC_FALLBACKS:()=>tt,erc20Allowance:()=>Fn,erc20BalanceOf:()=>jn,resolveRpcUrl:()=>Te,rpcBatch:()=>Ht,rpcBlockNumber:()=>rt,rpcCall:()=>D,rpcChainId:()=>Dn,rpcGasPrice:()=>vn,rpcGetBalance:()=>Mn,rpcHealth:()=>qt,rpcHealthAll:()=>Hn,transactionReceipt:()=>Un});import{Interface as Nn,getAddress as Pn}from"ethers";function J(e,t){try{return Pn(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Rn(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function et(e){return e==null?null:Number.parseInt(String(e),16)}function Te(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=$t(e,r);return n||tt[Number(e)]||null}function Ft(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Bn.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function $n(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function jt(e){if(e?.error)throw $n(e.error);return e?.result}function Ln(e,t,r){return`${e}
3
+ `)};i("method",e),i("url",t),Object.keys(r||{}).map((l,p)=>({name:l.toLowerCase(),order:p,value:String(r[l])})).sort((l,p)=>l.name.localeCompare(p.name)||l.order-p.order).forEach((l,p)=>{i(`header-name-${p}`,l.name),i(`header-value-${p}`,l.value)}),i("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${l}`,n[l]??"-");return s.digest("hex")}function In(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ot):Math.min(250*2**e,Ot)+Math.floor(Math.random()*100)}function K(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Ye(e,t,r){return K(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function te(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function _n(e){return e?e.byteLength??e.length??0:0}async function Tn(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&&(te(e),!n))throw Ye(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let d=await e.text(),u=Buffer.byteLength(d,"utf8");if(u>t){if(!n)throw Ye(r,`body ${u} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let c=[],l=0,p=!1;try{for(;;){let{value:d,done:u}=await i.read();if(u)break;if(d&&(c.push(Buffer.from(d)),l+=_n(d),l>t)){p=!0;break}}}finally{if(p)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(p&&(typeof o=="function"&&o(),!n))throw Ye(r,`streamed ${l} bytes`,t);let a=Buffer.concat(c);return(p?a.subarray(0,t):a).toString("utf8")}function Cn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function kn(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:c,untrustedUrl:l=!1,maxResponseBytes:p=null,sameOriginRedirectsOnly:a=!1,importUndici:d,validateResponse:u,signal:f,redirectPolicy:m="follow",maxRedirects:w=Se}){let g=null,b=t,E=i?{lookupFn:i}:{};if(l&&!c&&!Ke(b))throw K(`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 y=new AbortController,A=setTimeout(()=>y.abort(),s),_=f?Tt?Tt([f,y.signal]):f:y.signal,C=async(h,{status:O=null}={})=>{let x=await Ge(h,E);if(!x.ok)throw K(O==null?`HTTP refused ${h}: ${x.error}`:`HTTP redirect to ${h} ${x.error}`,O==null?{}:{status:O});let I=new URL(h).hostname;if(c){if(g&&(await g.close(),g=null),!g)try{g=await Ve({requireUndici:!0,...d?{importUndici:d}:{}})}catch(S){throw K(O==null?`HTTP refused ${h}: ${S?.message||S}`:`HTTP redirect to ${h} refused: ${S?.message||S}`,O==null?{}:{status:O})}g.pin(I,x.addresses),b=g.fetch}else xt(b,I,x.addresses);return x};try{let h=String(e),O=Object.assign(Object.create(null),n||{});l&&await C(h);for(let x=0;x<=w;x+=1){let I=Object.assign(Object.create(null),{method:r,headers:O,body:o,signal:_,redirect:"manual",dispatcher:void 0}),S=await b(h,I);if((m==="error"||w===0)&&S.status>=300&&S.status<400)throw te(S),K(`HTTP ${S.status} ${r} redirect refused`,{status:S.status,redirectRefused:!0});if(mn.has(S.status)){let $=a===!0&&r==="POST"&&[307,308].includes(S.status)&&Pt(r,o);if(r!=="GET"&&r!=="HEAD"&&!$){te(S);let R=new Error(`HTTP ${S.status} ${r} ${h} redirected non-idempotent request`);throw R.status=S.status,R}if(x===w)throw te(S),K(`HTTP ${S.status} ${r} redirect budget exhausted`,{status:S.status,redirectRefused:!0});let ge=S.headers?.get?.("location"),L;try{L=yn(ge,h)}catch(R){throw te(S),R}let j=!En(L,h);if(te(S),j&&r==="POST"){let R=new Error(`HTTP ${S.status} ${r} cross-origin redirect refused`);throw R.status=S.status,R}if(j&&a){let R=new Error(`HTTP ${S.status} ${r} cross-origin redirect refused`);throw R.status=S.status,R.retryable=!1,R}if(j&&(O=gn(O)),l)await C(L,{status:S.status});else if(j){let R=await Ge(L,E);if(!R.ok){let k=new Error(`HTTP redirect from ${h} ${R.error}`);throw k.status=S.status,k.retryable=!1,k}c&&R.addresses?.length&&(g||(g=await Ve(d?{importUndici:d}:{})),g&&(g.pin(new URL(L).hostname,R.addresses),b=g.fetch))}h=L;continue}if(typeof u=="function")try{await u(S,{url:h})}catch($){throw te(S),K($?.message||String($))}let P=await Tn(S,p,{url:h,onOversize:()=>y.abort()}),T=Cn(P);if(!S.ok){let $=new Error(`HTTP ${S.status} ${r} ${h}`);throw $.status=S.status,$.retryAfter=S.headers?.get?.("retry-after")??null,$.body=T??P.slice(0,300),$}return T??P}throw new Error(`HTTP redirect loop for ${e}`)}catch(h){if(y.signal.aborted&&!le(f)){let O=h&&(typeof h=="object"||typeof h=="function")&&!z.isProxy(h)?h:null,x=O?Object.getOwnPropertyDescriptor(O,"oversize"):null;if(!(x&&Object.hasOwn(x,"value")&&x.value===!0))try{if(!O)throw new TypeError("unsafe rejection");Object.defineProperties(O,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let S=new Error("HTTP request timed out");throw Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),S}}throw h}finally{clearTimeout(A),g&&await g.close()}}async function Ie(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&z.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let k of Object.getOwnPropertyNames(t)){let N=Object.getOwnPropertyDescriptor(t,k);if(!(k==="toJSON"&&N&&Object.hasOwn(N,"value")&&N.value===void 0)){if(!r.has(k))throw new TypeError("HTTP options contain unknown fields");if(!N||!N.enumerable||!Object.hasOwn(N,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=k=>{if(t==null||!Object.hasOwn(t,k))return;let N=Object.getOwnPropertyDescriptor(t,k);if(!N||!Object.hasOwn(N,"value"))throw new TypeError("HTTP options must contain own data properties");return N.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let s=n("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=n("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let c=n("redirectPolicy");if(c!==void 0&&c!=="follow"&&c!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>Se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Se}`);if(c==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let p=c??"follow",a=p==="error"?0:l??Se;for(let k of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let N=n(k);if(N!==void 0&&typeof N!="boolean")throw new TypeError(`HTTP ${k} must be boolean`)}let d=n("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=n("signal");if(u!==void 0){if(z.isProxy(u)||!(u instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{le(u)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let k of["importUndici","lookupFn","validateResponse"]){let N=n(k);if(N!==void 0&&typeof N!="function")throw new TypeError(`HTTP ${k} must be a function`)}let f=n("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let w=s??12e3,g=(o||"GET").toUpperCase(),b=n("headers"),E=bn(b),y=Object.assign(Object.create(null),E);Object.keys(y).some(k=>k.toLowerCase()==="accept")||(y.Accept="application/json");let A=n("body");A!=null&&typeof A!="string"&&(Object.keys(y).find(N=>N.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),A=wn(A));let _=i??cn,C=n("lookupFn"),h=!f,O=n("untrustedUrl")===!0,x=n("sameOriginRedirectsOnly")===!0,I=n("importUndici"),S=n("validateResponse"),P=u,T=d??null,$=async()=>{let k;for(let N=0;N<=_;N++){P&&dn.call(P);let wt=Ee("http");try{let q=await kn(e,{fetchImpl:m,method:g,headers:y,body:A,timeoutMs:w,lookupFn:C,realFetch:h,untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:x,importUndici:I,validateResponse:S,signal:P,redirectPolicy:p,maxRedirects:a});return wt?.("succeeded"),q}catch(q){k=q;let ie=qe=>{if(!q||typeof q!="object"&&typeof q!="function"||z.isProxy(q))return;let ce=Object.getOwnPropertyDescriptor(q,qe);return ce&&Object.hasOwn(ce,"value")?ce.value:void 0},ye=ie("status");wt?.("failed",ye);let zr=ie("oracleTimeout")===!0||ie("name")==="AbortError"||ie("name")==="TimeoutError"||le(P),Gr=new Set([408,425,429]),Vr=ie("retryable")===!1?!1:ye!=null?Gr.has(ye)||an.has(ye)&&It.has(g):!zr&&It.has(g);if(N===_||!Vr)throw q;let bt=In(N,ie("retryAfter")),Xr=Ee("retry"),gt=!1;try{P?await new Promise((qe,ce)=>{let yt,ue=()=>{clearTimeout(yt),_t.call(P,"abort",ue),ce(pn(P)||new DOMException("Aborted","AbortError"))};if(le(P)){ue();return}yt=setTimeout(()=>{_t.call(P,"abort",ue),qe()},bt),fn.call(P,"abort",ue,{once:!0}),le(P)&&ue()}):await On(bt),gt=!0}finally{Xr?.(gt?"succeeded":"failed")}}}throw k};if(!(n("dedupe")!==!1&&!P&&Pt(g,A)))return $();let L=Sn(g,e,y,{untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:x,redirectPolicy:p,maxRedirects:a,timeoutMs:w,retries:_,fetchImpl:xe(m),realFetch:h,lookupFn:xe(C),importUndici:xe(I),validateResponse:xe(S)},A),j=Je.get(L);if(j){let k=Ee("shared");try{let N=await j;return k?.("succeeded"),N}catch(N){throw k?.("failed"),N}}let R=$().finally(()=>Je.delete(L));return Je.set(L,R),R}var an,It,cn,Ot,un,ln,dn,fn,_t,Tt,le,pn,mn,Se,Ts,W,Je,Ct,kt,An,xn,On,Ze=v(()=>{At();St();an=new Set([408,425,429,500,502,503,504]),It=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),cn=2,Ot=4e3,un=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ln=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,dn=AbortSignal.prototype.throwIfAborted,fn=EventTarget.prototype.addEventListener,_t=EventTarget.prototype.removeEventListener,Tt=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,le=e=>e?un.call(e):!1,pn=e=>e?ln.call(e):void 0,mn=new Set([301,302,303,307,308]),Se=3,Ts=64*1024,W=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Je=new Map,Ct=new WeakMap,kt=1;An=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),xn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);On=e=>new Promise(t=>setTimeout(t,e))});var Oe,Rt=v(()=>{Oe={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},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});function Qe(e){return Bt.get(Number(e))||null}function $t(e,t=process.env){let r=Qe(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function Lt(e){return Bt.has(Number(e))}var Bt,Dt=v(()=>{Rt();Bt=new Map(Object.values(Oe).map(e=>[e.chainId,e]))});var Wt={};Et(Wt,{PUBLIC_RPC_FALLBACKS:()=>tt,erc20Allowance:()=>Fn,erc20BalanceOf:()=>Un,resolveRpcUrl:()=>Te,rpcBatch:()=>Ht,rpcBlockNumber:()=>rt,rpcCall:()=>D,rpcChainId:()=>Dn,rpcGasPrice:()=>vn,rpcGetBalance:()=>Mn,rpcHealth:()=>qt,rpcHealthAll:()=>Hn,transactionReceipt:()=>jn});import{Interface as Nn,getAddress as Pn}from"ethers";function J(e,t){try{return Pn(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function Rn(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function et(e){return e==null?null:Number.parseInt(String(e),16)}function Te(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=$t(e,r);return n||tt[Number(e)]||null}function Ft(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!Bn.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function $n(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Ut(e){if(e?.error)throw $n(e.error);return e?.result}function Ln(e,t,r){return`${e}
4
4
  ${t}
5
- ${JSON.stringify(r??[])}`}async function Ut(e,t,r){return Ie(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Ht(e,t,r={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>vt)throw new Error(`rpcBatch: at most ${vt} calls`);for(let s of t)Ft(s?.method);let n=Te(e,r);if(!n)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((s,i)=>({jsonrpc:"2.0",id:i+1,method:s.method,params:s.params||[]}));try{let s=await Ut(n,o,r);if(Array.isArray(s)&&s.length===t.length){let i=new Map(s.map(c=>[Number(c?.id),c]));return t.map((c,l)=>jt(i.get(l+1)??s[l]))}}catch{}return Promise.all(t.map(s=>D(e,s.method,s.params||[],r)))}async function D(e,t,r=[],n={}){let o=String(t||""),s=Ft(o),i=Te(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(s==="eth_chainid"&&n.cacheChainId!==!1){let a=Mt.get(i);if(a!=null)return a}let l=n.dedupe!==!1&&!n.signal?Ln(i,o,r):null;if(l&&de.has(l))return de.get(l);let p=(async()=>{let a=await Ut(i,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=jt(a);return s==="eth_chainid"&&typeof d=="string"&&Mt.set(i,d),d})();return l&&(de.set(l,p),p.finally(()=>{de.get(l)===p&&de.delete(l)}).catch(()=>{})),p}async function qt(e,t={}){let[r,n]=await Ht(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(r,16),s=parseInt(n,16);return{ok:Number.isFinite(o)&&s===Number(e),chainId:Number(e),reportedChainId:s,blockNumber:o,name:Qe(e)?.name||null}}async function rt(e,t={}){let r=await D(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function Dn(e,t={}){let r=await D(e,"eth_chainId",[],t);return parseInt(r,16)}async function vn(e,t={}){let r=await D(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Mn(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await D(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function Fn(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=J(e.token||e.tokenAddress,"token"),o=J(e.owner,"owner"),s=J(e.spender,"spender"),i=_e.encodeFunctionData("allowance",[o,s]),c=await D(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),l=_e.decodeFunctionResult("allowance",c),p=BigInt(l[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:p.toString(),allowanceHex:`0x${p.toString(16)}`,blockTag:e.blockTag||"latest"}}async function jn(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=J(e.token||e.tokenAddress,"token"),o=J(e.account||e.owner||e.address,"account"),s=_e.encodeFunctionData("balanceOf",[o]),i=await D(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=_e.decodeFunctionResult("balanceOf",i),l=BigInt(c[0]);return{chainId:r,token:n,account:o,balance:l.toString(),balanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Un(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Rn(e.txHash||e.hash||e.transactionHash),o=await D(r,"eth_getTransactionReceipt",[n],t);if(!o)return{ok:!1,chainId:r,txHash:n,status:"pending",receipt:null,reason:"receipt pending"};let s=et(o.status),i=s===1,c=s===1?"success":s===0?"reverted":"unknown",l=i?null:c==="reverted"?"transaction reverted":"unknown receipt status",p=e.expectedTo?J(e.expectedTo,"expectedTo"):null,a=o.to?J(o.to,"receipt.to"):null;return p&&a!==p&&(i=!1,l=`to mismatch: expected ${p}, got ${a||"null"}`),{ok:i,chainId:r,txHash:n,status:c,reason:l,statusCode:s,to:a,from:o.from?J(o.from,"receipt.from"):null,blockNumber:et(o.blockNumber),transactionIndex:et(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Hn(e={}){let t=e.chainIds||Object.values(Oe).map(n=>n.chainId),r={};return await Promise.all(t.map(async n=>{if(!Lt(n)&&!tt[n]&&!Te(n,e)){r[n]={ok:!1,error:"no rpc configured",chainId:n};return}try{r[n]=await qt(n,e)}catch(o){r[n]={ok:!1,chainId:n,error:String(o.message||o)}}})),r}var _e,tt,Bn,vt,de,Mt,fe=v(()=>{Ze();Dt();_e=new Nn(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);tt={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"};Bn=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;vt=32,de=new Map,Mt=new Map});import{readFileSync as po}from"node:fs";import{homedir as mo}from"node:os";import{join as Pe}from"node:path";function ho(){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=mo();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Pe(t,".config","oracle")).trim();return[e,Pe(r,"exec.env")].filter(Boolean)}return[e,Pe(t,".config","oracle","exec.env"),Pe(t,".config","mad-desk","exec.env")].filter(Boolean)}function ar(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of ho())try{let s=po(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 cr=v(()=>{});var ur=v(()=>{});import{createHash as Ks,createHmac as wo,timingSafeEqual as Js}from"node:crypto";function ut(e){return Array.isArray(e)?`[${e.map(ut).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ut(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function bo(e,{required:t=!1}={}){try{return ar(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function go(e){let{signature:t,...r}=e;return r}function yo(e,{secret:t}={}){let r=bo(t);return r?{...e,signature:wo("sha256",r).update(ut(go(e))).digest("hex")}:e}function ct(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Eo(e){let t=e==null?lr: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,lr)}function Ao({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=ct(e,0),i=s>0?s>=25e4?5:s>=1e5?10:s>=5e4?20:s>=1e4?40:70:n?30:10,c=Math.min(60,Math.abs(ct(t,0))*2),l=Math.min(40,Math.floor(Math.max(0,ct(r,0))/5e3)*5),p=Math.max(25,Math.ceil(20+i+c+l)),a=Eo(o);return{mode:"auto",requiredBps:p,selectedBps:Math.min(p,a),capBps:a,executable:p<=a}}function xo({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:c,quotedAtMs:l=Date.now(),ttlMs:p=dr,secret:a}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let u=Ao({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:c});if(!u.executable)throw new Error(`auto-slippage requires ${u.requiredBps} bps above hard/requested cap ${u.capBps}; route blocked`);let f=Number(l);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(p)||dr)),w=d*BigInt(1e4-u.selectedBps),g=w/10000n;if(w%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${u.selectedBps} bps floor without rounding to zero`);let b=Number((d-g)*10000n/(d===0n?1n:d));if(b>u.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${u.capBps} \u2014 refusing to issue a guard weaker than advertised`);return yo({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:u.requiredBps,selectedBps:u.selectedBps,capBps:u.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:a})}function Re(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:c,quotedAtMs:l=Date.now(),ttlMs:p}={}){let a=xo({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:c,quotedAtMs:l,ttlMs:p});return{...e,autoSlippage:a,amountOutMinimum:a.minAmountOut}}var lr,dr,lt=v(()=>{cr();ur();lr=100,dr=2e4});var ei,ti,dt=v(()=>{ei=300*1e3,ti=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as mr,getAddress as Be,isAddress as Oo}from"ethers";function ko(e){let t=Number(e),r=he[t];if(!r)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(he).join(", ")})`);return{chainId:t,...r}}function pr(e,t){let r=he[Number(t)];if(!e||e===To||e===Co||/^eth$/i.test(String(e)))return Be(r.weth);let n=String(e);if(/^weth$/i.test(n))return Be(r.weth);if(/^usdc$/i.test(n))return Be(r.usdc);if(!Oo(n))throw new Error(`invalid token address: ${e}`);return Be(n)}async function hr(e={},t={}){let{chainId:r,quoter:n,router:o}=ko(e.chainId??8453),s=pr(e.tokenIn||"WETH",r),i=pr(e.tokenOut||he[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[..._o],a=await Promise.all(l.map(async u=>{let f=fr.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:i,amountIn:c,tickSpacing:u,sqrtPriceLimitX96:0n}]);try{let m=await D(r,"eth_call",[{to:n,data:f},"latest"],t);if(!m||m==="0x")return{tickSpacing:u,ok:!1,error:"empty result"};let w=fr.decodeFunctionResult("quoteExactInputSingle",m);return{tickSpacing:u,ok:!0,amountOut:w[0].toString(),sqrtPriceX96After:w[1].toString(),initializedTicksCrossed:Number(w[2]),gasEstimate:w[3].toString()}}catch(m){return{tickSpacing:u,ok:!1,error:String(m.message||m).slice(0,160)}}})),d=null;for(let u of a)u.ok&&(!d||BigInt(u.amountOut)>BigInt(d.amountOut))&&(d=u);if(!d){let u=a.map(f=>`${f.tickSpacing}:${f.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${r}: ${u}`)}return Re({venue:"aerodrome",chainId:r,chain:he[r].name,quoter:n,router:o,tokenIn:s,tokenOut:i,amountIn:c.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:a,best:!0},{chainId:r,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var he,_o,fr,ai,To,Co,wr=v(()=>{fe();lt();dt();he={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},_o=[1,50,100,200,2e3],fr=new mr(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),ai=new mr(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),To="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Co="0x0000000000000000000000000000000000000000"});var br=v(()=>{});function Bo(e,t,r){let n=H(t),o=H(r),s=H(e?.baseToken?.address),i=H(e?.quoteToken?.address);return s===n&&i===o||s===o&&i===n}function $o(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Lo(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||No).replace(/\/$/,"")}function Do(e,t){if(typeof e!="string"&&typeof e!="number")throw new Error(`${t} required`);let r=String(e).trim();if(!r||r.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:+~-]*$/u.test(r))throw new Error(`${t} must be a valid path component of at most 128 characters`);return encodeURIComponent(r)}function vo(e,t){return Ie(`${Lo(t)}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Mo(e,t={}){return vo(`/latest/dex/tokens/${Do(e,"tokenAddress")}`,t)}async function gr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let s=H(Po[Number(e)]||e),i=new Set(Ro(n).filter(Boolean).map(H)),c=[...new Set([t,r].map(u=>String(u)).filter(Boolean))],l=await Promise.allSettled(c.map(u=>Mo(u,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),p=new Set,a=[];for(let u of l)if(u.status==="fulfilled")for(let f of u.value?.pairs||u.value?.data?.pairs||[]){let m=`${H(f?.chainId)}:${H(f?.dexId)}:${H(f?.pairAddress)}`;p.has(m)||(p.add(m),a.push(f))}return a.filter(u=>H(u?.chainId)===s).filter(u=>Bo(u,t,r)).filter(u=>!i.size||i.has(H(u?.dexId))).map(u=>({pairAddress:u.pairAddress??null,dexId:u.dexId??null,chainId:u.chainId??null,liquidityUsd:$o(u),pairCreatedAt:u.pairCreatedAt??null})).filter(u=>u.liquidityUsd!=null).sort((u,f)=>f.liquidityUsd-u.liquidityUsd)}var No,Po,H,Ro,yr=v(()=>{Ze();br();No="https://api.dexscreener.com",Po=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),H=e=>String(e??"").toLowerCase(),Ro=e=>Array.isArray(e)?e:e==null?[]:[e]});import{Interface as xr,getAddress as $e,isAddress as Sr}from"ethers";function Wo(e,t){let r=Number(e),n=we[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(we).join(", ")})`);let o=qo[r]||{};if(!t){if(!n.quoter||!n.router){let l=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: ${l})`)}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,c=i[s];if(!c){let l=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${l})`)}return{chainId:r,venue:s,...n,quoter:c.quoter,router:c.router,feeTiers:c.feeTiers||null}}function Ar(e,t){let r=we[Number(t)];if(!e||e===Uo||e===Ho||/^eth$/i.test(String(e)))return $e(r.weth);let n=String(e);if(/^weth$/i.test(n))return $e(r.weth);if(/^usdc$/i.test(n))return $e(r.usdc);if(!Sr(n))throw new Error(`invalid token address: ${e}`);return $e(n)}function zo(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`]}async function Ir(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=Wo(e.chainId??8453,e.venue),i=Ar(e.tokenIn||"WETH",r),c=Ar(e.tokenOut||we[r].usdc,r),l=BigInt(e.amountIn??0);if(l<=0n)throw new Error("amountIn required (raw base units)");let p=s&&s.length?s:Fo,a=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[p[Math.min(2,p.length-1)]]:[...p],u=await Promise.all(a.map(async h=>{let O=Er.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:c,amountIn:l,fee:h,sqrtPriceLimitX96:0n}]);try{let x=await D(r,"eth_call",[{to:n,data:O},"latest"],t);if(!x||x==="0x")return{fee:h,ok:!1,error:"empty result"};let I=Er.decodeFunctionResult("quoteExactInputSingle",x);return{fee:h,ok:!0,amountOut:I[0].toString(),sqrtPriceX96After:I[1].toString(),initializedTicksCrossed:Number(I[2]),gasEstimate:I[3].toString()}}catch(x){return{fee:h,ok:!1,error:String(x.message||x).slice(0,160)}}})),f=null;for(let h of u)h.ok&&(!f||BigInt(h.amountOut)>BigInt(f.amountOut))&&(f=h);if(!f){let h=u.map(O=>`${O.fee}:${O.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${h}`)}let m=e.liquidityUsd==null?await gr({chainId:r,tokenA:i,tokenB:c,dexIds:zo(e.venue)},t).catch(()=>[]):[],w={};await Promise.all(m.slice(0,8).map(async h=>{if(!(!h.pairAddress||!Sr(h.pairAddress)))try{let O=await D(r,"eth_call",[{to:h.pairAddress,data:jo},"latest"],t),x=O&&O!=="0x"&&O.length<=66?Number.parseInt(O,16):NaN;if(!Number.isFinite(x)||x<=0||x>1e6)return;let I=w[x];(I==null||h.liquidityUsd>I.liquidityUsd)&&(w[x]=h)}catch{}}));let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(e.fee==null&&g>0&&BigInt(f.amountOut)>0n){let h=BigInt(f.amountOut),x=u.filter(I=>I.ok&&Number((h-BigInt(I.amountOut))*10000n/h)<=g).filter(I=>w[I.fee]?.liquidityUsd!=null).sort((I,S)=>w[S.fee].liquidityUsd-w[I.fee].liquidityUsd)[0];x&&x.fee!==f.fee&&(b={priceBestFee:f.fee,chosenFee:x.fee,chosenPoolUsd:w[x.fee].liquidityUsd,bandBps:g},f=x)}let E=w[f.fee]??null,y=m[0]??null,A=E??y,_=e.liquidityUsd??E?.liquidityUsd??y?.liquidityUsd??null,C=e.liquidityUsd!=null?"caller":E?"pool":y?"pair":null;return Re({venue:"uniswap-v3",chainId:r,chain:we[r].name,quoter:n,tokenIn:i,tokenOut:c,amountIn:l.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:_,liquiditySource:A,liquidityAttribution:C,liquidityPick:b,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:u,best:!0},{chainId:r,venue:o,amountOut:f.amountOut,liquidityUsd:_,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var we,Fo,jo,Er,yi,Uo,Ho,ft,qo,Or=v(()=>{fe();yr();lt();dt();we={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"}},Fo=[100,500,3e3,1e4],jo="0xddca3f43",Er=new xr(["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)"]),yi=new xr(["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)"]),Uo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ho="0x0000000000000000000000000000000000000000",ft=[100,500,2500,1e4],qo={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Nr={};Et(Nr,{collectBaseRoundTripCycles:()=>Xo});function pt(e,{positive:t=!1}={}){return typeof e=="string"&&/^(?:0|[1-9][0-9]*)$/.test(e)&&(!t||e!=="0")&&BigInt(e)<=Go}function _r(e){if(!pt(e,{positive:!0})){let t=typeof e=="string"&&/^[1-9][0-9]*$/.test(e)?" and fit uint256":"";throw new TypeError(`amountInWei must be a positive strict decimal string${t}`)}return e}function Tr(e,t){let r=e?.amountOut;if(!pt(r,{positive:!0}))throw new Error(`${t} returned an invalid amountOut`);return r}function Cr(e,t){let r=e?.gasEstimate??e?.gasUnits;if(!pt(r))throw new Error(`${t} returned invalid gas units`);return r}function ae(e,t){return e==="uniswap-v3"?{venue:e,...t?.fee==null?{}:{fee:t.fee}}:{venue:e,...t?.tickSpacing==null?{}:{tickSpacing:t.tickSpacing}}}function Le(e,t,r,n,o,s){return{status:"UNAVAILABLE",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:n,amountOutWei:null,gasUnits:null,source:o,error:String(s?.message||s)}}async function kr({entryVenue:e,exitVenue:t,amountInWei:r,blockTag:n,entryQuote:o,exitQuote:s}){let i;try{i=await o({chainId:be,tokenIn:"WETH",tokenOut:"USDC",amountIn:r,blockTag:n})}catch(a){return Le(e,t,r,null,{},a)}let c,l;try{c=Tr(i,e),l=Cr(i,e)}catch(a){return Le(e,t,r,null,{entry:ae(e,i)},a)}let p;try{p=await s({chainId:be,tokenIn:"USDC",tokenOut:"WETH",amountIn:c,blockTag:n})}catch(a){return Le(e,t,r,c,{entry:ae(e,i)},a)}try{let a=Tr(p,t),d=(BigInt(l)+BigInt(Cr(p,t))).toString();return{status:"OK",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:c,amountOutWei:a,gasUnits:d,source:{entry:ae(e,i),exit:ae(t,p)}}}catch(a){return Le(e,t,r,c,{entry:ae(e,i),exit:ae(t,p)},a)}}async function Vo(e){let t=await D(be,"eth_gasPrice",[],e);return BigInt(t).toString()}async function Xo(e={}){let t=_r(e.amountInWei),r=e.quoteUniswap??(m=>Ir(m,e)),n=e.quoteAerodrome??(m=>hr(m,e)),o=e.getBlockNumber??(()=>rt(be,e)),s=e.getGasPriceWei??(()=>Vo(e)),i=e.now??(()=>new Date().toISOString()),c=e.maxBlockDrift??1;if(!Number.isSafeInteger(c)||c<0)throw new TypeError("maxBlockDrift must be a non-negative safe integer");let l=e.pinnedBlock??await o();if(!Number.isSafeInteger(l)||l<0)throw new Error("block provider returned invalid height");let p=`0x${l.toString(16)}`,a=_r(await s()),d=[];d.push(await kr({entryVenue:"uniswap-v3",exitVenue:"aerodrome",amountInWei:t,blockTag:p,entryQuote:r,exitQuote:n})),d.push(await kr({entryVenue:"aerodrome",exitVenue:"uniswap-v3",amountInWei:t,blockTag:p,entryQuote:n,exitQuote:r}));let u=await o();if(!Number.isSafeInteger(u)||u<0)throw new Error("block provider returned invalid height");let f=Math.abs(u-l);return{mode:"shadow",executionReady:!1,chainId:be,pair:"WETH-USDC",capturedAt:i(),amountInWei:t,blockStart:l,blockEnd:u,pinnedBlock:l,blockTag:p,blockConsistency:"PINNED",blockDrift:f,maxBlockDrift:c,stale:f>c,gasPriceWei:a,cycles:d}}var be,Go,Pr=v(()=>{wr();fe();Or();be=8453,Go=(1n<<256n)-1n});import{homedir as ls}from"node:os";import{isAbsolute as ds,join as fs}from"node:path";var nt=Object.freeze({premium:"0x074b2e43",provider:"0x0542975c",reserves:"0xd1946dbc"}),Gt=/^0x[0-9a-fA-F]{64}$/,qn=/^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$/,Wn=256,zn=100;async function Gn(...e){let{rpcCall:t}=await Promise.resolve().then(()=>(fe(),Wt));return t(...e)}function ot(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ot(t);Object.freeze(e)}return e}var G=ot({chainId:8453,pool:"0xA238Dd80C259a72e81d7e4664a9801593F98d1c5",addressesProvider:"0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D",WETH:"0x4200000000000000000000000000000000000006",USDC:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",requiredReserves:["0x4200000000000000000000000000000000000006","0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],observedPremiumBps:5});function Vn(e){if(typeof e!="string"||!qn.test(e))throw new Error("malformed eth_blockNumber result");let t=BigInt(e);if(t>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed eth_blockNumber result: outside safe range");return Number(t)}function Xn(e,t){if(typeof e!="string"||!Gt.test(e))throw new Error(`malformed ${t} result`);return BigInt(e)}function Vt(e,t){if(typeof e!="string"||!Gt.test(e)||e.slice(2,26)!=="0".repeat(24))throw new Error(`malformed ${t} result`);return`0x${e.slice(26).toLowerCase()}`}function Kn(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]+$/.test(e)||e.length<130)throw new Error("malformed getReservesList result");let t=e.slice(2);if(t.length%64!==0||BigInt(`0x${t.slice(0,64)}`)!==32n)throw new Error("malformed getReservesList result");let r=BigInt(`0x${t.slice(64,128)}`);if(r>BigInt(Wn)||r>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed getReservesList result: unreasonable reserve count");let n=Number(r);if(t.length!==128+n*64)throw new Error("malformed getReservesList result: invalid length");let o=[];for(let s=0;s<n;s+=1){let i=`0x${t.slice(128+s*64,192+s*64)}`;o.push(Vt(i,"getReservesList address"))}return o}function zt(e,t,r,n){return ot({mode:"shadow",executionReady:!1,status:e,chainId:G.chainId,block:t,premiumBps:r,reasons:n})}async function Xt(e={}){let t=e.rpc??Gn;if(typeof t!="function")throw new TypeError("rpc must be a function");let r=null,n=null;try{let o=await t(G.chainId,"eth_blockNumber",[],e);r=Vn(o);let s=d=>t(G.chainId,"eth_call",[{to:G.pool,data:d},o],e),i=Xn(await s(nt.premium),"FLASHLOAN_PREMIUM_TOTAL");if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed FLASHLOAN_PREMIUM_TOTAL result: outside safe range");n=Number(i);let c=Vt(await s(nt.provider),"ADDRESSES_PROVIDER"),l=Kn(await s(nt.reserves)),p=[];n>zn?p.push(`premium ${n} bps exceeds reasonable bound`):n!==G.observedPremiumBps&&p.push(`premium ${n} bps differs from observed ${G.observedPremiumBps} bps`),c!==G.addressesProvider.toLowerCase()&&p.push(`addresses provider mismatch: received ${c}`);let a=new Set(l);for(let[d,u]of[["WETH",G.WETH],["USDC",G.USDC]])a.has(u.toLowerCase())||p.push(`${d} required reserve is missing`);return zt(p.length===0?"AVAILABLE":"MISMATCH",r,n,p)}catch(o){return zt("UNAVAILABLE",r,n,[String(o?.message||o)])}}var Jn=/^(?:0|[1-9][0-9]*)$/,Kt=10000n,st=(1n<<256n)-1n;function M(e,t="value"){let r;if(typeof e=="bigint"&&e>=0n)r=e;else if(typeof e=="string"&&Jn.test(e))r=BigInt(e);else throw new TypeError(`${t} must be a non-negative plain decimal string or bigint`);if(r>st)throw new RangeError(`${t} must fit uint256`);return r}function Ce(e,t){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?BigInt(e):M(e,t)}function Yn(e,t){let r=M(e,"amount"),n=Ce(t,"basisPoints");if(n>Kt)throw new RangeError("basisPoints must be at most 10000");let o=r*n;return o===0n?0n:(o-1n)/Kt+1n}function pe(e){if(typeof e!="bigint")throw new TypeError("value must be a bigint");return e.toString(10)}function Jt(e,t){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`${t} must be an object`);return e}function Yt(e){for(let t of Object.values(e))t!==null&&typeof t=="object"&&!Object.isFrozen(t)&&Yt(t);return Object.freeze(e)}function Zt(e,t){Jt(e,"cycle"),Jt(t,"policy");let r=M(e.amountInWei,"cycle.amountInWei"),n=M(e.amountOutWei,"cycle.amountOutWei"),o=Ce(e.gasUnits,"cycle.gasUnits"),s=M(e.gasPriceWei,"cycle.gasPriceWei"),i=Ce(t.loanPremiumBps,"policy.loanPremiumBps"),c=M(t.builderFeeWei,"policy.builderFeeWei"),l=M(t.extraCostWei,"policy.extraCostWei"),p=M(t.minProfitWei,"policy.minProfitWei"),a=M(t.maxGasWei,"policy.maxGasWei"),d=M(t.maxLoanWei,"policy.maxLoanWei");Ce(t.maxBlockDrift,"policy.maxBlockDrift");let u=n-r,f=o*s;if(f>st)throw new RangeError("gas cost must fit uint256");let m=Yn(r,i),w=f+m+c+l;if(w>st)throw new RangeError("total cost must fit uint256");let g=u-w,b=g>=p&&f<=a&&r<=d;return Yt({grossProfitWei:pe(u),gasCostWei:pe(f),loanPremiumWei:pe(m),totalCostWei:pe(w),netProfitWei:pe(g),status:b?"PROFITABLE":"UNPROFITABLE",executionReady:!1,mode:"shadow"})}var Zn=/^(?:0|[1-9][0-9]*)$/,Qn=(1n<<256n)-1n;function me(e){let t=null;return typeof e=="bigint"&&e>=0n&&(t=e),typeof e=="string"&&Zn.test(e)&&(t=BigInt(e)),t!==null&&t<=Qn?t:null}function ke(e){return typeof e=="string"&&e.length>0?e:null}function it(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}function F(e,t){e.push(`MALFORMED_${t.replaceAll(/[^A-Za-z0-9]+/g,"_").toUpperCase()}`)}function eo(e){return Object.freeze(e.reasonCodes),Object.freeze(e)}function Qt(e,t,r){let n=[],o=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{},s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{},i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},c=ke(o.chainId),l=ke(i.chainId),p=ke(o.lender),a=ke(o.strategy),d=it(s.supportedChainIds),u=it(s.allowedLenders),f=it(s.allowedStrategies);c||F(n,"chainId"),l||F(n,"opts.chainId"),c&&l&&c!==l&&n.push("CHAIN_MISMATCH"),d?(!c||!d.includes(c))&&n.push("UNSUPPORTED_CHAIN"):F(n,"supportedChainIds"),p||F(n,"lender"),u?(!p||!u.includes(p))&&n.push("LENDER_NOT_ALLOWED"):F(n,"allowedLenders"),a||F(n,"strategy"),f?(!a||!f.includes(a))&&n.push("STRATEGY_NOT_ALLOWED"):F(n,"allowedStrategies");let m=me(o.blockNumber),w=me(i.currentBlock),g=me(s.maxBlockDrift);m===null&&F(n,"blockNumber"),w===null&&F(n,"opts.currentBlock"),g===null&&F(n,"maxBlockDrift"),m!==null&&w!==null&&g!==null&&(m>w||w-m>g)&&n.push("STALE_BLOCK"),o.simulationStatus!=="PASS"&&n.push("SIMULATION_NOT_PASS"),o.repaymentStatus!=="PASS"&&n.push("REPAYMENT_NOT_PASS");let b=[["realizedProfitWei","minRealizedProfitWei","PROFIT_BELOW_MINIMUM",(A,_)=>A<_],["gasCostWei","maxGasWei","GAS_LIMIT_EXCEEDED",(A,_)=>A>_],["builderFeeWei","maxBuilderFeeWei","BUILDER_FEE_EXCEEDED",(A,_)=>A>_],["loanPremiumWei","maxLoanPremiumWei","LOAN_PREMIUM_EXCEEDED",(A,_)=>A>_],["loanAmountWei","maxLoanWei","LOAN_LIMIT_EXCEEDED",(A,_)=>A>_]],E={};for(let[A,_,C,h]of b){let O=me(o[A]),x=me(s[_]);E[A]=O,O===null&&F(n,A),x===null&&F(n,_),O!==null&&x!==null&&h(O,x)&&n.push(C)}i.armed!==!1&&n.push("NOT_DISARMED");let y={status:n.length===0?"ELIGIBLE":"BLOCKED",reasonCodes:[...new Set(n)],executionReady:!1,mode:"shadow"};return c&&(y.chainId=c),p&&(y.lender=p),a&&(y.strategy=a),m!==null&&(y.blockNumber=m.toString(10)),E.realizedProfitWei!==null&&(y.realizedProfitWei=E.realizedProfitWei.toString(10)),eo(y)}function Y(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Y(t);Object.freeze(e)}return e}function Ne(e){return e instanceof Error&&e.message?e.message.slice(0,300):String(e||"unknown error").slice(0,300)}function to(e,t){for(let r of[e?.cycleId,e?.id])if(typeof r=="string"&&r.trim())return r.trim().slice(0,160);return`cycle-${t}`}function ro(e,t){if(!e||typeof e!="object"||e.profitable===!1)return!1;if(typeof t=="function")return t(e)===!0;if(typeof t?.isProfitable=="function")return t.isProfitable(e)===!0;let r=Number(t?.minNetProfitUsd??0);return Number.isFinite(e.netProfitUsd)&&e.netProfitUsd>=(Number.isFinite(r)?r:0)}function er({collectCycles:e,evaluateCycle:t,store:r,policy:n={},intervalMs:o=6e4,now:s=Date.now}={}){if(typeof e!="function")throw new Error("collectCycles must be a function");if(typeof t!="function")throw new Error("evaluateCycle must be a function");if(!r||typeof r.append!="function"||typeof r.latest!="function")throw new Error("store must provide append() and latest()");if(!Number.isInteger(o)||o<=0)throw new Error("intervalMs must be a positive integer");if(typeof s!="function")throw new Error("now must be a function");let i=null,c=!1,l=0,p=0,a=null,d=[];function u(){return Y({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,running:i!==null,inFlight:c,ticks:l,failures:p,lastError:a})}async function f(){if(c)return Y({ok:!1,skipped:"overlap"});c=!0;let y=s(),A=[],_=[],C=[],h=[],O=[];try{try{let I=await e();if(!Array.isArray(I))throw new Error("collectCycles must return an array");O=I}catch(I){A.push({stage:"collect",message:Ne(I)})}for(let I=0;I<O.length;I+=1){let S=O[I],P=to(S,I);_.push({id:P});try{let T=await t(S,n),$={...T,cycleId:T?.cycleId??P};C.push($),ro(T,n)&&h.push({...$,profitable:!0})}catch(T){A.push({stage:"evaluate",cycleId:P,message:Ne(T)})}}let x={id:`shadow-${y}-${l+1}`,observedAt:y,cyclesEvaluated:O.length,cycles:_,candidates:C,opportunities:h,errors:A};try{await r.append(x)}catch(I){A.push({stage:"persist",message:Ne(I)})}return l+=1,A.length?(p+=1,a=A.map(I=>I.message).join("; ")):a=null,d=r.latest()?.opportunities??Y(structuredClone(h)),Y({ok:A.length===0,observation:r.latest()??x})}catch(x){return l+=1,p+=1,a=Ne(x),Y({ok:!1,error:a})}finally{c=!1}}function m(){return i!==null?!1:(i=setInterval(()=>f().catch(()=>{}),o),!0)}function w(){return i===null?!1:(clearInterval(i),i=null,!0)}async function g({timeoutMs:y=3e4}={}){if(!Number.isInteger(y)||y<=0)throw new Error("timeoutMs must be a positive integer");let A=Date.now()+y;for(;c;){if(Date.now()>=A)throw new Error("shadow engine drain timed out");await new Promise(_=>setTimeout(_,5))}return typeof r.drain=="function"&&await r.drain(),!0}function b(){return r.latest()}function E(){return Y(structuredClone(d))}return Y({tick:f,start:m,stop:w,drain:g,status:u,latest:b,opportunities:E})}import{mkdir as no,open as tr,readFile as rr,rename as oo,unlink as so}from"node:fs/promises";import{dirname as io,basename as ao,join as co}from"node:path";var uo=1e3;function re(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))re(t);Object.freeze(e)}return e}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function ne(e,t=300){return typeof e=="string"&&e.trim()?e.trim().slice(0,t):void 0}function lo(e){if(!e||typeof e!="object")return null;let t={},r=ne(e.stage,30),n=ne(e.message,300),o=ne(e.cycleId,160);return r&&(t.stage=r),n&&(t.message=n),o&&(t.cycleId=o),Object.keys(t).length?t:null}function nr(e,{signed:t=!1,max:r=96}={}){return typeof e!="string"||e.length>r?void 0:(t?/^-?(?:0|[1-9][0-9]*)$/:/^(?:0|[1-9][0-9]*)$/).test(e)?e:void 0}function or(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["cycleId","chain","pair","tokenIn","tokenOut","strategy","venue","lender","qualification","economicStatus","eligibilityStatus","costModel","blockConsistency"]){let n=ne(e[r],160);n&&(t[r]=n)}for(let r of["netProfitUsd","grossProfitUsd","costUsd","gasCostUsd","confidence"]){let n=at(e[r]);n!==void 0&&(t[r]=n)}for(let r of["amountInWei","amountOutWei","gasUnits","gasCostWei","loanPremiumWei","totalCostWei"]){let n=nr(e[r]);n!==void 0&&(t[r]=n)}for(let r of["grossProfitWei","netProfitWei"]){let n=nr(e[r],{signed:!0});n!==void 0&&(t[r]=n)}return["PROFITABLE","UNPROFITABLE","STALE","UNAVAILABLE","THEORETICAL"].includes(e.status)&&(t.status=e.status),typeof e.profitable=="boolean"&&(t.profitable=e.profitable),typeof e.economicallyProfitable=="boolean"&&(t.economicallyProfitable=e.economicallyProfitable),e.executionReady===!1&&(t.executionReady=!1),Array.isArray(e.reasonCodes)&&(t.reasonCodes=e.reasonCodes.map(r=>ne(r,80)).filter(Boolean).slice(0,32)),Object.keys(t).length?t:null}function fo(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["id","cycleId","chain","tokenIn","tokenOut","strategy"]){let n=ne(e[r],160);n&&(t[r]=n)}return Object.keys(t).length?t:null}function sr(e,t){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=at(r.observedAt)??at(r.timestamp)??t(),o=ne(r.id,160)??`shadow-${n}`,s=Array.isArray(r.cycles)?r.cycles.map(fo).filter(Boolean):[],i=Array.isArray(r.opportunities)?r.opportunities.map(or).filter(Boolean):[],c=Array.isArray(r.candidates)?r.candidates.map(or).filter(Boolean):[],l=Array.isArray(r.errors)?r.errors.map(lo).filter(Boolean):[];return{id:o,observedAt:n,mode:"shadow",cyclesEvaluated:Number.isInteger(r.cyclesEvaluated)&&r.cyclesEvaluated>=0?r.cyclesEvaluated:s.length,cycles:s,candidates:c,opportunities:i,errors:l}}function ir({filePath:e,maxRecords:t=uo,now:r=Date.now,persist:n=!0}={}){if(!Number.isInteger(t)||t<=0)throw new Error("maxRecords must be a positive integer");if(typeof r!="function")throw new Error("now must be a function");if(typeof n!="boolean")throw new Error("persist must be a boolean");if(n&&(typeof e!="string"||!e.trim()))throw new Error("filePath is required when persistence is enabled");let o=[],s=Promise.resolve(),i=()=>re(structuredClone(o));async function c(b){let E=JSON.parse(await rr(b,"utf8")),y=Array.isArray(E)?E:E?.records;if(!Array.isArray(y))throw new Error("shadow store payload is malformed");return y.map(A=>sr(A,r)).slice(-t)}async function l(){if(!n)return i();let b=s.then(async()=>{try{o=await c(e)}catch(E){if(E?.code==="ENOENT")try{o=await c(`${e}.bak`)}catch(y){if(y?.code==="ENOENT")o=[];else throw new Error("shadow store backup is corrupted")}else try{o=await c(`${e}.bak`)}catch{throw new Error("shadow store primary and backup are corrupted")}}return i()});return s=b.catch(()=>{}),b}let p=0;async function a(b,E){let y=io(b),A=co(y,`.${ao(b)}.${process.pid}.${Date.now()}.${p+=1}.tmp`);await no(y,{recursive:!0,mode:448});let _;try{_=await tr(A,"wx",384),await _.writeFile(E,"utf8"),await _.sync(),await _.close(),_=null,await oo(A,b);let C=await tr(y,"r");try{await C.sync()}finally{await C.close()}}finally{_&&await _.close().catch(()=>{}),await so(A).catch(()=>{})}}async function d(b){try{let E=await rr(e,"utf8"),y=JSON.parse(E);if(!Array.isArray(y)&&!Array.isArray(y?.records))throw new Error("shadow store payload is malformed");await a(`${e}.bak`,E)}catch(E){if(E?.code!=="ENOENT")throw new Error("refusing to overwrite corrupted shadow store")}await a(e,`${JSON.stringify({version:1,records:b})}
6
- `)}async function u(b){let E=sr(b,r),y=s.then(async()=>{let A=[...o,E].slice(-t);return n&&await d(A),o=A,re(structuredClone(E))});return s=y.catch(()=>{}),y}async function f(){return await s,!0}function m({limit:b}={}){let E=Number.isInteger(b)&&b>=0?o.slice(-b):o;return re(structuredClone(E))}function w(){let b=o.at(-1);return b?re(structuredClone(b)):null}function g(){return re({records:o.length,maxRecords:t,candidates:o.reduce((b,E)=>b+E.candidates.length,0),opportunities:o.reduce((b,E)=>b+E.opportunities.length,0),errors:o.reduce((b,E)=>b+E.errors.length,0)})}return re({append:u,record:u,load:l,drain:f,list:m,latest:w,stats:g})}var Ko=/^(?:0|[1-9][0-9]*)$/,De="8453",Rr="base",Br="WETH-USDC",ve="base-weth-usdc-round-trip",Me="aave-v3";async function Jo(e){let{collectBaseRoundTripCycles:t}=await Promise.resolve().then(()=>(Pr(),Nr));return t(e)}function V(e,t,{positive:r=!1}={}){if(typeof e!="string"||!Ko.test(e)||r&&e==="0")throw new TypeError(`${t} must be ${r?"a positive":"a non-negative"} decimal string`);return M(e,t),e}function mt(e,t,r,n){if(!Number.isSafeInteger(e)||e<r||e>n)throw new TypeError(`${t} must be an integer from ${r} through ${n}`);return e}function Z(e){return e==null?e:structuredClone(e)}function j(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))j(t);Object.freeze(e)}return e}function Yo(e){return String(e?.message||e||"unknown provider failure").slice(0,300)}function $r(e={}){let t=V(e.amountInWei,"amountInWei",{positive:!0}),r=V(e.minProfitWei,"minProfitWei"),n=V(e.maxLoanWei,"maxLoanWei"),o=V(e.maxGasWei,"maxGasWei"),s=V(e.builderFeeWei,"builderFeeWei"),i=V(e.extraCostWei,"extraCostWei"),c=V(e.extraGasUnits,"extraGasUnits"),l=mt(e.intervalMs,"intervalMs",1,864e5),p=mt(e.maxBlockDrift,"maxBlockDrift",0,1e3),a=mt(e.maxRecords,"maxRecords",1,1e5),d=e.dependencies??{},u=e.collectCycles??d.collectBaseRoundTripCycles??Jo,f=e.readLenderState??d.readBaseAaveLenderState??Xt,m=e.evaluateEconomics??d.evaluateCycleEconomics??Zt,w=e.evaluateEligibility??d.evaluateFlashLoanCandidate??Qt,g=e.createEngine??d.createShadowEngine??er,b=e.createStore??d.createShadowStore??ir;for(let[T,$]of Object.entries({collect:u,readLender:f,evaluateEconomics:m,evaluateEligibility:w,makeEngine:g,makeStore:b}))if(typeof $!="function")throw new TypeError(`${T} dependency must be a function`);let E=b({filePath:e.filePath,persist:e.persist??!0,maxRecords:a,now:e.now??Date.now}),y=[],A=null,_=j({async append(T){return await E.append(T),y=[...y,j(Z(T))].slice(-a),j(Z(T))},async drain(){return typeof E.drain=="function"&&await E.drain(),!0},latest(){return y.length?j(Z(y.at(-1))):null}}),C=null,h=null;async function O(){try{h=await f(e.lenderOptions??e)}catch(T){h={status:"UNAVAILABLE",block:null,premiumBps:null,reasons:[Yo(T)]}}if(A=j(Z(h)),!h||h.status!=="AVAILABLE")throw new Error(`lender ${h?.status?.toLowerCase()||"unavailable"}: ${(h?.reasons||[]).join("; ")}`);if(!Number.isSafeInteger(h.block)||!Number.isSafeInteger(h.premiumBps)||h.premiumBps<0)throw new Error("lender returned malformed live state");if(C=await u({...e.collectorOptions,amountInWei:t,maxBlockDrift:p,pinnedBlock:h.block}),!C||!Array.isArray(C.cycles))throw new Error("quote provider returned malformed snapshot");if(C.stale===!0||C.blockDrift>p)throw new Error("stale quote snapshot");if(!Number.isSafeInteger(C.blockEnd)||Math.abs(C.blockEnd-h.block)>p)throw new Error("stale lender snapshot relative to quotes");return V(C.gasPriceWei,"quoteSnapshot.gasPriceWei",{positive:!0}),C.cycles}async function x(T){if(!T||T.status!=="OK")throw new Error(T?.error||"cycle quote unavailable");let $=(BigInt(V(T.gasUnits,"cycle.gasUnits"))+BigInt(c)).toString(),ge={...T,gasUnits:$,gasPriceWei:C.gasPriceWei},L=await m(ge,{loanPremiumBps:h.premiumBps,builderFeeWei:s,extraCostWei:i,minProfitWei:r,maxGasWei:o,maxLoanWei:n,maxBlockDrift:p}),U=await w({chainId:De,lender:Me,strategy:ve,blockNumber:String(C.blockEnd),realizedProfitWei:L.netProfitWei.startsWith("-")?"0":L.netProfitWei,gasCostWei:L.gasCostWei,builderFeeWei:s,loanPremiumWei:L.loanPremiumWei,loanAmountWei:T.amountInWei},{supportedChainIds:[De],allowedLenders:[Me],allowedStrategies:[ve],maxBlockDrift:String(p),minRealizedProfitWei:r,maxGasWei:o,maxBuilderFeeWei:s,maxLoanPremiumWei:L.loanPremiumWei,maxLoanWei:n},{chainId:De,currentBlock:String(C.blockEnd),armed:!1}),R=[...new Set([...U.reasonCodes,"L1_DATA_FEE_NOT_MODELED","EXECUTOR_GAS_NOT_SIMULATED","LENDER_LIQUIDITY_NOT_CHECKED",...C.blockConsistency==="PINNED"?[]:["QUOTE_BLOCK_NOT_PINNED"]])],k=L.status==="PROFITABLE"&&U.status==="ELIGIBLE"&&R.length===0;return j({cycleId:`${T.entryVenue||"unknown"}->${T.exitVenue||"unknown"}`,chain:Rr,pair:Br,strategy:ve,lender:Me,amountInWei:T.amountInWei,amountOutWei:T.amountOutWei,gasUnits:$,...L,status:"THEORETICAL",economicStatus:L.status,economicallyProfitable:L.status==="PROFITABLE",qualification:"THEORETICAL_ONLY",eligibilityStatus:U.status,reasonCodes:R,costModel:"INCOMPLETE_ESTIMATE",blockConsistency:C.blockConsistency??"RANGE_ONLY",profitable:k,executionReady:!1,mode:"shadow"})}let I=g({collectCycles:O,evaluateCycle:x,store:_,policy:{isProfitable:T=>T?.profitable===!0},intervalMs:l,now:e.now??Date.now});async function S(){let T=await E.load();return y=Z(T).slice(-a),j(Z(y))}function P(){return j({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,chain:Rr,chainId:De,pair:Br,strategy:ve,lender:Me,...I.status(),lastProviderState:j(Z(A))})}return j({load:S,tick:I.tick,start:I.start,stop:I.stop,drain:I.drain,status:P,latest:_.latest,opportunities:()=>j(Z(_.latest()?.opportunities??[]))})}import{createServer as ts}from"node:http";var Ni=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Pi=Object.freeze(["read","simulate"]);var Ri=1440*60;var X=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}},Zo=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Qo=Object.freeze(["privkey","wif","xprv","seed"]);function ht(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Zo.test(t)||Qo.includes(r)}var Lr=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}]),Dr=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function es(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>Dr.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function vr(e){let t;try{t=JSON.stringify(e)}catch(o){throw new X("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=es(t);for(let{rule:o,re:s}of Lr)if(s.test(r))throw new X("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new X("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,s)=>{if(o&&ht(o))throw new X(`$<serialized>.${o}`,"forbidden-key-name");return s}),t}function oe(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Dr.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:s,re:i}of Lr)if(!(o&&s.startsWith("raw-32-byte-hex"))&&i.test(e))throw new X(t,s);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,s]of e.entries()){if(typeof o=="string"&&ht(o))throw new X(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");oe(o,`${t}[key]`,r),oe(s,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let s of e.values())oe(s,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,s)=>oe(o,`${t}[${s}]`,r)),e;for(let[o,s]of Object.entries(e)){if(ht(o))throw new X(`${t}.${o}`,"forbidden-key-name");oe(s,`${t}.${o}`,r,o)}return e}var Mr=null,rs="127.0.0.1",ns=8798,os=1e6,ss='{"error":"redacted"}',is=Object.freeze({"content-type":"application/json; charset=utf-8","cache-control":"no-store","content-security-policy":"default-src 'none'","x-content-type-options":"nosniff","x-frame-options":"DENY"});function as(e){if(!((e==="localhost"||e==="::1"||/^127(?:\.\d{1,3}){3}$/.test(e))&&(!e.startsWith("127.")||e.split(".").slice(1).every(t=>Number(t)<=255))))throw new Error("host must be a loopback address")}function cs(e){if(!e||["status","latest","opportunities"].some(t=>typeof e[t]!="function"))throw new Error("runtime must provide status(), latest(), and opportunities()")}function us(e){typeof Mr=="function"&&Mr(e),oe(e);let t=vr(e);if(Buffer.byteLength(t)>os)throw new Error("response too large");return t}function Q(e,t,r){let n,o=t;try{n=us(r)}catch{o=500,n=ss}e.writeHead(o,{...is,"content-length":Buffer.byteLength(n)}),e.end(n)}function Fr({runtime:e,host:t=rs,port:r=ns}={}){if(cs(e),typeof t!="string")throw new Error("host must be a loopback address");if(as(t),!Number.isInteger(r)||r<0||r>65535)throw new Error("port must be an integer between 0 and 65535");function n(){let d=e.status(),u=Number.isSafeInteger(d?.ticks)?d.ticks:0,f=typeof d?.lastProviderState?.status=="string"?d.lastProviderState.status:"UNKNOWN",m=d?.running===!0&&u>0&&d?.lastError==null&&f==="AVAILABLE";return{httpStatus:m?200:503,body:{ok:m,ready:m,service:"oracle-mev-shadow",mode:"shadow",execution:!1,signer:!1,broadcaster:!1,ticks:u,provider:f}}}let o=new Map([["/status",()=>e.status()],["/latest",()=>e.latest()],["/opportunities",()=>e.opportunities()]]);async function s(d,u){if(d.method!=="GET"){Q(u,405,{error:"method-not-allowed"});return}let f;try{f=new URL(d.url||"/","http://localhost").pathname}catch{Q(u,404,{error:"not-found"});return}if(f==="/health"){try{let w=n();Q(u,w.httpStatus,w.body)}catch{Q(u,503,{error:"redacted"})}return}let m=o.get(f);if(!m){Q(u,404,{error:"not-found"});return}try{Q(u,200,await m())}catch{Q(u,500,{error:"redacted"})}}let i=ts((d,u)=>{s(d,u).catch(()=>{u.headersSent?u.destroy():Q(u,500,{error:"redacted"})})}),c=null;function l(){let d=i.address();return d&&typeof d=="object"?{address:d.address,family:d.family,port:d.port}:null}function p(){return i.listening?Promise.resolve(l()):c||(c=new Promise((d,u)=>{let f=w=>{i.off("listening",m),c=null,u(w)},m=()=>{i.off("error",f);let w=l();c=null,d(w)};i.once("error",f),i.once("listening",m),i.listen(r,t)}),c)}async function a(){if(c)try{await c}catch{return!1}return i.listening?(await new Promise((d,u)=>i.close(f=>f?u(f):d())),!0):!1}return Object.freeze({start:p,stop:a,address:l,handler:s})}var Ur=/^(?:0|[1-9][0-9]*)$/,ps=/^127(?:\.\d{1,3}){3}$/,ms=(1n<<256n)-1n;function je(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))je(t);Object.freeze(e)}return e}function jr(e,t){let r=String(e??"").trim().toLowerCase();if(!["","0","false","off"].includes(r))throw new Error(`${t} must remain disarmed for the shadow service`)}function hs(e){return e==="localhost"||e==="::1"?!0:ps.test(e)?e.split(".").slice(1).every(t=>Number(t)<=255):!1}function se(e,t,r,{positive:n=!1}={}){let o=String(e[t]??r);if(!Ur.test(o)||n&&o==="0"){let s=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new TypeError(`${s} must be ${n?"a positive":"a non-negative"} decimal string`)}if(BigInt(o)>ms){let s=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new RangeError(`${s} must fit uint256`)}return o}function Fe(e,t,r,n,o,s){let i=String(e[t]??r);if(!Ur.test(i))throw new TypeError(`${s} must be an integer`);let c=Number(i);if(!Number.isSafeInteger(c)||c<n||c>o)throw new TypeError(`${s} must be an integer from ${n} through ${o}`);return c}function ws(e=process.env){jr(e.ORACLE_EXECUTE_ENABLED,"ORACLE_EXECUTE_ENABLED"),jr(e.MAD_EXECUTE_ENABLED,"MAD_EXECUTE_ENABLED");let t=String(e.ORACLE_MEV_SHADOW_HOST??"127.0.0.1").trim();if(!hs(t))throw new Error("ORACLE_MEV_SHADOW_HOST must be loopback-only");let r=String(e.HOME||ls()),n=String(e.ORACLE_MEV_SHADOW_STATE??fs(r,".local/state/oracle/mev-shadow/observations.json"));if(!ds(n))throw new Error("ORACLE_MEV_SHADOW_STATE must be an absolute path");let o=String(e.ORACLE_MEV_SHADOW_PERSIST??"1").trim();if(!["0","1"].includes(o))throw new Error("persist must be 0 or 1");return je({host:t,port:Fe(e,"ORACLE_MEV_SHADOW_PORT","8808",0,65535,"port"),intervalMs:Fe(e,"ORACLE_MEV_SHADOW_INTERVAL_MS","15000",1e3,864e5,"intervalMs"),amountInWei:se(e,"ORACLE_MEV_SHADOW_AMOUNT_IN_WEI","10000000000000000",{positive:!0}),minProfitWei:se(e,"ORACLE_MEV_SHADOW_MIN_PROFIT_WEI","10000000000000"),maxLoanWei:se(e,"ORACLE_MEV_SHADOW_MAX_LOAN_WEI","250000000000000000",{positive:!0}),maxGasWei:se(e,"ORACLE_MEV_SHADOW_MAX_GAS_WEI","500000000000000"),builderFeeWei:se(e,"ORACLE_MEV_SHADOW_BUILDER_FEE_WEI","0"),extraCostWei:se(e,"ORACLE_MEV_SHADOW_EXTRA_COST_WEI","0"),extraGasUnits:se(e,"ORACLE_MEV_SHADOW_EXTRA_GAS_UNITS","250000"),maxBlockDrift:Fe(e,"ORACLE_MEV_SHADOW_MAX_BLOCK_DRIFT","5",0,1e3,"maxBlockDrift"),maxRecords:Fe(e,"ORACLE_MEV_SHADOW_MAX_RECORDS","500",1,1e5,"maxRecords"),filePath:n,persist:o==="1"})}function Hr({env:e=process.env,runtimeFactory:t=$r,serverFactory:r=Fr}={}){if(typeof t!="function"||typeof r!="function")throw new TypeError("runtimeFactory and serverFactory must be functions");let n=ws(e),o=t(n),s=r({runtime:o,host:n.host,port:n.port}),i=null,c=null;async function l(){return i||c||(c=(async()=>{let d=!1;try{await o.load();let u=await o.tick();o.start(),d=!0;let f=await s.start();return i=je({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:f,initialTick:u}),i}catch(u){try{await s.stop()}catch{}if(d)try{o.stop(),typeof o.drain=="function"&&await o.drain()}catch{}throw u}finally{c=null}})(),c)}async function p(){if(c)try{await c}catch{}if(!i)return!1;let d=null;try{await s.stop()}catch(u){d=u}if(o.stop(),typeof o.drain=="function"&&await o.drain(),i=null,d)throw d;return!0}function a(){return je({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,listening:!!i,address:s.address(),runtime:o.status()})}return Object.freeze({start:l,stop:p,status:a,config:n})}var Ue="oracle-mev-shadow";function He(e,t){e.write(`${JSON.stringify(t)}
7
- `)}async function qr({env:e=process.env,appFactory:t=Hr,stdout:r=process.stdout,stderr:n=process.stderr,processLike:o=process}={}){if(typeof t!="function")throw new TypeError("appFactory must be a function");if(!r||typeof r.write!="function"||!n||typeof n.write!="function")throw new TypeError("stdout and stderr must be writable streams");if(!o||typeof o.once!="function")throw new TypeError("processLike must provide once()");let s=t({env:e}),i=null;async function c(a="shutdown"){return i||(i=(async()=>{try{return await s.stop(),He(r,{event:"stopped",service:Ue,signal:a}),!0}catch{return o.exitCode=1,He(n,{event:"fatal",service:Ue,error:"shutdown failed"}),!1}})(),i)}for(let a of["SIGINT","SIGTERM"])o.once(a,()=>{c(a).catch(()=>{o.exitCode=1})});let l;try{l=await s.start()}catch{throw o.exitCode=1,He(n,{event:"fatal",service:Ue,error:"startup failed"}),new Error("shadow service failed to start")}let p=l?.address&&typeof l.address=="object"?l.address:{};return He(r,{event:"listening",service:Ue,mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:p.address??null,family:p.family??null,port:p.port??null}),Object.freeze({app:s,stop:c})}var Wr=process.argv.slice(2);(Wr.includes("--help")||Wr.includes("-h"))&&(process.stdout.write(`Usage: oracle-mev-shadow [--help]
5
+ ${JSON.stringify(r??[])}`}async function jt(e,t,r){return Ie(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Ht(e,t,r={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>vt)throw new Error(`rpcBatch: at most ${vt} calls`);for(let s of t)Ft(s?.method);let n=Te(e,r);if(!n)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((s,i)=>({jsonrpc:"2.0",id:i+1,method:s.method,params:s.params||[]}));try{let s=await jt(n,o,r);if(Array.isArray(s)&&s.length===t.length){let i=new Map(s.map(c=>[Number(c?.id),c]));return t.map((c,l)=>Ut(i.get(l+1)??s[l]))}}catch{}return Promise.all(t.map(s=>D(e,s.method,s.params||[],r)))}async function D(e,t,r=[],n={}){let o=String(t||""),s=Ft(o),i=Te(e,n);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(s==="eth_chainid"&&n.cacheChainId!==!1){let a=Mt.get(i);if(a!=null)return a}let l=n.dedupe!==!1&&!n.signal?Ln(i,o,r):null;if(l&&de.has(l))return de.get(l);let p=(async()=>{let a=await jt(i,{jsonrpc:"2.0",id:1,method:t,params:r},n),d=Ut(a);return s==="eth_chainid"&&typeof d=="string"&&Mt.set(i,d),d})();return l&&(de.set(l,p),p.finally(()=>{de.get(l)===p&&de.delete(l)}).catch(()=>{})),p}async function qt(e,t={}){let[r,n]=await Ht(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(r,16),s=parseInt(n,16);return{ok:Number.isFinite(o)&&s===Number(e),chainId:Number(e),reportedChainId:s,blockNumber:o,name:Qe(e)?.name||null}}async function rt(e,t={}){let r=await D(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function Dn(e,t={}){let r=await D(e,"eth_chainId",[],t);return parseInt(r,16)}async function vn(e,t={}){let r=await D(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function Mn(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await D(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function Fn(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=J(e.token||e.tokenAddress,"token"),o=J(e.owner,"owner"),s=J(e.spender,"spender"),i=_e.encodeFunctionData("allowance",[o,s]),c=await D(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),l=_e.decodeFunctionResult("allowance",c),p=BigInt(l[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:p.toString(),allowanceHex:`0x${p.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Un(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=J(e.token||e.tokenAddress,"token"),o=J(e.account||e.owner||e.address,"account"),s=_e.encodeFunctionData("balanceOf",[o]),i=await D(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),c=_e.decodeFunctionResult("balanceOf",i),l=BigInt(c[0]);return{chainId:r,token:n,account:o,balance:l.toString(),balanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function jn(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=Rn(e.txHash||e.hash||e.transactionHash),o=await D(r,"eth_getTransactionReceipt",[n],t);if(!o)return{ok:!1,chainId:r,txHash:n,status:"pending",receipt:null,reason:"receipt pending"};let s=et(o.status),i=s===1,c=s===1?"success":s===0?"reverted":"unknown",l=i?null:c==="reverted"?"transaction reverted":"unknown receipt status",p=e.expectedTo?J(e.expectedTo,"expectedTo"):null,a=o.to?J(o.to,"receipt.to"):null;return p&&a!==p&&(i=!1,l=`to mismatch: expected ${p}, got ${a||"null"}`),{ok:i,chainId:r,txHash:n,status:c,reason:l,statusCode:s,to:a,from:o.from?J(o.from,"receipt.from"):null,blockNumber:et(o.blockNumber),transactionIndex:et(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Hn(e={}){let t=e.chainIds||Object.values(Oe).map(n=>n.chainId),r={};return await Promise.all(t.map(async n=>{if(!Lt(n)&&!tt[n]&&!Te(n,e)){r[n]={ok:!1,error:"no rpc configured",chainId:n};return}try{r[n]=await qt(n,e)}catch(o){r[n]={ok:!1,chainId:n,error:String(o.message||o)}}})),r}var _e,tt,Bn,vt,de,Mt,fe=v(()=>{Ze();Dt();_e=new Nn(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);tt={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",1339:"https://rpc.elysiumchain.tech"};Bn=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;vt=32,de=new Map,Mt=new Map});import{readFileSync as po}from"node:fs";import{homedir as mo}from"node:os";import{join as Pe}from"node:path";function ho(){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=mo();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Pe(t,".config","oracle")).trim();return[e,Pe(r,"exec.env")].filter(Boolean)}return[e,Pe(t,".config","oracle","exec.env"),Pe(t,".config","mad-desk","exec.env")].filter(Boolean)}function ar(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of ho())try{let s=po(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 cr=v(()=>{});var ur=v(()=>{});import{createHash as Ks,createHmac as wo,timingSafeEqual as Js}from"node:crypto";function ut(e){return Array.isArray(e)?`[${e.map(ut).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ut(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function bo(e,{required:t=!1}={}){try{return ar(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function go(e){let{signature:t,...r}=e;return r}function yo(e,{secret:t}={}){let r=bo(t);return r?{...e,signature:wo("sha256",r).update(ut(go(e))).digest("hex")}:e}function ct(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function Eo(e){let t=e==null?lr: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,lr)}function Ao({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=ct(e,0),i=s>0?s>=25e4?5:s>=1e5?10:s>=5e4?20:s>=1e4?40:70:n?30:10,c=Math.min(60,Math.abs(ct(t,0))*2),l=Math.min(40,Math.floor(Math.max(0,ct(r,0))/5e3)*5),p=Math.max(25,Math.ceil(20+i+c+l)),a=Eo(o);return{mode:"auto",requiredBps:p,selectedBps:Math.min(p,a),capBps:a,executable:p<=a}}function xo({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:c,quotedAtMs:l=Date.now(),ttlMs:p=dr,secret:a}={}){let d=BigInt(r??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let u=Ao({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:c});if(!u.executable)throw new Error(`auto-slippage requires ${u.requiredBps} bps above hard/requested cap ${u.capBps}; route blocked`);let f=Number(l);if(!Number.isFinite(f))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(p)||dr)),w=d*BigInt(1e4-u.selectedBps),g=w/10000n;if(w%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${u.selectedBps} bps floor without rounding to zero`);let b=Number((d-g)*10000n/(d===0n?1n:d));if(b>u.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${u.capBps} \u2014 refusing to issue a guard weaker than advertised`);return yo({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:u.requiredBps,selectedBps:u.selectedBps,capBps:u.capBps,quotedAtMs:f,expiresAtMs:f+m},{secret:a})}function Re(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:c,quotedAtMs:l=Date.now(),ttlMs:p}={}){let a=xo({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:c,quotedAtMs:l,ttlMs:p});return{...e,autoSlippage:a,amountOutMinimum:a.minAmountOut}}var lr,dr,lt=v(()=>{cr();ur();lr=100,dr=2e4});var ei,ti,dt=v(()=>{ei=300*1e3,ti=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as mr,getAddress as Be,isAddress as Oo}from"ethers";function ko(e){let t=Number(e),r=he[t];if(!r)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(he).join(", ")})`);return{chainId:t,...r}}function pr(e,t){let r=he[Number(t)];if(!e||e===To||e===Co||/^eth$/i.test(String(e)))return Be(r.weth);let n=String(e);if(/^weth$/i.test(n))return Be(r.weth);if(/^usdc$/i.test(n))return Be(r.usdc);if(!Oo(n))throw new Error(`invalid token address: ${e}`);return Be(n)}async function hr(e={},t={}){let{chainId:r,quoter:n,router:o}=ko(e.chainId??8453),s=pr(e.tokenIn||"WETH",r),i=pr(e.tokenOut||he[r].usdc,r),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[..._o],a=await Promise.all(l.map(async u=>{let f=fr.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:i,amountIn:c,tickSpacing:u,sqrtPriceLimitX96:0n}]);try{let m=await D(r,"eth_call",[{to:n,data:f},"latest"],t);if(!m||m==="0x")return{tickSpacing:u,ok:!1,error:"empty result"};let w=fr.decodeFunctionResult("quoteExactInputSingle",m);return{tickSpacing:u,ok:!0,amountOut:w[0].toString(),sqrtPriceX96After:w[1].toString(),initializedTicksCrossed:Number(w[2]),gasEstimate:w[3].toString()}}catch(m){return{tickSpacing:u,ok:!1,error:String(m.message||m).slice(0,160)}}})),d=null;for(let u of a)u.ok&&(!d||BigInt(u.amountOut)>BigInt(d.amountOut))&&(d=u);if(!d){let u=a.map(f=>`${f.tickSpacing}:${f.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${r}: ${u}`)}return Re({venue:"aerodrome",chainId:r,chain:he[r].name,quoter:n,router:o,tokenIn:s,tokenOut:i,amountIn:c.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:a,best:!0},{chainId:r,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var he,_o,fr,ai,To,Co,wr=v(()=>{fe();lt();dt();he={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},_o=[1,50,100,200,2e3],fr=new mr(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),ai=new mr(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),To="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Co="0x0000000000000000000000000000000000000000"});var br=v(()=>{});function Bo(e,t,r){let n=H(t),o=H(r),s=H(e?.baseToken?.address),i=H(e?.quoteToken?.address);return s===n&&i===o||s===o&&i===n}function $o(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Lo(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||No).replace(/\/$/,"")}function Do(e,t){if(typeof e!="string"&&typeof e!="number")throw new Error(`${t} required`);let r=String(e).trim();if(!r||r.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:+~-]*$/u.test(r))throw new Error(`${t} must be a valid path component of at most 128 characters`);return encodeURIComponent(r)}function vo(e,t){return Ie(`${Lo(t)}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Mo(e,t={}){return vo(`/latest/dex/tokens/${Do(e,"tokenAddress")}`,t)}async function gr({chainId:e,tokenA:t,tokenB:r,dexIds:n=[]}={},o={}){if(e==null||!t||!r)throw new Error("chainId, tokenA, and tokenB required");let s=H(Po[Number(e)]||e),i=new Set(Ro(n).filter(Boolean).map(H)),c=[...new Set([t,r].map(u=>String(u)).filter(Boolean))],l=await Promise.allSettled(c.map(u=>Mo(u,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),p=new Set,a=[];for(let u of l)if(u.status==="fulfilled")for(let f of u.value?.pairs||u.value?.data?.pairs||[]){let m=`${H(f?.chainId)}:${H(f?.dexId)}:${H(f?.pairAddress)}`;p.has(m)||(p.add(m),a.push(f))}return a.filter(u=>H(u?.chainId)===s).filter(u=>Bo(u,t,r)).filter(u=>!i.size||i.has(H(u?.dexId))).map(u=>({pairAddress:u.pairAddress??null,dexId:u.dexId??null,chainId:u.chainId??null,liquidityUsd:$o(u),pairCreatedAt:u.pairCreatedAt??null})).filter(u=>u.liquidityUsd!=null).sort((u,f)=>f.liquidityUsd-u.liquidityUsd)}var No,Po,H,Ro,yr=v(()=>{Ze();br();No="https://api.dexscreener.com",Po=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),H=e=>String(e??"").toLowerCase(),Ro=e=>Array.isArray(e)?e:e==null?[]:[e]});import{Interface as xr,getAddress as $e,isAddress as Sr}from"ethers";function Wo(e,t){let r=Number(e),n=we[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(we).join(", ")})`);let o=qo[r]||{};if(!t){if(!n.quoter||!n.router){let l=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: ${l})`)}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,c=i[s];if(!c){let l=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${l})`)}return{chainId:r,venue:s,...n,quoter:c.quoter,router:c.router,feeTiers:c.feeTiers||null}}function Ar(e,t){let r=we[Number(t)];if(!e||e===jo||e===Ho||/^eth$/i.test(String(e)))return $e(r.weth);let n=String(e);if(/^weth$/i.test(n))return $e(r.weth);if(/^usdc$/i.test(n))return $e(r.usdc);if(!Sr(n))throw new Error(`invalid token address: ${e}`);return $e(n)}function zo(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`]}async function Ir(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=Wo(e.chainId??8453,e.venue),i=Ar(e.tokenIn||"WETH",r),c=Ar(e.tokenOut||we[r].usdc,r),l=BigInt(e.amountIn??0);if(l<=0n)throw new Error("amountIn required (raw base units)");let p=s&&s.length?s:Fo,a=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[p[Math.min(2,p.length-1)]]:[...p],u=await Promise.all(a.map(async h=>{let O=Er.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:c,amountIn:l,fee:h,sqrtPriceLimitX96:0n}]);try{let x=await D(r,"eth_call",[{to:n,data:O},"latest"],t);if(!x||x==="0x")return{fee:h,ok:!1,error:"empty result"};let I=Er.decodeFunctionResult("quoteExactInputSingle",x);return{fee:h,ok:!0,amountOut:I[0].toString(),sqrtPriceX96After:I[1].toString(),initializedTicksCrossed:Number(I[2]),gasEstimate:I[3].toString()}}catch(x){return{fee:h,ok:!1,error:String(x.message||x).slice(0,160)}}})),f=null;for(let h of u)h.ok&&(!f||BigInt(h.amountOut)>BigInt(f.amountOut))&&(f=h);if(!f){let h=u.map(O=>`${O.fee}:${O.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${h}`)}let m=e.liquidityUsd==null?await gr({chainId:r,tokenA:i,tokenB:c,dexIds:zo(e.venue)},t).catch(()=>[]):[],w={};await Promise.all(m.slice(0,8).map(async h=>{if(!(!h.pairAddress||!Sr(h.pairAddress)))try{let O=await D(r,"eth_call",[{to:h.pairAddress,data:Uo},"latest"],t),x=O&&O!=="0x"&&O.length<=66?Number.parseInt(O,16):NaN;if(!Number.isFinite(x)||x<=0||x>1e6)return;let I=w[x];(I==null||h.liquidityUsd>I.liquidityUsd)&&(w[x]=h)}catch{}}));let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(e.fee==null&&g>0&&BigInt(f.amountOut)>0n){let h=BigInt(f.amountOut),x=u.filter(I=>I.ok&&Number((h-BigInt(I.amountOut))*10000n/h)<=g).filter(I=>w[I.fee]?.liquidityUsd!=null).sort((I,S)=>w[S.fee].liquidityUsd-w[I.fee].liquidityUsd)[0];x&&x.fee!==f.fee&&(b={priceBestFee:f.fee,chosenFee:x.fee,chosenPoolUsd:w[x.fee].liquidityUsd,bandBps:g},f=x)}let E=w[f.fee]??null,y=m[0]??null,A=E??y,_=e.liquidityUsd??E?.liquidityUsd??y?.liquidityUsd??null,C=e.liquidityUsd!=null?"caller":E?"pool":y?"pair":null;return Re({venue:"uniswap-v3",chainId:r,chain:we[r].name,quoter:n,tokenIn:i,tokenOut:c,amountIn:l.toString(),fee:f.fee,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:_,liquiditySource:A,liquidityAttribution:C,liquidityPick:b,sqrtPriceX96After:f.sqrtPriceX96After,initializedTicksCrossed:f.initializedTicksCrossed,triedFees:u,best:!0},{chainId:r,venue:o,amountOut:f.amountOut,liquidityUsd:_,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var we,Fo,Uo,Er,yi,jo,Ho,ft,qo,Or=v(()=>{fe();yr();lt();dt();we={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"}},Fo=[100,500,3e3,1e4],Uo="0xddca3f43",Er=new xr(["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)"]),yi=new xr(["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)"]),jo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Ho="0x0000000000000000000000000000000000000000",ft=[100,500,2500,1e4],qo={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ft}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Nr={};Et(Nr,{collectBaseRoundTripCycles:()=>Xo});function pt(e,{positive:t=!1}={}){return typeof e=="string"&&/^(?:0|[1-9][0-9]*)$/.test(e)&&(!t||e!=="0")&&BigInt(e)<=Go}function _r(e){if(!pt(e,{positive:!0})){let t=typeof e=="string"&&/^[1-9][0-9]*$/.test(e)?" and fit uint256":"";throw new TypeError(`amountInWei must be a positive strict decimal string${t}`)}return e}function Tr(e,t){let r=e?.amountOut;if(!pt(r,{positive:!0}))throw new Error(`${t} returned an invalid amountOut`);return r}function Cr(e,t){let r=e?.gasEstimate??e?.gasUnits;if(!pt(r))throw new Error(`${t} returned invalid gas units`);return r}function ae(e,t){return e==="uniswap-v3"?{venue:e,...t?.fee==null?{}:{fee:t.fee}}:{venue:e,...t?.tickSpacing==null?{}:{tickSpacing:t.tickSpacing}}}function Le(e,t,r,n,o,s){return{status:"UNAVAILABLE",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:n,amountOutWei:null,gasUnits:null,source:o,error:String(s?.message||s)}}async function kr({entryVenue:e,exitVenue:t,amountInWei:r,blockTag:n,entryQuote:o,exitQuote:s}){let i;try{i=await o({chainId:be,tokenIn:"WETH",tokenOut:"USDC",amountIn:r,blockTag:n})}catch(a){return Le(e,t,r,null,{},a)}let c,l;try{c=Tr(i,e),l=Cr(i,e)}catch(a){return Le(e,t,r,null,{entry:ae(e,i)},a)}let p;try{p=await s({chainId:be,tokenIn:"USDC",tokenOut:"WETH",amountIn:c,blockTag:n})}catch(a){return Le(e,t,r,c,{entry:ae(e,i)},a)}try{let a=Tr(p,t),d=(BigInt(l)+BigInt(Cr(p,t))).toString();return{status:"OK",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:c,amountOutWei:a,gasUnits:d,source:{entry:ae(e,i),exit:ae(t,p)}}}catch(a){return Le(e,t,r,c,{entry:ae(e,i),exit:ae(t,p)},a)}}async function Vo(e){let t=await D(be,"eth_gasPrice",[],e);return BigInt(t).toString()}async function Xo(e={}){let t=_r(e.amountInWei),r=e.quoteUniswap??(m=>Ir(m,e)),n=e.quoteAerodrome??(m=>hr(m,e)),o=e.getBlockNumber??(()=>rt(be,e)),s=e.getGasPriceWei??(()=>Vo(e)),i=e.now??(()=>new Date().toISOString()),c=e.maxBlockDrift??1;if(!Number.isSafeInteger(c)||c<0)throw new TypeError("maxBlockDrift must be a non-negative safe integer");let l=e.pinnedBlock??await o();if(!Number.isSafeInteger(l)||l<0)throw new Error("block provider returned invalid height");let p=`0x${l.toString(16)}`,a=_r(await s()),d=[];d.push(await kr({entryVenue:"uniswap-v3",exitVenue:"aerodrome",amountInWei:t,blockTag:p,entryQuote:r,exitQuote:n})),d.push(await kr({entryVenue:"aerodrome",exitVenue:"uniswap-v3",amountInWei:t,blockTag:p,entryQuote:n,exitQuote:r}));let u=await o();if(!Number.isSafeInteger(u)||u<0)throw new Error("block provider returned invalid height");let f=Math.abs(u-l);return{mode:"shadow",executionReady:!1,chainId:be,pair:"WETH-USDC",capturedAt:i(),amountInWei:t,blockStart:l,blockEnd:u,pinnedBlock:l,blockTag:p,blockConsistency:"PINNED",blockDrift:f,maxBlockDrift:c,stale:f>c,gasPriceWei:a,cycles:d}}var be,Go,Pr=v(()=>{wr();fe();Or();be=8453,Go=(1n<<256n)-1n});import{homedir as ls}from"node:os";import{isAbsolute as ds,join as fs}from"node:path";var nt=Object.freeze({premium:"0x074b2e43",provider:"0x0542975c",reserves:"0xd1946dbc"}),Gt=/^0x[0-9a-fA-F]{64}$/,qn=/^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$/,Wn=256,zn=100;async function Gn(...e){let{rpcCall:t}=await Promise.resolve().then(()=>(fe(),Wt));return t(...e)}function ot(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ot(t);Object.freeze(e)}return e}var G=ot({chainId:8453,pool:"0xA238Dd80C259a72e81d7e4664a9801593F98d1c5",addressesProvider:"0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D",WETH:"0x4200000000000000000000000000000000000006",USDC:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",requiredReserves:["0x4200000000000000000000000000000000000006","0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],observedPremiumBps:5});function Vn(e){if(typeof e!="string"||!qn.test(e))throw new Error("malformed eth_blockNumber result");let t=BigInt(e);if(t>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed eth_blockNumber result: outside safe range");return Number(t)}function Xn(e,t){if(typeof e!="string"||!Gt.test(e))throw new Error(`malformed ${t} result`);return BigInt(e)}function Vt(e,t){if(typeof e!="string"||!Gt.test(e)||e.slice(2,26)!=="0".repeat(24))throw new Error(`malformed ${t} result`);return`0x${e.slice(26).toLowerCase()}`}function Kn(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]+$/.test(e)||e.length<130)throw new Error("malformed getReservesList result");let t=e.slice(2);if(t.length%64!==0||BigInt(`0x${t.slice(0,64)}`)!==32n)throw new Error("malformed getReservesList result");let r=BigInt(`0x${t.slice(64,128)}`);if(r>BigInt(Wn)||r>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed getReservesList result: unreasonable reserve count");let n=Number(r);if(t.length!==128+n*64)throw new Error("malformed getReservesList result: invalid length");let o=[];for(let s=0;s<n;s+=1){let i=`0x${t.slice(128+s*64,192+s*64)}`;o.push(Vt(i,"getReservesList address"))}return o}function zt(e,t,r,n){return ot({mode:"shadow",executionReady:!1,status:e,chainId:G.chainId,block:t,premiumBps:r,reasons:n})}async function Xt(e={}){let t=e.rpc??Gn;if(typeof t!="function")throw new TypeError("rpc must be a function");let r=null,n=null;try{let o=await t(G.chainId,"eth_blockNumber",[],e);r=Vn(o);let s=d=>t(G.chainId,"eth_call",[{to:G.pool,data:d},o],e),i=Xn(await s(nt.premium),"FLASHLOAN_PREMIUM_TOTAL");if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed FLASHLOAN_PREMIUM_TOTAL result: outside safe range");n=Number(i);let c=Vt(await s(nt.provider),"ADDRESSES_PROVIDER"),l=Kn(await s(nt.reserves)),p=[];n>zn?p.push(`premium ${n} bps exceeds reasonable bound`):n!==G.observedPremiumBps&&p.push(`premium ${n} bps differs from observed ${G.observedPremiumBps} bps`),c!==G.addressesProvider.toLowerCase()&&p.push(`addresses provider mismatch: received ${c}`);let a=new Set(l);for(let[d,u]of[["WETH",G.WETH],["USDC",G.USDC]])a.has(u.toLowerCase())||p.push(`${d} required reserve is missing`);return zt(p.length===0?"AVAILABLE":"MISMATCH",r,n,p)}catch(o){return zt("UNAVAILABLE",r,n,[String(o?.message||o)])}}var Jn=/^(?:0|[1-9][0-9]*)$/,Kt=10000n,st=(1n<<256n)-1n;function M(e,t="value"){let r;if(typeof e=="bigint"&&e>=0n)r=e;else if(typeof e=="string"&&Jn.test(e))r=BigInt(e);else throw new TypeError(`${t} must be a non-negative plain decimal string or bigint`);if(r>st)throw new RangeError(`${t} must fit uint256`);return r}function Ce(e,t){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?BigInt(e):M(e,t)}function Yn(e,t){let r=M(e,"amount"),n=Ce(t,"basisPoints");if(n>Kt)throw new RangeError("basisPoints must be at most 10000");let o=r*n;return o===0n?0n:(o-1n)/Kt+1n}function pe(e){if(typeof e!="bigint")throw new TypeError("value must be a bigint");return e.toString(10)}function Jt(e,t){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`${t} must be an object`);return e}function Yt(e){for(let t of Object.values(e))t!==null&&typeof t=="object"&&!Object.isFrozen(t)&&Yt(t);return Object.freeze(e)}function Zt(e,t){Jt(e,"cycle"),Jt(t,"policy");let r=M(e.amountInWei,"cycle.amountInWei"),n=M(e.amountOutWei,"cycle.amountOutWei"),o=Ce(e.gasUnits,"cycle.gasUnits"),s=M(e.gasPriceWei,"cycle.gasPriceWei"),i=Ce(t.loanPremiumBps,"policy.loanPremiumBps"),c=M(t.builderFeeWei,"policy.builderFeeWei"),l=M(t.extraCostWei,"policy.extraCostWei"),p=M(t.minProfitWei,"policy.minProfitWei"),a=M(t.maxGasWei,"policy.maxGasWei"),d=M(t.maxLoanWei,"policy.maxLoanWei");Ce(t.maxBlockDrift,"policy.maxBlockDrift");let u=n-r,f=o*s;if(f>st)throw new RangeError("gas cost must fit uint256");let m=Yn(r,i),w=f+m+c+l;if(w>st)throw new RangeError("total cost must fit uint256");let g=u-w,b=g>=p&&f<=a&&r<=d;return Yt({grossProfitWei:pe(u),gasCostWei:pe(f),loanPremiumWei:pe(m),totalCostWei:pe(w),netProfitWei:pe(g),status:b?"PROFITABLE":"UNPROFITABLE",executionReady:!1,mode:"shadow"})}var Zn=/^(?:0|[1-9][0-9]*)$/,Qn=(1n<<256n)-1n;function me(e){let t=null;return typeof e=="bigint"&&e>=0n&&(t=e),typeof e=="string"&&Zn.test(e)&&(t=BigInt(e)),t!==null&&t<=Qn?t:null}function ke(e){return typeof e=="string"&&e.length>0?e:null}function it(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}function F(e,t){e.push(`MALFORMED_${t.replaceAll(/[^A-Za-z0-9]+/g,"_").toUpperCase()}`)}function eo(e){return Object.freeze(e.reasonCodes),Object.freeze(e)}function Qt(e,t,r){let n=[],o=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{},s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{},i=r!==null&&typeof r=="object"&&!Array.isArray(r)?r:{},c=ke(o.chainId),l=ke(i.chainId),p=ke(o.lender),a=ke(o.strategy),d=it(s.supportedChainIds),u=it(s.allowedLenders),f=it(s.allowedStrategies);c||F(n,"chainId"),l||F(n,"opts.chainId"),c&&l&&c!==l&&n.push("CHAIN_MISMATCH"),d?(!c||!d.includes(c))&&n.push("UNSUPPORTED_CHAIN"):F(n,"supportedChainIds"),p||F(n,"lender"),u?(!p||!u.includes(p))&&n.push("LENDER_NOT_ALLOWED"):F(n,"allowedLenders"),a||F(n,"strategy"),f?(!a||!f.includes(a))&&n.push("STRATEGY_NOT_ALLOWED"):F(n,"allowedStrategies");let m=me(o.blockNumber),w=me(i.currentBlock),g=me(s.maxBlockDrift);m===null&&F(n,"blockNumber"),w===null&&F(n,"opts.currentBlock"),g===null&&F(n,"maxBlockDrift"),m!==null&&w!==null&&g!==null&&(m>w||w-m>g)&&n.push("STALE_BLOCK"),o.simulationStatus!=="PASS"&&n.push("SIMULATION_NOT_PASS"),o.repaymentStatus!=="PASS"&&n.push("REPAYMENT_NOT_PASS");let b=[["realizedProfitWei","minRealizedProfitWei","PROFIT_BELOW_MINIMUM",(A,_)=>A<_],["gasCostWei","maxGasWei","GAS_LIMIT_EXCEEDED",(A,_)=>A>_],["builderFeeWei","maxBuilderFeeWei","BUILDER_FEE_EXCEEDED",(A,_)=>A>_],["loanPremiumWei","maxLoanPremiumWei","LOAN_PREMIUM_EXCEEDED",(A,_)=>A>_],["loanAmountWei","maxLoanWei","LOAN_LIMIT_EXCEEDED",(A,_)=>A>_]],E={};for(let[A,_,C,h]of b){let O=me(o[A]),x=me(s[_]);E[A]=O,O===null&&F(n,A),x===null&&F(n,_),O!==null&&x!==null&&h(O,x)&&n.push(C)}i.armed!==!1&&n.push("NOT_DISARMED");let y={status:n.length===0?"ELIGIBLE":"BLOCKED",reasonCodes:[...new Set(n)],executionReady:!1,mode:"shadow"};return c&&(y.chainId=c),p&&(y.lender=p),a&&(y.strategy=a),m!==null&&(y.blockNumber=m.toString(10)),E.realizedProfitWei!==null&&(y.realizedProfitWei=E.realizedProfitWei.toString(10)),eo(y)}function Y(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Y(t);Object.freeze(e)}return e}function Ne(e){return e instanceof Error&&e.message?e.message.slice(0,300):String(e||"unknown error").slice(0,300)}function to(e,t){for(let r of[e?.cycleId,e?.id])if(typeof r=="string"&&r.trim())return r.trim().slice(0,160);return`cycle-${t}`}function ro(e,t){if(!e||typeof e!="object"||e.profitable===!1)return!1;if(typeof t=="function")return t(e)===!0;if(typeof t?.isProfitable=="function")return t.isProfitable(e)===!0;let r=Number(t?.minNetProfitUsd??0);return Number.isFinite(e.netProfitUsd)&&e.netProfitUsd>=(Number.isFinite(r)?r:0)}function er({collectCycles:e,evaluateCycle:t,store:r,policy:n={},intervalMs:o=6e4,now:s=Date.now}={}){if(typeof e!="function")throw new Error("collectCycles must be a function");if(typeof t!="function")throw new Error("evaluateCycle must be a function");if(!r||typeof r.append!="function"||typeof r.latest!="function")throw new Error("store must provide append() and latest()");if(!Number.isInteger(o)||o<=0)throw new Error("intervalMs must be a positive integer");if(typeof s!="function")throw new Error("now must be a function");let i=null,c=!1,l=0,p=0,a=null,d=[];function u(){return Y({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,running:i!==null,inFlight:c,ticks:l,failures:p,lastError:a})}async function f(){if(c)return Y({ok:!1,skipped:"overlap"});c=!0;let y=s(),A=[],_=[],C=[],h=[],O=[];try{try{let I=await e();if(!Array.isArray(I))throw new Error("collectCycles must return an array");O=I}catch(I){A.push({stage:"collect",message:Ne(I)})}for(let I=0;I<O.length;I+=1){let S=O[I],P=to(S,I);_.push({id:P});try{let T=await t(S,n),$={...T,cycleId:T?.cycleId??P};C.push($),ro(T,n)&&h.push({...$,profitable:!0})}catch(T){A.push({stage:"evaluate",cycleId:P,message:Ne(T)})}}let x={id:`shadow-${y}-${l+1}`,observedAt:y,cyclesEvaluated:O.length,cycles:_,candidates:C,opportunities:h,errors:A};try{await r.append(x)}catch(I){A.push({stage:"persist",message:Ne(I)})}return l+=1,A.length?(p+=1,a=A.map(I=>I.message).join("; ")):a=null,d=r.latest()?.opportunities??Y(structuredClone(h)),Y({ok:A.length===0,observation:r.latest()??x})}catch(x){return l+=1,p+=1,a=Ne(x),Y({ok:!1,error:a})}finally{c=!1}}function m(){return i!==null?!1:(i=setInterval(()=>f().catch(()=>{}),o),!0)}function w(){return i===null?!1:(clearInterval(i),i=null,!0)}async function g({timeoutMs:y=3e4}={}){if(!Number.isInteger(y)||y<=0)throw new Error("timeoutMs must be a positive integer");let A=Date.now()+y;for(;c;){if(Date.now()>=A)throw new Error("shadow engine drain timed out");await new Promise(_=>setTimeout(_,5))}return typeof r.drain=="function"&&await r.drain(),!0}function b(){return r.latest()}function E(){return Y(structuredClone(d))}return Y({tick:f,start:m,stop:w,drain:g,status:u,latest:b,opportunities:E})}import{mkdir as no,open as tr,readFile as rr,rename as oo,unlink as so}from"node:fs/promises";import{dirname as io,basename as ao,join as co}from"node:path";var uo=1e3;function re(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))re(t);Object.freeze(e)}return e}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function ne(e,t=300){return typeof e=="string"&&e.trim()?e.trim().slice(0,t):void 0}function lo(e){if(!e||typeof e!="object")return null;let t={},r=ne(e.stage,30),n=ne(e.message,300),o=ne(e.cycleId,160);return r&&(t.stage=r),n&&(t.message=n),o&&(t.cycleId=o),Object.keys(t).length?t:null}function nr(e,{signed:t=!1,max:r=96}={}){return typeof e!="string"||e.length>r?void 0:(t?/^-?(?:0|[1-9][0-9]*)$/:/^(?:0|[1-9][0-9]*)$/).test(e)?e:void 0}function or(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["cycleId","chain","pair","tokenIn","tokenOut","strategy","venue","lender","qualification","economicStatus","eligibilityStatus","costModel","blockConsistency"]){let n=ne(e[r],160);n&&(t[r]=n)}for(let r of["netProfitUsd","grossProfitUsd","costUsd","gasCostUsd","confidence"]){let n=at(e[r]);n!==void 0&&(t[r]=n)}for(let r of["amountInWei","amountOutWei","gasUnits","gasCostWei","loanPremiumWei","totalCostWei"]){let n=nr(e[r]);n!==void 0&&(t[r]=n)}for(let r of["grossProfitWei","netProfitWei"]){let n=nr(e[r],{signed:!0});n!==void 0&&(t[r]=n)}return["PROFITABLE","UNPROFITABLE","STALE","UNAVAILABLE","THEORETICAL"].includes(e.status)&&(t.status=e.status),typeof e.profitable=="boolean"&&(t.profitable=e.profitable),typeof e.economicallyProfitable=="boolean"&&(t.economicallyProfitable=e.economicallyProfitable),e.executionReady===!1&&(t.executionReady=!1),Array.isArray(e.reasonCodes)&&(t.reasonCodes=e.reasonCodes.map(r=>ne(r,80)).filter(Boolean).slice(0,32)),Object.keys(t).length?t:null}function fo(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let r of["id","cycleId","chain","tokenIn","tokenOut","strategy"]){let n=ne(e[r],160);n&&(t[r]=n)}return Object.keys(t).length?t:null}function sr(e,t){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=at(r.observedAt)??at(r.timestamp)??t(),o=ne(r.id,160)??`shadow-${n}`,s=Array.isArray(r.cycles)?r.cycles.map(fo).filter(Boolean):[],i=Array.isArray(r.opportunities)?r.opportunities.map(or).filter(Boolean):[],c=Array.isArray(r.candidates)?r.candidates.map(or).filter(Boolean):[],l=Array.isArray(r.errors)?r.errors.map(lo).filter(Boolean):[];return{id:o,observedAt:n,mode:"shadow",cyclesEvaluated:Number.isInteger(r.cyclesEvaluated)&&r.cyclesEvaluated>=0?r.cyclesEvaluated:s.length,cycles:s,candidates:c,opportunities:i,errors:l}}function ir({filePath:e,maxRecords:t=uo,now:r=Date.now,persist:n=!0}={}){if(!Number.isInteger(t)||t<=0)throw new Error("maxRecords must be a positive integer");if(typeof r!="function")throw new Error("now must be a function");if(typeof n!="boolean")throw new Error("persist must be a boolean");if(n&&(typeof e!="string"||!e.trim()))throw new Error("filePath is required when persistence is enabled");let o=[],s=Promise.resolve(),i=()=>re(structuredClone(o));async function c(b){let E=JSON.parse(await rr(b,"utf8")),y=Array.isArray(E)?E:E?.records;if(!Array.isArray(y))throw new Error("shadow store payload is malformed");return y.map(A=>sr(A,r)).slice(-t)}async function l(){if(!n)return i();let b=s.then(async()=>{try{o=await c(e)}catch(E){if(E?.code==="ENOENT")try{o=await c(`${e}.bak`)}catch(y){if(y?.code==="ENOENT")o=[];else throw new Error("shadow store backup is corrupted")}else try{o=await c(`${e}.bak`)}catch{throw new Error("shadow store primary and backup are corrupted")}}return i()});return s=b.catch(()=>{}),b}let p=0;async function a(b,E){let y=io(b),A=co(y,`.${ao(b)}.${process.pid}.${Date.now()}.${p+=1}.tmp`);await no(y,{recursive:!0,mode:448});let _;try{_=await tr(A,"wx",384),await _.writeFile(E,"utf8"),await _.sync(),await _.close(),_=null,await oo(A,b);let C=await tr(y,"r");try{await C.sync()}finally{await C.close()}}finally{_&&await _.close().catch(()=>{}),await so(A).catch(()=>{})}}async function d(b){try{let E=await rr(e,"utf8"),y=JSON.parse(E);if(!Array.isArray(y)&&!Array.isArray(y?.records))throw new Error("shadow store payload is malformed");await a(`${e}.bak`,E)}catch(E){if(E?.code!=="ENOENT")throw new Error("refusing to overwrite corrupted shadow store")}await a(e,`${JSON.stringify({version:1,records:b})}
6
+ `)}async function u(b){let E=sr(b,r),y=s.then(async()=>{let A=[...o,E].slice(-t);return n&&await d(A),o=A,re(structuredClone(E))});return s=y.catch(()=>{}),y}async function f(){return await s,!0}function m({limit:b}={}){let E=Number.isInteger(b)&&b>=0?o.slice(-b):o;return re(structuredClone(E))}function w(){let b=o.at(-1);return b?re(structuredClone(b)):null}function g(){return re({records:o.length,maxRecords:t,candidates:o.reduce((b,E)=>b+E.candidates.length,0),opportunities:o.reduce((b,E)=>b+E.opportunities.length,0),errors:o.reduce((b,E)=>b+E.errors.length,0)})}return re({append:u,record:u,load:l,drain:f,list:m,latest:w,stats:g})}var Ko=/^(?:0|[1-9][0-9]*)$/,De="8453",Rr="base",Br="WETH-USDC",ve="base-weth-usdc-round-trip",Me="aave-v3";async function Jo(e){let{collectBaseRoundTripCycles:t}=await Promise.resolve().then(()=>(Pr(),Nr));return t(e)}function V(e,t,{positive:r=!1}={}){if(typeof e!="string"||!Ko.test(e)||r&&e==="0")throw new TypeError(`${t} must be ${r?"a positive":"a non-negative"} decimal string`);return M(e,t),e}function mt(e,t,r,n){if(!Number.isSafeInteger(e)||e<r||e>n)throw new TypeError(`${t} must be an integer from ${r} through ${n}`);return e}function Z(e){return e==null?e:structuredClone(e)}function U(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))U(t);Object.freeze(e)}return e}function Yo(e){return String(e?.message||e||"unknown provider failure").slice(0,300)}function $r(e={}){let t=V(e.amountInWei,"amountInWei",{positive:!0}),r=V(e.minProfitWei,"minProfitWei"),n=V(e.maxLoanWei,"maxLoanWei"),o=V(e.maxGasWei,"maxGasWei"),s=V(e.builderFeeWei,"builderFeeWei"),i=V(e.extraCostWei,"extraCostWei"),c=V(e.extraGasUnits,"extraGasUnits"),l=mt(e.intervalMs,"intervalMs",1,864e5),p=mt(e.maxBlockDrift,"maxBlockDrift",0,1e3),a=mt(e.maxRecords,"maxRecords",1,1e5),d=e.dependencies??{},u=e.collectCycles??d.collectBaseRoundTripCycles??Jo,f=e.readLenderState??d.readBaseAaveLenderState??Xt,m=e.evaluateEconomics??d.evaluateCycleEconomics??Zt,w=e.evaluateEligibility??d.evaluateFlashLoanCandidate??Qt,g=e.createEngine??d.createShadowEngine??er,b=e.createStore??d.createShadowStore??ir;for(let[T,$]of Object.entries({collect:u,readLender:f,evaluateEconomics:m,evaluateEligibility:w,makeEngine:g,makeStore:b}))if(typeof $!="function")throw new TypeError(`${T} dependency must be a function`);let E=b({filePath:e.filePath,persist:e.persist??!0,maxRecords:a,now:e.now??Date.now}),y=[],A=null,_=U({async append(T){return await E.append(T),y=[...y,U(Z(T))].slice(-a),U(Z(T))},async drain(){return typeof E.drain=="function"&&await E.drain(),!0},latest(){return y.length?U(Z(y.at(-1))):null}}),C=null,h=null;async function O(){try{h=await f(e.lenderOptions??e)}catch(T){h={status:"UNAVAILABLE",block:null,premiumBps:null,reasons:[Yo(T)]}}if(A=U(Z(h)),!h||h.status!=="AVAILABLE")throw new Error(`lender ${h?.status?.toLowerCase()||"unavailable"}: ${(h?.reasons||[]).join("; ")}`);if(!Number.isSafeInteger(h.block)||!Number.isSafeInteger(h.premiumBps)||h.premiumBps<0)throw new Error("lender returned malformed live state");if(C=await u({...e.collectorOptions,amountInWei:t,maxBlockDrift:p,pinnedBlock:h.block}),!C||!Array.isArray(C.cycles))throw new Error("quote provider returned malformed snapshot");if(C.stale===!0||C.blockDrift>p)throw new Error("stale quote snapshot");if(!Number.isSafeInteger(C.blockEnd)||Math.abs(C.blockEnd-h.block)>p)throw new Error("stale lender snapshot relative to quotes");return V(C.gasPriceWei,"quoteSnapshot.gasPriceWei",{positive:!0}),C.cycles}async function x(T){if(!T||T.status!=="OK")throw new Error(T?.error||"cycle quote unavailable");let $=(BigInt(V(T.gasUnits,"cycle.gasUnits"))+BigInt(c)).toString(),ge={...T,gasUnits:$,gasPriceWei:C.gasPriceWei},L=await m(ge,{loanPremiumBps:h.premiumBps,builderFeeWei:s,extraCostWei:i,minProfitWei:r,maxGasWei:o,maxLoanWei:n,maxBlockDrift:p}),j=await w({chainId:De,lender:Me,strategy:ve,blockNumber:String(C.blockEnd),realizedProfitWei:L.netProfitWei.startsWith("-")?"0":L.netProfitWei,gasCostWei:L.gasCostWei,builderFeeWei:s,loanPremiumWei:L.loanPremiumWei,loanAmountWei:T.amountInWei},{supportedChainIds:[De],allowedLenders:[Me],allowedStrategies:[ve],maxBlockDrift:String(p),minRealizedProfitWei:r,maxGasWei:o,maxBuilderFeeWei:s,maxLoanPremiumWei:L.loanPremiumWei,maxLoanWei:n},{chainId:De,currentBlock:String(C.blockEnd),armed:!1}),R=[...new Set([...j.reasonCodes,"L1_DATA_FEE_NOT_MODELED","EXECUTOR_GAS_NOT_SIMULATED","LENDER_LIQUIDITY_NOT_CHECKED",...C.blockConsistency==="PINNED"?[]:["QUOTE_BLOCK_NOT_PINNED"]])],k=L.status==="PROFITABLE"&&j.status==="ELIGIBLE"&&R.length===0;return U({cycleId:`${T.entryVenue||"unknown"}->${T.exitVenue||"unknown"}`,chain:Rr,pair:Br,strategy:ve,lender:Me,amountInWei:T.amountInWei,amountOutWei:T.amountOutWei,gasUnits:$,...L,status:"THEORETICAL",economicStatus:L.status,economicallyProfitable:L.status==="PROFITABLE",qualification:"THEORETICAL_ONLY",eligibilityStatus:j.status,reasonCodes:R,costModel:"INCOMPLETE_ESTIMATE",blockConsistency:C.blockConsistency??"RANGE_ONLY",profitable:k,executionReady:!1,mode:"shadow"})}let I=g({collectCycles:O,evaluateCycle:x,store:_,policy:{isProfitable:T=>T?.profitable===!0},intervalMs:l,now:e.now??Date.now});async function S(){let T=await E.load();return y=Z(T).slice(-a),U(Z(y))}function P(){return U({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,chain:Rr,chainId:De,pair:Br,strategy:ve,lender:Me,...I.status(),lastProviderState:U(Z(A))})}return U({load:S,tick:I.tick,start:I.start,stop:I.stop,drain:I.drain,status:P,latest:_.latest,opportunities:()=>U(Z(_.latest()?.opportunities??[]))})}import{createServer as ts}from"node:http";var Ni=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Pi=Object.freeze(["read","simulate"]);var Ri=1440*60;var X=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}},Zo=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Qo=Object.freeze(["privkey","wif","xprv","seed"]);function ht(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Zo.test(t)||Qo.includes(r)}var Lr=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}]),Dr=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function es(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>Dr.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function vr(e){let t;try{t=JSON.stringify(e)}catch(o){throw new X("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=es(t);for(let{rule:o,re:s}of Lr)if(s.test(r))throw new X("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new X("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,s)=>{if(o&&ht(o))throw new X(`$<serialized>.${o}`,"forbidden-key-name");return s}),t}function oe(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Dr.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:s,re:i}of Lr)if(!(o&&s.startsWith("raw-32-byte-hex"))&&i.test(e))throw new X(t,s);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,s]of e.entries()){if(typeof o=="string"&&ht(o))throw new X(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");oe(o,`${t}[key]`,r),oe(s,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let s of e.values())oe(s,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,s)=>oe(o,`${t}[${s}]`,r)),e;for(let[o,s]of Object.entries(e)){if(ht(o))throw new X(`${t}.${o}`,"forbidden-key-name");oe(s,`${t}.${o}`,r,o)}return e}var Mr=null,rs="127.0.0.1",ns=8798,os=1e6,ss='{"error":"redacted"}',is=Object.freeze({"content-type":"application/json; charset=utf-8","cache-control":"no-store","content-security-policy":"default-src 'none'","x-content-type-options":"nosniff","x-frame-options":"DENY"});function as(e){if(!((e==="localhost"||e==="::1"||/^127(?:\.\d{1,3}){3}$/.test(e))&&(!e.startsWith("127.")||e.split(".").slice(1).every(t=>Number(t)<=255))))throw new Error("host must be a loopback address")}function cs(e){if(!e||["status","latest","opportunities"].some(t=>typeof e[t]!="function"))throw new Error("runtime must provide status(), latest(), and opportunities()")}function us(e){typeof Mr=="function"&&Mr(e),oe(e);let t=vr(e);if(Buffer.byteLength(t)>os)throw new Error("response too large");return t}function Q(e,t,r){let n,o=t;try{n=us(r)}catch{o=500,n=ss}e.writeHead(o,{...is,"content-length":Buffer.byteLength(n)}),e.end(n)}function Fr({runtime:e,host:t=rs,port:r=ns}={}){if(cs(e),typeof t!="string")throw new Error("host must be a loopback address");if(as(t),!Number.isInteger(r)||r<0||r>65535)throw new Error("port must be an integer between 0 and 65535");function n(){let d=e.status(),u=Number.isSafeInteger(d?.ticks)?d.ticks:0,f=typeof d?.lastProviderState?.status=="string"?d.lastProviderState.status:"UNKNOWN",m=d?.running===!0&&u>0&&d?.lastError==null&&f==="AVAILABLE";return{httpStatus:m?200:503,body:{ok:m,ready:m,service:"oracle-mev-shadow",mode:"shadow",execution:!1,signer:!1,broadcaster:!1,ticks:u,provider:f}}}let o=new Map([["/status",()=>e.status()],["/latest",()=>e.latest()],["/opportunities",()=>e.opportunities()]]);async function s(d,u){if(d.method!=="GET"){Q(u,405,{error:"method-not-allowed"});return}let f;try{f=new URL(d.url||"/","http://localhost").pathname}catch{Q(u,404,{error:"not-found"});return}if(f==="/health"){try{let w=n();Q(u,w.httpStatus,w.body)}catch{Q(u,503,{error:"redacted"})}return}let m=o.get(f);if(!m){Q(u,404,{error:"not-found"});return}try{Q(u,200,await m())}catch{Q(u,500,{error:"redacted"})}}let i=ts((d,u)=>{s(d,u).catch(()=>{u.headersSent?u.destroy():Q(u,500,{error:"redacted"})})}),c=null;function l(){let d=i.address();return d&&typeof d=="object"?{address:d.address,family:d.family,port:d.port}:null}function p(){return i.listening?Promise.resolve(l()):c||(c=new Promise((d,u)=>{let f=w=>{i.off("listening",m),c=null,u(w)},m=()=>{i.off("error",f);let w=l();c=null,d(w)};i.once("error",f),i.once("listening",m),i.listen(r,t)}),c)}async function a(){if(c)try{await c}catch{return!1}return i.listening?(await new Promise((d,u)=>i.close(f=>f?u(f):d())),!0):!1}return Object.freeze({start:p,stop:a,address:l,handler:s})}var jr=/^(?:0|[1-9][0-9]*)$/,ps=/^127(?:\.\d{1,3}){3}$/,ms=(1n<<256n)-1n;function Ue(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ue(t);Object.freeze(e)}return e}function Ur(e,t){let r=String(e??"").trim().toLowerCase();if(!["","0","false","off"].includes(r))throw new Error(`${t} must remain disarmed for the shadow service`)}function hs(e){return e==="localhost"||e==="::1"?!0:ps.test(e)?e.split(".").slice(1).every(t=>Number(t)<=255):!1}function se(e,t,r,{positive:n=!1}={}){let o=String(e[t]??r);if(!jr.test(o)||n&&o==="0"){let s=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new TypeError(`${s} must be ${n?"a positive":"a non-negative"} decimal string`)}if(BigInt(o)>ms){let s=t.replace("ORACLE_MEV_SHADOW_","").toLowerCase();throw new RangeError(`${s} must fit uint256`)}return o}function Fe(e,t,r,n,o,s){let i=String(e[t]??r);if(!jr.test(i))throw new TypeError(`${s} must be an integer`);let c=Number(i);if(!Number.isSafeInteger(c)||c<n||c>o)throw new TypeError(`${s} must be an integer from ${n} through ${o}`);return c}function ws(e=process.env){Ur(e.ORACLE_EXECUTE_ENABLED,"ORACLE_EXECUTE_ENABLED"),Ur(e.MAD_EXECUTE_ENABLED,"MAD_EXECUTE_ENABLED");let t=String(e.ORACLE_MEV_SHADOW_HOST??"127.0.0.1").trim();if(!hs(t))throw new Error("ORACLE_MEV_SHADOW_HOST must be loopback-only");let r=String(e.HOME||ls()),n=String(e.ORACLE_MEV_SHADOW_STATE??fs(r,".local/state/oracle/mev-shadow/observations.json"));if(!ds(n))throw new Error("ORACLE_MEV_SHADOW_STATE must be an absolute path");let o=String(e.ORACLE_MEV_SHADOW_PERSIST??"1").trim();if(!["0","1"].includes(o))throw new Error("persist must be 0 or 1");return Ue({host:t,port:Fe(e,"ORACLE_MEV_SHADOW_PORT","8808",0,65535,"port"),intervalMs:Fe(e,"ORACLE_MEV_SHADOW_INTERVAL_MS","15000",1e3,864e5,"intervalMs"),amountInWei:se(e,"ORACLE_MEV_SHADOW_AMOUNT_IN_WEI","10000000000000000",{positive:!0}),minProfitWei:se(e,"ORACLE_MEV_SHADOW_MIN_PROFIT_WEI","10000000000000"),maxLoanWei:se(e,"ORACLE_MEV_SHADOW_MAX_LOAN_WEI","250000000000000000",{positive:!0}),maxGasWei:se(e,"ORACLE_MEV_SHADOW_MAX_GAS_WEI","500000000000000"),builderFeeWei:se(e,"ORACLE_MEV_SHADOW_BUILDER_FEE_WEI","0"),extraCostWei:se(e,"ORACLE_MEV_SHADOW_EXTRA_COST_WEI","0"),extraGasUnits:se(e,"ORACLE_MEV_SHADOW_EXTRA_GAS_UNITS","250000"),maxBlockDrift:Fe(e,"ORACLE_MEV_SHADOW_MAX_BLOCK_DRIFT","5",0,1e3,"maxBlockDrift"),maxRecords:Fe(e,"ORACLE_MEV_SHADOW_MAX_RECORDS","500",1,1e5,"maxRecords"),filePath:n,persist:o==="1"})}function Hr({env:e=process.env,runtimeFactory:t=$r,serverFactory:r=Fr}={}){if(typeof t!="function"||typeof r!="function")throw new TypeError("runtimeFactory and serverFactory must be functions");let n=ws(e),o=t(n),s=r({runtime:o,host:n.host,port:n.port}),i=null,c=null;async function l(){return i||c||(c=(async()=>{let d=!1;try{await o.load();let u=await o.tick();o.start(),d=!0;let f=await s.start();return i=Ue({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:f,initialTick:u}),i}catch(u){try{await s.stop()}catch{}if(d)try{o.stop(),typeof o.drain=="function"&&await o.drain()}catch{}throw u}finally{c=null}})(),c)}async function p(){if(c)try{await c}catch{}if(!i)return!1;let d=null;try{await s.stop()}catch(u){d=u}if(o.stop(),typeof o.drain=="function"&&await o.drain(),i=null,d)throw d;return!0}function a(){return Ue({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,listening:!!i,address:s.address(),runtime:o.status()})}return Object.freeze({start:l,stop:p,status:a,config:n})}var je="oracle-mev-shadow";function He(e,t){e.write(`${JSON.stringify(t)}
7
+ `)}async function qr({env:e=process.env,appFactory:t=Hr,stdout:r=process.stdout,stderr:n=process.stderr,processLike:o=process}={}){if(typeof t!="function")throw new TypeError("appFactory must be a function");if(!r||typeof r.write!="function"||!n||typeof n.write!="function")throw new TypeError("stdout and stderr must be writable streams");if(!o||typeof o.once!="function")throw new TypeError("processLike must provide once()");let s=t({env:e}),i=null;async function c(a="shutdown"){return i||(i=(async()=>{try{return await s.stop(),He(r,{event:"stopped",service:je,signal:a}),!0}catch{return o.exitCode=1,He(n,{event:"fatal",service:je,error:"shutdown failed"}),!1}})(),i)}for(let a of["SIGINT","SIGTERM"])o.once(a,()=>{c(a).catch(()=>{o.exitCode=1})});let l;try{l=await s.start()}catch{throw o.exitCode=1,He(n,{event:"fatal",service:je,error:"startup failed"}),new Error("shadow service failed to start")}let p=l?.address&&typeof l.address=="object"?l.address:{};return He(r,{event:"listening",service:je,mode:"shadow",execution:!1,signer:!1,broadcaster:!1,address:p.address??null,family:p.family??null,port:p.port??null}),Object.freeze({app:s,stop:c})}var Wr=process.argv.slice(2);(Wr.includes("--help")||Wr.includes("-h"))&&(process.stdout.write(`Usage: oracle-mev-shadow [--help]
8
8
  Loopback-only Base MEV observer. Never prepares, signs, or broadcasts.
9
9
  `),process.exit(0));qr().catch(()=>{process.exitCode=1});