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