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