@oracle-agent/oracle 0.35.38 → 0.35.40

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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-sessions.mjs +13 -13
  3. package/dist/assets/skills/blocked-page-recovery.md +16 -0
  4. package/dist/assets/skills/browser-use.md +19 -0
  5. package/dist/assets/skills/chrome-profile-browser.md +21 -0
  6. package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +27 -0
  7. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  8. package/dist/assets/skills/oracle-x402/SKILL.md +54 -11
  9. package/dist/assets/skills/web-form-filling.md +19 -0
  10. package/dist/assets/skills/web-research.md +17 -0
  11. package/dist/assets/skills/x-read-browser.md +17 -0
  12. package/dist/assets/skills/xurl.md +1 -1
  13. package/dist/bin/desk-server.mjs +30 -30
  14. package/dist/bin/oracle-data-mcp.mjs +17 -13
  15. package/dist/bin/oracle-public-server.mjs +1 -1
  16. package/dist/bin/oracle-route.mjs +26 -14
  17. package/dist/bin/oracle-scan.mjs +4 -4
  18. package/dist/bin/oracle.mjs +11 -10
  19. package/dist/cli/commands/agent-session.mjs +18 -18
  20. package/dist/cli/commands/auth.mjs +20 -17
  21. package/dist/cli/commands/chat.mjs +231 -228
  22. package/dist/cli/commands/data.mjs +5 -5
  23. package/dist/cli/commands/doctor.mjs +1 -1
  24. package/dist/cli/commands/eval.mjs +154 -152
  25. package/dist/cli/commands/extension-policy.mjs +1 -1
  26. package/dist/cli/commands/follow.mjs +57 -19
  27. package/dist/cli/commands/governance-prepare.mjs +1 -1
  28. package/dist/cli/commands/init.mjs +2 -2
  29. package/dist/cli/commands/model.mjs +235 -232
  30. package/dist/cli/commands/public.mjs +3 -3
  31. package/dist/cli/commands/route.mjs +1 -1
  32. package/dist/cli/commands/setup.mjs +62 -59
  33. package/dist/cli/commands/signer.mjs +4 -4
  34. package/dist/cli/commands/upgrade.mjs +2 -2
  35. package/dist/cli/commands/x402.mjs +19 -0
  36. package/dist/control-plane/index.mjs +1 -1
  37. package/dist/data/desk-data.mjs +28 -28
  38. package/dist/index.mjs +46 -46
  39. package/dist/local-signer/runtime.mjs +6 -6
  40. package/dist/teams/index.mjs +6 -5
  41. package/dist/tui/standalone-client.mjs +84 -82
  42. package/package.json +1 -1
  43. package/public/eval-report.json +2 -2
  44. package/public/oracle-splash/docs/browser-and-web/index.html +32 -0
  45. package/public/oracle-splash/docs/connectors/index.html +18 -0
  46. package/public/oracle-splash/docs/docs.css +21 -0
  47. package/public/oracle-splash/docs/docs.js +108 -0
  48. package/public/oracle-splash/docs/getting-started/index.html +36 -0
  49. package/public/oracle-splash/docs/index.html +26 -0
  50. package/public/oracle-splash/docs/reference/index.html +20 -0
  51. package/public/oracle-splash/docs/security/index.html +19 -0
  52. package/public/oracle-splash/docs/using-oracle/index.html +32 -0
  53. package/public/oracle-splash/download/index.html +2584 -0
  54. package/public/oracle-splash/index.html +313 -942
  55. package/public/oracle-splash/pricing/index.html +2570 -0
  56. package/public/oracle-splash/security/index.html +2574 -0
  57. package/public/oracle-splash/what-it-does/index.html +2608 -0
  58. package/public/oracle-splash/where-it-works/index.html +2635 -0
  59. package/server.json +2 -2
  60. package/dist/assets/equities-fixtures/bridge_routes.json +0 -159
