@oracle-agent/oracle 0.28.28 → 0.28.29

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