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