@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 $r=Object.defineProperty;var
|
|
3
|
-
`)};i("method",e),i("url",t),Object.keys(r||{}).map((l,d)=>({name:l.toLowerCase(),order:d,value:String(r[l])})).sort((l,d)=>l.name.localeCompare(d.name)||l.order-d.order).forEach((l,d)=>{i(`header-name-${d}`,l.name),i(`header-value-${d}`,l.value)}),i("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${l}`,n[l]??"-");return s.digest("hex")}function nn(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,mt):Math.min(250*2**e,mt)+Math.floor(Math.random()*100)}function X(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function We(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 sn(e){return e?e.byteLength??e.length??0:0}async function an(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 We(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let a=await e.text(),c=Buffer.byteLength(a,"utf8");if(c>t){if(!n)throw We(r,`body ${c} bytes`,t);return Buffer.from(a,"utf8").subarray(0,t).toString("utf8")}return a}let u=[],l=0,d=!1;try{for(;;){let{value:a,done:c}=await i.read();if(c)break;if(a&&(u.push(Buffer.from(a)),l+=sn(a),l>t)){d=!0;break}}}finally{if(d)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!n))throw We(r,`streamed ${l} bytes`,t);let f=Buffer.concat(u);return(d?f.subarray(0,t):f).toString("utf8")}function cn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function un(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:u,untrustedUrl:l=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:f=!1,importUndici:a,validateResponse:c,signal:p,redirectPolicy:m="follow",maxRedirects:b=be}){let _=new AbortController,g=setTimeout(()=>_.abort(),s),S=p?ht?ht([p,_.signal]):p:_.signal,h=null,y=t,E=i?{lookupFn:i}:{};if(l&&!u&&!je(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(w,{status:O=null}={})=>{let A=await Me(w,E);if(!A.ok)throw X(O==null?`HTTP refused ${w}: ${A.error}`:`HTTP redirect to ${w} ${A.error}`,O==null?{}:{status:O});let I=new URL(w).hostname;if(u){if(h&&(await h.close(),h=null),!h)try{h=await Fe({requireUndici:!0,...a?{importUndici:a}:{}})}catch(x){throw X(O==null?`HTTP refused ${w}: ${x?.message||x}`:`HTTP redirect to ${w} refused: ${x?.message||x}`,O==null?{}:{status:O})}h.pin(I,A.addresses),y=h.fetch}else ft(y,I,A.addresses);return A};try{let w=String(e),O=Object.assign(Object.create(null),n||{});l&&await C(w);for(let A=0;A<=b;A+=1){let I=Object.assign(Object.create(null),{method:r,headers:O,body:o,signal:S,redirect:"manual",dispatcher:void 0}),x=await y(w,I);if((m==="error"||b===0)&&x.status>=300&&x.status<400)throw te(x),X(`HTTP ${x.status} ${r} redirect refused`,{status:x.status,redirectRefused:!0});if(Vr.has(x.status)){let B=f===!0&&r==="POST"&&[307,308].includes(x.status)&&yt(r,o);if(r!=="GET"&&r!=="HEAD"&&!B){te(x);let P=new Error(`HTTP ${x.status} ${r} ${w} redirected non-idempotent request`);throw P.status=x.status,P}if(A===b)throw te(x),X(`HTTP ${x.status} ${r} redirect budget exhausted`,{status:x.status,redirectRefused:!0});let pe=x.headers?.get?.("location"),$;try{$=Zr(pe,w)}catch(P){throw te(x),P}let j=!Qr($,w);if(te(x),j&&r==="POST"){let P=new Error(`HTTP ${x.status} ${r} cross-origin redirect refused`);throw P.status=x.status,P}if(j&&f){let P=new Error(`HTTP ${x.status} ${r} cross-origin redirect refused`);throw P.status=x.status,P.retryable=!1,P}if(j&&(O=Yr(O)),l)await C($,{status:x.status});else if(j){let P=await Me($,E);if(!P.ok){let N=new Error(`HTTP redirect from ${w} ${P.error}`);throw N.status=x.status,N.retryable=!1,N}u&&P.addresses?.length&&(h||(h=await Fe(a?{importUndici:a}:{})),h&&(h.pin(new URL($).hostname,P.addresses),y=h.fetch))}w=$;continue}if(typeof c=="function")try{await c(x,{url:w})}catch(B){throw te(x),X(B?.message||String(B))}let L=await an(x,d,{url:w,onOversize:()=>_.abort()}),T=cn(L);if(!x.ok){let B=new Error(`HTTP ${x.status} ${r} ${w}`);throw B.status=x.status,B.retryAfter=x.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(w){if(_.signal.aborted&&!qe(p)){let O=w&&(typeof w=="object"||typeof w=="function")&&!q.isProxy(w)?w:null,A=O?Object.getOwnPropertyDescriptor(O,"oversize"):null;if(!(A&&Object.hasOwn(A,"value")&&A.value===!0))try{if(!O)throw new TypeError("unsafe rejection");Object.defineProperties(O,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let x=new Error("HTTP request timed out");throw Object.defineProperties(x,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),x}}throw w}finally{clearTimeout(g),h&&await h.close()}}async function we(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 R=Object.getOwnPropertyDescriptor(t,N);if(!(N==="toJSON"&&R&&Object.hasOwn(R,"value")&&R.value===void 0)){if(!r.has(N))throw new TypeError("HTTP options contain unknown fields");if(!R||!R.enumerable||!Object.hasOwn(R,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=N=>{if(t==null||!Object.hasOwn(t,N))return;let R=Object.getOwnPropertyDescriptor(t,N);if(!R||!Object.hasOwn(R,"value"))throw new TypeError("HTTP options must contain own data properties");return R.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 l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>be))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${be}`);if(u==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=u??"follow",f=d==="error"?0:l??be;for(let N of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let R=n(N);if(R!==void 0&&typeof R!="boolean")throw new TypeError(`HTTP ${N} must be boolean`)}let a=n("maxResponseBytes");if(a!==void 0&&(!Number.isInteger(a)||a<1||a>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let c=n("signal");if(c!==void 0){if(q.isProxy(c)||!(c instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{qe(c)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let N of["importUndici","lookupFn","validateResponse"]){let R=n(N);if(R!==void 0&&typeof R!="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||"GET").toUpperCase(),g=n("headers"),S=Jr(g),h=Object.assign(Object.create(null),S);Object.keys(h).some(N=>N.toLowerCase()==="accept")||(h.Accept="application/json");let y=n("body");y!=null&&typeof y!="string"&&(Object.keys(h).find(R=>R.toLowerCase()==="content-type")||(h["Content-Type"]="application/json"),y=Kr(y));let E=i??jr,C=n("lookupFn"),w=!p,O=n("untrustedUrl")===!0,A=n("sameOriginRedirectsOnly")===!0,I=n("importUndici"),x=n("validateResponse"),L=c,T=a??null,B=async()=>{let N;for(let R=0;R<=E;R++){L&&qr.call(L);try{return await un(e,{fetchImpl:m,method:_,headers:h,body:y,timeoutMs:b,lookupFn:C,realFetch:w,untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:A,importUndici:I,validateResponse:x,signal:L,redirectPolicy:d,maxRedirects:f})}catch(Q){N=Q;let ie=Le=>{if(!Q||typeof Q!="object"&&typeof Q!="function"||q.isProxy(Q))return;let ae=Object.getOwnPropertyDescriptor(Q,Le);return ae&&Object.hasOwn(ae,"value")?ae.value:void 0},$e=ie("status"),Rr=ie("oracleTimeout")===!0||ie("name")==="AbortError"||ie("name")==="TimeoutError"||qe(L),Pr=new Set([408,425,429]),kr=ie("retryable")===!1?!1:$e!=null?Pr.has($e)||Ur.has($e)&&pt.has(_):!Rr&&pt.has(_);if(R===E||!kr)throw Q;let ut=nn(R,ie("retryAfter"));L?await new Promise((Le,ae)=>{let Br=setTimeout(Le,ut);zr.call(L,"abort",()=>{clearTimeout(Br),ae(Gr(L)||new DOMException("Aborted","AbortError"))},{once:!0})}):await on(ut)}}throw N};if(!(n("dedupe")!==!1&&!L&&yt(_,y)))return B();let $=rn(_,e,h,{untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:A,redirectPolicy:d,maxRedirects:f,timeoutMs:b,retries:E,fetchImpl:he(m),realFetch:w,lookupFn:he(C),importUndici:he(I),validateResponse:he(x)},y),j=He.get($);if(j)return j;let P=B().finally(()=>He.delete($));return He.set($,P),P}var Ur,pt,jr,mt,Hr,Wr,qr,zr,ht,qe,Gr,Vr,be,Jo,W,He,bt,wt,en,tn,on,ze=v(()=>{dt();Ur=new Set([408,425,429,500,502,503,504]),pt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),jr=2,mt=4e3,Hr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Wr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qr=AbortSignal.prototype.throwIfAborted,zr=EventTarget.prototype.addEventListener,ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,qe=e=>e?Hr.call(e):!1,Gr=e=>e?Wr.call(e):void 0,Vr=new Set([301,302,303,307,308]),be=3,Jo=64*1024,W=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});He=new Map,bt=new WeakMap,wt=1;en=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),tn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);on=e=>new Promise(t=>setTimeout(t,e))});function Ve(e){return Et.get(Number(e))||null}function At(e,t=process.env){let r=Ve(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function xt(e){return Et.has(Number(e))}var Ge,Et,St=v(()=>{Ge={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}},Et=new Map(Object.values(Ge).map(e=>[e.chainId,e]))});var Pt={};lt(Pt,{PUBLIC_RPC_FALLBACKS:()=>Ke,erc20Allowance:()=>yn,erc20BalanceOf:()=>En,resolveRpcUrl:()=>ye,rpcBatch:()=>Nt,rpcBlockNumber:()=>Je,rpcCall:()=>D,rpcChainId:()=>bn,rpcGasPrice:()=>wn,rpcGetBalance:()=>gn,rpcHealth:()=>Rt,rpcHealthAll:()=>xn,transactionReceipt:()=>An});import{Interface as ln,getAddress as fn}from"ethers";function K(e,t){try{return fn(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function dn(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 Xe(e){return e==null?null:Number.parseInt(String(e),16)}function ye(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=At(e,r);return n||Ke[Number(e)]||null}function Ot(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!pn.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 mn(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Tt(e){if(e?.error)throw mn(e.error);return e?.result}function hn(e,t,r){return`${e}
|
|
2
|
+
var $r=Object.defineProperty;var D=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var lt=(e,t)=>{for(var r in t)$r(e,r,{get:t[r],enumerable:!0})};import ee from"node:net";import Lr from"node:dns";function me(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=f=>{if(!f)return[];let a=f.split(":"),c=a.at(-1);if(c?.includes(".")){let p=c.split(".").map(Number);if(p.length!==4||p.some(m=>!Number.isInteger(m)||m<0||m>255))return null;a.splice(a.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return a.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:a.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("::"),l=8-s.length-i.length;if(!u&&l!==0||u&&l<1)return null;let d=[...s,...Array(Math.max(0,l)).fill(0),...i];return d.length!==8?null:Uint8Array.from(d.flatMap(f=>[f>>8,f&255]))}function ve(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 De(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=me(e);if(!t)return!1;let r=me("::ffff:0:0");return ve(t,r,96)?De([...t.slice(12)].join(".")):ve(t,me("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>ve(t,me(o),s)):!1}return!1}function Dr(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(vr.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=ee.isIP(r);return n!==0&&!De(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Me(e,{lookupFn:t=Lr.promises.lookup}={}){let r=Dr(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family: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=>!De(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function Fe({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let a=await t();r=a.Agent,n=a.fetch}catch(a){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${a?.message||a}`);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=a=>String(a).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,i=a=>(Array.isArray(a)?a:[a]).map(c=>typeof c=="string"?{address:c}:c).filter(c=>c&&c.address).map(c=>({address:c.address,family:c.family||(ee.isIPv6(c.address)?6:4)})),u=(a,c,p)=>{s.set(o(a),i(typeof c=="string"?[{address:c,family:p}]:c))},l=a=>{let c=o(a);if(ee.isIP(c))return[{address:c,family:ee.isIPv6(c)?6:4}];let p=s.get(c);if(!p||!p.length)throw new Error(`refused: unpinned host ${a} during pinned fetch`);return p},d=new r({connect:{lookup(a,c,p){let m;try{m=l(a)}catch(b){return p(b)}return c?.all?p(null,m):p(null,m[0].address,m[0].family)}}}),f=Mr((a,c={})=>n(a,{...c,dispatcher:d}),u);return{dispatcher:d,fetch:f,pin:u,resolve:l,async close(){try{await d.destroy()}catch{}}}}function Mr(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[je]=Object.freeze({pin:t}),e}function Ue(e){return typeof e=="function"&&typeof e[je]?.pin=="function"}function ft(e,t,r){if(!Ue(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[je].pin(t,r)}var vr,je,dt=D(()=>{vr=new Set(["localhost","metadata.google.internal","metadata.goog"]);je=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Fr}from"node:crypto";import{types as q}from"node:util";function k(e){return X(`HTTP JSON body refused: ${e}`)}function Xr(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 q[t]=="function"&&q[t](e))}function Kr(e){let t=[],r=0,n=0,o=0,s=0,i=new WeakSet,u=f=>{if(r+=Buffer.byteLength(f,"utf8"),r>W.bytes)throw k("serialized byte limit exceeded");t.push(f)},l=f=>{if(Buffer.byteLength(f,"utf8")>W.bytes)throw k("serialized byte limit exceeded");return JSON.stringify(f)},d=(f,a)=>{if(n+=1,n>W.nodes)throw k("node limit exceeded");if(a>W.depth)throw k("depth limit exceeded");if(f===null){u("null");return}if(typeof f=="string"){u(l(f));return}if(typeof f=="boolean"){u(f?"true":"false");return}if(typeof f=="number"){if(!Number.isFinite(f))throw k("non-finite number");u(Object.is(f,-0)?"0":String(f));return}if(typeof f!="object")throw k("unsupported non-JSON value");if(q.isProxy(f))throw k("proxy value");if(Xr(f))throw k("unsupported exotic object");if(i.has(f))throw k("cyclic value");i.add(f);try{if(Object.getOwnPropertySymbols(f).length>0)throw k("symbol-keyed fields are unsupported");if(Array.isArray(f)){let m=Object.getPrototypeOf(f),b=0;for(;m!==null;){if(q.isProxy(m))throw k("proxy array prototype");if(b+=1,b>W.depth)throw k("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(f.length>W.arrayLength)throw k("array length limit exceeded");for(let g=0;g<f.length;g+=1){let S=Object.getOwnPropertyDescriptor(f,String(g));if(!S||!Object.hasOwn(S,"value")||S.enumerable!==!0)throw k("array entries must be dense enumerable own data")}let _=0;for(let g in f){if(s+=1,s>W.fields)throw k("enumeration limit exceeded");if(Object.hasOwn(f,g)&&(_+=1,_>f.length))throw k("named array fields are unsupported")}if(_!==f.length)throw k("array entries must be dense enumerable own data");u("[");for(let g=0;g<f.length;g+=1)g&&u(","),d(Object.getOwnPropertyDescriptor(f,String(g)).value,a+1);u("]");return}let c=Object.getPrototypeOf(f);if(c!==Object.prototype&&c!==null)throw k("non-plain object");let p=[];for(let m in f){if(s+=1,s>W.fields)throw k("enumeration limit exceeded");if(!Object.hasOwn(f,m))continue;if(o+=1,o>W.fields)throw k("field limit exceeded");let b=Object.getOwnPropertyDescriptor(f,m);if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw k("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(l(p[m][0])),u(":"),d(p[m][1],a+1);u("}")}finally{i.delete(f)}};return d(e,0),t.join("")}function Jr(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(q.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 Yr(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Zr(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 Qr(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function he(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=bt.get(e);return t||(t=wt,wt+=1,bt.set(e,t)),`reference:${t}`}function gt(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?en.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 yt(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(gt);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return gt(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&tn.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function rn(e,t,r,n={},o=null){let s=Fr("sha256"),i=(l,d)=>{let f=String(d);s.update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l),s.update("=").update(String(Buffer.byteLength(f,"utf8"))).update(":").update(f).update(`
|
|
3
|
+
`)};i("method",e),i("url",t),Object.keys(r||{}).map((l,d)=>({name:l.toLowerCase(),order:d,value:String(r[l])})).sort((l,d)=>l.name.localeCompare(d.name)||l.order-d.order).forEach((l,d)=>{i(`header-name-${d}`,l.name),i(`header-value-${d}`,l.value)}),i("body",o??"-");for(let l of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${l}`,n[l]??"-");return s.digest("hex")}function nn(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,mt):Math.min(250*2**e,mt)+Math.floor(Math.random()*100)}function X(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function We(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 sn(e){return e?e.byteLength??e.length??0:0}async function an(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 We(r,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let a=await e.text(),c=Buffer.byteLength(a,"utf8");if(c>t){if(!n)throw We(r,`body ${c} bytes`,t);return Buffer.from(a,"utf8").subarray(0,t).toString("utf8")}return a}let u=[],l=0,d=!1;try{for(;;){let{value:a,done:c}=await i.read();if(c)break;if(a&&(u.push(Buffer.from(a)),l+=sn(a),l>t)){d=!0;break}}}finally{if(d)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!n))throw We(r,`streamed ${l} bytes`,t);let f=Buffer.concat(u);return(d?f.subarray(0,t):f).toString("utf8")}function cn(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function un(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:i,realFetch:u,untrustedUrl:l=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:f=!1,importUndici:a,validateResponse:c,signal:p,redirectPolicy:m="follow",maxRedirects:b=be}){let _=new AbortController,g=setTimeout(()=>_.abort(),s),S=p?ht?ht([p,_.signal]):p:_.signal,h=null,y=t,E=i?{lookupFn:i}:{};if(l&&!u&&!Ue(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(w,{status:O=null}={})=>{let A=await Me(w,E);if(!A.ok)throw X(O==null?`HTTP refused ${w}: ${A.error}`:`HTTP redirect to ${w} ${A.error}`,O==null?{}:{status:O});let I=new URL(w).hostname;if(u){if(h&&(await h.close(),h=null),!h)try{h=await Fe({requireUndici:!0,...a?{importUndici:a}:{}})}catch(x){throw X(O==null?`HTTP refused ${w}: ${x?.message||x}`:`HTTP redirect to ${w} refused: ${x?.message||x}`,O==null?{}:{status:O})}h.pin(I,A.addresses),y=h.fetch}else ft(y,I,A.addresses);return A};try{let w=String(e),O=Object.assign(Object.create(null),n||{});l&&await C(w);for(let A=0;A<=b;A+=1){let I=Object.assign(Object.create(null),{method:r,headers:O,body:o,signal:S,redirect:"manual",dispatcher:void 0}),x=await y(w,I);if((m==="error"||b===0)&&x.status>=300&&x.status<400)throw te(x),X(`HTTP ${x.status} ${r} redirect refused`,{status:x.status,redirectRefused:!0});if(Vr.has(x.status)){let B=f===!0&&r==="POST"&&[307,308].includes(x.status)&&yt(r,o);if(r!=="GET"&&r!=="HEAD"&&!B){te(x);let P=new Error(`HTTP ${x.status} ${r} ${w} redirected non-idempotent request`);throw P.status=x.status,P}if(A===b)throw te(x),X(`HTTP ${x.status} ${r} redirect budget exhausted`,{status:x.status,redirectRefused:!0});let pe=x.headers?.get?.("location"),$;try{$=Zr(pe,w)}catch(P){throw te(x),P}let U=!Qr($,w);if(te(x),U&&r==="POST"){let P=new Error(`HTTP ${x.status} ${r} cross-origin redirect refused`);throw P.status=x.status,P}if(U&&f){let P=new Error(`HTTP ${x.status} ${r} cross-origin redirect refused`);throw P.status=x.status,P.retryable=!1,P}if(U&&(O=Yr(O)),l)await C($,{status:x.status});else if(U){let P=await Me($,E);if(!P.ok){let N=new Error(`HTTP redirect from ${w} ${P.error}`);throw N.status=x.status,N.retryable=!1,N}u&&P.addresses?.length&&(h||(h=await Fe(a?{importUndici:a}:{})),h&&(h.pin(new URL($).hostname,P.addresses),y=h.fetch))}w=$;continue}if(typeof c=="function")try{await c(x,{url:w})}catch(B){throw te(x),X(B?.message||String(B))}let L=await an(x,d,{url:w,onOversize:()=>_.abort()}),T=cn(L);if(!x.ok){let B=new Error(`HTTP ${x.status} ${r} ${w}`);throw B.status=x.status,B.retryAfter=x.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(w){if(_.signal.aborted&&!qe(p)){let O=w&&(typeof w=="object"||typeof w=="function")&&!q.isProxy(w)?w:null,A=O?Object.getOwnPropertyDescriptor(O,"oversize"):null;if(!(A&&Object.hasOwn(A,"value")&&A.value===!0))try{if(!O)throw new TypeError("unsafe rejection");Object.defineProperties(O,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let x=new Error("HTTP request timed out");throw Object.defineProperties(x,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),x}}throw w}finally{clearTimeout(g),h&&await h.close()}}async function we(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 R=Object.getOwnPropertyDescriptor(t,N);if(!(N==="toJSON"&&R&&Object.hasOwn(R,"value")&&R.value===void 0)){if(!r.has(N))throw new TypeError("HTTP options contain unknown fields");if(!R||!R.enumerable||!Object.hasOwn(R,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=N=>{if(t==null||!Object.hasOwn(t,N))return;let R=Object.getOwnPropertyDescriptor(t,N);if(!R||!Object.hasOwn(R,"value"))throw new TypeError("HTTP options must contain own data properties");return R.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 l=n("maxRedirects");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>be))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${be}`);if(u==="error"&&l!==void 0&&l!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=u??"follow",f=d==="error"?0:l??be;for(let N of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let R=n(N);if(R!==void 0&&typeof R!="boolean")throw new TypeError(`HTTP ${N} must be boolean`)}let a=n("maxResponseBytes");if(a!==void 0&&(!Number.isInteger(a)||a<1||a>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let c=n("signal");if(c!==void 0){if(q.isProxy(c)||!(c instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{qe(c)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let N of["importUndici","lookupFn","validateResponse"]){let R=n(N);if(R!==void 0&&typeof R!="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||"GET").toUpperCase(),g=n("headers"),S=Jr(g),h=Object.assign(Object.create(null),S);Object.keys(h).some(N=>N.toLowerCase()==="accept")||(h.Accept="application/json");let y=n("body");y!=null&&typeof y!="string"&&(Object.keys(h).find(R=>R.toLowerCase()==="content-type")||(h["Content-Type"]="application/json"),y=Kr(y));let E=i??Ur,C=n("lookupFn"),w=!p,O=n("untrustedUrl")===!0,A=n("sameOriginRedirectsOnly")===!0,I=n("importUndici"),x=n("validateResponse"),L=c,T=a??null,B=async()=>{let N;for(let R=0;R<=E;R++){L&&qr.call(L);try{return await un(e,{fetchImpl:m,method:_,headers:h,body:y,timeoutMs:b,lookupFn:C,realFetch:w,untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:A,importUndici:I,validateResponse:x,signal:L,redirectPolicy:d,maxRedirects:f})}catch(Q){N=Q;let ie=Le=>{if(!Q||typeof Q!="object"&&typeof Q!="function"||q.isProxy(Q))return;let ae=Object.getOwnPropertyDescriptor(Q,Le);return ae&&Object.hasOwn(ae,"value")?ae.value:void 0},$e=ie("status"),Rr=ie("oracleTimeout")===!0||ie("name")==="AbortError"||ie("name")==="TimeoutError"||qe(L),Pr=new Set([408,425,429]),kr=ie("retryable")===!1?!1:$e!=null?Pr.has($e)||jr.has($e)&&pt.has(_):!Rr&&pt.has(_);if(R===E||!kr)throw Q;let ut=nn(R,ie("retryAfter"));L?await new Promise((Le,ae)=>{let Br=setTimeout(Le,ut);zr.call(L,"abort",()=>{clearTimeout(Br),ae(Gr(L)||new DOMException("Aborted","AbortError"))},{once:!0})}):await on(ut)}}throw N};if(!(n("dedupe")!==!1&&!L&&yt(_,y)))return B();let $=rn(_,e,h,{untrustedUrl:O,maxResponseBytes:T,sameOriginRedirectsOnly:A,redirectPolicy:d,maxRedirects:f,timeoutMs:b,retries:E,fetchImpl:he(m),realFetch:w,lookupFn:he(C),importUndici:he(I),validateResponse:he(x)},y),U=He.get($);if(U)return U;let P=B().finally(()=>He.delete($));return He.set($,P),P}var jr,pt,Ur,mt,Hr,Wr,qr,zr,ht,qe,Gr,Vr,be,Zo,W,He,bt,wt,en,tn,on,ze=D(()=>{dt();jr=new Set([408,425,429,500,502,503,504]),pt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ur=2,mt=4e3,Hr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Wr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qr=AbortSignal.prototype.throwIfAborted,zr=EventTarget.prototype.addEventListener,ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,qe=e=>e?Hr.call(e):!1,Gr=e=>e?Wr.call(e):void 0,Vr=new Set([301,302,303,307,308]),be=3,Zo=64*1024,W=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});He=new Map,bt=new WeakMap,wt=1;en=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),tn=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);on=e=>new Promise(t=>setTimeout(t,e))});function Ve(e){return Et.get(Number(e))||null}function At(e,t=process.env){let r=Ve(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}function xt(e){return Et.has(Number(e))}var Ge,Et,St=D(()=>{Ge={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}},Et=new Map(Object.values(Ge).map(e=>[e.chainId,e]))});var Pt={};lt(Pt,{PUBLIC_RPC_FALLBACKS:()=>Ke,erc20Allowance:()=>yn,erc20BalanceOf:()=>En,resolveRpcUrl:()=>ye,rpcBatch:()=>Nt,rpcBlockNumber:()=>Je,rpcCall:()=>v,rpcChainId:()=>bn,rpcGasPrice:()=>wn,rpcGetBalance:()=>gn,rpcHealth:()=>Rt,rpcHealthAll:()=>xn,transactionReceipt:()=>An});import{Interface as ln,getAddress as fn}from"ethers";function K(e,t){try{return fn(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function dn(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 Xe(e){return e==null?null:Number.parseInt(String(e),16)}function ye(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=At(e,r);return n||Ke[Number(e)]||null}function Ot(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!pn.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 mn(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Tt(e){if(e?.error)throw mn(e.error);return e?.result}function hn(e,t,r){return`${e}
|
|
4
4
|
${t}
|
|
5
|
-
${JSON.stringify(r??[])}`}async function Ct(e,t,r){return we(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Nt(e,t,r={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>_t)throw new Error(`rpcBatch: at most ${_t} calls`);for(let s of t)Ot(s?.method);let n=ye(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 Ct(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,l)=>Tt(i.get(l+1)??s[l]))}}catch{}return Promise.all(t.map(s=>D(e,s.method,s.params||[],r)))}async function D(e,t,r=[],n={}){let o=String(t||""),s=Ot(o),i=ye(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 f=It.get(i);if(f!=null)return f}let l=n.dedupe!==!1&&!n.signal?hn(i,o,r):null;if(l&&ce.has(l))return ce.get(l);let d=(async()=>{let f=await Ct(i,{jsonrpc:"2.0",id:1,method:t,params:r},n),a=Tt(f);return s==="eth_chainid"&&typeof a=="string"&&It.set(i,a),a})();return l&&(ce.set(l,d),d.finally(()=>{ce.get(l)===d&&ce.delete(l)}).catch(()=>{})),d}async function Rt(e,t={}){let[r,n]=await Nt(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:Ve(e)?.name||null}}async function Je(e,t={}){let r=await D(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function bn(e,t={}){let r=await D(e,"eth_chainId",[],t);return parseInt(r,16)}async function wn(e,t={}){let r=await D(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function gn(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 yn(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=ge.encodeFunctionData("allowance",[o,s]),u=await D(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),l=ge.decodeFunctionResult("allowance",u),d=BigInt(l[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:d.toString(),allowanceHex:`0x${d.toString(16)}`,blockTag:e.blockTag||"latest"}}async function En(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=ge.encodeFunctionData("balanceOf",[o]),i=await D(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),u=ge.decodeFunctionResult("balanceOf",i),l=BigInt(u[0]);return{chainId:r,token:n,account:o,balance:l.toString(),balanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function An(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=dn(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=Xe(o.status),i=s===1,u=s===1?"success":s===0?"reverted":"unknown",l=i?null:u==="reverted"?"transaction reverted":"unknown receipt status",d=e.expectedTo?K(e.expectedTo,"expectedTo"):null,f=o.to?K(o.to,"receipt.to"):null;return d&&f!==d&&(i=!1,l=`to mismatch: expected ${d}, got ${f||"null"}`),{ok:i,chainId:r,txHash:n,status:u,reason:l,statusCode:s,to:f,from:o.from?K(o.from,"receipt.from"):null,blockNumber:Xe(o.blockNumber),transactionIndex:Xe(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function xn(e={}){let t=e.chainIds||Object.values(Ge).map(n=>n.chainId),r={};return await Promise.all(t.map(async n=>{if(!xt(n)&&!Ke[n]&&!ye(n,e)){r[n]={ok:!1,error:"no rpc configured",chainId:n};return}try{r[n]=await Rt(n,e)}catch(o){r[n]={ok:!1,chainId:n,error:String(o.message||o)}}})),r}var ge,Ke,pn,_t,ce,It,Ee=v(()=>{ze();St();ge=new ln(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Ke={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"};pn=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;_t=32,ce=new Map,It=new Map});var Xt=v(()=>{});function Kn(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 Jn(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Yn(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Gn).replace(/\/$/,"")}async function Zn(e,t={}){if(!e)throw new Error("tokenAddress required");return we(`${Yn(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Kt({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(Vn[Number(e)]||e),i=new Set(Xn(n).filter(Boolean).map(H)),u=[...new Set([t,r].map(c=>String(c)).filter(Boolean))],l=await Promise.allSettled(u.map(c=>Zn(c,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),d=new Set,f=[];for(let c of l)if(c.status==="fulfilled")for(let p of c.value?.pairs||c.value?.data?.pairs||[]){let m=`${H(p?.chainId)}:${H(p?.dexId)}:${H(p?.pairAddress)}`;d.has(m)||(d.add(m),f.push(p))}return f.filter(c=>H(c?.chainId)===s).filter(c=>Kn(c,t,r)).filter(c=>!i.size||i.has(H(c?.dexId))).map(c=>({pairAddress:c.pairAddress??null,dexId:c.dexId??null,chainId:c.chainId??null,liquidityUsd:Jn(c),pairCreatedAt:c.pairCreatedAt??null})).filter(c=>c.liquidityUsd!=null).sort((c,p)=>p.liquidityUsd-c.liquidityUsd)}var Gn,Vn,H,Xn,Jt=v(()=>{ze();Xt();Gn="https://api.dexscreener.com",Vn=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(),Xn=e=>Array.isArray(e)?e:e==null?[]:[e]});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 Yt(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 Zt=v(()=>{});var Qt=v(()=>{});import{createHash as As,createHmac as ro,timingSafeEqual as xs}from"node:crypto";function nt(e){return Array.isArray(e)?`[${e.map(nt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${nt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function no(e,{required:t=!1}={}){try{return Yt(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(nt(oo(e))).digest("hex")}:e}function rt(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function io(e){let t=e==null?er: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,er)}function ao({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=rt(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(rt(t,0))*2),l=Math.min(40,Math.floor(Math.max(0,rt(r,0))/5e3)*5),d=Math.max(25,Math.ceil(20+i+u+l)),f=io(o);return{mode:"auto",requiredBps:d,selectedBps:Math.min(d,f),capBps:f,executable:d<=f}}function co({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:u,quotedAtMs:l=Date.now(),ttlMs:d=tr,secret:f}={}){let a=BigInt(r??0);if(a<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let c=ao({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:u});if(!c.executable)throw new Error(`auto-slippage requires ${c.requiredBps} bps above hard/requested cap ${c.capBps}; route blocked`);let p=Number(l);if(!Number.isFinite(p))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(d)||tr)),b=a*BigInt(1e4-c.selectedBps),_=b/10000n;if(b%10000n!==0n&&(_+=1n),_>a&&(_=a),a>0n&&_<=0n)throw new Error(`auto-slippage: quote ${a} is too small to express a ${c.selectedBps} bps floor without rounding to zero`);let g=Number((a-_)*10000n/(a===0n?1n:a));if(g>c.capBps)throw new Error(`auto-slippage: realised floor implies ${g} bps, above cap ${c.capBps} \u2014 refusing to issue a guard weaker than advertised`);return so({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:a.toString(),minAmountOut:_.toString(),requiredBps:c.requiredBps,selectedBps:c.selectedBps,capBps:c.capBps,quotedAtMs:p,expiresAtMs:p+m},{secret:f})}function rr(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:u,quotedAtMs:l=Date.now(),ttlMs:d}={}){let f=co({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:u,quotedAtMs:l,ttlMs:d});return{...e,autoSlippage:f,amountOutMinimum:f.minAmountOut}}var er,tr,nr=v(()=>{Zt();Qt();er=100,tr=2e4});var Os,Ts,or=v(()=>{Os=300*1e3,Ts=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as ar,getAddress as Ie,isAddress as cr}from"ethers";function ho(e,t){let r=Number(e),n=fe[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(fe).join(", ")})`);let o=mo[r]||{};if(!t){if(!n.quoter||!n.router){let l=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${l})`)}return{chainId:r,venue:n.name,...n}}let s=String(t).toLowerCase();if(s===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let i=o,u=i[s];if(!u){let l=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${l})`)}return{chainId:r,venue:s,...n,quoter:u.quoter,router:u.router,feeTiers:u.feeTiers||null}}function ir(e,t){let r=fe[Number(t)];if(!e||e===fo||e===po||/^eth$/i.test(String(e)))return Ie(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ie(r.weth);if(/^usdc$/i.test(n))return Ie(r.usdc);if(!cr(n))throw new Error(`invalid token address: ${e}`);return Ie(n)}function bo(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 ur(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=ho(e.chainId??8453,e.venue),i=ir(e.tokenIn||"WETH",r),u=ir(e.tokenOut||fe[r].usdc,r),l=BigInt(e.amountIn??0);if(l<=0n)throw new Error("amountIn required (raw base units)");let d=s&&s.length?s:uo,f=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[d[Math.min(2,d.length-1)]]:[...d],c=await Promise.all(f.map(async w=>{let O=sr.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:u,amountIn:l,fee:w,sqrtPriceLimitX96:0n}]);try{let A=await D(r,"eth_call",[{to:n,data:O},"latest"],t);if(!A||A==="0x")return{fee:w,ok:!1,error:"empty result"};let I=sr.decodeFunctionResult("quoteExactInputSingle",A);return{fee:w,ok:!0,amountOut:I[0].toString(),sqrtPriceX96After:I[1].toString(),initializedTicksCrossed:Number(I[2]),gasEstimate:I[3].toString()}}catch(A){return{fee:w,ok:!1,error:String(A.message||A).slice(0,160)}}})),p=null;for(let w of c)w.ok&&(!p||BigInt(w.amountOut)>BigInt(p.amountOut))&&(p=w);if(!p){let w=c.map(O=>`${O.fee}:${O.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${w}`)}let m=e.liquidityUsd==null?await Kt({chainId:r,tokenA:i,tokenB:u,dexIds:bo(e.venue)},t).catch(()=>[]):[],b={};await Promise.all(m.slice(0,8).map(async w=>{if(!(!w.pairAddress||!cr(w.pairAddress)))try{let O=await D(r,"eth_call",[{to:w.pairAddress,data:lo},"latest"],t),A=O&&O!=="0x"&&O.length<=66?Number.parseInt(O,16):NaN;if(!Number.isFinite(A)||A<=0||A>1e6)return;let I=b[A];(I==null||w.liquidityUsd>I.liquidityUsd)&&(b[A]=w)}catch{}}));let _=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&_>0&&BigInt(p.amountOut)>0n){let w=BigInt(p.amountOut),A=c.filter(I=>I.ok&&Number((w-BigInt(I.amountOut))*10000n/w)<=_).filter(I=>b[I.fee]?.liquidityUsd!=null).sort((I,x)=>b[x.fee].liquidityUsd-b[I.fee].liquidityUsd)[0];A&&A.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:b[A.fee].liquidityUsd,bandBps:_},p=A)}let S=b[p.fee]??null,h=m[0]??null,y=S??h,E=e.liquidityUsd??S?.liquidityUsd??h?.liquidityUsd??null,C=e.liquidityUsd!=null?"caller":S?"pool":h?"pair":null;return rr({venue:"uniswap-v3",chainId:r,chain:fe[r].name,quoter:n,tokenIn:i,tokenOut:u,amountIn:l.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:E,liquiditySource:y,liquidityAttribution:C,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:c,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:E,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var fe,uo,lo,sr,Ds,fo,po,ot,mo,lr=v(()=>{Ee();Jt();nr();or();fe={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"}},uo=[100,500,3e3,1e4],lo="0xddca3f43",sr=new ar(["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)"]),Ds=new ar(["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)"]),fo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",po="0x0000000000000000000000000000000000000000",ot=[100,500,2500,1e4],mo={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var br={};lt(br,{ARB_UNI_FEE_TIERS:()=>hr,collectArbRoundTripCycles:()=>Eo});function st(e,{positive:t=!1}={}){return typeof e=="string"&&/^(?:0|[1-9][0-9]*)$/.test(e)&&(!t||e!=="0")&&BigInt(e)<=wo}function fr(e){if(!st(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 dr(e,t){let r=e?.amountOut;if(!st(r,{positive:!0}))throw new Error(`${t} returned an invalid amountOut`);return r}function pr(e,t){let r=e?.gasEstimate??e?.gasUnits;if(!st(r))throw new Error(`${t} returned invalid gas units`);return r}function Oe(e,t,r,n,o,s){return{status:"UNAVAILABLE",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:n,amountOutWei:null,gasUnits:null,source:o,error:String(s?.message||s)}}function mr(e){return`uniswap-v3-${e}`}async function go({entryFee:e,exitFee:t,amountInWei:r,blockTag:n,quoteUniswap:o}){let s=mr(e),i=mr(t),u;try{u=await o({chainId:de,tokenIn:"WETH",tokenOut:"USDC",amountIn:r,fee:e,tryFees:!1,blockTag:n})}catch(a){return Oe(s,i,r,null,{},a)}let l,d;try{l=dr(u,s),d=pr(u,s)}catch(a){return Oe(s,i,r,null,{entry:{venue:"uniswap-v3",fee:e}},a)}let f;try{f=await o({chainId:de,tokenIn:"USDC",tokenOut:"WETH",amountIn:l,fee:t,tryFees:!1,blockTag:n})}catch(a){return Oe(s,i,r,l,{entry:{venue:"uniswap-v3",fee:e}},a)}try{let a=dr(f,i),c=(BigInt(d)+BigInt(pr(f,i))).toString();return{status:"OK",entryVenue:s,exitVenue:i,amountInWei:r,intermediateAmountBase:l,amountOutWei:a,gasUnits:c,source:{entry:{venue:"uniswap-v3",fee:e},exit:{venue:"uniswap-v3",fee:t}}}}catch(a){return Oe(s,i,r,l,{entry:{venue:"uniswap-v3",fee:e},exit:{venue:"uniswap-v3",fee:t}},a)}}async function yo(e){let t=await D(de,"eth_gasPrice",[],e);return BigInt(t).toString()}async function Eo(e={}){let t=fr(e.amountInWei),r=e.quoteUniswap??(b=>ur(b,e)),n=e.getBlockNumber??(()=>Je(de,e)),o=e.getGasPriceWei??(()=>yo(e)),s=e.now??(()=>new Date().toISOString()),i=e.maxBlockDrift??1,u=Array.isArray(e.feeTiers)&&e.feeTiers.length?e.feeTiers.map(Number):[...hr];if(!Number.isSafeInteger(i)||i<0)throw new TypeError("maxBlockDrift must be a non-negative safe integer");for(let b of u)if(![100,500,3e3,1e4].includes(b))throw new TypeError(`unsupported Uni fee tier: ${b}`);let l=e.pinnedBlock??await n();if(!Number.isSafeInteger(l)||l<0)throw new Error("block provider returned invalid height");let d=`0x${l.toString(16)}`,f=fr(await o()),a=[];for(let b of u)for(let _ of u)b!==_&&a.push({entryFee:b,exitFee:_});let c=await Promise.all(a.map(({entryFee:b,exitFee:_})=>go({entryFee:b,exitFee:_,amountInWei:t,blockTag:d,quoteUniswap:r}))),p=await n();if(!Number.isSafeInteger(p)||p<0)throw new Error("block provider returned invalid height");let m=Math.abs(p-l);return{mode:"shadow",executionReady:!1,chainId:de,pair:"WETH-USDC",capturedAt:s(),amountInWei:t,blockStart:l,blockEnd:p,pinnedBlock:l,blockTag:d,blockConsistency:"PINNED",blockDrift:m,maxBlockDrift:i,stale:m>i,gasPriceWei:f,cycles:c,venueNote:"uniswap-v3-fee-tiers-only; camelot/pancake deferred"}}var de,wo,hr,wr=v(()=>{Ee();lr();de=42161,wo=(1n<<256n)-1n,hr=Object.freeze([100,500,3e3])});import{homedir as Do}from"node:os";import{isAbsolute as vo,join as Mo}from"node:path";var Ye=Object.freeze({premium:"0x074b2e43",provider:"0x0542975c",reserves:"0xd1946dbc"}),Bt=/^0x[0-9a-fA-F]{64}$/,Sn=/^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$/,_n=256,In=100;async function On(...e){let{rpcCall:t}=await Promise.resolve().then(()=>(Ee(),Pt));return t(...e)}function Ze(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ze(t);Object.freeze(e)}return e}var z=Ze({chainId:42161,pool:"0x794a61358D6845594F94dc1DB02A252b5b4814aD",addressesProvider:"0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb",WETH:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",USDC:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",requiredReserves:["0x82aF49447D8a07e3bd95BD0d56f35241523fBab1","0xaf88d065e77c8cC2239327C5EDb3A432268e5831"],observedPremiumBps:5});function Tn(e){if(typeof e!="string"||!Sn.test(e))throw new Error("malformed eth_blockNumber result");let t=BigInt(e);if(t>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed eth_blockNumber result: outside safe range");return Number(t)}function Cn(e,t){if(typeof e!="string"||!Bt.test(e))throw new Error(`malformed ${t} result`);return BigInt(e)}function $t(e,t){if(typeof e!="string"||!Bt.test(e)||e.slice(2,26)!=="0".repeat(24))throw new Error(`malformed ${t} result`);return`0x${e.slice(26).toLowerCase()}`}function Nn(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(_n)||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($t(i,"getReservesList address"))}return o}function kt(e,t,r,n){return Ze({mode:"shadow",executionReady:!1,status:e,chainId:z.chainId,block:t,premiumBps:r,reasons:n})}async function Lt(e={}){let t=e.rpc??On;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=Tn(o);let s=a=>t(z.chainId,"eth_call",[{to:z.pool,data:a},o],e),i=Cn(await s(Ye.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=$t(await s(Ye.provider),"ADDRESSES_PROVIDER"),l=Nn(await s(Ye.reserves)),d=[];n>In?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 f=new Set(l);for(let[a,c]of[["WETH",z.WETH],["USDC",z.USDC]])f.has(c.toLowerCase())||d.push(`${a} required reserve is missing`);return kt(d.length===0?"AVAILABLE":"MISMATCH",r,n,d)}catch(o){return kt("UNAVAILABLE",r,n,[String(o?.message||o)])}}var Rn=/^(?:0|[1-9][0-9]*)$/,Dt=10000n,Qe=(1n<<256n)-1n;function M(e,t="value"){let r;if(typeof e=="bigint"&&e>=0n)r=e;else if(typeof e=="string"&&Rn.test(e))r=BigInt(e);else throw new TypeError(`${t} must be a non-negative plain decimal string or bigint`);if(r>Qe)throw new RangeError(`${t} must fit uint256`);return r}function Ae(e,t){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?BigInt(e):M(e,t)}function Pn(e,t){let r=M(e,"amount"),n=Ae(t,"basisPoints");if(n>Dt)throw new RangeError("basisPoints must be at most 10000");let o=r*n;return o===0n?0n:(o-1n)/Dt+1n}function ue(e){if(typeof e!="bigint")throw new TypeError("value must be a bigint");return e.toString(10)}function vt(e,t){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`${t} must be an object`);return e}function Mt(e){for(let t of Object.values(e))t!==null&&typeof t=="object"&&!Object.isFrozen(t)&&Mt(t);return Object.freeze(e)}function Ft(e,t){vt(e,"cycle"),vt(t,"policy");let r=M(e.amountInWei,"cycle.amountInWei"),n=M(e.amountOutWei,"cycle.amountOutWei"),o=Ae(e.gasUnits,"cycle.gasUnits"),s=M(e.gasPriceWei,"cycle.gasPriceWei"),i=Ae(t.loanPremiumBps,"policy.loanPremiumBps"),u=M(t.builderFeeWei,"policy.builderFeeWei"),l=M(t.extraCostWei,"policy.extraCostWei"),d=M(t.minProfitWei,"policy.minProfitWei"),f=M(t.maxGasWei,"policy.maxGasWei"),a=M(t.maxLoanWei,"policy.maxLoanWei");Ae(t.maxBlockDrift,"policy.maxBlockDrift");let c=n-r,p=o*s;if(p>Qe)throw new RangeError("gas cost must fit uint256");let m=Pn(r,i),b=p+m+u+l;if(b>Qe)throw new RangeError("total cost must fit uint256");let _=c-b,g=_>=d&&p<=f&&r<=a;return Mt({grossProfitWei:ue(c),gasCostWei:ue(p),loanPremiumWei:ue(m),totalCostWei:ue(b),netProfitWei:ue(_),status:g?"PROFITABLE":"UNPROFITABLE",executionReady:!1,mode:"shadow"})}var kn=/^(?:0|[1-9][0-9]*)$/,Bn=(1n<<256n)-1n;function le(e){let t=null;return typeof e=="bigint"&&e>=0n&&(t=e),typeof e=="string"&&kn.test(e)&&(t=BigInt(e)),t!==null&&t<=Bn?t:null}function xe(e){return typeof e=="string"&&e.length>0?e:null}function et(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 $n(e){return Object.freeze(e.reasonCodes),Object.freeze(e)}function Ut(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=xe(o.chainId),l=xe(i.chainId),d=xe(o.lender),f=xe(o.strategy),a=et(s.supportedChainIds),c=et(s.allowedLenders),p=et(s.allowedStrategies);u||F(n,"chainId"),l||F(n,"opts.chainId"),u&&l&&u!==l&&n.push("CHAIN_MISMATCH"),a?(!u||!a.includes(u))&&n.push("UNSUPPORTED_CHAIN"):F(n,"supportedChainIds"),d||F(n,"lender"),c?(!d||!c.includes(d))&&n.push("LENDER_NOT_ALLOWED"):F(n,"allowedLenders"),f||F(n,"strategy"),p?(!f||!p.includes(f))&&n.push("STRATEGY_NOT_ALLOWED"):F(n,"allowedStrategies");let m=le(o.blockNumber),b=le(i.currentBlock),_=le(s.maxBlockDrift);m===null&&F(n,"blockNumber"),b===null&&F(n,"opts.currentBlock"),_===null&&F(n,"maxBlockDrift"),m!==null&&b!==null&&_!==null&&(m>b||b-m>_)&&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,E)=>y<E],["gasCostWei","maxGasWei","GAS_LIMIT_EXCEEDED",(y,E)=>y>E],["builderFeeWei","maxBuilderFeeWei","BUILDER_FEE_EXCEEDED",(y,E)=>y>E],["loanPremiumWei","maxLoanPremiumWei","LOAN_PREMIUM_EXCEEDED",(y,E)=>y>E],["loanAmountWei","maxLoanWei","LOAN_LIMIT_EXCEEDED",(y,E)=>y>E]],S={};for(let[y,E,C,w]of g){let O=le(o[y]),A=le(s[E]);S[y]=O,O===null&&F(n,y),A===null&&F(n,E),O!==null&&A!==null&&w(O,A)&&n.push(C)}i.armed!==!1&&n.push("NOT_DISARMED");let h={status:n.length===0?"ELIGIBLE":"BLOCKED",reasonCodes:[...new Set(n)],executionReady:!1,mode:"shadow"};return u&&(h.chainId=u),d&&(h.lender=d),f&&(h.strategy=f),m!==null&&(h.blockNumber=m.toString(10)),S.realizedProfitWei!==null&&(h.realizedProfitWei=S.realizedProfitWei.toString(10)),$n(h)}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 Se(e){return e instanceof Error&&e.message?e.message.slice(0,300):String(e||"unknown error").slice(0,300)}function Ln(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 Dn(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 jt({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,l=0,d=0,f=null,a=[];function c(){return J({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,running:i!==null,inFlight:u,ticks:l,failures:d,lastError:f})}async function p(){if(u)return J({ok:!1,skipped:"overlap"});u=!0;let h=s(),y=[],E=[],C=[],w=[],O=[];try{try{let I=await e();if(!Array.isArray(I))throw new Error("collectCycles must return an array");O=I}catch(I){y.push({stage:"collect",message:Se(I)})}for(let I=0;I<O.length;I+=1){let x=O[I],L=Ln(x,I);E.push({id:L});try{let T=await t(x,n),B={...T,cycleId:T?.cycleId??L};C.push(B),Dn(T,n)&&w.push({...B,profitable:!0})}catch(T){y.push({stage:"evaluate",cycleId:L,message:Se(T)})}}let A={id:`shadow-${h}-${l+1}`,observedAt:h,cyclesEvaluated:O.length,cycles:E,candidates:C,opportunities:w,errors:y};try{await r.append(A)}catch(I){y.push({stage:"persist",message:Se(I)})}return l+=1,y.length?(d+=1,f=y.map(I=>I.message).join("; ")):f=null,a=r.latest()?.opportunities??J(structuredClone(w)),J({ok:y.length===0,observation:r.latest()??A})}catch(A){return l+=1,d+=1,f=Se(A),J({ok:!1,error:f})}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 _({timeoutMs:h=3e4}={}){if(!Number.isInteger(h)||h<=0)throw new Error("timeoutMs must be a positive integer");let y=Date.now()+h;for(;u;){if(Date.now()>=y)throw new Error("shadow engine drain timed out");await new Promise(E=>setTimeout(E,5))}return typeof r.drain=="function"&&await r.drain(),!0}function g(){return r.latest()}function S(){return J(structuredClone(a))}return J({tick:p,start:m,stop:b,drain:_,status:c,latest:g,opportunities:S})}import{mkdir as vn,open as Ht,readFile as Wt,rename as Mn,unlink as Fn}from"node:fs/promises";import{dirname as Un,basename as jn,join as Hn}from"node:path";var Wn=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 tt(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 qn(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 qt(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 zt(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=tt(e[r]);n!==void 0&&(t[r]=n)}for(let r of["amountInWei","amountOutWei","gasUnits","gasCostWei","loanPremiumWei","totalCostWei"]){let n=qt(e[r]);n!==void 0&&(t[r]=n)}for(let r of["grossProfitWei","netProfitWei"]){let n=qt(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 Gt(e,t){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=tt(r.observedAt)??tt(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(zt).filter(Boolean):[],u=Array.isArray(r.candidates)?r.candidates.map(zt).filter(Boolean):[],l=Array.isArray(r.errors)?r.errors.map(qn).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:l}}function Vt({filePath:e,maxRecords:t=Wn,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 Wt(g,"utf8")),h=Array.isArray(S)?S:S?.records;if(!Array.isArray(h))throw new Error("shadow store payload is malformed");return h.map(y=>Gt(y,r)).slice(-t)}async function l(){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(h){if(h?.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 f(g,S){let h=Un(g),y=Hn(h,`.${jn(g)}.${process.pid}.${Date.now()}.${d+=1}.tmp`);await vn(h,{recursive:!0,mode:448});let E;try{E=await Ht(y,"wx",384),await E.writeFile(S,"utf8"),await E.sync(),await E.close(),E=null,await Mn(y,g);let C=await Ht(h,"r");try{await C.sync()}finally{await C.close()}}finally{E&&await E.close().catch(()=>{}),await Fn(y).catch(()=>{})}}async function a(g){try{let S=await Wt(e,"utf8"),h=JSON.parse(S);if(!Array.isArray(h)&&!Array.isArray(h?.records))throw new Error("shadow store payload is malformed");await f(`${e}.bak`,S)}catch(S){if(S?.code!=="ENOENT")throw new Error("refusing to overwrite corrupted shadow store")}await f(e,`${JSON.stringify({version:1,records:g})}
|
|
6
|
-
`)}async function c(g){let S=Gt(g,r),h=s.then(async()=>{let y=[...o,S].slice(-t);return n&&await a(y),o=y,re(structuredClone(S))});return s=h.catch(()=>{}),h}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 _(){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:c,record:c,load:l,drain:p,list:m,latest:b,stats:_})}var Ao=/^(?:0|[1-9][0-9]*)$/,Te="42161",gr="arbitrum",yr="WETH-USDC",Ce="arb-weth-usdc-uni-fee-round-trip",Ne="aave-v3";async function xo(e){let{collectArbRoundTripCycles:t}=await Promise.resolve().then(()=>(wr(),br));return t(e)}function G(e,t,{positive:r=!1}={}){if(typeof e!="string"||!Ao.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 it(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 So(e){return String(e?.message||e||"unknown provider failure").slice(0,300)}function Er(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"),l=it(e.intervalMs,"intervalMs",1,864e5),d=it(e.maxBlockDrift,"maxBlockDrift",0,1e3),f=it(e.maxRecords,"maxRecords",1,1e5),a=e.dependencies??{},c=e.collectCycles??a.collectArbRoundTripCycles??xo,p=e.readLenderState??a.readArbAaveLenderState??Lt,m=e.evaluateEconomics??a.evaluateCycleEconomics??Ft,b=e.evaluateEligibility??a.evaluateFlashLoanCandidate??Ut,_=e.createEngine??a.createShadowEngine??jt,g=e.createStore??a.createShadowStore??Vt;for(let[T,B]of Object.entries({collect:c,readLender:p,evaluateEconomics:m,evaluateEligibility:b,makeEngine:_,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:f,now:e.now??Date.now}),h=[],y=null,E=null,C=null,w=U({async append(T){return await S.append(T),h=[...h,U(Y(T))].slice(-f),U(Y(T))},async drain(){return typeof S.drain=="function"&&await S.drain(),!0},latest(){return h.length?U(Y(h.at(-1))):null}});async function O(){try{C=await p(e.lenderOptions??e)}catch(T){C={status:"UNAVAILABLE",block:null,premiumBps:null,reasons:[So(T)]}}if(y=U(Y(C)),!C||C.status!=="AVAILABLE")throw new Error(`lender ${C?.status?.toLowerCase()||"unavailable"}: ${(C?.reasons||[]).join("; ")}`);if(!Number.isSafeInteger(C.block)||!Number.isSafeInteger(C.premiumBps)||C.premiumBps<0)throw new Error("lender returned malformed live state");if(E=await c({...e.collectorOptions,amountInWei:t,maxBlockDrift:d,pinnedBlock:C.block}),!E||!Array.isArray(E.cycles))throw new Error("quote provider returned malformed snapshot");if(E.stale===!0||E.blockDrift>d)throw new Error("stale quote snapshot");if(!Number.isSafeInteger(E.blockEnd)||Math.abs(E.blockEnd-C.block)>d)throw new Error("stale lender snapshot relative to quotes");return G(E.gasPriceWei,"quoteSnapshot.gasPriceWei",{positive:!0}),E.cycles}async function A(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(),pe={...T,gasUnits:B,gasPriceWei:E.gasPriceWei},$=await m(pe,{loanPremiumBps:C.premiumBps,builderFeeWei:s,extraCostWei:i,minProfitWei:r,maxGasWei:o,maxLoanWei:n,maxBlockDrift:d}),j=await b({chainId:Te,lender:Ne,strategy:Ce,blockNumber:String(E.blockEnd),realizedProfitWei:$.netProfitWei.startsWith("-")?"0":$.netProfitWei,gasCostWei:$.gasCostWei,builderFeeWei:s,loanPremiumWei:$.loanPremiumWei,loanAmountWei:T.amountInWei},{supportedChainIds:[Te],allowedLenders:[Ne],allowedStrategies:[Ce],maxBlockDrift:String(d),minRealizedProfitWei:r,maxGasWei:o,maxBuilderFeeWei:s,maxLoanPremiumWei:$.loanPremiumWei,maxLoanWei:n},{chainId:Te,currentBlock:String(E.blockEnd),armed:!1}),P=[...new Set([...j.reasonCodes,"L1_DATA_FEE_NOT_MODELED","EXECUTOR_GAS_NOT_SIMULATED","LENDER_LIQUIDITY_NOT_CHECKED","CROSS_VENUE_CAMELOT_PANCAKE_NOT_QUOTED",...E.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:gr,pair:yr,strategy:Ce,lender:Ne,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:E.blockConsistency??"RANGE_ONLY",profitable:N,executionReady:!1,mode:"shadow"})}let I=_({collectCycles:O,evaluateCycle:A,store:w,policy:{isProfitable:T=>T?.profitable===!0},intervalMs:l,now:e.now??Date.now});async function x(){let T=await S.load();return h=Y(T).slice(-f),U(Y(h))}function L(){return U({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,chain:gr,chainId:Te,pair:yr,strategy:Ce,lender:Ne,...I.status(),lastProviderState:U(Y(y))})}return U({load:x,tick:I.tick,start:I.start,stop:I.stop,drain:I.drain,status:L,latest:w.latest,opportunities:()=>U(Y(w.latest()?.opportunities??[]))})}import{createServer as To}from"node:http";var Gs=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Vs=Object.freeze(["read","simulate"]);var Xs=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}},_o=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Io=Object.freeze(["privkey","wif","xprv","seed"]);function at(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return _o.test(t)||Io.includes(r)}var Ar=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}]),xr=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Oo(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>xr.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function Sr(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=Oo(t);for(let{rule:o,re:s}of Ar)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&&at(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=xr.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:s,re:i}of Ar)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"&&at(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(at(o))throw new V(`${t}.${o}`,"forbidden-key-name");oe(s,`${t}.${o}`,r,o)}return e}var _r=null,Co="127.0.0.1",No=8798,Ro=1e6,Po='{"error":"redacted"}',ko=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 Bo(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 $o(e){if(!e||["status","latest","opportunities"].some(t=>typeof e[t]!="function"))throw new Error("runtime must provide status(), latest(), and opportunities()")}function Lo(e){typeof _r=="function"&&_r(e),oe(e);let t=Sr(e);if(Buffer.byteLength(t)>Ro)throw new Error("response too large");return t}function Z(e,t,r){let n,o=t;try{n=Lo(r)}catch{o=500,n=Po}e.writeHead(o,{...ko,"content-length":Buffer.byteLength(n)}),e.end(n)}function Ir({runtime:e,host:t=Co,port:r=No}={}){if($o(e),typeof t!="string")throw new Error("host must be a loopback address");if(Bo(t),!Number.isInteger(r)||r<0||r>65535)throw new Error("port must be an integer between 0 and 65535");function n(){let a=e.status(),c=Number.isSafeInteger(a?.ticks)?a.ticks:0,p=typeof a?.lastProviderState?.status=="string"?a.lastProviderState.status:"UNKNOWN",m=a?.running===!0&&c>0&&a?.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:c,provider:p}}}let o=new Map([["/status",()=>e.status()],["/latest",()=>e.latest()],["/opportunities",()=>e.opportunities()]]);async function s(a,c){if(a.method!=="GET"){Z(c,405,{error:"method-not-allowed"});return}let p;try{p=new URL(a.url||"/","http://localhost").pathname}catch{Z(c,404,{error:"not-found"});return}if(p==="/health"){try{let b=n();Z(c,b.httpStatus,b.body)}catch{Z(c,503,{error:"redacted"})}return}let m=o.get(p);if(!m){Z(c,404,{error:"not-found"});return}try{Z(c,200,await m())}catch{Z(c,500,{error:"redacted"})}}let i=To((a,c)=>{s(a,c).catch(()=>{c.headersSent?c.destroy():Z(c,500,{error:"redacted"})})}),u=null;function l(){let a=i.address();return a&&typeof a=="object"?{address:a.address,family:a.family,port:a.port}:null}function d(){return i.listening?Promise.resolve(l()):u||(u=new Promise((a,c)=>{let p=b=>{i.off("listening",m),u=null,c(b)},m=()=>{i.off("error",p);let b=l();u=null,a(b)};i.once("error",p),i.once("listening",m),i.listen(r,t)}),u)}async function f(){if(u)try{await u}catch{return!1}return i.listening?(await new Promise((a,c)=>i.close(p=>p?c(p):a())),!0):!1}return Object.freeze({start:d,stop:f,address:l,handler:s})}var Or=/^(?:0|[1-9][0-9]*)$/,Fo=/^127(?:\.\d{1,3}){3}$/,Uo=(1n<<256n)-1n;function Pe(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Pe(t);Object.freeze(e)}return e}function ct(e,t){let r=String(e??"").trim().toLowerCase();if(!["","0","false","off"].includes(r))throw new Error(`${t} must remain disarmed for the arb paper shadow service`)}function jo(e){return e==="localhost"||e==="::1"?!0:Fo.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(!Or.test(o)||n&&o==="0")throw new TypeError(`${t} must be ${n?"a positive":"a non-negative"} decimal string`);if(BigInt(o)>Uo)throw new RangeError(`${t} must fit uint256`);return o}function Re(e,t,r,n,o,s){let i=String(e[t]??r);if(!Or.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 Ho(e=process.env){ct(e.ORACLE_EXECUTE_ENABLED,"ORACLE_EXECUTE_ENABLED"),ct(e.MAD_EXECUTE_ENABLED,"MAD_EXECUTE_ENABLED"),ct(e.ORACLE_MEV_EXECUTE_ENABLED,"ORACLE_MEV_EXECUTE_ENABLED");let t=String(e.ORACLE_MEV_ARB_SHADOW_HOST??"127.0.0.1").trim();if(!jo(t))throw new Error("ORACLE_MEV_ARB_SHADOW_HOST must be loopback-only");let r=String(e.HOME||Do()),n=String(e.ORACLE_MEV_ARB_SHADOW_STATE??Mo(r,".local/state/oracle/mev-arb-shadow/observations.json"));if(!vo(n))throw new Error("ORACLE_MEV_ARB_SHADOW_STATE must be an absolute path");let o=String(e.ORACLE_MEV_ARB_SHADOW_PERSIST??"1").trim();if(!["0","1"].includes(o))throw new Error("persist must be 0 or 1");return Pe({host:t,port:Re(e,"ORACLE_MEV_ARB_SHADOW_PORT","8809",0,65535,"port"),intervalMs:Re(e,"ORACLE_MEV_ARB_SHADOW_INTERVAL_MS","15000",1e3,864e5,"intervalMs"),amountInWei:se(e,"ORACLE_MEV_ARB_SHADOW_AMOUNT_IN_WEI","1000000000000000000",{positive:!0}),minProfitWei:se(e,"ORACLE_MEV_ARB_SHADOW_MIN_PROFIT_WEI","10000000000000"),maxLoanWei:se(e,"ORACLE_MEV_ARB_SHADOW_MAX_LOAN_WEI","5000000000000000000",{positive:!0}),maxGasWei:se(e,"ORACLE_MEV_ARB_SHADOW_MAX_GAS_WEI","500000000000000"),builderFeeWei:se(e,"ORACLE_MEV_ARB_SHADOW_BUILDER_FEE_WEI","0"),extraCostWei:se(e,"ORACLE_MEV_ARB_SHADOW_EXTRA_COST_WEI","0"),extraGasUnits:se(e,"ORACLE_MEV_ARB_SHADOW_EXTRA_GAS_UNITS","250000"),maxBlockDrift:Re(e,"ORACLE_MEV_ARB_SHADOW_MAX_BLOCK_DRIFT","40",0,1e3,"maxBlockDrift"),maxRecords:Re(e,"ORACLE_MEV_ARB_SHADOW_MAX_RECORDS","500",1,1e5,"maxRecords"),filePath:n,persist:o==="1"})}function Tr({env:e=process.env,runtimeFactory:t=Er,serverFactory:r=Ir}={}){if(typeof t!="function"||typeof r!="function")throw new TypeError("runtimeFactory and serverFactory must be functions");let n=Ho(e),o=t(n),s=r({runtime:o,host:n.host,port:n.port}),i=null,u=null;async function l(){return i||u||(u=(async()=>{let a=!1;try{await o.load();let c=await o.tick();o.start(),a=!0;let p=await s.start();return i=Pe({mode:"shadow",chain:"arbitrum",chainId:42161,execution:!1,signer:!1,broadcaster:!1,address:p,initialTick:c}),i}catch(c){try{await s.stop()}catch{}if(a)try{o.stop(),typeof o.drain=="function"&&await o.drain()}catch{}throw c}finally{u=null}})(),u)}async function d(){if(u)try{await u}catch{}if(!i)return!1;let a=null;try{await s.stop()}catch(c){a=c}if(o.stop(),typeof o.drain=="function"&&await o.drain(),i=null,a)throw a;return!0}function f(){return Pe({mode:"shadow",chain:"arbitrum",chainId:42161,execution:!1,signer:!1,broadcaster:!1,listening:!!i,address:s.address(),runtime:o.status()})}return Object.freeze({start:l,stop:d,status:f,config:n})}var ke="oracle-mev-arb-shadow";function Be(e,t){e.write(`${JSON.stringify(t)}
|
|
5
|
+
${JSON.stringify(r??[])}`}async function Ct(e,t,r){return we(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Nt(e,t,r={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>_t)throw new Error(`rpcBatch: at most ${_t} calls`);for(let s of t)Ot(s?.method);let n=ye(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 Ct(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,l)=>Tt(i.get(l+1)??s[l]))}}catch{}return Promise.all(t.map(s=>v(e,s.method,s.params||[],r)))}async function v(e,t,r=[],n={}){let o=String(t||""),s=Ot(o),i=ye(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 f=It.get(i);if(f!=null)return f}let l=n.dedupe!==!1&&!n.signal?hn(i,o,r):null;if(l&&ce.has(l))return ce.get(l);let d=(async()=>{let f=await Ct(i,{jsonrpc:"2.0",id:1,method:t,params:r},n),a=Tt(f);return s==="eth_chainid"&&typeof a=="string"&&It.set(i,a),a})();return l&&(ce.set(l,d),d.finally(()=>{ce.get(l)===d&&ce.delete(l)}).catch(()=>{})),d}async function Rt(e,t={}){let[r,n]=await Nt(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:Ve(e)?.name||null}}async function Je(e,t={}){let r=await v(e,"eth_blockNumber",[],t);return parseInt(r,16)}async function bn(e,t={}){let r=await v(e,"eth_chainId",[],t);return parseInt(r,16)}async function wn(e,t={}){let r=await v(e,"eth_gasPrice",[],t);if(r==null)return null;try{return BigInt(r)}catch{return null}}async function gn(e,t,r={}){if(!t)throw new Error("rpcGetBalance requires address");let n=await v(e,"eth_getBalance",[t,"latest"],r);return{chainId:Number(e),address:t,balanceWei:BigInt(n).toString(),balanceHex:n}}async function yn(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=ge.encodeFunctionData("allowance",[o,s]),u=await v(r,"eth_call",[{to:n,data:i},e.blockTag||"latest"],t),l=ge.decodeFunctionResult("allowance",u),d=BigInt(l[0]);return{chainId:r,token:n,owner:o,spender:s,allowance:d.toString(),allowanceHex:`0x${d.toString(16)}`,blockTag:e.blockTag||"latest"}}async function En(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=ge.encodeFunctionData("balanceOf",[o]),i=await v(r,"eth_call",[{to:n,data:s},e.blockTag||"latest"],t),u=ge.decodeFunctionResult("balanceOf",i),l=BigInt(u[0]);return{chainId:r,token:n,account:o,balance:l.toString(),balanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function An(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=dn(e.txHash||e.hash||e.transactionHash),o=await v(r,"eth_getTransactionReceipt",[n],t);if(!o)return{ok:!1,chainId:r,txHash:n,status:"pending",receipt:null,reason:"receipt pending"};let s=Xe(o.status),i=s===1,u=s===1?"success":s===0?"reverted":"unknown",l=i?null:u==="reverted"?"transaction reverted":"unknown receipt status",d=e.expectedTo?K(e.expectedTo,"expectedTo"):null,f=o.to?K(o.to,"receipt.to"):null;return d&&f!==d&&(i=!1,l=`to mismatch: expected ${d}, got ${f||"null"}`),{ok:i,chainId:r,txHash:n,status:u,reason:l,statusCode:s,to:f,from:o.from?K(o.from,"receipt.from"):null,blockNumber:Xe(o.blockNumber),transactionIndex:Xe(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function xn(e={}){let t=e.chainIds||Object.values(Ge).map(n=>n.chainId),r={};return await Promise.all(t.map(async n=>{if(!xt(n)&&!Ke[n]&&!ye(n,e)){r[n]={ok:!1,error:"no rpc configured",chainId:n};return}try{r[n]=await Rt(n,e)}catch(o){r[n]={ok:!1,chainId:n,error:String(o.message||o)}}})),r}var ge,Ke,pn,_t,ce,It,Ee=D(()=>{ze();St();ge=new ln(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Ke={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"};pn=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;_t=32,ce=new Map,It=new Map});var Xt=D(()=>{});function Kn(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 Jn(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Yn(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Gn).replace(/\/$/,"")}function Zn(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 Qn(e,t){return we(`${Yn(t)}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function eo(e,t={}){return Qn(`/latest/dex/tokens/${Zn(e,"tokenAddress")}`,t)}async function Kt({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(Vn[Number(e)]||e),i=new Set(Xn(n).filter(Boolean).map(H)),u=[...new Set([t,r].map(c=>String(c)).filter(Boolean))],l=await Promise.allSettled(u.map(c=>eo(c,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),d=new Set,f=[];for(let c of l)if(c.status==="fulfilled")for(let p of c.value?.pairs||c.value?.data?.pairs||[]){let m=`${H(p?.chainId)}:${H(p?.dexId)}:${H(p?.pairAddress)}`;d.has(m)||(d.add(m),f.push(p))}return f.filter(c=>H(c?.chainId)===s).filter(c=>Kn(c,t,r)).filter(c=>!i.size||i.has(H(c?.dexId))).map(c=>({pairAddress:c.pairAddress??null,dexId:c.dexId??null,chainId:c.chainId??null,liquidityUsd:Jn(c),pairCreatedAt:c.pairCreatedAt??null})).filter(c=>c.liquidityUsd!=null).sort((c,p)=>p.liquidityUsd-c.liquidityUsd)}var Gn,Vn,H,Xn,Jt=D(()=>{ze();Xt();Gn="https://api.dexscreener.com",Vn=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(),Xn=e=>Array.isArray(e)?e:e==null?[]:[e]});import{readFileSync as to}from"node:fs";import{homedir as ro}from"node:os";import{join as _e}from"node:path";function no(){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=ro();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 Yt(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of no())try{let s=to(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 Zt=D(()=>{});var Qt=D(()=>{});import{createHash as Ss,createHmac as oo,timingSafeEqual as _s}from"node:crypto";function nt(e){return Array.isArray(e)?`[${e.map(nt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${nt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function so(e,{required:t=!1}={}){try{return Yt(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function io(e){let{signature:t,...r}=e;return r}function ao(e,{secret:t}={}){let r=so(t);return r?{...e,signature:oo("sha256",r).update(nt(io(e))).digest("hex")}:e}function rt(e,t=0){let r=Number(e);return Number.isFinite(r)?r:t}function co(e){let t=e==null?er: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,er)}function uo({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:r=0,crossChain:n=!1,requestedCapBps:o}={}){let s=rt(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(rt(t,0))*2),l=Math.min(40,Math.floor(Math.max(0,rt(r,0))/5e3)*5),d=Math.max(25,Math.ceil(20+i+u+l)),f=co(o);return{mode:"auto",requiredBps:d,selectedBps:Math.min(d,f),capBps:f,executable:d<=f}}function lo({chainId:e,venue:t,quoteAmountOut:r,liquidityUsd:n,priceChange5m:o=0,quoteAgeMs:s=0,crossChain:i=!1,requestedCapBps:u,quotedAtMs:l=Date.now(),ttlMs:d=tr,secret:f}={}){let a=BigInt(r??0);if(a<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let c=uo({liquidityUsd:n,priceChange5m:o,quoteAgeMs:s,crossChain:i,requestedCapBps:u});if(!c.executable)throw new Error(`auto-slippage requires ${c.requiredBps} bps above hard/requested cap ${c.capBps}; route blocked`);let p=Number(l);if(!Number.isFinite(p))throw new Error("auto-slippage: quotedAtMs must be a finite number");let m=Math.min(3e4,Math.max(1e3,Number(d)||tr)),b=a*BigInt(1e4-c.selectedBps),_=b/10000n;if(b%10000n!==0n&&(_+=1n),_>a&&(_=a),a>0n&&_<=0n)throw new Error(`auto-slippage: quote ${a} is too small to express a ${c.selectedBps} bps floor without rounding to zero`);let g=Number((a-_)*10000n/(a===0n?1n:a));if(g>c.capBps)throw new Error(`auto-slippage: realised floor implies ${g} bps, above cap ${c.capBps} \u2014 refusing to issue a guard weaker than advertised`);return ao({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:a.toString(),minAmountOut:_.toString(),requiredBps:c.requiredBps,selectedBps:c.selectedBps,capBps:c.capBps,quotedAtMs:p,expiresAtMs:p+m},{secret:f})}function rr(e,{chainId:t,venue:r,amountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:u,quotedAtMs:l=Date.now(),ttlMs:d}={}){let f=lo({chainId:t,venue:r,quoteAmountOut:n,liquidityUsd:o,priceChange5m:s,crossChain:i,requestedCapBps:u,quotedAtMs:l,ttlMs:d});return{...e,autoSlippage:f,amountOutMinimum:f.minAmountOut}}var er,tr,nr=D(()=>{Zt();Qt();er=100,tr=2e4});var Cs,Ns,or=D(()=>{Cs=300*1e3,Ns=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as ar,getAddress as Ie,isAddress as cr}from"ethers";function wo(e,t){let r=Number(e),n=fe[r];if(!n)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(fe).join(", ")})`);let o=bo[r]||{};if(!t){if(!n.quoter||!n.router){let l=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${r} (${n.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${l})`)}return{chainId:r,venue:n.name,...n}}let s=String(t).toLowerCase();if(s===n.name&&n.quoter&&n.router)return{chainId:r,venue:n.name,...n};let i=o,u=i[s];if(!u){let l=[...n.quoter&&n.router?[n.name]:[],...Object.keys(i)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${r} (known: ${l})`)}return{chainId:r,venue:s,...n,quoter:u.quoter,router:u.router,feeTiers:u.feeTiers||null}}function ir(e,t){let r=fe[Number(t)];if(!e||e===mo||e===ho||/^eth$/i.test(String(e)))return Ie(r.weth);let n=String(e);if(/^weth$/i.test(n))return Ie(r.weth);if(/^usdc$/i.test(n))return Ie(r.usdc);if(!cr(n))throw new Error(`invalid token address: ${e}`);return Ie(n)}function go(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 ur(e={},t={}){let{chainId:r,quoter:n,router:o,feeTiers:s}=wo(e.chainId??8453,e.venue),i=ir(e.tokenIn||"WETH",r),u=ir(e.tokenOut||fe[r].usdc,r),l=BigInt(e.amountIn??0);if(l<=0n)throw new Error("amountIn required (raw base units)");let d=s&&s.length?s:fo,f=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[d[Math.min(2,d.length-1)]]:[...d],c=await Promise.all(f.map(async w=>{let O=sr.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:u,amountIn:l,fee:w,sqrtPriceLimitX96:0n}]);try{let A=await v(r,"eth_call",[{to:n,data:O},"latest"],t);if(!A||A==="0x")return{fee:w,ok:!1,error:"empty result"};let I=sr.decodeFunctionResult("quoteExactInputSingle",A);return{fee:w,ok:!0,amountOut:I[0].toString(),sqrtPriceX96After:I[1].toString(),initializedTicksCrossed:Number(I[2]),gasEstimate:I[3].toString()}}catch(A){return{fee:w,ok:!1,error:String(A.message||A).slice(0,160)}}})),p=null;for(let w of c)w.ok&&(!p||BigInt(w.amountOut)>BigInt(p.amountOut))&&(p=w);if(!p){let w=c.map(O=>`${O.fee}:${O.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${r}: ${w}`)}let m=e.liquidityUsd==null?await Kt({chainId:r,tokenA:i,tokenB:u,dexIds:go(e.venue)},t).catch(()=>[]):[],b={};await Promise.all(m.slice(0,8).map(async w=>{if(!(!w.pairAddress||!cr(w.pairAddress)))try{let O=await v(r,"eth_call",[{to:w.pairAddress,data:po},"latest"],t),A=O&&O!=="0x"&&O.length<=66?Number.parseInt(O,16):NaN;if(!Number.isFinite(A)||A<=0||A>1e6)return;let I=b[A];(I==null||w.liquidityUsd>I.liquidityUsd)&&(b[A]=w)}catch{}}));let _=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&_>0&&BigInt(p.amountOut)>0n){let w=BigInt(p.amountOut),A=c.filter(I=>I.ok&&Number((w-BigInt(I.amountOut))*10000n/w)<=_).filter(I=>b[I.fee]?.liquidityUsd!=null).sort((I,x)=>b[x.fee].liquidityUsd-b[I.fee].liquidityUsd)[0];A&&A.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:A.fee,chosenPoolUsd:b[A.fee].liquidityUsd,bandBps:_},p=A)}let S=b[p.fee]??null,h=m[0]??null,y=S??h,E=e.liquidityUsd??S?.liquidityUsd??h?.liquidityUsd??null,C=e.liquidityUsd!=null?"caller":S?"pool":h?"pair":null;return rr({venue:"uniswap-v3",chainId:r,chain:fe[r].name,quoter:n,tokenIn:i,tokenOut:u,amountIn:l.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:E,liquiditySource:y,liquidityAttribution:C,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:c,best:!0},{chainId:r,venue:o,amountOut:p.amountOut,liquidityUsd:E,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}var fe,fo,po,sr,Ms,mo,ho,ot,bo,lr=D(()=>{Ee();Jt();nr();or();fe={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},fo=[100,500,3e3,1e4],po="0xddca3f43",sr=new ar(["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)"]),Ms=new ar(["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)"]),mo="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",ho="0x0000000000000000000000000000000000000000",ot=[100,500,2500,1e4],bo={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ot}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var br={};lt(br,{ARB_UNI_FEE_TIERS:()=>hr,collectArbRoundTripCycles:()=>xo});function st(e,{positive:t=!1}={}){return typeof e=="string"&&/^(?:0|[1-9][0-9]*)$/.test(e)&&(!t||e!=="0")&&BigInt(e)<=yo}function fr(e){if(!st(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 dr(e,t){let r=e?.amountOut;if(!st(r,{positive:!0}))throw new Error(`${t} returned an invalid amountOut`);return r}function pr(e,t){let r=e?.gasEstimate??e?.gasUnits;if(!st(r))throw new Error(`${t} returned invalid gas units`);return r}function Oe(e,t,r,n,o,s){return{status:"UNAVAILABLE",entryVenue:e,exitVenue:t,amountInWei:r,intermediateAmountBase:n,amountOutWei:null,gasUnits:null,source:o,error:String(s?.message||s)}}function mr(e){return`uniswap-v3-${e}`}async function Eo({entryFee:e,exitFee:t,amountInWei:r,blockTag:n,quoteUniswap:o}){let s=mr(e),i=mr(t),u;try{u=await o({chainId:de,tokenIn:"WETH",tokenOut:"USDC",amountIn:r,fee:e,tryFees:!1,blockTag:n})}catch(a){return Oe(s,i,r,null,{},a)}let l,d;try{l=dr(u,s),d=pr(u,s)}catch(a){return Oe(s,i,r,null,{entry:{venue:"uniswap-v3",fee:e}},a)}let f;try{f=await o({chainId:de,tokenIn:"USDC",tokenOut:"WETH",amountIn:l,fee:t,tryFees:!1,blockTag:n})}catch(a){return Oe(s,i,r,l,{entry:{venue:"uniswap-v3",fee:e}},a)}try{let a=dr(f,i),c=(BigInt(d)+BigInt(pr(f,i))).toString();return{status:"OK",entryVenue:s,exitVenue:i,amountInWei:r,intermediateAmountBase:l,amountOutWei:a,gasUnits:c,source:{entry:{venue:"uniswap-v3",fee:e},exit:{venue:"uniswap-v3",fee:t}}}}catch(a){return Oe(s,i,r,l,{entry:{venue:"uniswap-v3",fee:e},exit:{venue:"uniswap-v3",fee:t}},a)}}async function Ao(e){let t=await v(de,"eth_gasPrice",[],e);return BigInt(t).toString()}async function xo(e={}){let t=fr(e.amountInWei),r=e.quoteUniswap??(b=>ur(b,e)),n=e.getBlockNumber??(()=>Je(de,e)),o=e.getGasPriceWei??(()=>Ao(e)),s=e.now??(()=>new Date().toISOString()),i=e.maxBlockDrift??1,u=Array.isArray(e.feeTiers)&&e.feeTiers.length?e.feeTiers.map(Number):[...hr];if(!Number.isSafeInteger(i)||i<0)throw new TypeError("maxBlockDrift must be a non-negative safe integer");for(let b of u)if(![100,500,3e3,1e4].includes(b))throw new TypeError(`unsupported Uni fee tier: ${b}`);let l=e.pinnedBlock??await n();if(!Number.isSafeInteger(l)||l<0)throw new Error("block provider returned invalid height");let d=`0x${l.toString(16)}`,f=fr(await o()),a=[];for(let b of u)for(let _ of u)b!==_&&a.push({entryFee:b,exitFee:_});let c=await Promise.all(a.map(({entryFee:b,exitFee:_})=>Eo({entryFee:b,exitFee:_,amountInWei:t,blockTag:d,quoteUniswap:r}))),p=await n();if(!Number.isSafeInteger(p)||p<0)throw new Error("block provider returned invalid height");let m=Math.abs(p-l);return{mode:"shadow",executionReady:!1,chainId:de,pair:"WETH-USDC",capturedAt:s(),amountInWei:t,blockStart:l,blockEnd:p,pinnedBlock:l,blockTag:d,blockConsistency:"PINNED",blockDrift:m,maxBlockDrift:i,stale:m>i,gasPriceWei:f,cycles:c,venueNote:"uniswap-v3-fee-tiers-only; camelot/pancake deferred"}}var de,yo,hr,wr=D(()=>{Ee();lr();de=42161,yo=(1n<<256n)-1n,hr=Object.freeze([100,500,3e3])});import{homedir as Mo}from"node:os";import{isAbsolute as Fo,join as jo}from"node:path";var Ye=Object.freeze({premium:"0x074b2e43",provider:"0x0542975c",reserves:"0xd1946dbc"}),Bt=/^0x[0-9a-fA-F]{64}$/,Sn=/^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$/,_n=256,In=100;async function On(...e){let{rpcCall:t}=await Promise.resolve().then(()=>(Ee(),Pt));return t(...e)}function Ze(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ze(t);Object.freeze(e)}return e}var z=Ze({chainId:42161,pool:"0x794a61358D6845594F94dc1DB02A252b5b4814aD",addressesProvider:"0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb",WETH:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",USDC:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",requiredReserves:["0x82aF49447D8a07e3bd95BD0d56f35241523fBab1","0xaf88d065e77c8cC2239327C5EDb3A432268e5831"],observedPremiumBps:5});function Tn(e){if(typeof e!="string"||!Sn.test(e))throw new Error("malformed eth_blockNumber result");let t=BigInt(e);if(t>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("malformed eth_blockNumber result: outside safe range");return Number(t)}function Cn(e,t){if(typeof e!="string"||!Bt.test(e))throw new Error(`malformed ${t} result`);return BigInt(e)}function $t(e,t){if(typeof e!="string"||!Bt.test(e)||e.slice(2,26)!=="0".repeat(24))throw new Error(`malformed ${t} result`);return`0x${e.slice(26).toLowerCase()}`}function Nn(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(_n)||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($t(i,"getReservesList address"))}return o}function kt(e,t,r,n){return Ze({mode:"shadow",executionReady:!1,status:e,chainId:z.chainId,block:t,premiumBps:r,reasons:n})}async function Lt(e={}){let t=e.rpc??On;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=Tn(o);let s=a=>t(z.chainId,"eth_call",[{to:z.pool,data:a},o],e),i=Cn(await s(Ye.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=$t(await s(Ye.provider),"ADDRESSES_PROVIDER"),l=Nn(await s(Ye.reserves)),d=[];n>In?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 f=new Set(l);for(let[a,c]of[["WETH",z.WETH],["USDC",z.USDC]])f.has(c.toLowerCase())||d.push(`${a} required reserve is missing`);return kt(d.length===0?"AVAILABLE":"MISMATCH",r,n,d)}catch(o){return kt("UNAVAILABLE",r,n,[String(o?.message||o)])}}var Rn=/^(?:0|[1-9][0-9]*)$/,vt=10000n,Qe=(1n<<256n)-1n;function M(e,t="value"){let r;if(typeof e=="bigint"&&e>=0n)r=e;else if(typeof e=="string"&&Rn.test(e))r=BigInt(e);else throw new TypeError(`${t} must be a non-negative plain decimal string or bigint`);if(r>Qe)throw new RangeError(`${t} must fit uint256`);return r}function Ae(e,t){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?BigInt(e):M(e,t)}function Pn(e,t){let r=M(e,"amount"),n=Ae(t,"basisPoints");if(n>vt)throw new RangeError("basisPoints must be at most 10000");let o=r*n;return o===0n?0n:(o-1n)/vt+1n}function ue(e){if(typeof e!="bigint")throw new TypeError("value must be a bigint");return e.toString(10)}function Dt(e,t){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`${t} must be an object`);return e}function Mt(e){for(let t of Object.values(e))t!==null&&typeof t=="object"&&!Object.isFrozen(t)&&Mt(t);return Object.freeze(e)}function Ft(e,t){Dt(e,"cycle"),Dt(t,"policy");let r=M(e.amountInWei,"cycle.amountInWei"),n=M(e.amountOutWei,"cycle.amountOutWei"),o=Ae(e.gasUnits,"cycle.gasUnits"),s=M(e.gasPriceWei,"cycle.gasPriceWei"),i=Ae(t.loanPremiumBps,"policy.loanPremiumBps"),u=M(t.builderFeeWei,"policy.builderFeeWei"),l=M(t.extraCostWei,"policy.extraCostWei"),d=M(t.minProfitWei,"policy.minProfitWei"),f=M(t.maxGasWei,"policy.maxGasWei"),a=M(t.maxLoanWei,"policy.maxLoanWei");Ae(t.maxBlockDrift,"policy.maxBlockDrift");let c=n-r,p=o*s;if(p>Qe)throw new RangeError("gas cost must fit uint256");let m=Pn(r,i),b=p+m+u+l;if(b>Qe)throw new RangeError("total cost must fit uint256");let _=c-b,g=_>=d&&p<=f&&r<=a;return Mt({grossProfitWei:ue(c),gasCostWei:ue(p),loanPremiumWei:ue(m),totalCostWei:ue(b),netProfitWei:ue(_),status:g?"PROFITABLE":"UNPROFITABLE",executionReady:!1,mode:"shadow"})}var kn=/^(?:0|[1-9][0-9]*)$/,Bn=(1n<<256n)-1n;function le(e){let t=null;return typeof e=="bigint"&&e>=0n&&(t=e),typeof e=="string"&&kn.test(e)&&(t=BigInt(e)),t!==null&&t<=Bn?t:null}function xe(e){return typeof e=="string"&&e.length>0?e:null}function et(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 $n(e){return Object.freeze(e.reasonCodes),Object.freeze(e)}function jt(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=xe(o.chainId),l=xe(i.chainId),d=xe(o.lender),f=xe(o.strategy),a=et(s.supportedChainIds),c=et(s.allowedLenders),p=et(s.allowedStrategies);u||F(n,"chainId"),l||F(n,"opts.chainId"),u&&l&&u!==l&&n.push("CHAIN_MISMATCH"),a?(!u||!a.includes(u))&&n.push("UNSUPPORTED_CHAIN"):F(n,"supportedChainIds"),d||F(n,"lender"),c?(!d||!c.includes(d))&&n.push("LENDER_NOT_ALLOWED"):F(n,"allowedLenders"),f||F(n,"strategy"),p?(!f||!p.includes(f))&&n.push("STRATEGY_NOT_ALLOWED"):F(n,"allowedStrategies");let m=le(o.blockNumber),b=le(i.currentBlock),_=le(s.maxBlockDrift);m===null&&F(n,"blockNumber"),b===null&&F(n,"opts.currentBlock"),_===null&&F(n,"maxBlockDrift"),m!==null&&b!==null&&_!==null&&(m>b||b-m>_)&&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,E)=>y<E],["gasCostWei","maxGasWei","GAS_LIMIT_EXCEEDED",(y,E)=>y>E],["builderFeeWei","maxBuilderFeeWei","BUILDER_FEE_EXCEEDED",(y,E)=>y>E],["loanPremiumWei","maxLoanPremiumWei","LOAN_PREMIUM_EXCEEDED",(y,E)=>y>E],["loanAmountWei","maxLoanWei","LOAN_LIMIT_EXCEEDED",(y,E)=>y>E]],S={};for(let[y,E,C,w]of g){let O=le(o[y]),A=le(s[E]);S[y]=O,O===null&&F(n,y),A===null&&F(n,E),O!==null&&A!==null&&w(O,A)&&n.push(C)}i.armed!==!1&&n.push("NOT_DISARMED");let h={status:n.length===0?"ELIGIBLE":"BLOCKED",reasonCodes:[...new Set(n)],executionReady:!1,mode:"shadow"};return u&&(h.chainId=u),d&&(h.lender=d),f&&(h.strategy=f),m!==null&&(h.blockNumber=m.toString(10)),S.realizedProfitWei!==null&&(h.realizedProfitWei=S.realizedProfitWei.toString(10)),$n(h)}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 Se(e){return e instanceof Error&&e.message?e.message.slice(0,300):String(e||"unknown error").slice(0,300)}function Ln(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 vn(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 Ut({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,l=0,d=0,f=null,a=[];function c(){return J({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,running:i!==null,inFlight:u,ticks:l,failures:d,lastError:f})}async function p(){if(u)return J({ok:!1,skipped:"overlap"});u=!0;let h=s(),y=[],E=[],C=[],w=[],O=[];try{try{let I=await e();if(!Array.isArray(I))throw new Error("collectCycles must return an array");O=I}catch(I){y.push({stage:"collect",message:Se(I)})}for(let I=0;I<O.length;I+=1){let x=O[I],L=Ln(x,I);E.push({id:L});try{let T=await t(x,n),B={...T,cycleId:T?.cycleId??L};C.push(B),vn(T,n)&&w.push({...B,profitable:!0})}catch(T){y.push({stage:"evaluate",cycleId:L,message:Se(T)})}}let A={id:`shadow-${h}-${l+1}`,observedAt:h,cyclesEvaluated:O.length,cycles:E,candidates:C,opportunities:w,errors:y};try{await r.append(A)}catch(I){y.push({stage:"persist",message:Se(I)})}return l+=1,y.length?(d+=1,f=y.map(I=>I.message).join("; ")):f=null,a=r.latest()?.opportunities??J(structuredClone(w)),J({ok:y.length===0,observation:r.latest()??A})}catch(A){return l+=1,d+=1,f=Se(A),J({ok:!1,error:f})}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 _({timeoutMs:h=3e4}={}){if(!Number.isInteger(h)||h<=0)throw new Error("timeoutMs must be a positive integer");let y=Date.now()+h;for(;u;){if(Date.now()>=y)throw new Error("shadow engine drain timed out");await new Promise(E=>setTimeout(E,5))}return typeof r.drain=="function"&&await r.drain(),!0}function g(){return r.latest()}function S(){return J(structuredClone(a))}return J({tick:p,start:m,stop:b,drain:_,status:c,latest:g,opportunities:S})}import{mkdir as Dn,open as Ht,readFile as Wt,rename as Mn,unlink as Fn}from"node:fs/promises";import{dirname as jn,basename as Un,join as Hn}from"node:path";var Wn=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 tt(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 qn(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 qt(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 zt(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=tt(e[r]);n!==void 0&&(t[r]=n)}for(let r of["amountInWei","amountOutWei","gasUnits","gasCostWei","loanPremiumWei","totalCostWei"]){let n=qt(e[r]);n!==void 0&&(t[r]=n)}for(let r of["grossProfitWei","netProfitWei"]){let n=qt(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 Gt(e,t){let r=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=tt(r.observedAt)??tt(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(zt).filter(Boolean):[],u=Array.isArray(r.candidates)?r.candidates.map(zt).filter(Boolean):[],l=Array.isArray(r.errors)?r.errors.map(qn).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:l}}function Vt({filePath:e,maxRecords:t=Wn,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 Wt(g,"utf8")),h=Array.isArray(S)?S:S?.records;if(!Array.isArray(h))throw new Error("shadow store payload is malformed");return h.map(y=>Gt(y,r)).slice(-t)}async function l(){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(h){if(h?.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 f(g,S){let h=jn(g),y=Hn(h,`.${Un(g)}.${process.pid}.${Date.now()}.${d+=1}.tmp`);await Dn(h,{recursive:!0,mode:448});let E;try{E=await Ht(y,"wx",384),await E.writeFile(S,"utf8"),await E.sync(),await E.close(),E=null,await Mn(y,g);let C=await Ht(h,"r");try{await C.sync()}finally{await C.close()}}finally{E&&await E.close().catch(()=>{}),await Fn(y).catch(()=>{})}}async function a(g){try{let S=await Wt(e,"utf8"),h=JSON.parse(S);if(!Array.isArray(h)&&!Array.isArray(h?.records))throw new Error("shadow store payload is malformed");await f(`${e}.bak`,S)}catch(S){if(S?.code!=="ENOENT")throw new Error("refusing to overwrite corrupted shadow store")}await f(e,`${JSON.stringify({version:1,records:g})}
|
|
6
|
+
`)}async function c(g){let S=Gt(g,r),h=s.then(async()=>{let y=[...o,S].slice(-t);return n&&await a(y),o=y,re(structuredClone(S))});return s=h.catch(()=>{}),h}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 _(){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:c,record:c,load:l,drain:p,list:m,latest:b,stats:_})}var So=/^(?:0|[1-9][0-9]*)$/,Te="42161",gr="arbitrum",yr="WETH-USDC",Ce="arb-weth-usdc-uni-fee-round-trip",Ne="aave-v3";async function _o(e){let{collectArbRoundTripCycles:t}=await Promise.resolve().then(()=>(wr(),br));return t(e)}function G(e,t,{positive:r=!1}={}){if(typeof e!="string"||!So.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 it(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 Io(e){return String(e?.message||e||"unknown provider failure").slice(0,300)}function Er(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"),l=it(e.intervalMs,"intervalMs",1,864e5),d=it(e.maxBlockDrift,"maxBlockDrift",0,1e3),f=it(e.maxRecords,"maxRecords",1,1e5),a=e.dependencies??{},c=e.collectCycles??a.collectArbRoundTripCycles??_o,p=e.readLenderState??a.readArbAaveLenderState??Lt,m=e.evaluateEconomics??a.evaluateCycleEconomics??Ft,b=e.evaluateEligibility??a.evaluateFlashLoanCandidate??jt,_=e.createEngine??a.createShadowEngine??Ut,g=e.createStore??a.createShadowStore??Vt;for(let[T,B]of Object.entries({collect:c,readLender:p,evaluateEconomics:m,evaluateEligibility:b,makeEngine:_,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:f,now:e.now??Date.now}),h=[],y=null,E=null,C=null,w=j({async append(T){return await S.append(T),h=[...h,j(Y(T))].slice(-f),j(Y(T))},async drain(){return typeof S.drain=="function"&&await S.drain(),!0},latest(){return h.length?j(Y(h.at(-1))):null}});async function O(){try{C=await p(e.lenderOptions??e)}catch(T){C={status:"UNAVAILABLE",block:null,premiumBps:null,reasons:[Io(T)]}}if(y=j(Y(C)),!C||C.status!=="AVAILABLE")throw new Error(`lender ${C?.status?.toLowerCase()||"unavailable"}: ${(C?.reasons||[]).join("; ")}`);if(!Number.isSafeInteger(C.block)||!Number.isSafeInteger(C.premiumBps)||C.premiumBps<0)throw new Error("lender returned malformed live state");if(E=await c({...e.collectorOptions,amountInWei:t,maxBlockDrift:d,pinnedBlock:C.block}),!E||!Array.isArray(E.cycles))throw new Error("quote provider returned malformed snapshot");if(E.stale===!0||E.blockDrift>d)throw new Error("stale quote snapshot");if(!Number.isSafeInteger(E.blockEnd)||Math.abs(E.blockEnd-C.block)>d)throw new Error("stale lender snapshot relative to quotes");return G(E.gasPriceWei,"quoteSnapshot.gasPriceWei",{positive:!0}),E.cycles}async function A(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(),pe={...T,gasUnits:B,gasPriceWei:E.gasPriceWei},$=await m(pe,{loanPremiumBps:C.premiumBps,builderFeeWei:s,extraCostWei:i,minProfitWei:r,maxGasWei:o,maxLoanWei:n,maxBlockDrift:d}),U=await b({chainId:Te,lender:Ne,strategy:Ce,blockNumber:String(E.blockEnd),realizedProfitWei:$.netProfitWei.startsWith("-")?"0":$.netProfitWei,gasCostWei:$.gasCostWei,builderFeeWei:s,loanPremiumWei:$.loanPremiumWei,loanAmountWei:T.amountInWei},{supportedChainIds:[Te],allowedLenders:[Ne],allowedStrategies:[Ce],maxBlockDrift:String(d),minRealizedProfitWei:r,maxGasWei:o,maxBuilderFeeWei:s,maxLoanPremiumWei:$.loanPremiumWei,maxLoanWei:n},{chainId:Te,currentBlock:String(E.blockEnd),armed:!1}),P=[...new Set([...U.reasonCodes,"L1_DATA_FEE_NOT_MODELED","EXECUTOR_GAS_NOT_SIMULATED","LENDER_LIQUIDITY_NOT_CHECKED","CROSS_VENUE_CAMELOT_PANCAKE_NOT_QUOTED",...E.blockConsistency==="PINNED"?[]:["QUOTE_BLOCK_NOT_PINNED"]])],N=$.status==="PROFITABLE"&&U.status==="ELIGIBLE"&&P.length===0;return j({cycleId:`${T.entryVenue||"unknown"}->${T.exitVenue||"unknown"}`,chain:gr,pair:yr,strategy:Ce,lender:Ne,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:E.blockConsistency??"RANGE_ONLY",profitable:N,executionReady:!1,mode:"shadow"})}let I=_({collectCycles:O,evaluateCycle:A,store:w,policy:{isProfitable:T=>T?.profitable===!0},intervalMs:l,now:e.now??Date.now});async function x(){let T=await S.load();return h=Y(T).slice(-f),j(Y(h))}function L(){return j({mode:"shadow",execution:!1,signer:!1,broadcaster:!1,chain:gr,chainId:Te,pair:yr,strategy:Ce,lender:Ne,...I.status(),lastProviderState:j(Y(y))})}return j({load:x,tick:I.tick,start:I.start,stop:I.stop,drain:I.drain,status:L,latest:w.latest,opportunities:()=>j(Y(w.latest()?.opportunities??[]))})}import{createServer as No}from"node:http";var Xs=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Ks=Object.freeze(["read","simulate"]);var Js=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}},Oo=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,To=Object.freeze(["privkey","wif","xprv","seed"]);function at(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Oo.test(t)||To.includes(r)}var Ar=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}]),xr=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Co(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>xr.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function Sr(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=Co(t);for(let{rule:o,re:s}of Ar)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&&at(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=xr.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:s,re:i}of Ar)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"&&at(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(at(o))throw new V(`${t}.${o}`,"forbidden-key-name");oe(s,`${t}.${o}`,r,o)}return e}var _r=null,Ro="127.0.0.1",Po=8798,ko=1e6,Bo='{"error":"redacted"}',$o=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 Lo(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 Do(e){typeof _r=="function"&&_r(e),oe(e);let t=Sr(e);if(Buffer.byteLength(t)>ko)throw new Error("response too large");return t}function Z(e,t,r){let n,o=t;try{n=Do(r)}catch{o=500,n=Bo}e.writeHead(o,{...$o,"content-length":Buffer.byteLength(n)}),e.end(n)}function Ir({runtime:e,host:t=Ro,port:r=Po}={}){if(vo(e),typeof t!="string")throw new Error("host must be a loopback address");if(Lo(t),!Number.isInteger(r)||r<0||r>65535)throw new Error("port must be an integer between 0 and 65535");function n(){let a=e.status(),c=Number.isSafeInteger(a?.ticks)?a.ticks:0,p=typeof a?.lastProviderState?.status=="string"?a.lastProviderState.status:"UNKNOWN",m=a?.running===!0&&c>0&&a?.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:c,provider:p}}}let o=new Map([["/status",()=>e.status()],["/latest",()=>e.latest()],["/opportunities",()=>e.opportunities()]]);async function s(a,c){if(a.method!=="GET"){Z(c,405,{error:"method-not-allowed"});return}let p;try{p=new URL(a.url||"/","http://localhost").pathname}catch{Z(c,404,{error:"not-found"});return}if(p==="/health"){try{let b=n();Z(c,b.httpStatus,b.body)}catch{Z(c,503,{error:"redacted"})}return}let m=o.get(p);if(!m){Z(c,404,{error:"not-found"});return}try{Z(c,200,await m())}catch{Z(c,500,{error:"redacted"})}}let i=No((a,c)=>{s(a,c).catch(()=>{c.headersSent?c.destroy():Z(c,500,{error:"redacted"})})}),u=null;function l(){let a=i.address();return a&&typeof a=="object"?{address:a.address,family:a.family,port:a.port}:null}function d(){return i.listening?Promise.resolve(l()):u||(u=new Promise((a,c)=>{let p=b=>{i.off("listening",m),u=null,c(b)},m=()=>{i.off("error",p);let b=l();u=null,a(b)};i.once("error",p),i.once("listening",m),i.listen(r,t)}),u)}async function f(){if(u)try{await u}catch{return!1}return i.listening?(await new Promise((a,c)=>i.close(p=>p?c(p):a())),!0):!1}return Object.freeze({start:d,stop:f,address:l,handler:s})}var Or=/^(?:0|[1-9][0-9]*)$/,Uo=/^127(?:\.\d{1,3}){3}$/,Ho=(1n<<256n)-1n;function Pe(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Pe(t);Object.freeze(e)}return e}function ct(e,t){let r=String(e??"").trim().toLowerCase();if(!["","0","false","off"].includes(r))throw new Error(`${t} must remain disarmed for the arb paper shadow service`)}function Wo(e){return e==="localhost"||e==="::1"?!0:Uo.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(!Or.test(o)||n&&o==="0")throw new TypeError(`${t} must be ${n?"a positive":"a non-negative"} decimal string`);if(BigInt(o)>Ho)throw new RangeError(`${t} must fit uint256`);return o}function Re(e,t,r,n,o,s){let i=String(e[t]??r);if(!Or.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 qo(e=process.env){ct(e.ORACLE_EXECUTE_ENABLED,"ORACLE_EXECUTE_ENABLED"),ct(e.MAD_EXECUTE_ENABLED,"MAD_EXECUTE_ENABLED"),ct(e.ORACLE_MEV_EXECUTE_ENABLED,"ORACLE_MEV_EXECUTE_ENABLED");let t=String(e.ORACLE_MEV_ARB_SHADOW_HOST??"127.0.0.1").trim();if(!Wo(t))throw new Error("ORACLE_MEV_ARB_SHADOW_HOST must be loopback-only");let r=String(e.HOME||Mo()),n=String(e.ORACLE_MEV_ARB_SHADOW_STATE??jo(r,".local/state/oracle/mev-arb-shadow/observations.json"));if(!Fo(n))throw new Error("ORACLE_MEV_ARB_SHADOW_STATE must be an absolute path");let o=String(e.ORACLE_MEV_ARB_SHADOW_PERSIST??"1").trim();if(!["0","1"].includes(o))throw new Error("persist must be 0 or 1");return Pe({host:t,port:Re(e,"ORACLE_MEV_ARB_SHADOW_PORT","8809",0,65535,"port"),intervalMs:Re(e,"ORACLE_MEV_ARB_SHADOW_INTERVAL_MS","15000",1e3,864e5,"intervalMs"),amountInWei:se(e,"ORACLE_MEV_ARB_SHADOW_AMOUNT_IN_WEI","1000000000000000000",{positive:!0}),minProfitWei:se(e,"ORACLE_MEV_ARB_SHADOW_MIN_PROFIT_WEI","10000000000000"),maxLoanWei:se(e,"ORACLE_MEV_ARB_SHADOW_MAX_LOAN_WEI","5000000000000000000",{positive:!0}),maxGasWei:se(e,"ORACLE_MEV_ARB_SHADOW_MAX_GAS_WEI","500000000000000"),builderFeeWei:se(e,"ORACLE_MEV_ARB_SHADOW_BUILDER_FEE_WEI","0"),extraCostWei:se(e,"ORACLE_MEV_ARB_SHADOW_EXTRA_COST_WEI","0"),extraGasUnits:se(e,"ORACLE_MEV_ARB_SHADOW_EXTRA_GAS_UNITS","250000"),maxBlockDrift:Re(e,"ORACLE_MEV_ARB_SHADOW_MAX_BLOCK_DRIFT","40",0,1e3,"maxBlockDrift"),maxRecords:Re(e,"ORACLE_MEV_ARB_SHADOW_MAX_RECORDS","500",1,1e5,"maxRecords"),filePath:n,persist:o==="1"})}function Tr({env:e=process.env,runtimeFactory:t=Er,serverFactory:r=Ir}={}){if(typeof t!="function"||typeof r!="function")throw new TypeError("runtimeFactory and serverFactory must be functions");let n=qo(e),o=t(n),s=r({runtime:o,host:n.host,port:n.port}),i=null,u=null;async function l(){return i||u||(u=(async()=>{let a=!1;try{await o.load();let c=await o.tick();o.start(),a=!0;let p=await s.start();return i=Pe({mode:"shadow",chain:"arbitrum",chainId:42161,execution:!1,signer:!1,broadcaster:!1,address:p,initialTick:c}),i}catch(c){try{await s.stop()}catch{}if(a)try{o.stop(),typeof o.drain=="function"&&await o.drain()}catch{}throw c}finally{u=null}})(),u)}async function d(){if(u)try{await u}catch{}if(!i)return!1;let a=null;try{await s.stop()}catch(c){a=c}if(o.stop(),typeof o.drain=="function"&&await o.drain(),i=null,a)throw a;return!0}function f(){return Pe({mode:"shadow",chain:"arbitrum",chainId:42161,execution:!1,signer:!1,broadcaster:!1,listening:!!i,address:s.address(),runtime:o.status()})}return Object.freeze({start:l,stop:d,status:f,config:n})}var ke="oracle-mev-arb-shadow";function Be(e,t){e.write(`${JSON.stringify(t)}
|
|
7
7
|
`)}async function Cr({env:e=process.env,appFactory:t=Tr,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(f="shutdown"){return i||(i=(async()=>{try{return await s.stop(),Be(r,{event:"stopped",service:ke,signal:f}),!0}catch{return o.exitCode=1,Be(n,{event:"fatal",service:ke,error:"shutdown failed"}),!1}})(),i)}for(let f of["SIGINT","SIGTERM"])o.once(f,()=>{u(f).catch(()=>{o.exitCode=1})});let l;try{l=await s.start()}catch{throw o.exitCode=1,Be(n,{event:"fatal",service:ke,error:"startup failed"}),new Error("arb paper shadow service failed to start")}let d=l?.address&&typeof l.address=="object"?l.address:{};return Be(r,{event:"listening",service:ke,mode:"shadow",chain:"arbitrum",chainId:42161,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 Nr=process.argv.slice(2);(Nr.includes("--help")||Nr.includes("-h"))&&(process.stdout.write(`Usage: oracle-mev-arb-shadow [--help]
|
|
8
8
|
Loopback-only Arbitrum paper MEV observer. Never prepares, signs, or broadcasts.
|
|
9
9
|
`),process.exit(0));Cr().catch(()=>{process.exitCode=1});
|