@oracle-agent/oracle 0.35.20 → 0.35.22

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