@oracle-agent/oracle 0.35.5 → 0.35.6

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.
Files changed (37) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +25 -23
  4. package/dist/bin/oracle-data-mcp.mjs +13 -11
  5. package/dist/bin/oracle-mev-arb-shadow.mjs +7 -5
  6. package/dist/bin/oracle-mev-shadow.mjs +7 -5
  7. package/dist/bin/oracle-public-server.mjs +6 -4
  8. package/dist/bin/oracle-route.mjs +22 -20
  9. package/dist/bin/oracle-scan.mjs +14 -12
  10. package/dist/bin/oracle.mjs +2 -1
  11. package/dist/cli/commands/chat.mjs +166 -164
  12. package/dist/cli/commands/doctor.mjs +3 -3
  13. package/dist/cli/commands/eval.mjs +113 -113
  14. package/dist/cli/commands/farm.mjs +14 -14
  15. package/dist/cli/commands/follow.mjs +16 -14
  16. package/dist/cli/commands/model.mjs +170 -168
  17. package/dist/cli/commands/project.mjs +17 -0
  18. package/dist/cli/commands/resolve.mjs +8 -6
  19. package/dist/cli/commands/shadow.mjs +10 -8
  20. package/dist/cli/commands/signer.mjs +10 -10
  21. package/dist/cli/commands/snipe.mjs +10 -8
  22. package/dist/cli/commands/strategy.mjs +5 -5
  23. package/dist/cli/commands/swap.mjs +27 -25
  24. package/dist/cli/commands/venues.mjs +2 -2
  25. package/dist/data/desk-data.mjs +23 -21
  26. package/dist/data/names.mjs +4 -2
  27. package/dist/data/providers/farming.mjs +2 -2
  28. package/dist/index.mjs +37 -35
  29. package/dist/local-signer/index.mjs +3 -3
  30. package/dist/local-signer/runtime.mjs +9 -9
  31. package/dist/nft/universal-mint-router.mjs +5 -3
  32. package/dist/router/index.mjs +4 -2
  33. package/dist/router/prepare-bridge.mjs +2 -2
  34. package/dist/scanner/index.mjs +5 -3
  35. package/dist/strategy/index.mjs +3 -3
  36. package/package.json +1 -1
  37. package/public/oracle-splash/index.html +2 -2
