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