@@ -1,3 +1,3 @@
1
- import E from"node:fs";import u from"node:path";import{homedir as g}from"node:os";var _=Object.freeze(["oracle_cli","memory_add","memory_remove","memory_search","skill_load","skill_create","skill_list","cron_add","cron_list","cron_remove","meta_analyze","web_fetch","web_search","file_read","file_write","mcp_list","mcp_call","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","learn_skill","approval_preview","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk","trade_lifecycle","signal_score","vault_status","signer_status","signer_execute","signer_disarm","receipt_report","watch_create","watch_list","portfolio_snapshot","vision_analyze","browser_exec","xurl","knowledge_search"]),d="deny",w=256*1024,O=128,l=Object.freeze({version:1,source:"default",defaultDecision:d,allow:_,deny:Object.freeze([])});function s(e){let o=new Set;if(!Array.isArray(e))return o;for(let t of e){if(typeof t!="string")continue;let r=t.trim();r.length===0||r.length>O||o.add(r)}return o}function x(e){return{allow:!1,reason:e}}function p(e){return{allow:!0,reason:e}}var i="extension-prepare-only",f=Object.freeze(["oracle_cli","memory_search","skill_load","skill_list","web_fetch","web_search","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","approval_preview","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk","trade_lifecycle","signal_score","vault_status","signer_status","receipt_report","watch_list","portfolio_snapshot","vision_analyze","knowledge_search"]),c=new Set(f);function y(e=process.env){return e?.ORACLE_EXECUTION_MODE===i}function m(e,o=process.env){if(!y(o))return p("allowed: normal Oracle execution mode");let t=typeof e?.name=="string"?e.name.trim():"";return!t||!c.has(t)?x(`denied: tool "${t||"unknown"}" is outside extension prepare-only mode`):p(`allowed: tool "${t}" is inside extension prepare-only mode`)}function a(e,o=process.env){if(!y(o))return e;let t=[...s(e?.allow)].filter(n=>c.has(n)),r=new Set([...s(e?.deny),..._.filter(n=>!c.has(n))]);return Object.freeze({version:1,source:`${String(e?.source||"default")}:extension-prepare-only`,defaultDecision:d,allow:Object.freeze(t),deny:Object.freeze([...r])})}function b(e=process.env){let o=e&&e.ORACLE_CONFIG_DIR||u.join(g(),".config","oracle");return u.join(o,"tool-policy.json")}function h(e=process.env){try{let o=b(e),t=E.readFileSync(o,"utf8");if(typeof t!="string"||t.length>w)return a(l,e);let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))return a(l,e);let n=Array.isArray(r.allow)?s(r.allow):s(_);return a(Object.freeze({version:1,source:o,defaultDecision:d,allow:Object.freeze([...n]),deny:Object.freeze([...s(r.deny)])}),e)}catch{return a(l,e)}}function v(e=process.env){let o={...e,ORACLE_EXECUTION_MODE:i},t=h(o);return{ok:m({name:"signer_execute",args:{}},o).allow===!1&&!t.allow.includes("signer_execute"),version:1,mode:i,signerExecute:!1,tools:f}}var T={name:"extension-policy",summary:"attest the extension prepare-only tool boundary",group:"system",usage:"oracle extension-policy --json",async run(e){if(e.argv.length!==1||e.argv[0]!=="--json")return process.stderr.write(`oracle extension-policy requires --json
1
+ import E from"node:fs";import u from"node:path";import{homedir as g}from"node:os";var _=Object.freeze(["oracle_cli","memory_add","memory_remove","memory_search","skill_load","skill_create","skill_list","cron_add","cron_list","cron_remove","meta_analyze","web_fetch","web_search","file_read","file_write","mcp_list","mcp_call","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","learn_skill","approval_preview","workspace_artifact","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk","trade_lifecycle","signal_score","vault_status","signer_status","signer_execute","signer_disarm","receipt_report","watch_create","watch_list","portfolio_snapshot","vision_analyze","browser_exec","xurl","knowledge_search","x402_prepare"]),d="deny",w=256*1024,O=128,l=Object.freeze({version:1,source:"default",defaultDecision:d,allow:_,deny:Object.freeze([])});function s(e){let o=new Set;if(!Array.isArray(e))return o;for(let t of e){if(typeof t!="string")continue;let r=t.trim();r.length===0||r.length>O||o.add(r)}return o}function x(e){return{allow:!1,reason:e}}function p(e){return{allow:!0,reason:e}}var i="extension-prepare-only",f=Object.freeze(["oracle_cli","memory_search","skill_load","skill_list","web_fetch","web_search","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","approval_preview","research_artifact","portfolio_analyze","tax_lots","position_health","governance_prepare","safety_intelligence","portfolio_risk","trade_lifecycle","signal_score","vault_status","signer_status","receipt_report","watch_list","portfolio_snapshot","vision_analyze","knowledge_search"]),c=new Set(f);function y(e=process.env){return e?.ORACLE_EXECUTION_MODE===i}function m(e,o=process.env){if(!y(o))return p("allowed: normal Oracle execution mode");let t=typeof e?.name=="string"?e.name.trim():"";return!t||!c.has(t)?x(`denied: tool "${t||"unknown"}" is outside extension prepare-only mode`):p(`allowed: tool "${t}" is inside extension prepare-only mode`)}function a(e,o=process.env){if(!y(o))return e;let t=[...s(e?.allow)].filter(n=>c.has(n)),r=new Set([...s(e?.deny),..._.filter(n=>!c.has(n))]);return Object.freeze({version:1,source:`${String(e?.source||"default")}:extension-prepare-only`,defaultDecision:d,allow:Object.freeze(t),deny:Object.freeze([...r])})}function b(e=process.env){let o=e&&e.ORACLE_CONFIG_DIR||u.join(g(),".config","oracle");return u.join(o,"tool-policy.json")}function h(e=process.env){try{let o=b(e),t=E.readFileSync(o,"utf8");if(typeof t!="string"||t.length>w)return a(l,e);let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))return a(l,e);let n=Array.isArray(r.allow)?s(r.allow):s(_);return a(Object.freeze({version:1,source:o,defaultDecision:d,allow:Object.freeze([...n]),deny:Object.freeze([...s(r.deny)])}),e)}catch{return a(l,e)}}function v(e=process.env){let o={...e,ORACLE_EXECUTION_MODE:i},t=h(o);return{ok:m({name:"signer_execute",args:{}},o).allow===!1&&!t.allow.includes("signer_execute"),version:1,mode:i,signerExecute:!1,tools:f}}var T={name:"extension-policy",summary:"attest the extension prepare-only tool boundary",group:"system",usage:"oracle extension-policy --json",async run(e){if(e.argv.length!==1||e.argv[0]!=="--json")return process.stderr.write(`oracle extension-policy requires --json
2
2
  `),1;let o=v();return process.stdout.write(`${JSON.stringify(o)}
3
3
  `),o.ok?0:1}};export{T as default,v as extensionPolicyAttestation};
@@ -1,30 +1,68 @@
1
- var ge="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",oe={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"]},Xe=1e4,Qe=t=>new Promise(e=>setTimeout(e,t)),Te=t=>"0x"+BigInt(t).toString(16),et=t=>"0x"+"0".repeat(24)+t.slice(2).toLowerCase(),Ee=t=>"0x"+t.slice(26).toLowerCase(),tt=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,rt=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,D=class extends Error{constructor(e,{transient:r=!1,tooBig:n=!1,http:i=0}={}){super(e),this.transient=r,this.tooBig=n,this.http=i}};async function nt(t,e,r,n){let i=new AbortController,l=setTimeout(()=>i.abort(),n),s,f;try{s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:r}),signal:i.signal}),f=await s.text()}catch(u){throw new D(`${e} network: ${u.message}`,{transient:!0})}finally{clearTimeout(l)}let o;try{o=JSON.parse(f)}catch{throw new D(`${e} non-JSON http=${s.status}: ${f.slice(0,80)}`,{transient:s.status>=500||s.status===429,http:s.status})}if(o.error){let u=o.error.message||"rpc error";throw new D(`${e} rpc: ${u}`,{transient:tt.test(u),tooBig:rt.test(u),http:s.status})}if(s.status!==200)throw new D(`${e} http=${s.status}: ${f.slice(0,80)}`,{transient:s.status>=500||s.status===429,http:s.status});return o.result}async function Oe(t,e,r,{retries:n,timeoutMs:i,onWarn:l}){let s;for(let f of t){for(let o=0;o<=n;o++)try{return{result:await nt(f,e,r,i),url:f}}catch(u){if(s=u,u.tooBig)throw u;if(!u.transient||o===n)break;let a=Math.min(2e3*2**o,8e3)+Math.random()*250;l?.(`retry ${f} (${u.message.slice(0,70)}) in ${Math.round(a)}ms`),await Qe(a)}l?.(`endpoint exhausted: ${f} -> ${s?.message.slice(0,70)}`)}throw s??new D("no endpoints available")}async function ne(t,e,r,n,i,l){let s=[{...e,fromBlock:Te(r),toBlock:Te(n)}];try{let{result:o}=await Oe(t,"eth_getLogs",s,i);Array.isArray(o)&&l.push(...o);return}catch(o){if(!o.tooBig||n<=r)throw o;i.onWarn?.(`splitting ${r}-${n} (${o.message.slice(0,60)})`)}let f=r+Math.floor((n-r)/2);await Promise.all([ne(t,e,r,f,i,l),ne(t,e,f+1,n,i,l)])}async function Se(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:i,toBlock:l,chunkSize:s=Xe,tokens:f,direction:o="both",retries:u=3,timeoutMs:a=2e4,concurrency:c=4,endpoints:p=oe,onWarn:d}=e,m={retries:u,timeoutMs:a,onWarn:d},A=et(t),R=[],k=[],j={},g=new Set;return await Promise.all(r.map(async T=>{let N=p[T];if(!N?.length){k.push({chainId:T,stage:"config",error:"no endpoints configured"});return}try{let I=l;if(I==null){let{result:w}=await Oe(N,"eth_blockNumber",[],m);I=parseInt(w,16)}let y=Math.max(0,i??I-n+1),O=Math.max(y,I);j[T]={fromBlock:y,toBlock:O,blocks:O-y+1};let P=[];for(let w=y;w<=O;w+=s)P.push([w,Math.min(w+s-1,O)]);let C=[],h=f?.length?{address:f}:{};(o==="in"||o==="both")&&C.push({...h,topics:[ge,null,A]}),(o==="out"||o==="both")&&C.push({...h,topics:[ge,A,null]});let _=[];for(let w of C)for(let $ of P)_.push([w,$]);let B=[],v=0,K=Array.from({length:Math.min(c,_.length)},async()=>{for(;v<_.length;){let[w,[$,b]]=_[v++];try{await ne(N,w,$,b,m,B)}catch(E){k.push({chainId:T,stage:"getLogs",range:[$,b],error:E.message})}}});await Promise.all(K);for(let w of B){if(!w?.topics||w.topics.length<3)continue;let $=parseInt(w.logIndex,16),b=`${T}|${w.transactionHash}|${$}`;g.has(b)||(g.add(b),R.push({chainId:T,token:w.address.toLowerCase(),from:Ee(w.topics[1]),to:Ee(w.topics[2]),value:BigInt(w.data==="0x"?"0x0":w.data).toString(),blockNumber:parseInt(w.blockNumber,16),txHash:w.transactionHash,logIndex:$}))}}catch(I){k.push({chainId:T,stage:"range",error:I.message})}})),R.sort((T,N)=>N.blockNumber-T.blockNumber||N.logIndex-T.logIndex),{events:R,errors:k,ranges:j}}import{keccak_256 as he}from"@noble/hashes/sha3.js";import{createHash as ct}from"node:crypto";import{types as L}from"node:util";import F from"node:net";import ot from"node:dns";var st=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Z(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=a=>{if(!a)return[];let c=a.split(":"),p=c.at(-1);if(p?.includes(".")){let d=p.split(".").map(Number);if(d.length!==4||d.some(m=>!Number.isInteger(m)||m<0||m>255))return null;c.splice(c.length-1,1,(d[0]<<8|d[1]).toString(16),(d[2]<<8|d[3]).toString(16))}return c.some(d=>!/^[0-9a-f]{1,4}$/.test(d))?null:c.map(d=>Number.parseInt(d,16))},[n,i]=e.split("::"),l=r(n),s=r(i);if(!l||!s)return null;let f=e.includes("::"),o=8-l.length-s.length;if(!f&&o!==0||f&&o<1)return null;let u=[...l,...Array(Math.max(0,o)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(a=>[a>>8,a&255]))}function se(t,e,r){let n=Math.floor(r/8),i=r%8;for(let s=0;s<n;s+=1)if(t[s]!==e[s])return!1;if(!i)return!0;let l=255<<8-i;return(t[n]&l)===(e[n]&l)}function ae(t){if(F.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(F.isIPv6(t)){let e=Z(t);if(!e)return!1;let r=Z("::ffff:0:0");return se(e,r,96)?ae([...e.slice(12)].join(".")):se(e,Z("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([i,l])=>se(e,Z(i),l)):!1}return!1}function at(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(st.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=F.isIP(r);return n!==0&&!ae(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function ie(t,{lookupFn:e=ot.promises.lookup}={}){let r=at(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:F.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(i=>!ae(i.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function ce({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 i=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),l=new Map,s=c=>(Array.isArray(c)?c:[c]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(F.isIPv6(p.address)?6:4)})),f=(c,p,d)=>{l.set(i(c),s(typeof p=="string"?[{address:p,family:d}]:p))},o=c=>{let p=i(c);if(F.isIP(p))return[{address:p,family:F.isIPv6(p)?6:4}];let d=l.get(p);if(!d||!d.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return d},u=new r({connect:{lookup(c,p,d){let m;try{m=o(c)}catch(A){return d(A)}return p?.all?d(null,m):d(null,m[0].address,m[0].family)}}}),a=it((c,p={})=>n(c,{...p,dispatcher:u}),f);return{dispatcher:u,fetch:a,pin:f,resolve:o,async close(){try{await u.destroy()}catch{}}}}var le=Symbol.for("oracle.egressGuard.pinCapableFetch");function it(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[le]=Object.freeze({pin:e}),t}function ue(t){return typeof t=="function"&&typeof t[le]?.pin=="function"}function xe(t,e,r){if(!ue(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[le].pin(e,r)}var lt=new Set([408,425,429,500,502,503,504]),Pe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ut=2,Ae=4e3,ft=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,dt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,pt=AbortSignal.prototype.throwIfAborted,ht=EventTarget.prototype.addEventListener,Re=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,pe=t=>t?ft.call(t):!1,mt=t=>t?dt.call(t):void 0,wt=new Set([301,302,303,307,308]),Q=3,lr=64*1024,H=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function x(t){return M(`HTTP JSON body refused: ${t}`)}function yt(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof L[e]=="function"&&L[e](t))}function bt(t){let e=[],r=0,n=0,i=0,l=0,s=new WeakSet,f=a=>{if(r+=Buffer.byteLength(a,"utf8"),r>H.bytes)throw x("serialized byte limit exceeded");e.push(a)},o=a=>{if(Buffer.byteLength(a,"utf8")>H.bytes)throw x("serialized byte limit exceeded");return JSON.stringify(a)},u=(a,c)=>{if(n+=1,n>H.nodes)throw x("node limit exceeded");if(c>H.depth)throw x("depth limit exceeded");if(a===null){f("null");return}if(typeof a=="string"){f(o(a));return}if(typeof a=="boolean"){f(a?"true":"false");return}if(typeof a=="number"){if(!Number.isFinite(a))throw x("non-finite number");f(Object.is(a,-0)?"0":String(a));return}if(typeof a!="object")throw x("unsupported non-JSON value");if(L.isProxy(a))throw x("proxy value");if(yt(a))throw x("unsupported exotic object");if(s.has(a))throw x("cyclic value");s.add(a);try{if(Object.getOwnPropertySymbols(a).length>0)throw x("symbol-keyed fields are unsupported");if(Array.isArray(a)){let m=Object.getPrototypeOf(a),A=0;for(;m!==null;){if(L.isProxy(m))throw x("proxy array prototype");if(A+=1,A>H.depth)throw x("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(a.length>H.arrayLength)throw x("array length limit exceeded");for(let k=0;k<a.length;k+=1){let j=Object.getOwnPropertyDescriptor(a,String(k));if(!j||!Object.hasOwn(j,"value")||j.enumerable!==!0)throw x("array entries must be dense enumerable own data")}let R=0;for(let k in a){if(l+=1,l>H.fields)throw x("enumeration limit exceeded");if(Object.hasOwn(a,k)&&(R+=1,R>a.length))throw x("named array fields are unsupported")}if(R!==a.length)throw x("array entries must be dense enumerable own data");f("[");for(let k=0;k<a.length;k+=1)k&&f(","),u(Object.getOwnPropertyDescriptor(a,String(k)).value,c+1);f("]");return}let p=Object.getPrototypeOf(a);if(p!==Object.prototype&&p!==null)throw x("non-plain object");let d=[];for(let m in a){if(l+=1,l>H.fields)throw x("enumeration limit exceeded");if(!Object.hasOwn(a,m))continue;if(i+=1,i>H.fields)throw x("field limit exceeded");let A=Object.getOwnPropertyDescriptor(a,m);if(!A||!Object.hasOwn(A,"value")||A.enumerable!==!0)throw x("object fields must be enumerable own data");d.push([m,A.value])}f("{");for(let m=0;m<d.length;m+=1)m&&f(","),f(o(d[m][0])),f(":"),u(d[m][1],c+1);f("}")}finally{s.delete(a)}};return u(t,0),e.join("")}function gt(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(L.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let i=n.toLowerCase();if(r.has(i))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(i);let l=Object.getOwnPropertyDescriptor(t,n);if(!l||!Object.hasOwn(l,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=l.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");e[n]=String(s)}return e}function Tt(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Et(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 Ot(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var fe=new Map,ke=new WeakMap,_e=1;function X(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=ke.get(t);return e||(e=_e,_e+=1,ke.set(t,e)),`reference:${e}`}var St=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),xt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function ve(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?St.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function $e(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}if(Array.isArray(r))return r.length>0&&r.every(ve);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return ve(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&xt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Pt(t,e,r,n={},i=null){let l=ct("sha256"),s=(o,u)=>{let a=String(u);l.update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o),l.update("=").update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a).update(`
2
- `)};s("method",t),s("url",e),Object.keys(r||{}).map((o,u)=>({name:o.toLowerCase(),order:u,value:String(r[o])})).sort((o,u)=>o.name.localeCompare(u.name)||o.order-u.order).forEach((o,u)=>{s(`header-name-${u}`,o.name),s(`header-value-${u}`,o.value)}),s("body",i??"-");for(let o of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${o}`,n[o]??"-");return l.digest("hex")}function At(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ae):Math.min(250*2**t,Ae)+Math.floor(Math.random()*100)}var Rt=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 de(t,e,r){return M(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function z(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function kt(t){return t?t.byteLength??t.length??0:0}async function _t(t,e,{url:r,truncate:n=!1,onOversize:i}={}){if(e==null)return await t.text();let l=Number(t.headers?.get?.("content-length"));if(Number.isFinite(l)&&l>e&&(z(t),!n))throw de(r,`content-length ${l}`,e);let s=t.body?.getReader?.();if(!s){let c=await t.text(),p=Buffer.byteLength(c,"utf8");if(p>e){if(!n)throw de(r,`body ${p} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let f=[],o=0,u=!1;try{for(;;){let{value:c,done:p}=await s.read();if(p)break;if(c&&(f.push(Buffer.from(c)),o+=kt(c),o>e)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof i=="function"&&i(),!n))throw de(r,`streamed ${o} bytes`,e);let a=Buffer.concat(f);return(u?a.subarray(0,e):a).toString("utf8")}function vt(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function $t(t,{fetchImpl:e,method:r,headers:n,body:i,timeoutMs:l,lookupFn:s,realFetch:f,untrustedUrl:o=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:a=!1,importUndici:c,validateResponse:p,signal:d,redirectPolicy:m="follow",maxRedirects:A=Q}){let R=new AbortController,k=setTimeout(()=>R.abort(),l),j=d?Re?Re([d,R.signal]):d:R.signal,g=null,T=e,N=s?{lookupFn:s}:{};if(o&&!f&&!ue(T))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 I=async(y,{status:O=null}={})=>{let P=await ie(y,N);if(!P.ok)throw M(O==null?`HTTP refused ${y}: ${P.error}`:`HTTP redirect to ${y} ${P.error}`,O==null?{}:{status:O});let C=new URL(y).hostname;if(f){if(g&&(await g.close(),g=null),!g)try{g=await ce({requireUndici:!0,...c?{importUndici:c}:{}})}catch(h){throw M(O==null?`HTTP refused ${y}: ${h?.message||h}`:`HTTP redirect to ${y} refused: ${h?.message||h}`,O==null?{}:{status:O})}g.pin(C,P.addresses),T=g.fetch}else xe(T,C,P.addresses);return P};try{let y=String(t),O=Object.assign(Object.create(null),n||{});o&&await I(y);for(let P=0;P<=A;P+=1){let C=Object.assign(Object.create(null),{method:r,headers:O,body:i,signal:j,redirect:"manual",dispatcher:void 0}),h=await T(y,C);if((m==="error"||A===0)&&h.status>=300&&h.status<400)throw z(h),M(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(wt.has(h.status)){let v=a===!0&&r==="POST"&&[307,308].includes(h.status)&&$e(r,i);if(r!=="GET"&&r!=="HEAD"&&!v){z(h);let b=new Error(`HTTP ${h.status} ${r} ${y} redirected non-idempotent request`);throw b.status=h.status,b}if(P===A)throw z(h),M(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let K=h.headers?.get?.("location"),w;try{w=Et(K,y)}catch(b){throw z(h),b}let $=!Ot(w,y);if(z(h),$&&r==="POST"){let b=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw b.status=h.status,b}if($&&a){let b=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw b.status=h.status,b.retryable=!1,b}if($&&(O=Tt(O)),o)await I(w,{status:h.status});else if($){let b=await ie(w,N);if(!b.ok){let E=new Error(`HTTP redirect from ${y} ${b.error}`);throw E.status=h.status,E.retryable=!1,E}f&&b.addresses?.length&&(g||(g=await ce(c?{importUndici:c}:{})),g&&(g.pin(new URL(w).hostname,b.addresses),T=g.fetch))}y=w;continue}if(typeof p=="function")try{await p(h,{url:y})}catch(v){throw z(h),M(v?.message||String(v))}let _=await _t(h,u,{url:y,onOversize:()=>R.abort()}),B=vt(_);if(!h.ok){let v=new Error(`HTTP ${h.status} ${r} ${y}`);throw v.status=h.status,v.retryAfter=h.headers?.get?.("retry-after")??null,v.body=B??_.slice(0,300),v}return B??_}throw new Error(`HTTP redirect loop for ${t}`)}catch(y){if(R.signal.aborted&&!pe(d)){let O=y&&(typeof y=="object"||typeof y=="function")&&!L.isProxy(y)?y:null,P=O?Object.getOwnPropertyDescriptor(O,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.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 h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw y}finally{clearTimeout(k),g&&await g.close()}}async function Ne(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&L.isProxy(e))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(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let E of Object.getOwnPropertyNames(e)){let S=Object.getOwnPropertyDescriptor(e,E);if(!(E==="toJSON"&&S&&Object.hasOwn(S,"value")&&S.value===void 0)){if(!r.has(E))throw new TypeError("HTTP options contain unknown fields");if(!S||!S.enumerable||!Object.hasOwn(S,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=E=>{if(e==null||!Object.hasOwn(e,E))return;let S=Object.getOwnPropertyDescriptor(e,E);if(!S||!Object.hasOwn(S,"value"))throw new TypeError("HTTP options must contain own data properties");return S.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let i=n("method");if(i!==void 0&&(typeof i!="string"||!/^[A-Za-z]+$/u.test(i)))throw new TypeError("HTTP method must be a string token");let l=n("timeoutMs");if(l!==void 0&&(!Number.isInteger(l)||l<1||l>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let f=n("redirectPolicy");if(f!==void 0&&f!=="follow"&&f!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let o=n("maxRedirects");if(o!==void 0&&(!Number.isInteger(o)||o<0||o>Q))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Q}`);if(f==="error"&&o!==void 0&&o!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=f??"follow",a=u==="error"?0:o??Q;for(let E of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let S=n(E);if(S!==void 0&&typeof S!="boolean")throw new TypeError(`HTTP ${E} must be boolean`)}let c=n("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(L.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{pe(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let E of["importUndici","lookupFn","validateResponse"]){let S=n(E);if(S!==void 0&&typeof S!="function")throw new TypeError(`HTTP ${E} must be a function`)}let d=n("fetchImpl"),m=d||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let A=l??12e3,R=(i||"GET").toUpperCase(),k=n("headers"),j=gt(k),g=Object.assign(Object.create(null),j);Object.keys(g).some(E=>E.toLowerCase()==="accept")||(g.Accept="application/json");let T=n("body");T!=null&&typeof T!="string"&&(Object.keys(g).find(S=>S.toLowerCase()==="content-type")||(g["Content-Type"]="application/json"),T=bt(T));let N=s??ut,I=n("lookupFn"),y=!d,O=n("untrustedUrl")===!0,P=n("sameOriginRedirectsOnly")===!0,C=n("importUndici"),h=n("validateResponse"),_=p,B=c??null,v=async()=>{let E;for(let S=0;S<=N;S++){_&&pt.call(_);try{return await $t(t,{fetchImpl:m,method:R,headers:g,body:T,timeoutMs:A,lookupFn:I,realFetch:y,untrustedUrl:O,maxResponseBytes:B,sameOriginRedirectsOnly:P,importUndici:C,validateResponse:h,signal:_,redirectPolicy:u,maxRedirects:a})}catch(U){E=U;let V=re=>{if(!U||typeof U!="object"&&typeof U!="function"||L.isProxy(U))return;let W=Object.getOwnPropertyDescriptor(U,re);return W&&Object.hasOwn(W,"value")?W.value:void 0},te=V("status"),Ye=V("oracleTimeout")===!0||V("name")==="AbortError"||V("name")==="TimeoutError"||pe(_),qe=new Set([408,425,429]),Ke=V("retryable")===!1?!1:te!=null?qe.has(te)||lt.has(te)&&Pe.has(R):!Ye&&Pe.has(R);if(S===N||!Ke)throw U;let be=At(S,V("retryAfter"));_?await new Promise((re,W)=>{let Ze=setTimeout(re,be);ht.call(_,"abort",()=>{clearTimeout(Ze),W(mt(_)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Rt(be)}}throw E};if(!(n("dedupe")!==!1&&!_&&$e(R,T)))return v();let w=Pt(R,t,g,{untrustedUrl:O,maxResponseBytes:B,sameOriginRedirectsOnly:P,redirectPolicy:u,maxRedirects:a,timeoutMs:A,retries:N,fetchImpl:X(m),realFetch:y,lookupFn:X(I),importUndici:X(C),validateResponse:X(h)},T),$=fe.get(w);if($)return $;let b=v().finally(()=>fe.delete(w));return fe.set(w,b),b}var Ie={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}},Nt=new Map(Object.values(Ie).map(t=>[t.chainId,t]));function Ce(t){return Nt.get(Number(t))||null}function je(t,e=process.env){let r=Ce(t);if(!r)return null;for(let n of r.rpcEnv){let i=(e[n]||"").trim();if(i)return i}return null}import{Interface as It,getAddress as wr}from"ethers";var yr=new It(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Ct={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 jt(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=je(t,r);return n||Ct[Number(t)]||null}var Ht=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Lt(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!Ht.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 Y=new Map,He=new Map;function Bt(t){let e=new Error(t?.message||JSON.stringify(t));return e.code=t?.code,e}function Mt(t){if(t?.error)throw Bt(t.error);return t?.result}function Ut(t,e,r){return`${t}
3
- ${e}
4
- ${JSON.stringify(r??[])}`}async function Dt(t,e,r){return Ne(t,{method:"POST",body:e,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Le(t,e,r=[],n={}){let i=String(e||""),l=Lt(i),s=jt(t,n);if(!s)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);if(l==="eth_chainid"&&n.cacheChainId!==!1){let a=He.get(s);if(a!=null)return a}let o=n.dedupe!==!1&&!n.signal?Ut(s,i,r):null;if(o&&Y.has(o))return Y.get(o);let u=(async()=>{let a=await Dt(s,{jsonrpc:"2.0",id:1,method:e,params:r},n),c=Mt(a);return l==="eth_chainid"&&typeof c=="string"&&He.set(s,c),c})();return o&&(Y.set(o,u),u.finally(()=>{Y.get(o)===u&&Y.delete(o)}).catch(()=>{})),u}var we=999,me=1,Ft=8453,Be="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",zt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",Me="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",Jt="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Gt=".80002105.reverse",Ue=/^0x[a-fA-F0-9]{40}$/,De=new TextEncoder,Fe=t=>"0x"+Buffer.from(t).toString("hex"),J=t=>Fe(he(De.encode(t))).slice(0,10),ze=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function ee(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=he(De.encode(r)),i=new Uint8Array(64);i.set(e,0),i.set(n,32),e=he(i)}return Fe(e)}function ye(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 i=e.slice(r+64,r+64+n*2);return Buffer.from(i,"hex").toString("utf8")}catch{return""}}async function G(t,e,r){try{return await Le(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function Vt(t){let e=await G(we,Be,J("primaryName(address)")+ze(t)),r=ye(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function Wt(t){let e=await G(we,zt,J("getName(address)")+ze(t)),r=ye(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function Je(t,e,r){let n=await G(t,r,J("name(bytes32)")+e.slice(2));return ye(n)||null}async function Yt(t){let e=ee(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await G(me,Me,J("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:Je(me,e,n)}async function qt(t){let e=ee(t.slice(2).toLowerCase()+Gt);return Je(Ft,e,Jt)}var Kt=[{source:"hl",fn:Vt},{source:"hype",fn:Wt},{source:"ens",fn:Yt},{source:"basename",fn:qt}];async function Zt(t){let e=ee(t),r=await G(we,Be,J("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 Xt(t,e,r){let n=ee(e),i=await G(t,r,J("resolver(bytes32)")+n.slice(2));if(!i)return null;let l="0x"+i.slice(-40);if(/^0x0+$/.test(l))return null;let s=await G(t,l,J("addr(bytes32)")+n.slice(2));if(!s)return null;let f="0x"+s.slice(-40);return/^0x0+$/.test(f)?null:f}async function Ge(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Zt(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await Xt(me,e,Me);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var Er=Kt.map(t=>t.source);var q={1:"ethereum",8453:"base",42161:"arbitrum"},Qt=Object.fromEntries(Object.entries(q).map(([t,e])=>[e,Number(t)])),We=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
1
+ var Je="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Ae={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"]},Lt=1e4,jt=e=>new Promise(t=>setTimeout(t,e)),Ve=e=>"0x"+BigInt(e).toString(16),Ht=e=>"0x"+"0".repeat(24)+e.slice(2).toLowerCase(),Ke=e=>"0x"+e.slice(26).toLowerCase(),vt=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,Ft=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,J=class extends Error{constructor(t,{transient:r=!1,tooBig:n=!1,http:o=0}={}){super(t),this.transient=r,this.tooBig=n,this.http=o}};async function Ut(e,t,r,n){let o=new AbortController,i=setTimeout(()=>o.abort(),n),s,l;try{s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:t,params:r}),signal:o.signal}),l=await s.text()}catch(u){throw new J(`${t} network: ${u.message}`,{transient:!0})}finally{clearTimeout(i)}let a;try{a=JSON.parse(l)}catch{throw new J(`${t} non-JSON http=${s.status}: ${l.slice(0,80)}`,{transient:s.status>=500||s.status===429,http:s.status})}if(a.error){let u=a.error.message||"rpc error";throw new J(`${t} rpc: ${u}`,{transient:vt.test(u),tooBig:Ft.test(u),http:s.status})}if(s.status!==200)throw new J(`${t} http=${s.status}: ${l.slice(0,80)}`,{transient:s.status>=500||s.status===429,http:s.status});return a.result}async function Ye(e,t,r,{retries:n,timeoutMs:o,onWarn:i}){let s;for(let l of e){for(let a=0;a<=n;a++)try{return{result:await Ut(l,t,r,o),url:l}}catch(u){if(s=u,u.tooBig)throw u;if(!u.transient||a===n)break;let c=Math.min(2e3*2**a,8e3)+Math.random()*250;i?.(`retry ${l} (${u.message.slice(0,70)}) in ${Math.round(c)}ms`),await jt(c)}i?.(`endpoint exhausted: ${l} -> ${s?.message.slice(0,70)}`)}throw s??new J("no endpoints available")}async function Ee(e,t,r,n,o,i){let s=[{...t,fromBlock:Ve(r),toBlock:Ve(n)}];try{let{result:a}=await Ye(e,"eth_getLogs",s,o);Array.isArray(a)&&i.push(...a);return}catch(a){if(!a.tooBig||n<=r)throw a;o.onWarn?.(`splitting ${r}-${n} (${a.message.slice(0,60)})`)}let l=r+Math.floor((n-r)/2);await Promise.all([Ee(e,t,r,l,o,i),Ee(e,t,l+1,n,o,i)])}async function Te(e,t={}){if(!/^0x[0-9a-fA-F]{40}$/.test(e||""))throw new Error(`invalid address: ${e}`);let{chains:r=[1,8453,42161],lookback:n=1e5,fromBlock:o,toBlock:i,chunkSize:s=Lt,tokens:l,direction:a="both",retries:u=3,timeoutMs:c=2e4,concurrency:p=4,endpoints:f=Ae,onWarn:h}=t,d={retries:u,timeoutMs:c,onWarn:h},y=Ht(e),E=[],O=[],N={},x=new Set;return await Promise.all(r.map(async b=>{let C=f[b];if(!C?.length){O.push({chainId:b,stage:"config",error:"no endpoints configured"});return}try{let L=i;if(L==null){let{result:g}=await Ye(C,"eth_blockNumber",[],d);L=parseInt(g,16)}let w=Math.max(0,o??L-n+1),S=Math.max(w,L);N[b]={fromBlock:w,toBlock:S,blocks:S-w+1};let _=[];for(let g=w;g<=S;g+=s)_.push([g,Math.min(g+s-1,S)]);let I=[],m=l?.length?{address:l}:{};(a==="in"||a==="both")&&I.push({...m,topics:[Je,null,y]}),(a==="out"||a==="both")&&I.push({...m,topics:[Je,y,null]});let k=[];for(let g of I)for(let j of _)k.push([g,j]);let v=[],$=0,W=Array.from({length:Math.min(p,k.length)},async()=>{for(;$<k.length;){let[g,[j,A]]=k[$++];try{await Ee(C,g,j,A,d,v)}catch(T){O.push({chainId:b,stage:"getLogs",range:[j,A],error:T.message})}}});await Promise.all(W);for(let g of v){if(!g?.topics||g.topics.length<3)continue;let j=parseInt(g.logIndex,16),A=`${b}|${g.transactionHash}|${j}`;x.has(A)||(x.add(A),E.push({chainId:b,token:g.address.toLowerCase(),from:Ke(g.topics[1]),to:Ke(g.topics[2]),value:BigInt(g.data==="0x"?"0x0":g.data).toString(),blockNumber:parseInt(g.blockNumber,16),txHash:g.transactionHash,logIndex:j}))}}catch(L){O.push({chainId:b,stage:"range",error:L.message})}})),E.sort((b,C)=>C.blockNumber-b.blockNumber||C.logIndex-b.logIndex),{events:E,errors:O,ranges:N}}import{keccak_256 as Le}from"@noble/hashes/sha3.js";import{createHash as Gt}from"node:crypto";import{types as z}from"node:util";import V from"node:net";import Mt from"node:dns";var Dt=new Set(["localhost","metadata.google.internal","metadata.goog"]);function le(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let p=c.split(":"),f=p.at(-1);if(f?.includes(".")){let h=f.split(".").map(Number);if(h.length!==4||h.some(d=>!Number.isInteger(d)||d<0||d>255))return null;p.splice(p.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return p.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:p.map(h=>Number.parseInt(h,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let l=t.includes("::"),a=8-i.length-s.length;if(!l&&a!==0||l&&a<1)return null;let u=[...i,...Array(Math.max(0,a)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(c=>[c>>8,c&255]))}function Oe(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function _e(e){if(V.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(V.isIPv6(e)){let t=le(e);if(!t)return!1;let r=le("::ffff:0:0");return Oe(t,r,96)?_e([...t.slice(12)].join(".")):Oe(t,le("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Oe(t,le(o),i)):!1}return!1}function Bt(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(Dt.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=V.isIP(r);return n!==0&&!_e(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function ke(e,{lookupFn:t=Mt.promises.lookup}={}){let r=Bt(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:V.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!_e(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function $e({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let p=await t();r=p.Agent,n=p.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=p=>(Array.isArray(p)?p:[p]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(V.isIPv6(f.address)?6:4)})),l=(p,f,h)=>{i.set(o(p),s(typeof f=="string"?[{address:f,family:h}]:f))},a=p=>{let f=o(p);if(V.isIP(f))return[{address:f,family:V.isIPv6(f)?6:4}];let h=i.get(f);if(!h||!h.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return h},u=new r({connect:{lookup(p,f,h){let d;try{d=a(p)}catch(y){return h(y)}return f?.all?h(null,d):h(null,d[0].address,d[0].family)}}}),c=zt((p,f={})=>n(p,{...f,dispatcher:u}),l);return{dispatcher:u,fetch:c,pin:l,resolve:a,async close(){try{await u.destroy()}catch{}}}}var Re=Symbol.for("oracle.egressGuard.pinCapableFetch");function zt(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[Re]=Object.freeze({pin:t}),e}function Ne(e){return typeof e=="function"&&typeof e[Re]?.pin=="function"}function Xe(e,t,r){if(!Ne(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Re].pin(t,r)}var Wt=new Set([408,425,429,500,502,503,504]),Ze=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),qt=2,Qe=4e3,Jt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Vt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Kt=AbortSignal.prototype.throwIfAborted,Yt=EventTarget.prototype.addEventListener,et=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ce=e=>e?Jt.call(e):!1,Xt=e=>e?Vt.call(e):void 0,Zt=new Set([301,302,303,307,308]),de=3,no=64*1024,B=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function P(e){return G(`HTTP JSON body refused: ${e}`)}function Qt(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 er(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,l=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>B.bytes)throw P("serialized byte limit exceeded");t.push(c)},a=c=>{if(Buffer.byteLength(c,"utf8")>B.bytes)throw P("serialized byte limit exceeded");return JSON.stringify(c)},u=(c,p)=>{if(n+=1,n>B.nodes)throw P("node limit exceeded");if(p>B.depth)throw P("depth limit exceeded");if(c===null){l("null");return}if(typeof c=="string"){l(a(c));return}if(typeof c=="boolean"){l(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw P("non-finite number");l(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw P("unsupported non-JSON value");if(z.isProxy(c))throw P("proxy value");if(Qt(c))throw P("unsupported exotic object");if(s.has(c))throw P("cyclic value");s.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw P("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),y=0;for(;d!==null;){if(z.isProxy(d))throw P("proxy array prototype");if(y+=1,y>B.depth)throw P("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>B.arrayLength)throw P("array length limit exceeded");for(let O=0;O<c.length;O+=1){let N=Object.getOwnPropertyDescriptor(c,String(O));if(!N||!Object.hasOwn(N,"value")||N.enumerable!==!0)throw P("array entries must be dense enumerable own data")}let E=0;for(let O in c){if(i+=1,i>B.fields)throw P("enumeration limit exceeded");if(Object.hasOwn(c,O)&&(E+=1,E>c.length))throw P("named array fields are unsupported")}if(E!==c.length)throw P("array entries must be dense enumerable own data");l("[");for(let O=0;O<c.length;O+=1)O&&l(","),u(Object.getOwnPropertyDescriptor(c,String(O)).value,p+1);l("]");return}let f=Object.getPrototypeOf(c);if(f!==Object.prototype&&f!==null)throw P("non-plain object");let h=[];for(let d in c){if(i+=1,i>B.fields)throw P("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>B.fields)throw P("field limit exceeded");let y=Object.getOwnPropertyDescriptor(c,d);if(!y||!Object.hasOwn(y,"value")||y.enumerable!==!0)throw P("object fields must be enumerable own data");h.push([d,y.value])}l("{");for(let d=0;d<h.length;d+=1)d&&l(","),l(a(h[d][0])),l(":"),u(h[d][1],p+1);l("}")}finally{s.delete(c)}};return u(e,0),t.join("")}function tr(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 i=Object.getOwnPropertyDescriptor(e,n);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[n]=String(s)}return t}function rr(){return Object.assign(Object.create(null),{Accept:"application/json"})}function nr(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 or(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var Ie=new Map,tt=new WeakMap,rt=1;function ue(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=tt.get(e);return t||(t=rt,rt+=1,tt.set(e,t)),`reference:${t}`}var sr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),ir=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function nt(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?sr.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(nt);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return nt(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&ir.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function ar(e,t,r,n={},o=null){let i=Gt("sha256"),s=(a,u)=>{let c=String(u);i.update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a),i.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
2
+ `)};s("method",e),s("url",t),Object.keys(r||{}).map((a,u)=>({name:a.toLowerCase(),order:u,value:String(r[a])})).sort((a,u)=>a.name.localeCompare(u.name)||a.order-u.order).forEach((a,u)=>{s(`header-name-${u}`,a.name),s(`header-value-${u}`,a.value)}),s("body",o??"-");for(let a of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${a}`,n[a]??"-");return i.digest("hex")}function cr(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Qe):Math.min(250*2**e,Qe)+Math.floor(Math.random()*100)}var lr=e=>new Promise(t=>setTimeout(t,e));function G(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Pe(e,t,r){return G(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function K(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function ur(e){return e?e.byteLength??e.length??0:0}async function dr(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(K(e),!n))throw Pe(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let p=await e.text(),f=Buffer.byteLength(p,"utf8");if(f>t){if(!n)throw Pe(r,`body ${f} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let l=[],a=0,u=!1;try{for(;;){let{value:p,done:f}=await s.read();if(f)break;if(p&&(l.push(Buffer.from(p)),a+=ur(p),a>t)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof o=="function"&&o(),!n))throw Pe(r,`streamed ${a} bytes`,t);let c=Buffer.concat(l);return(u?c.subarray(0,t):c).toString("utf8")}function fr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function pr(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:l,untrustedUrl:a=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:c=!1,importUndici:p,validateResponse:f,signal:h,redirectPolicy:d="follow",maxRedirects:y=de}){let E=new AbortController,O=setTimeout(()=>E.abort(),i),N=h?et?et([h,E.signal]):h:E.signal,x=null,b=t,C=s?{lookupFn:s}:{};if(a&&!l&&!Ne(b))throw G(`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 L=async(w,{status:S=null}={})=>{let _=await ke(w,C);if(!_.ok)throw G(S==null?`HTTP refused ${w}: ${_.error}`:`HTTP redirect to ${w} ${_.error}`,S==null?{}:{status:S});let I=new URL(w).hostname;if(l){if(x&&(await x.close(),x=null),!x)try{x=await $e({requireUndici:!0,...p?{importUndici:p}:{}})}catch(m){throw G(S==null?`HTTP refused ${w}: ${m?.message||m}`:`HTTP redirect to ${w} refused: ${m?.message||m}`,S==null?{}:{status:S})}x.pin(I,_.addresses),b=x.fetch}else Xe(b,I,_.addresses);return _};try{let w=String(e),S=Object.assign(Object.create(null),n||{});a&&await L(w);for(let _=0;_<=y;_+=1){let I=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:N,redirect:"manual",dispatcher:void 0}),m=await b(w,I);if((d==="error"||y===0)&&m.status>=300&&m.status<400)throw K(m),G(`HTTP ${m.status} ${r} redirect refused`,{status:m.status,redirectRefused:!0});if(Zt.has(m.status)){let $=c===!0&&r==="POST"&&[307,308].includes(m.status)&&ot(r,o);if(r!=="GET"&&r!=="HEAD"&&!$){K(m);let A=new Error(`HTTP ${m.status} ${r} ${w} redirected non-idempotent request`);throw A.status=m.status,A}if(_===y)throw K(m),G(`HTTP ${m.status} ${r} redirect budget exhausted`,{status:m.status,redirectRefused:!0});let W=m.headers?.get?.("location"),g;try{g=nr(W,w)}catch(A){throw K(m),A}let j=!or(g,w);if(K(m),j&&r==="POST"){let A=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw A.status=m.status,A}if(j&&c){let A=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw A.status=m.status,A.retryable=!1,A}if(j&&(S=rr(S)),a)await L(g,{status:m.status});else if(j){let A=await ke(g,C);if(!A.ok){let T=new Error(`HTTP redirect from ${w} ${A.error}`);throw T.status=m.status,T.retryable=!1,T}l&&A.addresses?.length&&(x||(x=await $e(p?{importUndici:p}:{})),x&&(x.pin(new URL(g).hostname,A.addresses),b=x.fetch))}w=g;continue}if(typeof f=="function")try{await f(m,{url:w})}catch($){throw K(m),G($?.message||String($))}let k=await dr(m,u,{url:w,onOversize:()=>E.abort()}),v=fr(k);if(!m.ok){let $=new Error(`HTTP ${m.status} ${r} ${w}`);throw $.status=m.status,$.retryAfter=m.headers?.get?.("retry-after")??null,$.body=v??k.slice(0,300),$}return v??k}throw new Error(`HTTP redirect loop for ${e}`)}catch(w){if(E.signal.aborted&&!Ce(h)){let S=w&&(typeof w=="object"||typeof w=="function")&&!z.isProxy(w)?w:null,_=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(_&&Object.hasOwn(_,"value")&&_.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let m=new Error("HTTP request timed out");throw Object.defineProperties(m,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),m}}throw w}finally{clearTimeout(O),x&&await x.close()}}async function fe(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 T of Object.getOwnPropertyNames(t)){let R=Object.getOwnPropertyDescriptor(t,T);if(!(T==="toJSON"&&R&&Object.hasOwn(R,"value")&&R.value===void 0)){if(!r.has(T))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=T=>{if(t==null||!Object.hasOwn(t,T))return;let R=Object.getOwnPropertyDescriptor(t,T);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 i=n("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let a=n("maxRedirects");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>de))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${de}`);if(l==="error"&&a!==void 0&&a!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=l??"follow",c=u==="error"?0:a??de;for(let T of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let R=n(T);if(R!==void 0&&typeof R!="boolean")throw new TypeError(`HTTP ${T} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let f=n("signal");if(f!==void 0){if(z.isProxy(f)||!(f instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ce(f)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let T of["importUndici","lookupFn","validateResponse"]){let R=n(T);if(R!==void 0&&typeof R!="function")throw new TypeError(`HTTP ${T} must be a function`)}let h=n("fetchImpl"),d=h||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let y=i??12e3,E=(o||"GET").toUpperCase(),O=n("headers"),N=tr(O),x=Object.assign(Object.create(null),N);Object.keys(x).some(T=>T.toLowerCase()==="accept")||(x.Accept="application/json");let b=n("body");b!=null&&typeof b!="string"&&(Object.keys(x).find(R=>R.toLowerCase()==="content-type")||(x["Content-Type"]="application/json"),b=er(b));let C=s??qt,L=n("lookupFn"),w=!h,S=n("untrustedUrl")===!0,_=n("sameOriginRedirectsOnly")===!0,I=n("importUndici"),m=n("validateResponse"),k=f,v=p??null,$=async()=>{let T;for(let R=0;R<=C;R++){k&&Kt.call(k);try{return await pr(e,{fetchImpl:d,method:E,headers:x,body:b,timeoutMs:y,lookupFn:L,realFetch:w,untrustedUrl:S,maxResponseBytes:v,sameOriginRedirectsOnly:_,importUndici:I,validateResponse:m,signal:k,redirectPolicy:u,maxRedirects:c})}catch(q){T=q;let Q=Se=>{if(!q||typeof q!="object"&&typeof q!="function"||z.isProxy(q))return;let re=Object.getOwnPropertyDescriptor(q,Se);return re&&Object.hasOwn(re,"value")?re.value:void 0},xe=Q("status"),Nt=Q("oracleTimeout")===!0||Q("name")==="AbortError"||Q("name")==="TimeoutError"||Ce(k),It=new Set([408,425,429]),Pt=Q("retryable")===!1?!1:xe!=null?It.has(xe)||Wt.has(xe)&&Ze.has(E):!Nt&&Ze.has(E);if(R===C||!Pt)throw q;let qe=cr(R,Q("retryAfter"));k?await new Promise((Se,re)=>{let Ct=setTimeout(Se,qe);Yt.call(k,"abort",()=>{clearTimeout(Ct),re(Xt(k)||new DOMException("Aborted","AbortError"))},{once:!0})}):await lr(qe)}}throw T};if(!(n("dedupe")!==!1&&!k&&ot(E,b)))return $();let g=ar(E,e,x,{untrustedUrl:S,maxResponseBytes:v,sameOriginRedirectsOnly:_,redirectPolicy:u,maxRedirects:c,timeoutMs:y,retries:C,fetchImpl:ue(d),realFetch:w,lookupFn:ue(L),importUndici:ue(I),validateResponse:ue(m)},b),j=Ie.get(g);if(j)return j;let A=$().finally(()=>Ie.delete(g));return Ie.set(g,A),A}var st={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}},hr=new Map(Object.values(st).map(e=>[e.chainId,e]));function it(e){return hr.get(Number(e))||null}function at(e,t=process.env){let r=it(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}import{Interface as mr,getAddress as uo}from"ethers";var fo=new mr(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var yr={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 wr(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=at(e,r);return n||yr[Number(e)]||null}var br=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function gr(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!br.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}var ne=new Map,ct=new Map;function xr(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Sr(e){if(e?.error)throw xr(e.error);return e?.result}function Er(e,t,r){return`${e}
3
+ ${t}
4
+ ${JSON.stringify(r??[])}`}async function Ar(e,t,r){return fe(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function pe(e,t,r=[],n={}){let o=String(t||""),i=gr(o),s=wr(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let c=ct.get(s);if(c!=null)return c}let a=n.dedupe!==!1&&!n.signal?Er(s,o,r):null;if(a&&ne.has(a))return ne.get(a);let u=(async()=>{let c=await Ar(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),p=Sr(c);return i==="eth_chainid"&&typeof p=="string"&&ct.set(s,p),p})();return a&&(ne.set(a,u),u.finally(()=>{ne.get(a)===u&&ne.delete(a)}).catch(()=>{})),u}var He=999,je=1,Tr=8453,lt="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",Or="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ut="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",_r="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",kr=".80002105.reverse",dt=/^0x[a-fA-F0-9]{40}$/,ft=new TextEncoder,pt=e=>"0x"+Buffer.from(e).toString("hex"),Y=e=>pt(Le(ft.encode(e))).slice(0,10),ht=e=>e.toLowerCase().replace(/^0x/,"").padStart(64,"0");function he(e){let t=new Uint8Array(32);if(e)for(let r of String(e).split(".").reverse()){let n=Le(ft.encode(r)),o=new Uint8Array(64);o.set(t,0),o.set(n,32),t=Le(o)}return pt(t)}function ve(e){if(!e||e==="0x"||/^0x0*$/.test(e))return"";try{let t=e.slice(2),r=parseInt(t.slice(0,64),16)*2,n=parseInt(t.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=t.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function X(e,t,r){try{return await pe(e,"eth_call",[{to:t,data:r},"latest"])}catch{return null}}async function $r(e){let t=await X(He,lt,Y("primaryName(address)")+ht(e)),r=ve(t);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function Rr(e){let t=await X(He,Or,Y("getName(address)")+ht(e)),r=ve(t);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function mt(e,t,r){let n=await X(e,r,Y("name(bytes32)")+t.slice(2));return ve(n)||null}async function Nr(e){let t=he(`${e.slice(2).toLowerCase()}.addr.reverse`),r=await X(je,ut,Y("resolver(bytes32)")+t.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:mt(je,t,n)}async function Ir(e){let t=he(e.slice(2).toLowerCase()+kr);return mt(Tr,t,_r)}var Pr=[{source:"hl",fn:$r},{source:"hype",fn:Rr},{source:"ens",fn:Nr},{source:"basename",fn:Ir}];async function Cr(e){let t=he(e),r=await X(He,lt,Y("ownerOf(uint256)")+t.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function Lr(e,t,r){let n=he(t),o=await X(e,r,Y("resolver(bytes32)")+n.slice(2));if(!o)return null;let i="0x"+o.slice(-40);if(/^0x0+$/.test(i))return null;let s=await X(e,i,Y("addr(bytes32)")+n.slice(2));if(!s)return null;let l="0x"+s.slice(-40);return/^0x0+$/.test(l)?null:l}async function yt(e){let t=String(e||"").trim().toLowerCase();if(!t||!t.includes("."))return null;if(t.endsWith(".hl")){let r=await Cr(t);return r?{address:r,source:"hl",name:t}:null}if(t.endsWith(".eth")){let r=await Lr(je,t,ut);return r?{address:r,source:t.endsWith(".base.eth")?"basename":"ens",name:t}:null}return null}var yo=Pr.map(e=>e.source);var jr="protective-monitors",Hr="read-only",go=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),vr="https://hermes.pyth.network",Fr="https://coins.llama.fi",Ur="https://api.llama.fi/hacks",Mr="https://api.gopluslabs.io/api/v1/token_security",Dr="https://api.v3.aave.com/user",Br=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),zr=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),Gr=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),wt=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),Wr=/^0x[0-9a-fA-F]{40}$/,qr=/^[0-9a-fA-F]{64}$/;function oe(e,t={}){return{ok:!0,provider:jr,op:e,alertOnly:!0,execution:Hr,exec:!1,...t}}function H(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function se(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):fe(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function me(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function Jr(e={}){if(e.feedId){let n=String(e.feedId).replace(/^0x/i,"");return qr.test(n)||H("feedId must be a 32-byte hex id"),n.toLowerCase()}let t=me(e.symbol),r=Br[t];return r||H("unknown symbol",t),r}function Vr(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=me(e.symbol);return zr[t]||`coingecko:${t.toLowerCase()}`}function bt(e,t){let r=Number(e.thresholdBps??t);return(!Number.isFinite(r)||r<0)&&H("thresholdBps must be a non-negative number"),r}function Kr(e){let t=Array.isArray(e?.parsed)?e.parsed[0]:e?.price?e:null,r=Number(t?.price?.price),n=Number(t?.price?.expo);return(!Number.isFinite(r)||!Number.isFinite(n))&&H("no pyth price returned"),n<0?r/10**-n:r*10**n}function Yr(e,t){let r=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],n=Number(r?.price);return Number.isFinite(n)?n:null}function Xr(e,t={}){let r=String(t.pythBaseUrl||vr).replace(/\/$/,""),n=new URL(`${r}/v2/updates/price/latest`);return n.searchParams.append("ids[]",e),n.searchParams.set("parsed","true"),n.toString()}function Zr(e,t={}){return`${String(t.llamaCoinsBaseUrl||Fr).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function gt(e,t){let r=Jr(e),n=await se(Xr(r,t),t),o=Kr(n);return o>0||H("pyth price must be positive"),{id:r,price:o}}async function xt(e,t){let r=Vr(e),n=await se(Zr(r,t),t);return{coin:r,price:Yr(n,r)}}async function Qr(e={},t={}){let r=Number(e.peg??1);(!Number.isFinite(r)||r<=0)&&H("peg must be a positive number");let n=bt(e,50),o=await gt(e,t),i=Math.round(Math.abs(o.price-r)*1e4),s={required:!1,llamaPrice:null};try{let l=await xt(e,t);s={required:!1,llamaPrice:l.price,llamaCoin:l.coin}}catch{s={required:!1,llamaPrice:null}}return oe("depeg",{symbol:me(e.symbol),feedId:o.id,price:o.price,peg:r,thresholdBps:n,deviationBps:i,alert:i>n,crossCheck:s})}async function en(e={},t={}){let r=bt(e,100),n=await gt(e,t),o=await xt(e,t);o.price>0||H("llama price required for oracleDeviation");let i=(n.price+o.price)/2,s=Math.round(Math.abs(n.price-o.price)/i*1e4);return oe("oracleDeviation",{symbol:me(e.symbol),pythPrice:n.price,llamaPrice:o.price,mid:i,thresholdBps:r,deviationBps:s,alert:s>r})}function tn(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function rn(e,t){return{id:tn(e,t),name:String(e.name||e.protocol||"unknown"),classification:e.classification?String(e.classification):null,technique:e.technique?String(e.technique):null,amount:Number.isFinite(Number(e.amount))?Number(e.amount):null,chain:Array.isArray(e.chain)?e.chain.map(String):e.chain?[String(e.chain)]:[],source:e.source?String(e.source):null}}function nn(e){return(String(e).match(/<item\b[\s\S]*?<\/item>/gi)||[]).map((r,n)=>{let o=i=>{let s=r.match(new RegExp(`<${i}[^>]*>([\\s\\S]*?)</${i}>`,"i"));return s?s[1].replace(/<!\[CDATA\[|\]\]>/g,"").trim():""};return{id:o("guid")||o("link")||o("title")||`rss-${n}`,name:o("title")||"unknown",classification:"rss",technique:null,amount:null,chain:[],source:o("link")||null}})}function St(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return nn(t);try{return St(JSON.parse(t))}catch{H("exploitFeed payload is not JSON or RSS")}}return Array.isArray(e)?e:Array.isArray(e?.hacks)?e.hacks:Array.isArray(e?.items)?e.items:[]}function on(e){return e.map((t,r)=>({item:t,index:r})).sort((t,r)=>{let n=String(t.item.id).localeCompare(String(r.item.id));return n!==0?n:t.index-r.index}).map(t=>t.item)}async function sn(e={},t={}){let r=Ur,n=e.payload??await se(r,t),o=on(St(n).map(rn));return oe("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function an(e){return e===!0||e===1||e==="1"}function cn(e,t){let r=e?.result&&typeof e.result=="object"?e.result:e,n=String(t).toLowerCase();if(r&&typeof r=="object"){for(let[o,i]of Object.entries(r))if(String(o).toLowerCase()===n&&i&&typeof i=="object")return{address:o,token:i}}return null}async function Fe(e={},t={}){e.asSoleGate===!0&&H("goplus is a second opinion and must never be a sole gate");let r=String(e.address||e.token||"").trim();Wr.test(r)||H("goplus requires an EVM token address");let n=Number(e.chainId??1);(!Number.isInteger(n)||n<=0)&&H("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||Mr).replace(/\/$/,"")}/${n}?contract_addresses=${r}`,s=e.payload??await se(i,t),l=cn(s,r);l||H("goplus returned no result for",r);let a=Gr.filter(u=>an(l.token[u]));return oe("goplus",{chainId:n,address:r.toLowerCase(),role:"second-opinion",secondOpinion:!0,soleGate:!1,neverSoleGate:!0,token:{address:l.address,name:l.token.token_name||null,symbol:l.token.token_symbol||null},findings:a,alert:a.length>0,note:"second opinion only \u2014 never the sole gate"})}function ln(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&H("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function un(e,t){let r=Number(e.healthFactor??e.hf);Number.isFinite(r)||H("position healthFactor required");let n=ln(r);return{id:String(e.id||e.protocol||`pos-${t}`),protocol:String(e.protocol||"unknown"),healthFactor:r,collateralUsd:e.collateralUsd!=null?Number(e.collateralUsd):null,debtUsd:e.debtUsd!=null?Number(e.debtUsd):null,rung:n}}async function dn(e={},t={}){let r=null;if(Array.isArray(e.positions))r=e;else if(Array.isArray(e))r={positions:e};else{let s=String(e.user||"").trim();s||H("liquidationLadder requires user or positions");let l=String(t.aaveUrl||`${Dr}/${s}`);r=await se(l,t)}let o=(Array.isArray(r?.positions)?r.positions:[]).map(un),i=o.reduce((s,l)=>s?wt[l.rung]<wt[s]?l.rung:s:l.rung,null);return oe("liquidationLadder",{user:r?.user||e.user||null,chainId:r?.chainId??e.chainId??null,ladder:o,worstRung:i,alert:o.some(s=>s.rung!=="healthy")})}var xo=Object.freeze({depeg:Qr,oracleDeviation:en,exploitFeed:sn,goplus:Fe,liquidationLadder:dn});import ee from"node:fs";import kn from"node:os";import we from"node:path";import{randomUUID as $n}from"node:crypto";var Eo=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Ao=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),M=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),F=e=>Number.isFinite(Number(e))?Number(e):null,fn=e=>Math.round(e*1e4)/1e4;function U(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:fn(r)})}function pn(e,t){let r=F(e.repeatBuys??e.repeat_buys??e.buyCount),n=F(e.walletWinRate??e.winRate);U(t,"repeat_buys",r===null?null:M((r-1)/4)*.38),U(t,"wallet_win_rate",n===null?null:(M(n)-.5)*.5)}function hn(e,t){let r=F(e.ageHours??e.poolAgeHours),n=F(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;U(t,"pool_age",r===null?null:r<24?-.42:M(r/720)*.12),U(t,"liquidity",n===null?null:(M(Math.log10(Math.max(1,n))/7)-.5)*.28),U(t,"liquidity_lock",o==null?null:o?.12:-.28)}function mn(e,t){let r=F(e.floorChange??e.floorChangePct),n=F(e.sales??e.saleCount);U(t,"floor_change",r===null?null:M(r,-1,1)*.35),U(t,"sales_depth",n===null?null:M(n/50)*.18)}function yn(e,t){let r=F(e.flowImbalance??e.imbalance),n=F(e.fundingRate??e.funding);U(t,"flow_imbalance",r===null?null:M(r,-1,1)*.42),U(t,"funding",n===null?null:-M(n*100,-1,1)*.12)}function wn(e,t){let r=F(e.marketProbability??e.marketPrice??e.probability),n=F(e.fairProbability??e.referenceProbability??e.fairValue);U(t,"probability_mispricing",r===null||n===null?null:M(n-r,-1,1)*.65);let o=F(e.liquidityUsd??e.liquidity);U(t,"market_liquidity",o===null?null:M(Math.log10(Math.max(1,o))/6)*.12)}var To=Object.freeze({wallet:pn,pool:hn,nft_floor:mn,hl_flow:yn,prediction_market:wn});import{createHash as En}from"node:crypto";var _o=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),ko=Object.freeze(["read","simulate"]);var $o=1440*60;var ie=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}},bn=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,gn=Object.freeze(["privkey","wif","xprv","seed"]);function Et(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return bn.test(t)||gn.includes(r)}var xn=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}]),Sn=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Z(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=Sn.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of xn)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new ie(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Et(o))throw new ie(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Z(o,`${t}[key]`,r),Z(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Z(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>Z(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Et(o))throw new ie(`${t}.${o}`,"forbidden-key-name");Z(i,`${t}.${o}`,r,o)}return e}var Ue=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Mo=Object.freeze(Object.fromEntries(Ue.map((e,t)=>[e,Object.freeze(t+1<Ue.length?[Ue[t+1]]:[])])));function Me(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Me).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Me(e[t])}`).join(",")}}`}function An(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function De(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))De(t)}return e}function Tn(e,t="fact"){try{Z(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function On(e){return En("sha256").update(Me(e)).digest("hex")}function _n({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:An(r)};return De({...s,hash:On(s)})}function At({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Tn(t,"intent");let n=_n({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return De({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Tt(e,t={}){if(!e||typeof e!="object")throw new TypeError("signal required");if(e.noTrade===!0)throw new Error("NO_TRADE signal cannot open a trade lifecycle");if(e.executionAllowed===!0)throw new Error("executionAllowed must be false on public plane");let r=String(t.tradeId||`sig-${e.id||"unknown"}`).slice(0,128),n={source:"signal_score",signalId:e.id,signalType:e.type,score:e.score,confidence:e.confidence,flags:e.flags||[],promote:"research_only",execution:"prepare-only",custody:"none",note:"Cold signal \u2192 prepare intent only. Owner wallet must sign any later tx.",...t.intentExtra&&typeof t.intentExtra=="object"?t.intentExtra:{}},o=At({tradeId:r,intent:n,asOf:t.asOf??Date.now()});return{tradeId:r,intent:n,lifecycle:o,recommendation:"PREPARE_RESEARCH_ONLY"}}var kt=1,Be=5e3,Rn=Object.freeze({1:new Set(["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","0xdac17f958d2ee523a2206206994597c13d831ec","0x6b175474e89094c44da98b954eedeac495271d0","0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"]),8453:new Set(["0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0x4200000000000000000000000000000000000006"]),42161:new Set(["0xaf88d065e77c8cc2239327c5edb3a432268e5831","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x82af49447d8a07e3bd95bd0d56f35241523fbab1"])}),Nn=/^0x[0-9a-fA-F]{40}$/,In=/^0x[0-9a-fA-F]{64}$/,Pn=/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/;function D(e,t){let r=String(e||"").trim();if(!Nn.test(r))throw new TypeError(`${t} must be a 0x-prefixed EVM address`);return r.toLowerCase()}function $t(e,t){let r=Rn[Number(e)];if(!r)return!1;try{return r.has(D(t,"token"))}catch{return!1}}function ae(e,t="usd"){let r=typeof e=="number"?String(e):e;if(typeof r!="string"||!Pn.test(r))throw new TypeError(`${t} must be a non-negative decimal string with at most 2 decimal places`);let[n,o=""]=r.split("."),i=(o+"00").slice(0,2);return BigInt(n)*100n+BigInt(i)}function ce(e){let t=BigInt(e);if(t<0n)throw new RangeError("centsToUsd: cents must be non-negative");let r=t/100n,n=t%100n;return`${r.toString()}.${n.toString().padStart(2,"0")}`}function Cn({dailyCapUsd:e,spentTodayUsd:t,proportionalUsd:r=null}){let n=ae(e,"dailyCapUsd"),o=ae(t,"spentTodayUsd"),i=n-o;if(i<=0n)return{sizeCents:0n,sizeUsd:"0.00",basis:"daily-cap-exhausted"};if(r==null)return{sizeCents:i,sizeUsd:ce(i),basis:"cap-only"};let s=ae(r,"proportionalUsd");if(s<=0n)return{sizeCents:0n,sizeUsd:"0.00",basis:"sized-to-zero"};let l=s<i?s:i;return{sizeCents:l,sizeUsd:ce(l),basis:l===i?"cap-limited":"proportional"}}function Ln(e={}){let t=String(e.txHash||"").trim().toLowerCase();if(!In.test(t))throw new TypeError("event.txHash must be a 32-byte tx hash");let r=D(e.token,"event.token"),n=D(e.from,"event.from"),o=D(e.to,"event.to"),i=e.txFrom==null?null:D(e.txFrom,"event.txFrom");return{txHash:t,token:r,from:n,to:o,txFrom:i,chainId:Number(e.chainId),blockNumber:Number.isFinite(Number(e.blockNumber))?Number(e.blockNumber):null,logIndex:Number.isFinite(Number(e.logIndex))?Number(e.logIndex):null,valueUsd:e.valueUsd==null?null:String(e.valueUsd)}}function jn(e,{followedWallet:t}={}){let r=D(t,"followedWallet");return e.txFrom?e.txFrom!==r?{included:!1,reason:"not-initiated-by-followed-wallet"}:$t(e.chainId,e.token)?{included:!1,reason:"quote-asset-transfer"}:e.to===r?{included:!0,side:"buy"}:e.from===r?{included:!0,side:"sell"}:{included:!1,reason:"wallet-not-a-party"}:{included:!1,reason:"tx-from-unknown"}}function Hn({chainId:e,txHash:t,noTrade:r}){return{id:`follow-mirror:${e}:${t}`,type:"wallet_mirror",score:r?0:1,confidence:r?0:1,noTrade:r,executionAllowed:!1,flags:r?["FOLLOW_MIRROR","NO_TRADE"]:["FOLLOW_MIRROR"]}}function ye({chainId:e,txHash:t,token:r,side:n,sizeUsd:o,sizeBasis:i,followedWallet:s,refuseReason:l=null}={}){let a=Hn({chainId:e,txHash:t,noTrade:l!=null});try{let u=Tt(a,{tradeId:`follow-mirror-${e}-${t}`,intentExtra:{source:"follow_mirror",chain:e,followedWallet:s,token:r,side:n,sizeUsd:o,sizeBasis:i,txHash:t,executionAllowed:!1,backendSigner:!1,note:"Wallet-follow mirror. Cold, prepare-only. Owner wallet must sign any later tx."}});return{ok:!0,requiresWalletSignature:!0,backendSigner:!1,executionAllowed:!1,tradeId:u.tradeId,chain:e,token:r,side:n,sizeUsd:o,sizeBasis:i,txHash:t,followedWallet:s,recommendation:u.recommendation,lifecycle:u.lifecycle,intent:u.intent}}catch(u){return{ok:!1,reason:l||String(u?.message||u)}}}function vn(e=[],{followedWallet:t,dailyCapUsd:r,spentTodayUsd:n="0",seenTxHashes:o=new Set,honeypotResults:i={}}={}){if(!Array.isArray(e))throw new TypeError("rawEvents must be an array");let s=D(t,"followedWallet"),l=new Set(o),a=ae(n,"spentTodayUsd"),u=ae(r,"dailyCapUsd"),c=[],p=[],f=[];for(let h of e){let d;try{d=Ln(h)}catch(b){f.push({txHash:h?.txHash??null,reason:`malformed-event: ${b.message}`});continue}if(l.has(d.txHash)){f.push({txHash:d.txHash,reason:"duplicate-tx"});continue}let y=jn(d,{followedWallet:s});if(!y.included){f.push({txHash:d.txHash,reason:y.reason});continue}let E=i[d.token];if(E?.flagged){l.add(d.txHash);let b=ye({chainId:d.chainId,txHash:d.txHash,token:d.token,side:y.side,sizeUsd:"0.00",sizeBasis:"refused",followedWallet:s,refuseReason:`token flagged: ${E.reason||"security check flagged this token"}`});p.push({txHash:d.txHash,token:d.token,side:y.side,reason:b.reason});continue}if(u-a<=0n){l.add(d.txHash);let b=ye({chainId:d.chainId,txHash:d.txHash,token:d.token,side:y.side,sizeUsd:"0.00",sizeBasis:"refused",followedWallet:s,refuseReason:"daily-cap-exhausted"});p.push({txHash:d.txHash,token:d.token,side:y.side,reason:b.reason});continue}let N=Cn({dailyCapUsd:ce(u),spentTodayUsd:ce(a),proportionalUsd:d.valueUsd});if(N.sizeCents<=0n){l.add(d.txHash);let b=ye({chainId:d.chainId,txHash:d.txHash,token:d.token,side:y.side,sizeUsd:"0.00",sizeBasis:N.basis,followedWallet:s,refuseReason:N.basis});p.push({txHash:d.txHash,token:d.token,side:y.side,reason:b.reason});continue}let x=ye({chainId:d.chainId,txHash:d.txHash,token:d.token,side:y.side,sizeUsd:N.sizeUsd,sizeBasis:N.basis,followedWallet:s});l.add(d.txHash),x.ok?(c.push(x),a+=N.sizeCents):p.push({txHash:d.txHash,token:d.token,side:y.side,reason:x.reason})}return{intents:c,refusals:p,skipped:f,seenTxHashes:l,spentTodayUsd:ce(a)}}function ze(e=process.env){let t=e.ORACLE_CONFIG_DIR||we.join(kn.homedir(),".config","oracle");return we.join(t,"follow-mirror.json")}function Ot(){return{version:kt,targets:{}}}function _t(e,t){return`${String(e).toLowerCase()}:${D(t,"address")}`}function be(e){try{let t=ee.readFileSync(e,"utf8"),r=JSON.parse(t);return!r||typeof r!="object"||r.version!==kt||!r.targets||typeof r.targets!="object"?Ot():r}catch{return Ot()}}function Fn(e,t){let r=we.dirname(e);ee.mkdirSync(r,{recursive:!0,mode:448});let n=we.join(r,`.follow-mirror.${process.pid}.${Date.now()}.${$n()}.tmp`);try{ee.writeFileSync(n,`${JSON.stringify(t)}
5
+ `,{mode:384,flag:"wx"}),ee.renameSync(n,e);try{ee.chmodSync(e,384)}catch{}}catch(o){try{ee.unlinkSync(n)}catch{}throw o}}function Un(e){return new Date(e).toISOString().slice(0,10)}function Mn(e,t,r){let n=e.targets[t],o=new Set(Array.isArray(n?.seenTxHashes)?n.seenTxHashes:[]),i=typeof n?.days?.[r]=="string"?n.days[r]:"0";return{seenTxHashes:o,spentTodayUsd:i}}function Dn(e,t,{seenTxHashes:r,spentTodayUsd:n,day:o,newIntents:i,newRefusals:s}){let l=e.targets[t]||{seenTxHashes:[],days:{},intents:[],refusals:[]},a=[...r].slice(-Be),u=[...l.intents||[],...i].slice(-Be),c=[...l.refusals||[],...s].slice(-Be);e.targets[t]={seenTxHashes:a,days:{...l.days||{},[o]:n},intents:u,refusals:c}}function Ge({now:e=()=>Date.now(),fetchWallet:t,fetchTxFrom:r,checkHoneypot:n,estimateUsdValue:o=async()=>null,storePath:i=ze()}={}){if(typeof t!="function")throw new TypeError("createFollowMirror requires fetchWallet");if(typeof r!="function")throw new TypeError("createFollowMirror requires fetchTxFrom");if(typeof n!="function")throw new TypeError("createFollowMirror requires checkHoneypot");async function s({address:a,chain:u,chainId:c,dailyCapUsd:p,lookback:f}={}){let h=D(a,"address"),d=Number(c);if(!Number.isInteger(d)||d<=0)throw new TypeError("observe requires a numeric chainId");let y=e(),E=Un(y),O=_t(u||d,h),N=be(i),{seenTxHashes:x,spentTodayUsd:b}=Mn(N,O,E),C=await t(h,{chains:[d],lookback:f}),L=Array.isArray(C?.events)?C.events:[],w=[],S={},_=new Set;for(let m of L){let k=null;try{k=await r(d,m.txHash)}catch{k=null}let v=null;try{v=await o({...m,chainId:d,txFrom:k})}catch{v=null}let $=String(m.token||"").toLowerCase();if(k===h&&!$t(d,$)&&!_.has($)&&$){_.add($);try{S[$]=await n(d,$)}catch(W){S[$]={flagged:!0,reason:`security check unavailable: ${String(W?.message||W).slice(0,160)}`}}}w.push({...m,chainId:d,txFrom:k,valueUsd:v})}let I=vn(w,{followedWallet:h,dailyCapUsd:String(p),spentTodayUsd:b,seenTxHashes:x,honeypotResults:S});return Dn(N,O,{seenTxHashes:I.seenTxHashes,spentTodayUsd:I.spentTodayUsd,day:E,newIntents:I.intents.map(m=>({tradeId:m.tradeId,txHash:m.txHash,token:m.token,side:m.side,sizeUsd:m.sizeUsd,createdAt:y})),newRefusals:I.refusals.map(m=>({...m,createdAt:y}))}),Fn(i,N),{ok:!0,cold:!0,executionAllowed:!1,chain:u||d,chainId:d,address:h,observed:L.length,intents:I.intents,refusals:I.refusals,skipped:I.skipped,spentTodayUsd:I.spentTodayUsd,dailyCapUsd:String(p),errors:C?.errors||[]}}function l({address:a,chain:u}={}){let c=D(a,"address"),p=be(i),f=_t(u,c),h=p.targets[f]||{intents:[],refusals:[],days:{}};return{ok:!0,address:c,chain:u,intents:h.intents||[],refusals:h.refusals||[],days:h.days||{}}}return Object.freeze({observe:s,status:l,storePath:i})}var te={1:"ethereum",8453:"base",42161:"arbitrum"},Bn=Object.fromEntries(Object.entries(te).map(([e,t])=>[t,Number(e)])),zn=new Set(["is_honeypot","cannot_sell_all","cannot_buy","is_blacklisted","selfdestruct","owner_change_balance"]),Rt=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
6
+ oracle follow <name-or-address> --chain <name> --mirror --max-usd <n> [--json]
7
+ oracle follow status [<name-or-address>] [--chain <name>] [--json]
5
8
 
6
9
  oracle follow vitalik.eth
7
10
  oracle follow demi.hl --chain base
8
11
  oracle follow 0x1111111111111111111111111111111111111111 --blocks 20000 --json
12
+ oracle follow 0x1111...1111 --chain base --mirror --max-usd 50
13
+ oracle follow status
9
14
 
10
15
  Reads ERC20 transfer activity for a wallet. Read-only: this calls
11
16
  eth_getLogs and eth_blockNumber and nothing else, so it can never move funds.
12
17
 
13
- Chains: ${Object.values(q).join(", ")}. Default: ethereum.
18
+ --mirror turns each NEW swap initiated by the followed wallet (its own
19
+ transaction, not merely a transfer it appears in) into a PREPARED, unsigned
20
+ mirror intent through the same signal-to-prepare NO_TRADE path every cold
21
+ signal uses. Every emitted intent carries requiresWalletSignature:true,
22
+ backendSigner:false, executionAllowed:false and still needs the owner to
23
+ review and sign a real trade separately. This never signs or broadcasts.
24
+ --max-usd sets both the per-mirror size ceiling and the rolling daily budget
25
+ for the followed wallet; once exhausted, further mirrors are refused until
26
+ the next day. A token that fails GoPlus's honeypot/token-security check is
27
+ refused with the reason instead of prepared. A GoPlus check that cannot be
28
+ completed (network down, no data) is treated as flagged, never as clean.
29
+
30
+ oracle follow status lists prepared mirror intents and refusals already on
31
+ disk, without polling the chain again.
32
+
33
+ Chains: ${Object.values(te).join(", ")}. Default: ethereum.
14
34
  Lookback defaults to 40000 blocks. Endpoints are keyless.
15
35
 
16
36
  Note publicnode-class RPCs are deliberately excluded: they retain only ~128
17
- blocks, so they return an empty result instead of an error.`;function Ve(t,e){let r=t.indexOf(e);return r>=0?t[r+1]:void 0}function er(t){let e=String(t??"");return e.length>22?`${e.slice(0,19)}...`:e}async function tr(t=[]){let e=t.includes("--json"),r=[];for(let o=0;o<t.length;o+=1){let u=t[o];if(u!=="--json"){if(u==="--chain"||u==="--blocks"){o+=1;continue}r.push(u)}}let n=(r[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(`${We}
18
- `),n?0:1;let i=(Ve(t,"--chain")||"ethereum").toLowerCase(),l=Qt[i]??Number(i);if(!oe[l])return process.stderr.write(`follow: unsupported chain "${i}". Supported: ${Object.values(q).join(", ")}
19
- `),1;let s=Ve(t,"--blocks"),f=s?Number(s):4e4;if(!Number.isFinite(f)||f<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${s}"
20
- `),1;try{let o=n,u=null;if(!Ue.test(n)){let d=await Ge(n);if(!d?.address)return process.stderr.write(`follow: could not resolve "${n}" to an address
21
- `),1;o=d.address,u=n}let a=await Se(o,{chains:[l],lookback:f,onWarn:e?void 0:d=>process.stderr.write(` warn: ${d}
22
- `)}),c=a.events||[];if(e)return process.stdout.write(`${JSON.stringify({address:o,resolvedFrom:u,chain:q[l]||String(l),lookbackBlocks:f,count:c.length,errors:a.errors||[],events:c})}
23
- `),0;let p=u?`${u} ${o}`:o;process.stdout.write(`${p}
24
- `),process.stdout.write(` ${q[l]||l} \xB7 last ${f} blocks \xB7 ${c.length} transfer${c.length===1?"":"s"}
25
- `),c.length||process.stdout.write(` no ERC20 transfers in this window
26
- `);for(let d of c.slice(0,25)){let m=d.to?.toLowerCase()===o.toLowerCase()?"in ":"out";process.stdout.write(` ${m} blk ${d.blockNumber} token ${d.token} ${er(d.value)}
27
- `)}c.length>25&&process.stdout.write(` ... ${c.length-25} more (use --json for all)
28
- `);for(let d of a.errors||[])process.stderr.write(` error: ${d.stage||"rpc"}: ${d.error}
29
- `);return 0}catch(o){return process.stderr.write(`follow failed: ${o?.message||o}
30
- `),1}}var Pr={name:"follow",summary:"read a wallet's recent ERC20 transfer activity",group:"read",usage:We,async run(t){return tr(t.argv||[])}};export{Pr as default};
37
+ blocks, so they return an empty result instead of an error.`;function ge(e,t){let r=e.indexOf(t);return r>=0?e[r+1]:void 0}function Gn(e){let t=String(e??"");return t.length>22?`${t.slice(0,19)}...`:t}async function Wn(e,t){let n=(await pe(e,"eth_getTransactionByHash",[t]))?.from;return typeof n!="string"||!/^0x[0-9a-fA-F]{40}$/.test(n)?null:n.toLowerCase()}async function qn(e,t){try{let n=((await Fe({address:t,chainId:e},{})).findings||[]).filter(o=>zn.has(o));return n.length>0?{flagged:!0,reason:`goplus: ${n.join(", ")}`}:{flagged:!1,reason:null}}catch(r){return{flagged:!0,reason:`goplus check unavailable: ${String(r?.message||r).slice(0,160)}`}}}async function We(e){if(dt.test(e))return{address:e,resolvedFrom:null};let t=await yt(e);return t?.address?{address:t.address,resolvedFrom:e}:{address:null,resolvedFrom:null}}async function Jn(e,{query:t,chainArg:r,chainId:n,lookbackBlocks:o,asJson:i}){let s=ge(e,"--max-usd");if(!s||!/^\d+(?:\.\d{1,2})?$/.test(s))return process.stderr.write(`follow --mirror: --max-usd must be a positive decimal (at most 2 decimal places), got "${s??""}"
38
+ `),1;let{address:l,resolvedFrom:a}=await We(t);if(!l)return process.stderr.write(`follow: could not resolve "${t}" to an address
39
+ `),1;let c=await Ge({fetchWallet:Te,fetchTxFrom:Wn,checkHoneypot:qn}).observe({address:l,chain:te[n]||String(n),chainId:n,dailyCapUsd:s,lookback:o});if(i)return process.stdout.write(`${JSON.stringify({resolvedFrom:a,...c})}
40
+ `),0;let p=a?`${a} ${l}`:l;process.stdout.write(`${p}
41
+ `),process.stdout.write(` ${c.chain} \xB7 observed ${c.observed} transfer${c.observed===1?"":"s"} \xB7 spent ${c.spentTodayUsd}/${c.dailyCapUsd} today
42
+ `),c.intents.length||process.stdout.write(` no new prepared mirror intents this run
43
+ `);for(let f of c.intents)process.stdout.write(` PREPARED ${f.side} ${f.token} $${f.sizeUsd} tx ${f.txHash}
44
+ `);for(let f of c.refusals)process.stdout.write(` REFUSED ${f.side} ${f.token} ${f.reason} tx ${f.txHash}
45
+ `);for(let f of c.errors||[])process.stderr.write(` error: ${f.stage||"rpc"}: ${f.error}
46
+ `);return 0}async function Vn(e,t){let r=(ge(e,"--chain")||"").toLowerCase(),o=(e.filter((a,u)=>a==="--json"||a==="status"||a==="--chain"&&e[u+1]!=null||e[u-1]==="--chain"?!1:!a.startsWith("--"))[0]||"").trim();if(o){let{address:a,resolvedFrom:u}=await We(o);if(!a)return process.stderr.write(`follow status: could not resolve "${o}" to an address
47
+ `),1;let c=Ge({fetchWallet:async()=>({events:[],errors:[]}),fetchTxFrom:async()=>null,checkHoneypot:async()=>({flagged:!1})}),p=r||"ethereum",f=c.status({address:a,chain:p});if(t)return process.stdout.write(`${JSON.stringify({resolvedFrom:u,...f})}
48
+ `),0;process.stdout.write(`${u?`${u} ${a}`:a} (${p})
49
+ `),!f.intents.length&&!f.refusals.length&&process.stdout.write(` no prepared mirror intents on disk for this target
50
+ `);for(let h of f.intents)process.stdout.write(` PREPARED ${h.side} ${h.token} $${h.sizeUsd} tx ${h.txHash}
51
+ `);for(let h of f.refusals)process.stdout.write(` REFUSED ${h.side} ${h.token} ${h.reason} tx ${h.txHash}
52
+ `);return 0}let i=ze(),s=be(i),l=Object.entries(s.targets||{});if(t)return process.stdout.write(`${JSON.stringify({storePath:i,targets:Object.fromEntries(l)})}
53
+ `),0;if(!l.length)return process.stdout.write(`no follow --mirror targets on disk yet
54
+ `),0;for(let[a,u]of l)process.stdout.write(`${a} ${(u.intents||[]).length} prepared, ${(u.refusals||[]).length} refused
55
+ `);return 0}async function Kn(e=[]){let t=e.includes("--json"),r=e.includes("--mirror"),n=[];for(let u=0;u<e.length;u+=1){let c=e[u];if(!(c==="--json"||c==="--mirror")){if(c==="--chain"||c==="--blocks"||c==="--max-usd"){u+=1;continue}n.push(c)}}if(n[0]==="status")return Vn(e,t);let o=(n[0]||"").trim();if(!o||o==="--help"||o==="-h")return process.stdout.write(`${Rt}
56
+ `),o?0:1;let i=(ge(e,"--chain")||"ethereum").toLowerCase(),s=Bn[i]??Number(i);if(!Ae[s])return process.stderr.write(`follow: unsupported chain "${i}". Supported: ${Object.values(te).join(", ")}
57
+ `),1;let l=ge(e,"--blocks"),a=l?Number(l):4e4;if(!Number.isFinite(a)||a<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${l}"
58
+ `),1;try{if(r)return await Jn(e,{query:o,chainArg:i,chainId:s,lookbackBlocks:a,asJson:t});let{address:u,resolvedFrom:c}=await We(o);if(!u)return process.stderr.write(`follow: could not resolve "${o}" to an address
59
+ `),1;let p=await Te(u,{chains:[s],lookback:a,onWarn:t?void 0:d=>process.stderr.write(` warn: ${d}
60
+ `)}),f=p.events||[];if(t)return process.stdout.write(`${JSON.stringify({address:u,resolvedFrom:c,chain:te[s]||String(s),lookbackBlocks:a,count:f.length,errors:p.errors||[],events:f})}
61
+ `),0;let h=c?`${c} ${u}`:u;process.stdout.write(`${h}
62
+ `),process.stdout.write(` ${te[s]||s} \xB7 last ${a} blocks \xB7 ${f.length} transfer${f.length===1?"":"s"}
63
+ `),f.length||process.stdout.write(` no ERC20 transfers in this window
64
+ `);for(let d of f.slice(0,25)){let y=d.to?.toLowerCase()===u.toLowerCase()?"in ":"out";process.stdout.write(` ${y} blk ${d.blockNumber} token ${d.token} ${Gn(d.value)}
65
+ `)}f.length>25&&process.stdout.write(` ... ${f.length-25} more (use --json for all)
66
+ `);for(let d of p.errors||[])process.stderr.write(` error: ${d.stage||"rpc"}: ${d.error}
67
+ `);return 0}catch(u){return process.stderr.write(`follow failed: ${u?.message||u}
68
+ `),1}}var ns={name:"follow",summary:"read a wallet's recent ERC20 transfer activity, or --mirror it to prepared intents",group:"read",usage:Rt,async run(e){return Kn(e.argv||[])}};export{ns as default};
@@ -1,4 +1,4 @@
1
- import{wordlists as H}from"ethers";var D=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),F=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],J=new Set([12,15,18,21,24]);function q(e){let o=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return J.has(o.length)&&o.every(t=>H.en.getWordIndex(t)>=0)}var U=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,M=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,K=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function X(e){let o=_(e);return K.has(o)||M.test(o)}var A=class extends Error{constructor(o){super(`action receipt refused: secret-bearing field at ${o}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function _(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function W(e){let o=_(e);return[...D].some(t=>o.includes(t))}function Y(e,o,t){if(typeof o=="string"){if(F.some(n=>n.test(o))||q(o))throw new A(t);if(U.test(o)&&!X(e))throw new A(t)}}function x(e,o="$",t=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Y(t,e,o),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${o}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((r,s)=>x(r,`${o}[${s}]`,t));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${o}`);let n={};for(let r of Object.keys(e).sort()){let s=`${o}.${r}`;if(W(r))throw new A(s);e[r]!==void 0&&(n[r]=x(e[r],s,r))}return n}function u(e){return x(e)}var O=1,y="Unsigned prepare material only; no vote, signature, or broadcast occurred.",Z=Object.freeze(["proposal","delegation","vote"]),Q=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),ee=Object.freeze(["for","against","abstain"]),te=Object.freeze(["delegate","undelegate"]),oe=new Set(Z),re=new Set(Q),ne=new Set(ee),se=new Set(te),ae=/[\u0000-\u001f\u007f]/,ie=new Set(["active"]),ce=new Set(["executed","defeated","canceled","expired"]),R=class extends Error{constructor(o,t="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${o}`),this.name="GovernancePrepareError",this.code=t}};function i(e,o){throw new R(e,o)}function b(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let o of Object.values(e))b(o);Object.freeze(e)}return e}function g(e,o){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&i(`${o} must be a plain object`),e}function p(e,o,{optional:t=!1,lower:n=!1}={}){if(e==null&&t)return null;typeof e!="string"&&i(`${o} must be a string`);let r=e.trim();return r||i(`${o} is required`),ae.test(r)&&i(`${o} contains control characters`),r.length>2048&&i(`${o} is too long`),n?r.toLowerCase():r}function f(e,o,{optional:t=!1,positive:n=!1}={}){if(e==null&&t)return null;typeof e=="number"&&i(`${o} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let r;typeof e=="bigint"?r=e.toString():typeof e=="string"?r=e.trim():i(`${o} must be an exact decimal string or BigInt`),/^\d+$/.test(r)||i(`${o} must be a non-negative base-10 integer string`);let s=BigInt(r);return n&&s===0n&&i(`${o} must be positive`),s.toString()}function w(e,o){return e==null?null:p(e,o)}function m(e,o){for(let t of o)if(e[t]!==void 0)return e[t]}function pe(e,o="action"){let t=p(e,o,{lower:!0});return oe.has(t)||i(`${o} must be proposal, delegation, or vote`),t}function de(e,o="proposal.state"){e==null&&i(`${o} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let t=p(e,o,{lower:!0});return re.has(t)||i(`${o} is not a recognized proposal state`),t==="unknown"&&i(`${o} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),t}function le(e){let o=p(e,"support",{lower:!0});return ne.has(o)||i("support must be for, against, or abstain"),o}function N(e,{accountRequired:o=!0}={}){return b({chain:p(m(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:p(m(e,["governor","governorAddress","governance","contract"]),"governor"),account:p(m(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!o})})}function $(e,o){let t=w(o.tenantId??e.tenantId,"tenantId");return t?{tenantId:t}:{}}function S(e,o,t="asOf"){return f(o.asOf??e.asOf,t)}function ue(e,o={}){u(e),u(o);let t=g(e,"proposal");g(o,"options");let n=S(t,o),r=N(t,{accountRequired:!1}),s=p(m(t,["proposalId","id"]),"proposalId"),c=de(m(t,["state","status","proposalState"])),a=w(t.title??t.name,"title"),l=w(t.description??t.body??t.summary,"description"),d=w(t.proposer,"proposer"),v=f(t.startBlock??t.start,"startBlock",{optional:!0}),h=f(t.endBlock??t.end,"endBlock",{optional:!0}),E=f(t.forVotes??t.votesFor,"forVotes",{optional:!0}),z=f(t.againstVotes??t.votesAgainst,"againstVotes",{optional:!0}),L=f(t.abstainVotes??t.votesAbstain,"abstainVotes",{optional:!0}),B={recordVersion:O,recordType:"governance-proposal",label:y,asOf:n,chain:r.chain,governor:r.governor,proposalId:s,state:c,votable:ie.has(c),terminal:ce.has(c),title:a,description:l,proposer:d,startBlock:v,endBlock:h,tallies:{forVotes:E,againstVotes:z,abstainVotes:L},occurred:!1,...$(t,o)};return b(B)}function fe(e,o={}){u(e),u(o);let t=g(e,"intent");g(o,"options");let n=S(t,o),r=N(t),s=t.mode??(t.action==="undelegate"?"undelegate":"delegate"),c=p(s,"mode",{lower:!0});se.has(c)||i("mode must be delegate or undelegate");let a=c==="undelegate"?w(t.delegatee??t.to,"delegatee"):p(t.delegatee??t.to,"delegatee"),l=f(m(t,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),d={recordVersion:O,recordType:"governance-delegation-intent",label:y,action:"delegation",mode:c,asOf:n,chain:r.chain,governor:r.governor,account:r.account,delegatee:c==="undelegate"?a??r.account:a,votingPower:l,occurred:!1,...$(t,o)};return b(d)}function ge(e,o={}){u(e),u(o);let t=g(e,"intent");g(o,"options");let n=S(t,o),r=ue(t.proposal??t,o);r.votable||i(`proposal ${r.proposalId} is ${r.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let s=N({...t,chain:t.chain??r.chain,governor:t.governor??r.governor}),c=le(t.support??t.choice??t.vote),a=f(m(t,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),l=w(t.reason??t.comment,"reason"),d={recordVersion:O,recordType:"governance-vote-intent",label:y,action:"vote",asOf:n,chain:s.chain,governor:s.governor,account:s.account,proposalId:r.proposalId,proposalState:r.state,support:c,votingPower:a,reason:l,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:r,...$(t,o)};return b(d)}function ye(e,o={}){u(e);let t=g(e,"intent"),n=S(t,o),r=N(t),s=p(t.title??t.name,"title"),c=p(t.description??t.body,"description"),a=t.targets;(!Array.isArray(a)||a.length===0)&&i("targets must be a non-empty array");let l=(t.values??a.map(()=>"0")).map((h,E)=>f(h,`values[${E}]`));l.length!==a.length&&i("values length must match targets");let d=(t.calldatas??t.data??[]).map((h,E)=>p(String(h),`calldatas[${E}]`));d.length!==a.length&&i("calldatas length must match targets");let v=f(m(t,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return b({recordVersion:O,recordType:"governance-proposal-intent",label:y,action:"proposal",asOf:n,chain:r.chain,governor:r.governor,account:r.account,title:s,description:c,targets:a.map((h,E)=>p(h,`targets[${E}]`)),values:l,calldatas:d,votingPower:v,occurred:!1,...$(t,o)})}function me(e,o,t){return e==="vote"?ge(o,t):e==="delegation"?fe(o,t):ye(o,t)}function he(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,y]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",y]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",y]}function I(e={},o={}){u(e),u(o);let t=g(e,"intent");g(o,"options"),o.asOf==null&&t.asOf==null&&i("explicit asOf required","GOVERNANCE_MISSING_ASOF");let n=pe(t.action??t.type??o.action??Ee(t)),r=me(n,{...t,action:n},o);return b({recordVersion:O,recordType:"governance-preview",label:y,action:n,asOf:r.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:he(r),intent:r,...$(t,o)})}function Ee(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";i("action is required")}import P from"node:fs";var V=1024*1024;function C(e=[],o={}){let t=[],n={};for(let r=0;r<e.length;r+=1){let s=e[r];if(!s.startsWith("--")){t.push(s);continue}let c=s.indexOf("="),a=s.slice(2,c===-1?void 0:c),l=o[a];if(!l)throw new TypeError(`unknown option --${a}`);if(Object.hasOwn(n,a))throw new TypeError(`duplicate option --${a}`);if(l==="boolean"){if(c!==-1)throw new TypeError(`option --${a} does not take a value`);n[a]=!0;continue}let d=c===-1?e[++r]:s.slice(c+1);if(d==null||d===""||d.startsWith("--"))throw new TypeError(`option --${a} requires a value`);n[a]=d}return{positionals:t,options:n}}function j(e,o="input"){if(!e)throw new TypeError(`${o} JSON path or - is required`);let t=e==="-"?P.readFileSync(0):P.readFileSync(e);if(t.length>V)throw new RangeError(`${o} exceeds ${V} bytes`);let n;try{n=JSON.parse(t.toString("utf8"))}catch(r){throw new TypeError(`${o} must be valid JSON: ${r.message}`)}if(!n||typeof n!="object"||Array.isArray(n)||Object.getPrototypeOf(n)!==Object.prototype)throw new TypeError(`${o} must be a JSON object`);return n}function k(e,o=process.stdout){o.write(`${JSON.stringify(e,null,2)}
1
+ import{wordlists as H}from"ethers";var D=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),F=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],J=new Set([12,15,18,21,24]);function q(e){let o=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return J.has(o.length)&&o.every(t=>H.en.getWordIndex(t)>=0)}var U=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,M=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,K=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function X(e){let o=_(e);return K.has(o)||M.test(o)}var A=class extends Error{constructor(o){super(`action receipt refused: secret-bearing field at ${o}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function _(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function W(e){let o=_(e);return[...D].some(t=>o.includes(t))}function Y(e,o,t){if(typeof o=="string"){if(F.some(n=>n.test(o))||q(o))throw new A(t);if(U.test(o)&&!X(e))throw new A(t)}}function x(e,o="$",t=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Y(t,e,o),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${o}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((r,s)=>x(r,`${o}[${s}]`,t));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${o}`);let n={};for(let r of Object.keys(e).sort()){let s=`${o}.${r}`;if(W(r))throw new A(s);e[r]!==void 0&&(n[r]=x(e[r],s,r))}return n}function u(e){return x(e)}var O=1,y="Unsigned prepare material only; no vote, signature, or broadcast occurred.",Z=Object.freeze(["proposal","delegation","vote"]),Q=Object.freeze(["pending","active","succeeded","queued","executed","defeated","canceled","expired","unknown"]),ee=Object.freeze(["for","against","abstain"]),te=Object.freeze(["delegate","undelegate"]),oe=new Set(Z),re=new Set(Q),ne=new Set(ee),se=new Set(te),ae=/[\u0000-\u001f\u007f]/,ie=new Set(["active"]),ce=new Set(["executed","defeated","canceled","expired"]),R=class extends Error{constructor(o,t="GOVERNANCE_PREPARE_INVALID"){super(`governance prepare: ${o}`),this.name="GovernancePrepareError",this.code=t}};function i(e,o){throw new R(e,o)}function b(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let o of Object.values(e))b(o);Object.freeze(e)}return e}function g(e,o){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&i(`${o} must be a plain object`),e}function p(e,o,{optional:t=!1,lower:n=!1}={}){if(e==null&&t)return null;typeof e!="string"&&i(`${o} must be a string`);let r=e.trim();return r||i(`${o} is required`),ae.test(r)&&i(`${o} contains control characters`),r.length>2048&&i(`${o} is too long`),n?r.toLowerCase():r}function f(e,o,{optional:t=!1,positive:n=!1}={}){if(e==null&&t)return null;typeof e=="number"&&i(`${o} must be an exact decimal string or BigInt; Number coercion is refused`,"GOVERNANCE_UNSAFE_NUMBER");let r;typeof e=="bigint"?r=e.toString():typeof e=="string"?r=e.trim():i(`${o} must be an exact decimal string or BigInt`),/^\d+$/.test(r)||i(`${o} must be a non-negative base-10 integer string`);let s=BigInt(r);return n&&s===0n&&i(`${o} must be positive`),s.toString()}function w(e,o){return e==null?null:p(e,o)}function h(e,o){for(let t of o)if(e[t]!==void 0)return e[t]}function pe(e,o="action"){let t=p(e,o,{lower:!0});return oe.has(t)||i(`${o} must be proposal, delegation, or vote`),t}function de(e,o="proposal.state"){e==null&&i(`${o} is required`,"GOVERNANCE_MISSING_PROPOSAL_STATE");let t=p(e,o,{lower:!0});return re.has(t)||i(`${o} is not a recognized proposal state`),t==="unknown"&&i(`${o} is unknown; voting and execution fail closed`,"GOVERNANCE_UNKNOWN_PROPOSAL_STATE"),t}function le(e){let o=p(e,"support",{lower:!0});return ne.has(o)||i("support must be for, against, or abstain"),o}function N(e,{accountRequired:o=!0}={}){return b({chain:p(h(e,["chain","chainId","network"]),"chain",{lower:!0}),governor:p(h(e,["governor","governorAddress","governance","contract"]),"governor"),account:p(h(e,["account","address","owner","voter","from","proposer"]),"account",{optional:!o})})}function $(e,o){let t=w(o.tenantId??e.tenantId,"tenantId");return t?{tenantId:t}:{}}function S(e,o,t="asOf"){return f(o.asOf??e.asOf,t)}function ue(e,o={}){u(e),u(o);let t=g(e,"proposal");g(o,"options");let n=S(t,o),r=N(t,{accountRequired:!1}),s=p(h(t,["proposalId","id"]),"proposalId"),c=de(h(t,["state","status","proposalState"])),a=w(t.title??t.name,"title"),l=w(t.description??t.body??t.summary,"description"),d=w(t.proposer,"proposer"),v=f(t.startBlock??t.start,"startBlock",{optional:!0}),m=f(t.endBlock??t.end,"endBlock",{optional:!0}),E=f(t.forVotes??t.votesFor,"forVotes",{optional:!0}),z=f(t.againstVotes??t.votesAgainst,"againstVotes",{optional:!0}),L=f(t.abstainVotes??t.votesAbstain,"abstainVotes",{optional:!0}),B={recordVersion:O,recordType:"governance-proposal",label:y,asOf:n,chain:r.chain,governor:r.governor,proposalId:s,state:c,votable:ie.has(c),terminal:ce.has(c),title:a,description:l,proposer:d,startBlock:v,endBlock:m,tallies:{forVotes:E,againstVotes:z,abstainVotes:L},occurred:!1,...$(t,o)};return b(B)}function fe(e,o={}){u(e),u(o);let t=g(e,"intent");g(o,"options");let n=S(t,o),r=N(t),s=t.mode??(t.action==="undelegate"?"undelegate":"delegate"),c=p(s,"mode",{lower:!0});se.has(c)||i("mode must be delegate or undelegate");let a=c==="undelegate"?w(t.delegatee??t.to,"delegatee"):p(t.delegatee??t.to,"delegatee"),l=f(h(t,["votingPower","votes","power","balance"]),"votingPower",{positive:!0}),d={recordVersion:O,recordType:"governance-delegation-intent",label:y,action:"delegation",mode:c,asOf:n,chain:r.chain,governor:r.governor,account:r.account,delegatee:c==="undelegate"?a??r.account:a,votingPower:l,occurred:!1,...$(t,o)};return b(d)}function ge(e,o={}){u(e),u(o);let t=g(e,"intent");g(o,"options");let n=S(t,o),r=ue(t.proposal??t,o);r.votable||i(`proposal ${r.proposalId} is ${r.state} and is not votable`,"GOVERNANCE_PROPOSAL_NOT_VOTABLE");let s=N({...t,chain:t.chain??r.chain,governor:t.governor??r.governor}),c=le(t.support??t.choice??t.vote),a=f(h(t,["votingPower","votes","power","weight"]),"votingPower",{positive:!0}),l=w(t.reason??t.comment,"reason"),d={recordVersion:O,recordType:"governance-vote-intent",label:y,action:"vote",asOf:n,chain:s.chain,governor:s.governor,account:s.account,proposalId:r.proposalId,proposalState:r.state,support:c,votingPower:a,reason:l,occurred:!1,voted:!1,signed:!1,broadcast:!1,proposal:r,...$(t,o)};return b(d)}function ye(e,o={}){u(e);let t=g(e,"intent"),n=S(t,o),r=N(t),s=p(t.title??t.name,"title"),c=p(t.description??t.body,"description"),a=t.targets;(!Array.isArray(a)||a.length===0)&&i("targets must be a non-empty array");let l=(t.values??a.map(()=>"0")).map((m,E)=>f(m,`values[${E}]`));l.length!==a.length&&i("values length must match targets");let d=(t.calldatas??t.data??[]).map((m,E)=>p(String(m),`calldatas[${E}]`));d.length!==a.length&&i("calldatas length must match targets");let v=f(h(t,["votingPower","proposalThreshold","threshold"]),"votingPower",{positive:!0});return b({recordVersion:O,recordType:"governance-proposal-intent",label:y,action:"proposal",asOf:n,chain:r.chain,governor:r.governor,account:r.account,title:s,description:c,targets:a.map((m,E)=>p(m,`targets[${E}]`)),values:l,calldatas:d,votingPower:v,occurred:!1,...$(t,o)})}function he(e,o,t){return e==="vote"?ge(o,t):e==="delegation"?fe(o,t):ye(o,t)}function me(e){return e.action==="vote"?[`Unsigned vote preview for proposal ${e.proposalId} on ${e.governor}.`,`Support: ${e.support}. Voting power: ${e.votingPower} (exact base units).`,`Proposal state is ${e.proposalState}. No ballot is submitted.`,y]:e.action==="delegation"?[`Unsigned ${e.mode} preview on ${e.governor}.`,`Account ${e.account} \u2192 ${e.delegatee}. Voting power: ${e.votingPower}.`,"No delegation transaction is signed or broadcast.",y]:[`Unsigned proposal preview on ${e.governor}: ${e.title}.`,`${e.targets.length} target(s). Voting power: ${e.votingPower}.`,"No proposal is submitted.",y]}function I(e={},o={}){u(e),u(o);let t=g(e,"intent");g(o,"options"),o.asOf==null&&t.asOf==null&&i("explicit asOf required","GOVERNANCE_MISSING_ASOF");let n=pe(t.action??t.type??o.action??Ee(t)),r=he(n,{...t,action:n},o);return b({recordVersion:O,recordType:"governance-preview",label:y,action:n,asOf:r.asOf,occurred:!1,voted:!1,signed:!1,broadcast:!1,executionReady:!1,signingReady:!1,broadcastReady:!1,lines:me(r),intent:r,...$(t,o)})}function Ee(e){if(e.support!=null||e.choice!=null||e.proposalId!=null)return"vote";if(e.delegatee!=null||e.mode==="delegate"||e.mode==="undelegate")return"delegation";if(e.targets!=null||e.title!=null)return"proposal";i("action is required")}import P from"node:fs";var V=1024*1024;function C(e=[],o={}){let t=[],n={};for(let r=0;r<e.length;r+=1){let s=e[r];if(!s.startsWith("--")){t.push(s);continue}let c=s.indexOf("="),a=s.slice(2,c===-1?void 0:c),l=o[a];if(!l)throw new TypeError(`unknown option --${a}`);if(Object.hasOwn(n,a))throw new TypeError(`duplicate option --${a}`);if(l==="boolean"){if(c!==-1)throw new TypeError(`option --${a} does not take a value`);n[a]=!0;continue}let d=c===-1?e[++r]:s.slice(c+1);if(d==null||d===""||d.startsWith("--"))throw new TypeError(`option --${a} requires a value`);n[a]=d}return{positionals:t,options:n}}function j(e,o="input"){if(!e)throw new TypeError(`${o} JSON path or - is required`);let t=e==="-"?P.readFileSync(0):P.readFileSync(e);if(t.length>V)throw new RangeError(`${o} exceeds ${V} bytes`);let n;try{n=JSON.parse(t.toString("utf8"))}catch(r){throw new TypeError(`${o} must be valid JSON: ${r.message}`)}if(!n||typeof n!="object"||Array.isArray(n)||Object.getPrototypeOf(n)!==Object.prototype)throw new TypeError(`${o} must be a JSON object`);return n}function k(e,o=process.stdout){o.write(`${JSON.stringify(e,null,2)}
2
2
  `)}function G(e,o=process.stderr){return o.write(`oracle: ${e instanceof Error?e.message:String(e)}
3
3
  `),2}var T="oracle governance-prepare <input.json|-> --as-of <integer>",Re={name:"governance-prepare",summary:"preview a supplied governance intent without adapter calldata",group:"prepare",usage:T,async run(e){let o=e.argv??[];if(o.length===0||o.includes("--help")||o.includes("-h"))return process.stdout.write(`${T}
4
4
  Semantic preview only. No adapter, calldata, vote, signature, or broadcast.
@@ -1,3 +1,3 @@
1
- import{spawnSync as p}from"node:child_process";var n=["oracle data serve # loopback read/prepare plane on 127.0.0.1:8787","oracle doctor # verify","oracle setup model # Claude, Codex, Grok, OpenRouter, DeepSeek, Nous, ...","oracle chat # premium oracle chat surface","oracle chain list # pick hyperliquid/base/solana/...","oracle setup # telegram/discord/slack messaging","oracle mcp install claude-code"];function t(){return["","Next:",...n.map(s=>" "+s),""].join(`
2
- `)}var u={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(s){let r=[...s.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let a=s.bin("oracle-init.mjs"),e=p(process.execPath,[a,...r],{encoding:"utf8",env:process.env});if(e.error)return process.stderr.write(`oracle: failed to spawn oracle-init: ${e.error.message}
1
+ import{spawnSync as c}from"node:child_process";var n=["oracle data serve # loopback read/prepare plane on 127.0.0.1:8787","oracle doctor # verify","oracle setup model # Claude, Codex, Grok, OpenRouter, DeepSeek, Nous, ...","oracle chat # premium oracle chat surface","oracle chain list # pick hyperliquid/base/solana/...","oracle setup # telegram/discord/slack messaging","oracle mcp install claude-code"];function t(){return["","Next:",...n.map(s=>" "+s),""].join(`
2
+ `)}var u={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(s){let r=[...s.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let a=s.bin("oracle-init.mjs"),e=c(process.execPath,[a,...r],{encoding:"utf8",env:process.env});if(e.error)return process.stderr.write(`oracle: failed to spawn oracle-init: ${e.error.message}
3
3
  `),1;e.stdout&&process.stdout.write(e.stdout),e.stderr&&process.stderr.write(e.stderr);let o=typeof e.status=="number"?e.status:1;return o===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(t()),o}};export{u as default};