@@ -1,5 +1,7 @@
1
- var oe="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",W={1:["https://mainnet.gateway.tenderly.co","https://eth.drpc.org","https://rpc.flashbots.net"],8453:["https://base.gateway.tenderly.co","https://mainnet.base.org","https://base.drpc.org"],42161:["https://arbitrum.gateway.tenderly.co","https://arb1.arbitrum.io/rpc","https://arbitrum.drpc.org"]},Ne=1e4,Pe=t=>new Promise(e=>setTimeout(e,t)),se=t=>"0x"+BigInt(t).toString(16),Le=t=>"0x"+"0".repeat(24)+t.slice(2).toLowerCase(),ae=t=>"0x"+t.slice(26).toLowerCase(),Be=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,He=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,P=class extends Error{constructor(e,{transient:r=!1,tooBig:n=!1,http:o=0}={}){super(e),this.transient=r,this.tooBig=n,this.http=o}};async function Oe(t,e,r,n){let o=new AbortController,i=setTimeout(()=>o.abort(),n),a,l;try{a=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:r}),signal:o.signal}),l=await a.text()}catch(f){throw new P(`${e} network: ${f.message}`,{transient:!0})}finally{clearTimeout(i)}let s;try{s=JSON.parse(l)}catch{throw new P(`${e} non-JSON http=${a.status}: ${l.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status})}if(s.error){let f=s.error.message||"rpc error";throw new P(`${e} rpc: ${f}`,{transient:Be.test(f),tooBig:He.test(f),http:a.status})}if(a.status!==200)throw new P(`${e} http=${a.status}: ${l.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status});return s.result}async function ce(t,e,r,{retries:n,timeoutMs:o,onWarn:i}){let a;for(let l of t){for(let s=0;s<=n;s++)try{return{result:await Oe(l,e,r,o),url:l}}catch(f){if(a=f,f.tooBig)throw f;if(!f.transient||s===n)break;let h=Math.min(2e3*2**s,8e3)+Math.random()*250;i?.(`retry ${l} (${f.message.slice(0,70)}) in ${Math.round(h)}ms`),await Pe(h)}i?.(`endpoint exhausted: ${l} -> ${a?.message.slice(0,70)}`)}throw a??new P("no endpoints available")}async function V(t,e,r,n,o,i){let a=[{...e,fromBlock:se(r),toBlock:se(n)}];try{let{result:s}=await ce(t,"eth_getLogs",a,o);Array.isArray(s)&&i.push(...s);return}catch(s){if(!s.tooBig||n<=r)throw s;o.onWarn?.(`splitting ${r}-${n} (${s.message.slice(0,60)})`)}let l=r+Math.floor((n-r)/2);await V(t,e,r,l,o,i),await V(t,e,l+1,n,o,i)}async function ie(t,e={}){if(!/^0x[0-9a-fA-F]{40}$/.test(t||""))throw new Error(`invalid address: ${t}`);let{chains:r=[1,8453,42161],lookback:n=1e5,fromBlock:o,toBlock:i,chunkSize:a=Ne,tokens:l,direction:s="both",retries:f=3,timeoutMs:h=2e4,concurrency:c=4,endpoints:d=W,onWarn:u}=e,E={retries:f,timeoutMs:h,onWarn:u},C=Le(t),g=[],R=[],_={},v=new Set;return await Promise.all(r.map(async m=>{let y=d[m];if(!y?.length){R.push({chainId:m,stage:"config",error:"no endpoints configured"});return}try{let w=i;if(w==null){let{result:b}=await ce(y,"eth_blockNumber",[],E);w=parseInt(b,16)}let p=Math.max(0,o??w-n+1),x=Math.max(p,w);_[m]={fromBlock:p,toBlock:x,blocks:x-p+1};let I=[];for(let b=p;b<=x;b+=a)I.push([b,Math.min(b+a-1,x)]);let k=[],A=l?.length?{address:l}:{};(s==="in"||s==="both")&&k.push({...A,topics:[oe,null,C]}),(s==="out"||s==="both")&&k.push({...A,topics:[oe,C,null]});let T=[];for(let b of k)for(let N of I)T.push([b,N]);let S=[],$=0,z=Array.from({length:Math.min(c,T.length)},async()=>{for(;$<T.length;){let[b,[N,O]]=T[$++];try{await V(y,b,N,O,E,S)}catch(Ie){R.push({chainId:m,stage:"getLogs",range:[N,O],error:Ie.message})}}});await Promise.all(z);for(let b of S){if(!b?.topics||b.topics.length<3)continue;let N=parseInt(b.logIndex,16),O=`${m}|${b.transactionHash}|${N}`;v.has(O)||(v.add(O),g.push({chainId:m,token:b.address.toLowerCase(),from:ae(b.topics[1]),to:ae(b.topics[2]),value:BigInt(b.data==="0x"?"0x0":b.data).toString(),blockNumber:parseInt(b.blockNumber,16),txHash:b.transactionHash,logIndex:N}))}}catch(w){R.push({chainId:m,stage:"range",error:w.message})}})),g.sort((m,y)=>y.blockNumber-m.blockNumber||y.logIndex-m.logIndex),{events:g,errors:R,ranges:_}}import{keccak_256 as ee}from"@noble/hashes/sha3.js";import{createHash as je}from"node:crypto";import L from"node:net";import Me from"node:dns";var Ue=new Set(["localhost","metadata.google.internal","metadata.goog"]);function D(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=h=>{if(!h)return[];let c=h.split(":"),d=c.at(-1);if(d?.includes(".")){let u=d.split(".").map(Number);if(u.length!==4||u.some(E=>!Number.isInteger(E)||E<0||E>255))return null;c.splice(c.length-1,1,(u[0]<<8|u[1]).toString(16),(u[2]<<8|u[3]).toString(16))}return c.some(u=>!/^[0-9a-f]{1,4}$/.test(u))?null:c.map(u=>Number.parseInt(u,16))},[n,o]=e.split("::"),i=r(n),a=r(o);if(!i||!a)return null;let l=e.includes("::"),s=8-i.length-a.length;if(!l&&s!==0||l&&s<1)return null;let f=[...i,...Array(Math.max(0,s)).fill(0),...a];return f.length!==8?null:Uint8Array.from(f.flatMap(h=>[h>>8,h&255]))}function G(t,e,r){let n=Math.floor(r/8),o=r%8;for(let a=0;a<n;a+=1)if(t[a]!==e[a])return!1;if(!o)return!0;let i=255<<8-o;return(t[n]&i)===(e[n]&i)}function Y(t){if(L.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(L.isIPv6(t)){let e=D(t);if(!e)return!1;let r=D("::ffff:0:0");return G(e,r,96)?Y([...e.slice(12)].join(".")):G(e,D("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>G(e,D(o),i)):!1}return!1}function Fe(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ue.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=L.isIP(r);return n!==0&&!Y(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function J(t,{lookupFn:e=Me.promises.lookup}={}){let r=Fe(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:L.isIPv6(r.host)?6:4}]};let n;try{n=await e(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=>!Y(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function q({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let c=await e();r=c.Agent,n=c.fetch}catch(c){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=c=>(Array.isArray(c)?c:[c]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(L.isIPv6(d.address)?6:4)})),l=(c,d,u)=>{i.set(o(c),a(typeof d=="string"?[{address:d,family:u}]:d))},s=c=>{let d=o(c);if(L.isIP(d))return[{address:d,family:L.isIPv6(d)?6:4}];let u=i.get(d);if(!u||!u.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return u},f=new r({connect:{lookup(c,d,u){let E;try{E=s(c)}catch(C){return u(C)}return d?.all?u(null,E):u(null,E[0].address,E[0].family)}}}),h=De((c,d={})=>n(c,{...d,dispatcher:f}),l);return{dispatcher:f,fetch:h,pin:l,resolve:s,async close(){try{await f.destroy()}catch{}}}}var K=Symbol.for("oracle.egressGuard.pinCapableFetch");function De(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[K]=Object.freeze({pin:e}),t}function X(t){return typeof t=="function"&&typeof t[K]?.pin=="function"}function le(t,e,r){if(!X(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[K].pin(e,r)}var ze=new Set([408,425,429,500,502,503,504]),ue=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ve=2,fe=4e3,me=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],We=new Set([301,302,303,307,308]),de=3,Ge=64*1024;function Ye(t){let e=String(t||"").toLowerCase();return me.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function Je(t){let e={};for(let[r,n]of Object.entries(t||{}))Ye(r)||(e[r]=n);return e}function qe(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Ke(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var Z=new Map;function Xe(t,e,r,n={}){let o={};for(let[h,c]of Object.entries(r||{}))o[h.toLowerCase()]=c;let i=Object.keys(o).filter(h=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(h)),l=[...new Set([...me,...i])].sort().map(h=>`${h}=${o[h]??""}`).join(`
2
- `),s=je("sha256").update(l).digest("hex").slice(0,32),f=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${t} ${e} ${f} ${s}`}function Ze(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,fe):Math.min(250*2**t,fe)+Math.floor(Math.random()*100)}var Qe=t=>new Promise(e=>setTimeout(e,t));function M(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function Q(t,e,r){return M(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function U(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function et(t){return t?t.byteLength??t.length??0:0}async function he(t,e,{url:r,truncate:n=!1,onOversize:o}={}){if(e==null)return await t.text();let i=Number(t.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>e&&(U(t),!n))throw Q(r,`content-length ${i}`,e);let a=t.body?.getReader?.();if(!a){let c=await t.text(),d=Buffer.byteLength(c,"utf8");if(d>e){if(!n)throw Q(r,`body ${d} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let l=[],s=0,f=!1;try{for(;;){let{value:c,done:d}=await a.read();if(d)break;if(c&&(l.push(Buffer.from(c)),s+=et(c),s>e)){f=!0;break}}}finally{if(f)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(f&&(typeof o=="function"&&o(),!n))throw Q(r,`streamed ${s} bytes`,e);let h=Buffer.concat(l);return(f?h.subarray(0,e):h).toString("utf8")}function pe(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function tt(t,{fetchImpl:e,method:r,headers:n,body:o,timeoutMs:i,lookupFn:a,realFetch:l,untrustedUrl:s=!1,maxResponseBytes:f=null,importUndici:h,validateResponse:c,signal:d}){let u=new AbortController,E=setTimeout(()=>u.abort(),i),C=d?typeof AbortSignal.any=="function"?AbortSignal.any([d,u.signal]):d:u.signal,g=null,R=e,_=a?{lookupFn:a}:{};if(s&&!l&&!X(R))throw M(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let v=async(m,{status:y=null}={})=>{let w=await J(m,_);if(!w.ok)throw M(y==null?`HTTP refused ${m}: ${w.error}`:`HTTP redirect to ${m} ${w.error}`,y==null?{}:{status:y});let p=new URL(m).hostname;if(l){if(g&&(await g.close(),g=null),!g)try{g=await q({requireUndici:!0,...h?{importUndici:h}:{}})}catch(x){throw M(y==null?`HTTP refused ${m}: ${x?.message||x}`:`HTTP redirect to ${m} refused: ${x?.message||x}`,y==null?{}:{status:y})}g.pin(p,w.addresses),R=g.fetch}else le(R,p,w.addresses);return w};try{let m=String(t),y={...n||{}};s&&await v(m);for(let w=0;w<=de;w+=1){let p=await R(m,{method:r,headers:y,body:o,signal:C,redirect:"manual"});if(We.has(p.status)){if(r!=="GET"&&r!=="HEAD"){let S=await he(p,f??Ge,{url:m,truncate:!0}),$=new Error(`HTTP ${p.status} ${r} ${m} redirected non-idempotent request`);throw $.status=p.status,$.body=pe(S)??S.slice(0,300),$}if(w===de)throw U(p),new Error(`HTTP redirect loop for ${t}`);let k=p.headers?.get?.("location"),A;try{A=qe(k,m)}catch(S){throw U(p),S}let T=!Ke(A,m);if(U(p),T&&(y=Je(y)),s)await v(A,{status:p.status});else if(T){let S=await J(A,_);if(!S.ok){let $=new Error(`HTTP redirect from ${m} ${S.error}`);throw $.status=p.status,$.retryable=!1,$}l&&S.addresses?.length&&(g||(g=await q(h?{importUndici:h}:{})),g&&(g.pin(new URL(A).hostname,S.addresses),R=g.fetch))}m=A;continue}if(typeof c=="function")try{await c(p,{url:m})}catch(k){throw U(p),M(k?.message||String(k))}let x=await he(p,f,{url:m,onOversize:()=>u.abort()}),I=pe(x);if(!p.ok){let k=new Error(`HTTP ${p.status} ${r} ${m}`);throw k.status=p.status,k.retryAfter=p.headers?.get?.("retry-after")??null,k.body=I??x.slice(0,300),k}return I??x}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(E),g&&await g.close()}}async function we(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),i={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let l=Number.isInteger(e.retries)?Math.max(e.retries,0):Ve,s=e.lookupFn,f=!e.fetchImpl,h=e.untrustedUrl===!0,c=e.importUndici,d=e.validateResponse,u=e.signal,E=Number(e.maxResponseBytes),C=Number.isFinite(E)&&E>0?Math.floor(E):null,g=async()=>{let y;for(let w=0;w<=l;w++){u?.throwIfAborted?.();try{return await tt(t,{fetchImpl:r,method:o,headers:i,body:a,timeoutMs:n,lookupFn:s,realFetch:f,untrustedUrl:h,maxResponseBytes:C,importUndici:c,validateResponse:d,signal:u})}catch(p){y=p;let x=p?.status,I=p?.name==="AbortError"||p?.name==="TimeoutError"||u?.aborted,k=new Set([408,425,429]),A=p?.retryable===!1?!1:x!=null?k.has(x)||ze.has(x)&&ue.has(o):!I&&ue.has(o);if(w===l||!A)throw p;let T=Ze(w,p?.retryAfter);u?await new Promise((S,$)=>{let z=setTimeout(S,T);u.addEventListener("abort",()=>{clearTimeout(z),$(u.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Qe(T)}}throw y};if(!(e.dedupe!==!1&&!u&&o==="GET"&&a==null))return g();let _=Xe(o,t,i,{untrustedUrl:h,maxResponseBytes:C}),v=Z.get(_);if(v)return v;let m=g().finally(()=>Z.delete(_));return Z.set(_,m),m}var be={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},rt=new Map(Object.values(be).map(t=>[t.chainId,t]));function ge(t){return rt.get(Number(t))||null}function ye(t,e=process.env){let r=ge(t);if(!r)return null;for(let n of r.rpcEnv){let o=(e[n]||"").trim();if(o)return o}return null}import{Interface as nt,getAddress as Lt}from"ethers";var Bt=new nt(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ot={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"};function st(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=ye(t,r);return n||ot[Number(t)]||null}var at=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function ct(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!at.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function Ee(t,e,r=[],n={}){let o=String(e||"");ct(o);let i=st(t,n);if(!i)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let l=await we(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(l?.error){let s=new Error(l.error.message||JSON.stringify(l.error));throw s.code=l.error.code,s}return l.result}var re=999,te=1,it=8453,xe="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",lt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ke="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",ut="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",ft=".80002105.reverse",Se=/^0x[a-fA-F0-9]{40}$/,$e=new TextEncoder,Re=t=>"0x"+Buffer.from(t).toString("hex"),B=t=>Re(ee($e.encode(t))).slice(0,10),Ae=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function j(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=ee($e.encode(r)),o=new Uint8Array(64);o.set(e,0),o.set(n,32),e=ee(o)}return Re(e)}function ne(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=e.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function H(t,e,r){try{return await Ee(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function dt(t){let e=await H(re,xe,B("primaryName(address)")+Ae(t)),r=ne(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function ht(t){let e=await H(re,lt,B("getName(address)")+Ae(t)),r=ne(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function Te(t,e,r){let n=await H(t,r,B("name(bytes32)")+e.slice(2));return ne(n)||null}async function pt(t){let e=j(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await H(te,ke,B("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:Te(te,e,n)}async function mt(t){let e=j(t.slice(2).toLowerCase()+ft);return Te(it,e,ut)}var wt=[{source:"hl",fn:dt},{source:"hype",fn:ht},{source:"ens",fn:pt},{source:"basename",fn:mt}];async function bt(t){let e=j(t),r=await H(re,xe,B("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function gt(t,e,r){let n=j(e),o=await H(t,r,B("resolver(bytes32)")+n.slice(2));if(!o)return null;let i="0x"+o.slice(-40);if(/^0x0+$/.test(i))return null;let a=await H(t,i,B("addr(bytes32)")+n.slice(2));if(!a)return null;let l="0x"+a.slice(-40);return/^0x0+$/.test(l)?null:l}async function Ce(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await bt(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await gt(te,e,ke);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var Ut=wt.map(t=>t.source);var F={1:"ethereum",8453:"base",42161:"arbitrum"},yt=Object.fromEntries(Object.entries(F).map(([t,e])=>[e,Number(t)])),ve=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
1
+ var se="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",W={1:["https://mainnet.gateway.tenderly.co","https://eth.drpc.org","https://rpc.flashbots.net"],8453:["https://base.gateway.tenderly.co","https://mainnet.base.org","https://base.drpc.org"],42161:["https://arbitrum.gateway.tenderly.co","https://arb1.arbitrum.io/rpc","https://arbitrum.drpc.org"]},Oe=1e4,He=t=>new Promise(e=>setTimeout(e,t)),ae=t=>"0x"+BigInt(t).toString(16),Me=t=>"0x"+"0".repeat(24)+t.slice(2).toLowerCase(),ce=t=>"0x"+t.slice(26).toLowerCase(),Fe=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,Ue=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,P=class extends Error{constructor(e,{transient:r=!1,tooBig:n=!1,http:a=0}={}){super(e),this.transient=r,this.tooBig=n,this.http=a}};async function De(t,e,r,n){let a=new AbortController,i=setTimeout(()=>a.abort(),n),o,d;try{o=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:r}),signal:a.signal}),d=await o.text()}catch(f){throw new P(`${e} network: ${f.message}`,{transient:!0})}finally{clearTimeout(i)}let s;try{s=JSON.parse(d)}catch{throw new P(`${e} non-JSON http=${o.status}: ${d.slice(0,80)}`,{transient:o.status>=500||o.status===429,http:o.status})}if(s.error){let f=s.error.message||"rpc error";throw new P(`${e} rpc: ${f}`,{transient:Fe.test(f),tooBig:Ue.test(f),http:o.status})}if(o.status!==200)throw new P(`${e} http=${o.status}: ${d.slice(0,80)}`,{transient:o.status>=500||o.status===429,http:o.status});return s.result}async function ie(t,e,r,{retries:n,timeoutMs:a,onWarn:i}){let o;for(let d of t){for(let s=0;s<=n;s++)try{return{result:await De(d,e,r,a),url:d}}catch(f){if(o=f,f.tooBig)throw f;if(!f.transient||s===n)break;let h=Math.min(2e3*2**s,8e3)+Math.random()*250;i?.(`retry ${d} (${f.message.slice(0,70)}) in ${Math.round(h)}ms`),await He(h)}i?.(`endpoint exhausted: ${d} -> ${o?.message.slice(0,70)}`)}throw o??new P("no endpoints available")}async function V(t,e,r,n,a,i){let o=[{...e,fromBlock:ae(r),toBlock:ae(n)}];try{let{result:s}=await ie(t,"eth_getLogs",o,a);Array.isArray(s)&&i.push(...s);return}catch(s){if(!s.tooBig||n<=r)throw s;a.onWarn?.(`splitting ${r}-${n} (${s.message.slice(0,60)})`)}let d=r+Math.floor((n-r)/2);await Promise.all([V(t,e,r,d,a,i),V(t,e,d+1,n,a,i)])}async function le(t,e={}){if(!/^0x[0-9a-fA-F]{40}$/.test(t||""))throw new Error(`invalid address: ${t}`);let{chains:r=[1,8453,42161],lookback:n=1e5,fromBlock:a,toBlock:i,chunkSize:o=Oe,tokens:d,direction:s="both",retries:f=3,timeoutMs:h=2e4,concurrency:c=4,endpoints:u=W,onWarn:l}=e,E={retries:f,timeoutMs:h,onWarn:l},_=Me(t),b=[],R=[],C={},v=new Set;return await Promise.all(r.map(async m=>{let y=u[m];if(!y?.length){R.push({chainId:m,stage:"config",error:"no endpoints configured"});return}try{let w=i;if(w==null){let{result:g}=await ie(y,"eth_blockNumber",[],E);w=parseInt(g,16)}let p=Math.max(0,a??w-n+1),x=Math.max(p,w);C[m]={fromBlock:p,toBlock:x,blocks:x-p+1};let I=[];for(let g=p;g<=x;g+=o)I.push([g,Math.min(g+o-1,x)]);let S=[],$=d?.length?{address:d}:{};(s==="in"||s==="both")&&S.push({...$,topics:[se,null,_]}),(s==="out"||s==="both")&&S.push({...$,topics:[se,_,null]});let T=[];for(let g of S)for(let N of I)T.push([g,N]);let k=[],A=0,J=Array.from({length:Math.min(c,T.length)},async()=>{for(;A<T.length;){let[g,[N,H]]=T[A++];try{await V(y,g,N,H,E,k)}catch(Be){R.push({chainId:m,stage:"getLogs",range:[N,H],error:Be.message})}}});await Promise.all(J);for(let g of k){if(!g?.topics||g.topics.length<3)continue;let N=parseInt(g.logIndex,16),H=`${m}|${g.transactionHash}|${N}`;v.has(H)||(v.add(H),b.push({chainId:m,token:g.address.toLowerCase(),from:ce(g.topics[1]),to:ce(g.topics[2]),value:BigInt(g.data==="0x"?"0x0":g.data).toString(),blockNumber:parseInt(g.blockNumber,16),txHash:g.transactionHash,logIndex:N}))}}catch(w){R.push({chainId:m,stage:"range",error:w.message})}})),b.sort((m,y)=>y.blockNumber-m.blockNumber||y.logIndex-m.logIndex),{events:b,errors:R,ranges:C}}import{keccak_256 as te}from"@noble/hashes/sha3.js";import{createHash as fe}from"node:crypto";import L from"node:net";import je from"node:dns";var ze=new Set(["localhost","metadata.google.internal","metadata.goog"]);function j(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=h=>{if(!h)return[];let c=h.split(":"),u=c.at(-1);if(u?.includes(".")){let l=u.split(".").map(Number);if(l.length!==4||l.some(E=>!Number.isInteger(E)||E<0||E>255))return null;c.splice(c.length-1,1,(l[0]<<8|l[1]).toString(16),(l[2]<<8|l[3]).toString(16))}return c.some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:c.map(l=>Number.parseInt(l,16))},[n,a]=e.split("::"),i=r(n),o=r(a);if(!i||!o)return null;let d=e.includes("::"),s=8-i.length-o.length;if(!d&&s!==0||d&&s<1)return null;let f=[...i,...Array(Math.max(0,s)).fill(0),...o];return f.length!==8?null:Uint8Array.from(f.flatMap(h=>[h>>8,h&255]))}function G(t,e,r){let n=Math.floor(r/8),a=r%8;for(let o=0;o<n;o+=1)if(t[o]!==e[o])return!1;if(!a)return!0;let i=255<<8-a;return(t[n]&i)===(e[n]&i)}function Y(t){if(L.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(L.isIPv6(t)){let e=j(t);if(!e)return!1;let r=j("::ffff:0:0");return G(e,r,96)?Y([...e.slice(12)].join(".")):G(e,j("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([a,i])=>G(e,j(a),i)):!1}return!1}function Je(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(ze.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=L.isIP(r);return n!==0&&!Y(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function q(t,{lookupFn:e=je.promises.lookup}={}){let r=Je(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:L.isIPv6(r.host)?6:4}]};let n;try{n=await e(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(a=>!Y(a.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function K({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let c=await e();r=c.Agent,n=c.fetch}catch(c){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)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 a=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,o=c=>(Array.isArray(c)?c:[c]).map(u=>typeof u=="string"?{address:u}:u).filter(u=>u&&u.address).map(u=>({address:u.address,family:u.family||(L.isIPv6(u.address)?6:4)})),d=(c,u,l)=>{i.set(a(c),o(typeof u=="string"?[{address:u,family:l}]:u))},s=c=>{let u=a(c);if(L.isIP(u))return[{address:u,family:L.isIPv6(u)?6:4}];let l=i.get(u);if(!l||!l.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return l},f=new r({connect:{lookup(c,u,l){let E;try{E=s(c)}catch(_){return l(_)}return u?.all?l(null,E):l(null,E[0].address,E[0].family)}}}),h=Ve((c,u={})=>n(c,{...u,dispatcher:f}),d);return{dispatcher:f,fetch:h,pin:d,resolve:s,async close(){try{await f.destroy()}catch{}}}}var X=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ve(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[X]=Object.freeze({pin:e}),t}function Z(t){return typeof t=="function"&&typeof t[X]?.pin=="function"}function ue(t,e,r){if(!Z(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[X].pin(e,r)}var We=new Set([408,425,429,500,502,503,504]),de=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ge=2,he=4e3,be=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ye=new Set([301,302,303,307,308]),pe=3,qe=64*1024;function Ke(t){let e=String(t||"").toLowerCase();return be.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function Xe(t){let e={};for(let[r,n]of Object.entries(t||{}))Ke(r)||(e[r]=n);return e}function Ze(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Qe(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var Q=new Map,et=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,tt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function me(t){let e=String(t?.method||"");return e?!et.test(e):!1}function rt(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}return Array.isArray(r)?r.length>0&&r.every(me):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?me(r):typeof r.type=="string"&&tt.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function nt(t,e,r,n={},a=null){let i={};for(let[u,l]of Object.entries(r||{}))i[u.toLowerCase()]=l;let o=Object.keys(i).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...be,...o])].sort().map(u=>`${u}=${i[u]??""}`).join(`
2
+ `),f=fe("sha256").update(s).digest("hex").slice(0,32),h=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,c=a==null?"-":fe("sha256").update(String(a)).digest("hex").slice(0,32);return`${t} ${e} ${h} ${f} ${c}`}function ot(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,he):Math.min(250*2**t,he)+Math.floor(Math.random()*100)}var st=t=>new Promise(e=>setTimeout(e,t));function M(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function ee(t,e,r){return M(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function F(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function at(t){return t?t.byteLength??t.length??0:0}async function we(t,e,{url:r,truncate:n=!1,onOversize:a}={}){if(e==null)return await t.text();let i=Number(t.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>e&&(F(t),!n))throw ee(r,`content-length ${i}`,e);let o=t.body?.getReader?.();if(!o){let c=await t.text(),u=Buffer.byteLength(c,"utf8");if(u>e){if(!n)throw ee(r,`body ${u} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let d=[],s=0,f=!1;try{for(;;){let{value:c,done:u}=await o.read();if(u)break;if(c&&(d.push(Buffer.from(c)),s+=at(c),s>e)){f=!0;break}}}finally{if(f)try{await o.cancel()}catch{}try{o.releaseLock?.()}catch{}}if(f&&(typeof a=="function"&&a(),!n))throw ee(r,`streamed ${s} bytes`,e);let h=Buffer.concat(d);return(f?h.subarray(0,e):h).toString("utf8")}function ge(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function ct(t,{fetchImpl:e,method:r,headers:n,body:a,timeoutMs:i,lookupFn:o,realFetch:d,untrustedUrl:s=!1,maxResponseBytes:f=null,importUndici:h,validateResponse:c,signal:u}){let l=new AbortController,E=setTimeout(()=>l.abort(),i),_=u?typeof AbortSignal.any=="function"?AbortSignal.any([u,l.signal]):u:l.signal,b=null,R=e,C=o?{lookupFn:o}:{};if(s&&!d&&!Z(R))throw M(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let v=async(m,{status:y=null}={})=>{let w=await q(m,C);if(!w.ok)throw M(y==null?`HTTP refused ${m}: ${w.error}`:`HTTP redirect to ${m} ${w.error}`,y==null?{}:{status:y});let p=new URL(m).hostname;if(d){if(b&&(await b.close(),b=null),!b)try{b=await K({requireUndici:!0,...h?{importUndici:h}:{}})}catch(x){throw M(y==null?`HTTP refused ${m}: ${x?.message||x}`:`HTTP redirect to ${m} refused: ${x?.message||x}`,y==null?{}:{status:y})}b.pin(p,w.addresses),R=b.fetch}else ue(R,p,w.addresses);return w};try{let m=String(t),y={...n||{}};s&&await v(m);for(let w=0;w<=pe;w+=1){let p=await R(m,{method:r,headers:y,body:a,signal:_,redirect:"manual"});if(Ye.has(p.status)){if(r!=="GET"&&r!=="HEAD"){let k=await we(p,f??qe,{url:m,truncate:!0}),A=new Error(`HTTP ${p.status} ${r} ${m} redirected non-idempotent request`);throw A.status=p.status,A.body=ge(k)??k.slice(0,300),A}if(w===pe)throw F(p),new Error(`HTTP redirect loop for ${t}`);let S=p.headers?.get?.("location"),$;try{$=Ze(S,m)}catch(k){throw F(p),k}let T=!Qe($,m);if(F(p),T&&(y=Xe(y)),s)await v($,{status:p.status});else if(T){let k=await q($,C);if(!k.ok){let A=new Error(`HTTP redirect from ${m} ${k.error}`);throw A.status=p.status,A.retryable=!1,A}d&&k.addresses?.length&&(b||(b=await K(h?{importUndici:h}:{})),b&&(b.pin(new URL($).hostname,k.addresses),R=b.fetch))}m=$;continue}if(typeof c=="function")try{await c(p,{url:m})}catch(S){throw F(p),M(S?.message||String(S))}let x=await we(p,f,{url:m,onOversize:()=>l.abort()}),I=ge(x);if(!p.ok){let S=new Error(`HTTP ${p.status} ${r} ${m}`);throw S.status=p.status,S.retryAfter=p.headers?.get?.("retry-after")??null,S.body=I??x.slice(0,300),S}return I??x}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(E),b&&await b.close()}}async function ye(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,a=(e.method||"GET").toUpperCase(),i={Accept:"application/json",...e.headers||{}},o=e.body;o!=null&&typeof o!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",o=JSON.stringify(o));let d=Number.isInteger(e.retries)?Math.max(e.retries,0):Ge,s=e.lookupFn,f=!e.fetchImpl,h=e.untrustedUrl===!0,c=e.importUndici,u=e.validateResponse,l=e.signal,E=Number(e.maxResponseBytes),_=Number.isFinite(E)&&E>0?Math.floor(E):null,b=async()=>{let y;for(let w=0;w<=d;w++){l?.throwIfAborted?.();try{return await ct(t,{fetchImpl:r,method:a,headers:i,body:o,timeoutMs:n,lookupFn:s,realFetch:f,untrustedUrl:h,maxResponseBytes:_,importUndici:c,validateResponse:u,signal:l})}catch(p){y=p;let x=p?.status,I=p?.name==="AbortError"||p?.name==="TimeoutError"||l?.aborted,S=new Set([408,425,429]),$=p?.retryable===!1?!1:x!=null?S.has(x)||We.has(x)&&de.has(a):!I&&de.has(a);if(w===d||!$)throw p;let T=ot(w,p?.retryAfter);l?await new Promise((k,A)=>{let J=setTimeout(k,T);l.addEventListener("abort",()=>{clearTimeout(J),A(l.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await st(T)}}throw y};if(!(e.dedupe!==!1&&!l&&rt(a,o)))return b();let C=nt(a,t,i,{untrustedUrl:h,maxResponseBytes:_},o),v=Q.get(C);if(v)return v;let m=b().finally(()=>Q.delete(C));return Q.set(C,m),m}var Ee={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}},it=new Map(Object.values(Ee).map(t=>[t.chainId,t]));function xe(t){return it.get(Number(t))||null}function Se(t,e=process.env){let r=xe(t);if(!r)return null;for(let n of r.rpcEnv){let a=(e[n]||"").trim();if(a)return a}return null}import{Interface as lt,getAddress as Jt}from"ethers";var Vt=new lt(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ut={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"};function ft(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=Se(t,r);return n||ut[Number(t)]||null}var dt=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function ht(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!dt.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}var U=new Map,ke=new Map;function pt(t){let e=new Error(t?.message||JSON.stringify(t));return e.code=t?.code,e}function mt(t){if(t?.error)throw pt(t.error);return t?.result}function wt(t,e,r){return`${t}
3
+ ${e}
4
+ ${JSON.stringify(r??[])}`}async function gt(t,e,r){return ye(t,{method:"POST",body:e,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Ae(t,e,r=[],n={}){let a=String(e||""),i=ht(a),o=ft(t,n);if(!o)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let h=ke.get(o);if(h!=null)return h}let s=n.dedupe!==!1&&!n.signal?wt(o,a,r):null;if(s&&U.has(s))return U.get(s);let f=(async()=>{let h=await gt(o,{jsonrpc:"2.0",id:1,method:e,params:r},n),c=mt(h);return i==="eth_chainid"&&typeof c=="string"&&ke.set(o,c),c})();return s&&(U.set(s,f),f.finally(()=>{U.get(s)===f&&U.delete(s)}).catch(()=>{})),f}var ne=999,re=1,bt=8453,Re="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",yt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",$e="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",Et="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",xt=".80002105.reverse",Te=/^0x[a-fA-F0-9]{40}$/,_e=new TextEncoder,Ce=t=>"0x"+Buffer.from(t).toString("hex"),B=t=>Ce(te(_e.encode(t))).slice(0,10),ve=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function z(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=te(_e.encode(r)),a=new Uint8Array(64);a.set(e,0),a.set(n,32),e=te(a)}return Ce(e)}function oe(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let a=e.slice(r+64,r+64+n*2);return Buffer.from(a,"hex").toString("utf8")}catch{return""}}async function O(t,e,r){try{return await Ae(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function St(t){let e=await O(ne,Re,B("primaryName(address)")+ve(t)),r=oe(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function kt(t){let e=await O(ne,yt,B("getName(address)")+ve(t)),r=oe(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function Ie(t,e,r){let n=await O(t,r,B("name(bytes32)")+e.slice(2));return oe(n)||null}async function At(t){let e=z(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await O(re,$e,B("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:Ie(re,e,n)}async function Rt(t){let e=z(t.slice(2).toLowerCase()+xt);return Ie(bt,e,Et)}var $t=[{source:"hl",fn:St},{source:"hype",fn:kt},{source:"ens",fn:At},{source:"basename",fn:Rt}];async function Tt(t){let e=z(t),r=await O(ne,Re,B("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function _t(t,e,r){let n=z(e),a=await O(t,r,B("resolver(bytes32)")+n.slice(2));if(!a)return null;let i="0x"+a.slice(-40);if(/^0x0+$/.test(i))return null;let o=await O(t,i,B("addr(bytes32)")+n.slice(2));if(!o)return null;let d="0x"+o.slice(-40);return/^0x0+$/.test(d)?null:d}async function Ne(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Tt(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await _t(re,e,$e);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var qt=$t.map(t=>t.source);var D={1:"ethereum",8453:"base",42161:"arbitrum"},Ct=Object.fromEntries(Object.entries(D).map(([t,e])=>[e,Number(t)])),Le=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
3
5
 
4
6
  oracle follow vitalik.eth
5
7
  oracle follow demi.hl --chain base
@@ -8,21 +10,21 @@ var oe="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",W={1
8
10
  Reads ERC20 transfer activity for a wallet. Read-only: this calls
9
11
  eth_getLogs and eth_blockNumber and nothing else, so it can never move funds.
10
12
 
11
- Chains: ${Object.values(F).join(", ")}. Default: ethereum.
13
+ Chains: ${Object.values(D).join(", ")}. Default: ethereum.
12
14
  Lookback defaults to 40000 blocks. Endpoints are keyless.
13
15
 
14
16
  Note publicnode-class RPCs are deliberately excluded: they retain only ~128
15
- blocks, so they return an empty result instead of an error.`;function _e(t,e){let r=t.indexOf(e);return r>=0?t[r+1]:void 0}function Et(t){let e=String(t??"");return e.length>22?`${e.slice(0,19)}...`:e}async function xt(t=[]){let e=t.includes("--json"),r=[];for(let s=0;s<t.length;s+=1){let f=t[s];if(f!=="--json"){if(f==="--chain"||f==="--blocks"){s+=1;continue}r.push(f)}}let n=(r[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(`${ve}
16
- `),n?0:1;let o=(_e(t,"--chain")||"ethereum").toLowerCase(),i=yt[o]??Number(o);if(!W[i])return process.stderr.write(`follow: unsupported chain "${o}". Supported: ${Object.values(F).join(", ")}
17
- `),1;let a=_e(t,"--blocks"),l=a?Number(a):4e4;if(!Number.isFinite(l)||l<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${a}"
18
- `),1;try{let s=n,f=null;if(!Se.test(n)){let u=await Ce(n);if(!u?.address)return process.stderr.write(`follow: could not resolve "${n}" to an address
19
- `),1;s=u.address,f=n}let h=await ie(s,{chains:[i],lookback:l,onWarn:e?void 0:u=>process.stderr.write(` warn: ${u}
20
- `)}),c=h.events||[];if(e)return process.stdout.write(`${JSON.stringify({address:s,resolvedFrom:f,chain:F[i]||String(i),lookbackBlocks:l,count:c.length,errors:h.errors||[],events:c})}
21
- `),0;let d=f?`${f} ${s}`:s;process.stdout.write(`${d}
22
- `),process.stdout.write(` ${F[i]||i} \xB7 last ${l} blocks \xB7 ${c.length} transfer${c.length===1?"":"s"}
17
+ blocks, so they return an empty result instead of an error.`;function Pe(t,e){let r=t.indexOf(e);return r>=0?t[r+1]:void 0}function vt(t){let e=String(t??"");return e.length>22?`${e.slice(0,19)}...`:e}async function It(t=[]){let e=t.includes("--json"),r=[];for(let s=0;s<t.length;s+=1){let f=t[s];if(f!=="--json"){if(f==="--chain"||f==="--blocks"){s+=1;continue}r.push(f)}}let n=(r[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(`${Le}
18
+ `),n?0:1;let a=(Pe(t,"--chain")||"ethereum").toLowerCase(),i=Ct[a]??Number(a);if(!W[i])return process.stderr.write(`follow: unsupported chain "${a}". Supported: ${Object.values(D).join(", ")}
19
+ `),1;let o=Pe(t,"--blocks"),d=o?Number(o):4e4;if(!Number.isFinite(d)||d<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${o}"
20
+ `),1;try{let s=n,f=null;if(!Te.test(n)){let l=await Ne(n);if(!l?.address)return process.stderr.write(`follow: could not resolve "${n}" to an address
21
+ `),1;s=l.address,f=n}let h=await le(s,{chains:[i],lookback:d,onWarn:e?void 0:l=>process.stderr.write(` warn: ${l}
22
+ `)}),c=h.events||[];if(e)return process.stdout.write(`${JSON.stringify({address:s,resolvedFrom:f,chain:D[i]||String(i),lookbackBlocks:d,count:c.length,errors:h.errors||[],events:c})}
23
+ `),0;let u=f?`${f} ${s}`:s;process.stdout.write(`${u}
24
+ `),process.stdout.write(` ${D[i]||i} \xB7 last ${d} blocks \xB7 ${c.length} transfer${c.length===1?"":"s"}
23
25
  `),c.length||process.stdout.write(` no ERC20 transfers in this window
24
- `);for(let u of c.slice(0,25)){let E=u.to?.toLowerCase()===s.toLowerCase()?"in ":"out";process.stdout.write(` ${E} blk ${u.blockNumber} token ${u.token} ${Et(u.value)}
26
+ `);for(let l of c.slice(0,25)){let E=l.to?.toLowerCase()===s.toLowerCase()?"in ":"out";process.stdout.write(` ${E} blk ${l.blockNumber} token ${l.token} ${vt(l.value)}
25
27
  `)}c.length>25&&process.stdout.write(` ... ${c.length-25} more (use --json for all)
26
- `);for(let u of h.errors||[])process.stderr.write(` error: ${u.stage||"rpc"}: ${u.error}
28
+ `);for(let l of h.errors||[])process.stderr.write(` error: ${l.stage||"rpc"}: ${l.error}
27
29
  `);return 0}catch(s){return process.stderr.write(`follow failed: ${s?.message||s}
28
- `),1}}var zt={name:"follow",summary:"read a wallet's recent ERC20 transfer activity",group:"read",usage:ve,async run(t){return xt(t.argv||[])}};export{zt as default};
30
+ `),1}}var Qt={name:"follow",summary:"read a wallet's recent ERC20 transfer activity",group:"read",usage:Le,async run(t){return It(t.argv||[])}};export{Qt as default};