@oracle-agent/oracle 0.35.49 → 0.35.50

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 (81) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +19 -19
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  15. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  16. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  17. package/dist/bin/oracle-public-server.mjs +5 -5
  18. package/dist/bin/oracle-route.mjs +27 -27
  19. package/dist/bin/oracle-scan.mjs +3 -3
  20. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  21. package/dist/chains.mjs +1 -1
  22. package/dist/cli/commands/account.mjs +22 -22
  23. package/dist/cli/commands/agent-session.mjs +23 -23
  24. package/dist/cli/commands/auth.mjs +16 -15
  25. package/dist/cli/commands/chain.mjs +5 -5
  26. package/dist/cli/commands/chat.mjs +310 -228
  27. package/dist/cli/commands/data.mjs +37 -37
  28. package/dist/cli/commands/doctor.mjs +5 -5
  29. package/dist/cli/commands/eval.mjs +249 -167
  30. package/dist/cli/commands/farm.mjs +1 -1
  31. package/dist/cli/commands/follow.mjs +4 -4
  32. package/dist/cli/commands/harness.mjs +6 -6
  33. package/dist/cli/commands/mint.mjs +11 -11
  34. package/dist/cli/commands/model.mjs +313 -231
  35. package/dist/cli/commands/project.mjs +8 -7
  36. package/dist/cli/commands/quickstart.mjs +2 -2
  37. package/dist/cli/commands/receipt.mjs +2 -2
  38. package/dist/cli/commands/resolve.mjs +4 -4
  39. package/dist/cli/commands/session-vault.mjs +4 -4
  40. package/dist/cli/commands/setup.mjs +53 -52
  41. package/dist/cli/commands/snipe.mjs +13 -13
  42. package/dist/cli/commands/strategy.mjs +5 -5
  43. package/dist/cli/commands/swap.mjs +11 -11
  44. package/dist/cli/commands/telegram.mjs +7 -7
  45. package/dist/cli/commands/venues.mjs +1 -1
  46. package/dist/cli/project-access.mjs +4 -3
  47. package/dist/data/desk-data.mjs +31 -31
  48. package/dist/data/holder-table.mjs +2 -2
  49. package/dist/data/market-tape.mjs +1 -1
  50. package/dist/data/names.mjs +3 -3
  51. package/dist/data/providers/farming.mjs +2 -2
  52. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  53. package/dist/index.mjs +49 -49
  54. package/dist/launch-radar/index.mjs +5 -5
  55. package/dist/lp/index.mjs +4 -4
  56. package/dist/nft/universal-mint-router.mjs +4 -4
  57. package/dist/notifications/index.mjs +1 -1
  58. package/dist/router/index.mjs +3 -3
  59. package/dist/router/prepare-bridge.mjs +2 -2
  60. package/dist/router/prepare-route.mjs +3 -3
  61. package/dist/scanner/index.mjs +3 -3
  62. package/dist/strategy/index.mjs +4 -4
  63. package/dist/task.mjs +1 -1
  64. package/dist/teams/index.mjs +6 -6
  65. package/dist/telegram/chart-card.mjs +5 -5
  66. package/dist/telegram/market-commands.mjs +1 -1
  67. package/dist/tui/standalone-client.mjs +179 -97
  68. package/package.json +2 -2
  69. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  70. package/public/oracle-splash/docs/connectors/index.html +2 -2
  71. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  72. package/public/oracle-splash/docs/index.html +3 -3
  73. package/public/oracle-splash/docs/reference/index.html +2 -2
  74. package/public/oracle-splash/docs/security/index.html +2 -2
  75. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  76. package/public/oracle-splash/download/index.html +3 -3
  77. package/public/oracle-splash/downloads/index.html +1 -1
  78. package/public/oracle-splash/eval/index.html +19 -19
  79. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  80. package/public/oracle-splash/index.html +9 -9
  81. package/server.json +2 -2
@@ -1,5 +1,5 @@
1
1
  var pe=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};import{AsyncLocalStorage as Ar}from"node:async_hooks";function Fe(e){let t=xr.getStore();if(!t||t.closed||!vr.includes(e))return null;if(t.spans.length>=kr)return t.droppedSpans++,null;let n={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(n),(r,o=null)=>{t.closed||n.durationMs!==null||(n.durationMs=Math.max(0,t.now()-t.start-n.startMs),n.outcome=r==="succeeded"?"succeeded":"failed",n.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var xr,vr,kr,Mt=pe(()=>{xr=new Ar,vr=["http","retry","shared"],kr=512});import ae from"node:net";import Tr from"node:dns";function Ue(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=p=>{if(!p)return[];let w=p.split(":"),T=w.at(-1);if(T?.includes(".")){let v=T.split(".").map(Number);if(v.length!==4||v.some(b=>!Number.isInteger(b)||b<0||b>255))return null;w.splice(w.length-1,1,(v[0]<<8|v[1]).toString(16),(v[2]<<8|v[3]).toString(16))}return w.some(v=>!/^[0-9a-f]{1,4}$/.test(v))?null:w.map(v=>Number.parseInt(v,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let h=[...i,...Array(Math.max(0,c)).fill(0),...s];return h.length!==8?null:Uint8Array.from(h.flatMap(p=>[p>>8,p&255]))}function et(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function tt(e){if(ae.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(ae.isIPv6(e)){let t=Ue(e);if(!t)return!1;let n=Ue("::ffff:0:0");return et(t,n,96)?tt([...t.slice(12)].join(".")):et(t,Ue("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>et(t,Ue(o),i)):!1}return!1}function _r(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 n=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ir.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ae.isIP(n);return r!==0&&!tt(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ae(e,{lookupFn:t=Tr.promises.lookup}={}){let n=_r(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ae.isIPv6(n.host)?6:4}]};let r;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:n.url,addresses:[]};try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!tt(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function Nr(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let n;try{n=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(n.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(n.hostname)||!n.port||n.username||n.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let r=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(r))throw new Error("egress-guard: egress proxy token is missing");return{uri:n.origin,token:r}}async function nt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(v){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${v?.message||v}`);return null}if(typeof n!="function"||typeof r!="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 i=v=>String(v).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,a=v=>(Array.isArray(v)?v:[v]).map(b=>typeof b=="string"?{address:b}:b).filter(b=>b&&b.address).map(b=>({address:b.address,family:b.family||(ae.isIPv6(b.address)?6:4)})),c=(v,b,I)=>{s.set(i(v),a(typeof b=="string"?[{address:b,family:I}]:b))},h=v=>{let b=i(v);if(ae.isIP(b))return[{address:b,family:ae.isIPv6(b)?6:4}];let I=s.get(b);if(!I||!I.length)throw new Error(`refused: unpinned host ${v} during pinned fetch`);return I},p=Nr(),w=p&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:p.uri,token:`Bearer ${p.token}`,connectTimeout:1e4}):new n({connect:{lookup(v,b,I){let O;try{O=h(v)}catch($){return I($)}return b?.all?I(null,O):I(null,O[0].address,O[0].family)}}}),T=Or((v,b={})=>r(v,{...b,dispatcher:w}),c);return{dispatcher:w,fetch:T,pin:c,resolve:h,async close(){try{await w.destroy()}catch{}}}}function Or(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[rt]=Object.freeze({pin:t}),e}function ot(e){return typeof e=="function"&&typeof e[rt]?.pin=="function"}function Dt(e,t,n){if(!ot(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[rt].pin(t,n)}var Ir,rt,it=pe(()=>{Ir=new Set(["localhost","metadata.google.internal","metadata.goog"]);rt=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Cr}from"node:crypto";import{types as re}from"node:util";function H(e){return oe(`HTTP JSON body refused: ${e}`)}function Br(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 re[t]=="function"&&re[t](e))}function qr(e){let t=[],n=0,r=0,o=0,i=0,s=new WeakSet,a=p=>{if(n+=Buffer.byteLength(p,"utf8"),n>ne.bytes)throw H("serialized byte limit exceeded");t.push(p)},c=p=>{if(Buffer.byteLength(p,"utf8")>ne.bytes)throw H("serialized byte limit exceeded");return JSON.stringify(p)},h=(p,w)=>{if(r+=1,r>ne.nodes)throw H("node limit exceeded");if(w>ne.depth)throw H("depth limit exceeded");if(p===null){a("null");return}if(typeof p=="string"){a(c(p));return}if(typeof p=="boolean"){a(p?"true":"false");return}if(typeof p=="number"){if(!Number.isFinite(p))throw H("non-finite number");a(Object.is(p,-0)?"0":String(p));return}if(typeof p!="object")throw H("unsupported non-JSON value");if(re.isProxy(p))throw H("proxy value");if(Br(p))throw H("unsupported exotic object");if(s.has(p))throw H("cyclic value");s.add(p);try{if(Object.getOwnPropertySymbols(p).length>0)throw H("symbol-keyed fields are unsupported");if(Array.isArray(p)){let b=Object.getPrototypeOf(p),I=0;for(;b!==null;){if(re.isProxy(b))throw H("proxy array prototype");if(I+=1,I>ne.depth)throw H("array prototype depth limit exceeded");b=Object.getPrototypeOf(b)}if(p.length>ne.arrayLength)throw H("array length limit exceeded");for(let $=0;$<p.length;$+=1){let B=Object.getOwnPropertyDescriptor(p,String($));if(!B||!Object.hasOwn(B,"value")||B.enumerable!==!0)throw H("array entries must be dense enumerable own data")}let O=0;for(let $ in p){if(i+=1,i>ne.fields)throw H("enumeration limit exceeded");if(Object.hasOwn(p,$)&&(O+=1,O>p.length))throw H("named array fields are unsupported")}if(O!==p.length)throw H("array entries must be dense enumerable own data");a("[");for(let $=0;$<p.length;$+=1)$&&a(","),h(Object.getOwnPropertyDescriptor(p,String($)).value,w+1);a("]");return}let T=Object.getPrototypeOf(p);if(T!==Object.prototype&&T!==null)throw H("non-plain object");let v=[];for(let b in p){if(i+=1,i>ne.fields)throw H("enumeration limit exceeded");if(!Object.hasOwn(p,b))continue;if(o+=1,o>ne.fields)throw H("field limit exceeded");let I=Object.getOwnPropertyDescriptor(p,b);if(!I||!Object.hasOwn(I,"value")||I.enumerable!==!0)throw H("object fields must be enumerable own data");v.push([b,I.value])}a("{");for(let b=0;b<v.length;b+=1)b&&a(","),a(c(v[b][0])),a(":"),h(v[b][1],w+1);a("}")}finally{s.delete(p)}};return h(e,0),t.join("")}function jr(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(re.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 n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);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[r]=String(s)}return t}function Hr(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Vr(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let n=new URL(String(e),String(t));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${n.protocol}`);return n.toString()}function zr(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Me(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Vt.get(e);return t||(t=zt,zt+=1,Vt.set(e,t)),`reference:${t}`}function Kt(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?Kr.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 Wt(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}if(Array.isArray(n))return n.length>0&&n.every(Kt);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Kt(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Wr.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Gr(e,t,n,r={},o=null){let i=Cr("sha256"),s=(c,h)=>{let p=String(h);i.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),i.update("=").update(String(Buffer.byteLength(p,"utf8"))).update(":").update(p).update(`
2
- `)};s("method",e),s("url",t),Object.keys(n||{}).map((c,h)=>({name:c.toLowerCase(),order:h,value:String(n[c])})).sort((c,h)=>c.name.localeCompare(h.name)||c.order-h.order).forEach((c,h)=>{s(`header-name-${h}`,c.name),s(`header-value-${h}`,c.value)}),s("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${c}`,r[c]??"-");return i.digest("hex")}function Yr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,qt):Math.min(250*2**e,qt)+Math.floor(Math.random()*100)}function oe(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function at(e,t,n){return oe(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ce(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Zr(e){return e?e.byteLength??e.length??0:0}async function Xr(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ce(e),!r))throw at(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let w=await e.text(),T=Buffer.byteLength(w,"utf8");if(T>t){if(!r)throw at(n,`body ${T} bytes`,t);return Buffer.from(w,"utf8").subarray(0,t).toString("utf8")}return w}let a=[],c=0,h=!1;try{for(;;){let{value:w,done:T}=await s.read();if(T)break;if(w&&(a.push(Buffer.from(w)),c+=Zr(w),c>t)){h=!0;break}}}finally{if(h)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(h&&(typeof o=="function"&&o(),!r))throw at(n,`streamed ${c} bytes`,t);let p=Buffer.concat(a);return(h?p.subarray(0,t):p).toString("utf8")}function Qr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function eo(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:h=null,sameOriginRedirectsOnly:p=!1,importUndici:w,validateResponse:T,signal:v,redirectPolicy:b="follow",maxRedirects:I=De}){let O=null,$=t,B=s?{lookupFn:s}:{};if(c&&!a&&!ot($))throw oe(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let y=new AbortController,d=setTimeout(()=>y.abort(),i),u=v?Ht?Ht([v,y.signal]):v:y.signal,m=async(f,{status:S=null}={})=>{let A=await Ae(f,B);if(!A.ok)throw oe(S==null?`HTTP refused ${f}: ${A.error}`:`HTTP redirect to ${f} ${A.error}`,S==null?{}:{status:S});let g=new URL(f).hostname;if(a){if(O&&(await O.close(),O=null),!O)try{O=await nt({requireUndici:!0,...w?{importUndici:w}:{}})}catch(l){throw oe(S==null?`HTTP refused ${f}: ${l?.message||l}`:`HTTP redirect to ${f} refused: ${l?.message||l}`,S==null?{}:{status:S})}O.pin(g,A.addresses),$=O.fetch}else Dt($,g,A.addresses);return A};try{let f=String(e),S=Object.assign(Object.create(null),r||{});c&&await m(f);for(let A=0;A<=I;A+=1){let g=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:u,redirect:"manual",dispatcher:void 0}),l=await $(f,g);if((b==="error"||I===0)&&l.status>=300&&l.status<400)throw ce(l),oe(`HTTP ${l.status} ${n} redirect refused`,{status:l.status,redirectRefused:!0});if(Dr.has(l.status)){let x=p===!0&&n==="POST"&&[307,308].includes(l.status)&&Wt(n,o);if(n!=="GET"&&n!=="HEAD"&&!x){ce(l);let F=new Error(`HTTP ${l.status} ${n} ${f} redirected non-idempotent request`);throw F.status=l.status,F}if(A===I)throw ce(l),oe(`HTTP ${l.status} ${n} redirect budget exhausted`,{status:l.status,redirectRefused:!0});let _=l.headers?.get?.("location"),R;try{R=Vr(_,f)}catch(F){throw ce(l),F}let U=!zr(R,f);if(ce(l),U&&n==="POST"){let F=new Error(`HTTP ${l.status} ${n} cross-origin redirect refused`);throw F.status=l.status,F}if(U&&p){let F=new Error(`HTTP ${l.status} ${n} cross-origin redirect refused`);throw F.status=l.status,F.retryable=!1,F}if(U&&(S=Hr(S)),c)await m(R,{status:l.status});else if(U){let F=await Ae(R,B);if(!F.ok){let N=new Error(`HTTP redirect from ${f} ${F.error}`);throw N.status=l.status,N.retryable=!1,N}a&&F.addresses?.length&&(O||(O=await nt(w?{importUndici:w}:{})),O&&(O.pin(new URL(R).hostname,F.addresses),$=O.fetch))}f=R;continue}if(typeof T=="function")try{await T(l,{url:f})}catch(x){throw ce(l),oe(x?.message||String(x))}let E=await Xr(l,h,{url:f,onOversize:()=>y.abort()}),k=Qr(E);if(!l.ok){let x=new Error(`HTTP ${l.status} ${n} ${f}`);throw x.status=l.status,x.retryAfter=l.headers?.get?.("retry-after")??null,x.body=k??E.slice(0,300),x}return k??E}throw new Error(`HTTP redirect loop for ${e}`)}catch(f){if(y.signal.aborted&&!xe(v)){let S=f&&(typeof f=="object"||typeof f=="function")&&!re.isProxy(f)?f:null,A=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(A&&Object.hasOwn(A,"value")&&A.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 l=new Error("HTTP request timed out");throw Object.defineProperties(l,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),l}}throw f}finally{clearTimeout(d),O&&await O.close()}}async function V(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&re.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let N of Object.getOwnPropertyNames(t)){let L=Object.getOwnPropertyDescriptor(t,N);if(!(N==="toJSON"&&L&&Object.hasOwn(L,"value")&&L.value===void 0)){if(!n.has(N))throw new TypeError("HTTP options contain unknown fields");if(!L||!L.enumerable||!Object.hasOwn(L,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=N=>{if(t==null||!Object.hasOwn(t,N))return;let L=Object.getOwnPropertyDescriptor(t,N);if(!L||!Object.hasOwn(L,"value"))throw new TypeError("HTTP options must contain own data properties");return L.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("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=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let c=r("maxRedirects");if(c!==void 0&&(!Number.isInteger(c)||c<0||c>De))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${De}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let h=a??"follow",p=h==="error"?0:c??De;for(let N of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let L=r(N);if(L!==void 0&&typeof L!="boolean")throw new TypeError(`HTTP ${N} must be boolean`)}let w=r("maxResponseBytes");if(w!==void 0&&(!Number.isInteger(w)||w<1||w>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let T=r("signal");if(T!==void 0){if(re.isProxy(T)||!(T instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{xe(T)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let N of["importUndici","lookupFn","validateResponse"]){let L=r(N);if(L!==void 0&&typeof L!="function")throw new TypeError(`HTTP ${N} must be a function`)}let v=r("fetchImpl"),b=v||globalThis.fetch;if(typeof b!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let I=i??12e3,O=(o||"GET").toUpperCase(),$=r("headers"),B=jr($),y=Object.assign(Object.create(null),B);Object.keys(y).some(N=>N.toLowerCase()==="accept")||(y.Accept="application/json");let d=r("body");d!=null&&typeof d!="string"&&(Object.keys(y).find(L=>L.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),d=qr(d));let u=s??Rr,m=r("lookupFn"),f=!v,S=r("untrustedUrl")===!0,A=r("sameOriginRedirectsOnly")===!0,g=r("importUndici"),l=r("validateResponse"),E=T,k=w??null,x=async()=>{let N;for(let L=0;L<=u;L++){E&&Fr.call(E);let Z=Fe("http");try{let q=await eo(e,{fetchImpl:b,method:O,headers:y,body:d,timeoutMs:I,lookupFn:m,realFetch:f,untrustedUrl:S,maxResponseBytes:k,sameOriginRedirectsOnly:A,importUndici:g,validateResponse:l,signal:E,redirectPolicy:h,maxRedirects:p});return Z?.("succeeded"),q}catch(q){N=q;let de=Ge=>{if(!q||typeof q!="object"&&typeof q!="function"||re.isProxy(q))return;let be=Object.getOwnPropertyDescriptor(q,Ge);return be&&Object.hasOwn(be,"value")?be.value:void 0},Ie=de("status");Z?.("failed",Ie);let Un=de("oracleTimeout")===!0||de("name")==="AbortError"||de("name")==="TimeoutError"||xe(E),Mn=new Set([408,425,429]),Dn=de("retryable")===!1?!1:Ie!=null?Mn.has(Ie)||Pr.has(Ie)&&Bt.has(O):!Un&&Bt.has(O);if(L===u||!Dn)throw q;let gt=Yr(L,de("retryAfter")),Bn=Fe("retry"),Et=!1;try{E?await new Promise((Ge,be)=>{let St,we=()=>{clearTimeout(St),jt.call(E,"abort",we),be(Mr(E)||new DOMException("Aborted","AbortError"))};if(xe(E)){we();return}St=setTimeout(()=>{jt.call(E,"abort",we),Ge()},gt),Ur.call(E,"abort",we,{once:!0}),xe(E)&&we()}):await Jr(gt),Et=!0}finally{Bn?.(Et?"succeeded":"failed")}}}throw N};if(!(r("dedupe")!==!1&&!E&&Wt(O,d)))return x();let R=Gr(O,e,y,{untrustedUrl:S,maxResponseBytes:k,sameOriginRedirectsOnly:A,redirectPolicy:h,maxRedirects:p,timeoutMs:I,retries:u,fetchImpl:Me(b),realFetch:f,lookupFn:Me(m),importUndici:Me(g),validateResponse:Me(l)},d),U=st.get(R);if(U){let N=Fe("shared");try{let L=await U;return N?.("succeeded"),L}catch(L){throw N?.("failed"),L}}let F=x().finally(()=>st.delete(R));return st.set(R,F),F}async function Be(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function ve(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var Pr,Bt,Rr,qt,$r,Lr,Fr,Ur,jt,Ht,xe,Mr,Dr,De,as,ne,st,Vt,zt,Kr,Wr,Jr,z=pe(()=>{Mt();it();Pr=new Set([408,425,429,500,502,503,504]),Bt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Rr=2,qt=4e3,$r=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Lr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Fr=AbortSignal.prototype.throwIfAborted,Ur=EventTarget.prototype.addEventListener,jt=EventTarget.prototype.removeEventListener,Ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,xe=e=>e?$r.call(e):!1,Mr=e=>e?Lr.call(e):void 0,Dr=new Set([301,302,303,307,308]),De=3,as=64*1024,ne=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});st=new Map,Vt=new WeakMap,zt=1;Kr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Wr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Jr=e=>new Promise(t=>setTimeout(t,e))});var lt,Xt=pe(()=>{lt={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}}});var gs,Qt=pe(()=>{Xt();gs=new Map(Object.values(lt).map(e=>[e.chainId,e]))});import{Interface as so,getAddress as Is}from"ethers";var _s,ke=pe(()=>{z();Qt();_s=new so(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});import M from"node:fs";import _e from"node:path";import{createHash as qn,randomUUID as At}from"node:crypto";var Ce=1,W=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Y(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(Y).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Y(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function xt(e){return qn("sha256").update(Y(e)).digest("hex")}function Ne(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Oe(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function vt(e){M.mkdirSync(e,{recursive:!0,mode:448});try{M.chmodSync(e,448)}catch{}}function Ye(e){try{let t=M.statSync(e);return{...JSON.parse(M.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function te({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:s=3e4,lockWaitMs:a=2e3,lockIdFactory:c=()=>At()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(s)||s<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(a)||a<0||a>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let h=`${e}.lock`;function p(){let y=n();return r(y),{schemaVersion:Ce,kind:t,generation:0,data:y}}function w(y){let d;try{d=JSON.parse(y)}catch(f){throw new W(`corrupt ${t} snapshot: invalid JSON (${f.message})`,"STORE_CORRUPT")}if(!d||typeof d!="object"||Array.isArray(d))throw new W(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(d.schemaVersion!==Ce)throw new W(`unsupported ${t} schemaVersion ${String(d.schemaVersion)}`,"STORE_SCHEMA");if(d.kind!==t||!Number.isSafeInteger(d.generation)||d.generation<0)throw new W(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:u,...m}=d;if(typeof u!="string"||!/^[a-f0-9]{64}$/.test(u)||xt(m)!==u)throw new W(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(d.data)}catch(f){throw new W(`corrupt ${t} snapshot: ${f.message}`,"STORE_CORRUPT")}return m}function T(){if(!M.existsSync(e))return p();let y=M.statSync(e);if(!y.isFile()||y.size>i)throw new W(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{M.chmodSync(e,384)}catch{}return w(M.readFileSync(e,"utf8"))}function v(){vt(_e.dirname(e));let y=Ne(o),d=String(c()),u=`${JSON.stringify({schemaVersion:1,lockId:d,pid:process.pid,acquiredAt:y})}
2
+ `)};s("method",e),s("url",t),Object.keys(n||{}).map((c,h)=>({name:c.toLowerCase(),order:h,value:String(n[c])})).sort((c,h)=>c.name.localeCompare(h.name)||c.order-h.order).forEach((c,h)=>{s(`header-name-${h}`,c.name),s(`header-value-${h}`,c.value)}),s("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${c}`,r[c]??"-");return i.digest("hex")}function Yr(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,qt):Math.min(250*2**e,qt)+Math.floor(Math.random()*100)}function oe(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function at(e,t,n){return oe(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ce(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Zr(e){return e?e.byteLength??e.length??0:0}async function Xr(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ce(e),!r))throw at(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let w=await e.text(),T=Buffer.byteLength(w,"utf8");if(T>t){if(!r)throw at(n,`body ${T} bytes`,t);return Buffer.from(w,"utf8").subarray(0,t).toString("utf8")}return w}let a=[],c=0,h=!1;try{for(;;){let{value:w,done:T}=await s.read();if(T)break;if(w&&(a.push(Buffer.from(w)),c+=Zr(w),c>t)){h=!0;break}}}finally{if(h)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(h&&(typeof o=="function"&&o(),!r))throw at(n,`streamed ${c} bytes`,t);let p=Buffer.concat(a);return(h?p.subarray(0,t):p).toString("utf8")}function Qr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function eo(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:h=null,sameOriginRedirectsOnly:p=!1,importUndici:w,validateResponse:T,signal:v,redirectPolicy:b="follow",maxRedirects:I=De}){let O=null,$=t,B=s?{lookupFn:s}:{};if(c&&!a&&!ot($))throw oe(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let y=new AbortController,d=setTimeout(()=>y.abort(),i),u=v?Ht?Ht([v,y.signal]):v:y.signal,m=async(f,{status:S=null}={})=>{let A=await Ae(f,B);if(!A.ok)throw oe(S==null?`HTTP refused ${f}: ${A.error}`:`HTTP redirect to ${f} ${A.error}`,S==null?{}:{status:S});let g=new URL(f).hostname;if(a){if(O&&(await O.close(),O=null),!O)try{O=await nt({requireUndici:!0,...w?{importUndici:w}:{}})}catch(l){throw oe(S==null?`HTTP refused ${f}: ${l?.message||l}`:`HTTP redirect to ${f} refused: ${l?.message||l}`,S==null?{}:{status:S})}O.pin(g,A.addresses),$=O.fetch}else Dt($,g,A.addresses);return A};try{let f=String(e),S=Object.assign(Object.create(null),r||{});c&&await m(f);for(let A=0;A<=I;A+=1){let g=Object.assign(Object.create(null),{method:n,headers:S,body:o,signal:u,redirect:"manual",dispatcher:void 0}),l=await $(f,g);if((b==="error"||I===0)&&l.status>=300&&l.status<400)throw ce(l),oe(`HTTP ${l.status} ${n} redirect refused`,{status:l.status,redirectRefused:!0});if(Dr.has(l.status)){let x=p===!0&&n==="POST"&&[307,308].includes(l.status)&&Wt(n,o);if(n!=="GET"&&n!=="HEAD"&&!x){ce(l);let F=new Error(`HTTP ${l.status} ${n} ${f} redirected non-idempotent request`);throw F.status=l.status,F}if(A===I)throw ce(l),oe(`HTTP ${l.status} ${n} redirect budget exhausted`,{status:l.status,redirectRefused:!0});let _=l.headers?.get?.("location"),R;try{R=Vr(_,f)}catch(F){throw ce(l),F}let U=!zr(R,f);if(ce(l),U&&n==="POST"){let F=new Error(`HTTP ${l.status} ${n} cross-origin redirect refused`);throw F.status=l.status,F}if(U&&p){let F=new Error(`HTTP ${l.status} ${n} cross-origin redirect refused`);throw F.status=l.status,F.retryable=!1,F}if(U&&(S=Hr(S)),c)await m(R,{status:l.status});else if(U){let F=await Ae(R,B);if(!F.ok){let N=new Error(`HTTP redirect from ${f} ${F.error}`);throw N.status=l.status,N.retryable=!1,N}a&&F.addresses?.length&&(O||(O=await nt(w?{importUndici:w}:{})),O&&(O.pin(new URL(R).hostname,F.addresses),$=O.fetch))}f=R;continue}if(typeof T=="function")try{await T(l,{url:f})}catch(x){throw ce(l),oe(x?.message||String(x))}let E=await Xr(l,h,{url:f,onOversize:()=>y.abort()}),k=Qr(E);if(!l.ok){let x=new Error(`HTTP ${l.status} ${n} ${f}`);throw x.status=l.status,x.retryAfter=l.headers?.get?.("retry-after")??null,x.body=k??E.slice(0,300),x}return k??E}throw new Error(`HTTP redirect loop for ${e}`)}catch(f){if(y.signal.aborted&&!xe(v)){let S=f&&(typeof f=="object"||typeof f=="function")&&!re.isProxy(f)?f:null,A=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(A&&Object.hasOwn(A,"value")&&A.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 l=new Error("HTTP request timed out");throw Object.defineProperties(l,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),l}}throw f}finally{clearTimeout(d),O&&await O.close()}}async function V(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&re.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let n=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let N of Object.getOwnPropertyNames(t)){let L=Object.getOwnPropertyDescriptor(t,N);if(!(N==="toJSON"&&L&&Object.hasOwn(L,"value")&&L.value===void 0)){if(!n.has(N))throw new TypeError("HTTP options contain unknown fields");if(!L||!L.enumerable||!Object.hasOwn(L,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=N=>{if(t==null||!Object.hasOwn(t,N))return;let L=Object.getOwnPropertyDescriptor(t,N);if(!L||!Object.hasOwn(L,"value"))throw new TypeError("HTTP options must contain own data properties");return L.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("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=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let c=r("maxRedirects");if(c!==void 0&&(!Number.isInteger(c)||c<0||c>De))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${De}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let h=a??"follow",p=h==="error"?0:c??De;for(let N of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let L=r(N);if(L!==void 0&&typeof L!="boolean")throw new TypeError(`HTTP ${N} must be boolean`)}let w=r("maxResponseBytes");if(w!==void 0&&(!Number.isInteger(w)||w<1||w>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let T=r("signal");if(T!==void 0){if(re.isProxy(T)||!(T instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{xe(T)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let N of["importUndici","lookupFn","validateResponse"]){let L=r(N);if(L!==void 0&&typeof L!="function")throw new TypeError(`HTTP ${N} must be a function`)}let v=r("fetchImpl"),b=v||globalThis.fetch;if(typeof b!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let I=i??12e3,O=(o||"GET").toUpperCase(),$=r("headers"),B=jr($),y=Object.assign(Object.create(null),B);Object.keys(y).some(N=>N.toLowerCase()==="accept")||(y.Accept="application/json");let d=r("body");d!=null&&typeof d!="string"&&(Object.keys(y).find(L=>L.toLowerCase()==="content-type")||(y["Content-Type"]="application/json"),d=qr(d));let u=s??Rr,m=r("lookupFn"),f=!v,S=r("untrustedUrl")===!0,A=r("sameOriginRedirectsOnly")===!0,g=r("importUndici"),l=r("validateResponse"),E=T,k=w??null,x=async()=>{let N;for(let L=0;L<=u;L++){E&&Fr.call(E);let Z=Fe("http");try{let q=await eo(e,{fetchImpl:b,method:O,headers:y,body:d,timeoutMs:I,lookupFn:m,realFetch:f,untrustedUrl:S,maxResponseBytes:k,sameOriginRedirectsOnly:A,importUndici:g,validateResponse:l,signal:E,redirectPolicy:h,maxRedirects:p});return Z?.("succeeded"),q}catch(q){N=q;let de=Ge=>{if(!q||typeof q!="object"&&typeof q!="function"||re.isProxy(q))return;let be=Object.getOwnPropertyDescriptor(q,Ge);return be&&Object.hasOwn(be,"value")?be.value:void 0},Ie=de("status");Z?.("failed",Ie);let Un=de("oracleTimeout")===!0||de("name")==="AbortError"||de("name")==="TimeoutError"||xe(E),Mn=new Set([408,425,429]),Dn=de("retryable")===!1?!1:Ie!=null?Mn.has(Ie)||Pr.has(Ie)&&Bt.has(O):!Un&&Bt.has(O);if(L===u||!Dn)throw q;let gt=Yr(L,de("retryAfter")),Bn=Fe("retry"),Et=!1;try{E?await new Promise((Ge,be)=>{let St,we=()=>{clearTimeout(St),jt.call(E,"abort",we),be(Mr(E)||new DOMException("Aborted","AbortError"))};if(xe(E)){we();return}St=setTimeout(()=>{jt.call(E,"abort",we),Ge()},gt),Ur.call(E,"abort",we,{once:!0}),xe(E)&&we()}):await Jr(gt),Et=!0}finally{Bn?.(Et?"succeeded":"failed")}}}throw N};if(!(r("dedupe")!==!1&&!E&&Wt(O,d)))return x();let R=Gr(O,e,y,{untrustedUrl:S,maxResponseBytes:k,sameOriginRedirectsOnly:A,redirectPolicy:h,maxRedirects:p,timeoutMs:I,retries:u,fetchImpl:Me(b),realFetch:f,lookupFn:Me(m),importUndici:Me(g),validateResponse:Me(l)},d),U=st.get(R);if(U){let N=Fe("shared");try{let L=await U;return N?.("succeeded"),L}catch(L){throw N?.("failed"),L}}let F=x().finally(()=>st.delete(R));return st.set(R,F),F}async function Be(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function ve(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var Pr,Bt,Rr,qt,$r,Lr,Fr,Ur,jt,Ht,xe,Mr,Dr,De,as,ne,st,Vt,zt,Kr,Wr,Jr,z=pe(()=>{Mt();it();Pr=new Set([408,425,429,500,502,503,504]),Bt=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Rr=2,qt=4e3,$r=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Lr=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Fr=AbortSignal.prototype.throwIfAborted,Ur=EventTarget.prototype.addEventListener,jt=EventTarget.prototype.removeEventListener,Ht=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,xe=e=>e?$r.call(e):!1,Mr=e=>e?Lr.call(e):void 0,Dr=new Set([301,302,303,307,308]),De=3,as=64*1024,ne=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});st=new Map,Vt=new WeakMap,zt=1;Kr=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Wr=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Jr=e=>new Promise(t=>setTimeout(t,e))});var lt,Xt=pe(()=>{lt={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},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}}});var gs,Qt=pe(()=>{Xt();gs=new Map(Object.values(lt).map(e=>[e.chainId,e]))});import{Interface as so,getAddress as Is}from"ethers";var _s,ke=pe(()=>{z();Qt();_s=new so(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"])});import M from"node:fs";import _e from"node:path";import{createHash as qn,randomUUID as At}from"node:crypto";var Ce=1,W=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Y(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(Y).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Y(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function xt(e){return qn("sha256").update(Y(e)).digest("hex")}function Ne(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Oe(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function vt(e){M.mkdirSync(e,{recursive:!0,mode:448});try{M.chmodSync(e,448)}catch{}}function Ye(e){try{let t=M.statSync(e);return{...JSON.parse(M.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function te({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:s=3e4,lockWaitMs:a=2e3,lockIdFactory:c=()=>At()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(s)||s<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(a)||a<0||a>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let h=`${e}.lock`;function p(){let y=n();return r(y),{schemaVersion:Ce,kind:t,generation:0,data:y}}function w(y){let d;try{d=JSON.parse(y)}catch(f){throw new W(`corrupt ${t} snapshot: invalid JSON (${f.message})`,"STORE_CORRUPT")}if(!d||typeof d!="object"||Array.isArray(d))throw new W(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(d.schemaVersion!==Ce)throw new W(`unsupported ${t} schemaVersion ${String(d.schemaVersion)}`,"STORE_SCHEMA");if(d.kind!==t||!Number.isSafeInteger(d.generation)||d.generation<0)throw new W(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:u,...m}=d;if(typeof u!="string"||!/^[a-f0-9]{64}$/.test(u)||xt(m)!==u)throw new W(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(d.data)}catch(f){throw new W(`corrupt ${t} snapshot: ${f.message}`,"STORE_CORRUPT")}return m}function T(){if(!M.existsSync(e))return p();let y=M.statSync(e);if(!y.isFile()||y.size>i)throw new W(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{M.chmodSync(e,384)}catch{}return w(M.readFileSync(e,"utf8"))}function v(){vt(_e.dirname(e));let y=Ne(o),d=String(c()),u=`${JSON.stringify({schemaVersion:1,lockId:d,pid:process.pid,acquiredAt:y})}
3
3
  `,m=()=>{let g;try{return g=M.openSync(h,"wx",384),M.writeFileSync(g,u,"utf8"),M.fsyncSync(g),M.closeSync(g),{lockId:d}}catch(l){let E=g!==void 0;if(E)try{M.closeSync(g)}catch{}if(E)try{M.unlinkSync(h)}catch{}if(l?.code!=="EEXIST")throw l;return null}},S=Ne(o)+a,A=new Int32Array(new SharedArrayBuffer(4));for(;;){let g=m();if(g)return g;let l=Ne(o),E=Ye(h),k=!1;if(E){let _=l-Number(E.acquiredAt??E.mtimeMs);k=Number.isFinite(_)&&_>=s}else try{k=l-M.statSync(h).mtimeMs>=s}catch{k=!1}if(k){let _=Ye(h);if(E?_?.lockId===E.lockId:_===null){try{M.unlinkSync(h)}catch(U){if(U?.code!=="ENOENT")throw U}continue}}let x=S-l;if(x<=0)throw new W(`${t} store is busy`,"STORE_BUSY");Atomics.wait(A,0,0,Math.min(10,x))}}function b(y){if(Ye(h)?.lockId===y.lockId)try{M.unlinkSync(h)}catch(u){if(u?.code!=="ENOENT")throw u}}function I(y){r(y.data);let d={...y,integrity:xt(y)},u=`${Y(d)}
4
4
  `;if(Buffer.byteLength(u)>i)throw new W(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let m=_e.dirname(e);vt(m);let f=_e.join(m,`.${_e.basename(e)}.${process.pid}.${At()}.tmp`),S;try{S=M.openSync(f,"wx",384),M.writeFileSync(S,u,"utf8"),M.fsyncSync(S),M.closeSync(S),S=void 0,M.renameSync(f,e);try{M.chmodSync(e,384)}catch{}try{let A=M.openSync(m,"r");try{M.fsyncSync(A)}finally{M.closeSync(A)}}catch{}}finally{if(S!==void 0)try{M.closeSync(S)}catch{}try{M.unlinkSync(f)}catch(A){if(A?.code!=="ENOENT")throw A}}}function O(){return Oe(T().data)}function $(){let y=T();return{schemaVersion:y.schemaVersion,kind:y.kind,generation:y.generation,data:Oe(y.data)}}function B(y){if(typeof y!="function")throw new TypeError("mutator must be a function");let d=v();try{let u=T(),m=Oe(u.data),f=y(m,{generation:u.generation,now:Ne(o)});return r(m),I({schemaVersion:Ce,kind:t,generation:u.generation+1,data:m}),Oe(f)}finally{b(d)}}return Object.freeze({filePath:e,read:O,inspect:$,mutate:B})}import{createHash as ir}from"node:crypto";var Je=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),jn=new Set(Je);function Hn(e){if(!jn.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function Vn(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function zn(){return{subscribedCategories:[]}}function Kn(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function kt(e,t=zn(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return Hn(e.category),Vn(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:Kn(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}var Wn=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),Gn=["1","true","yes","on"].includes(Wn),Yn=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],Jn=/\b0x[a-fA-F0-9]{64}\b/g,Zn=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,Xn=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,Qn=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,er=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,tr=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,nr=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),Oi=new Set([...nr].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()));function rr(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function or(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function Tt(e,t={}){if(e==null)return e;let n=typeof e=="string"?e:String(e);if(!n||!(t.force||Gn))return n;let r=t.fileRead?or:rr;n=n.replace(Zn,"[REDACTED_PRIVATE_KEY]"),n=n.replace(Jn,"[REDACTED_EVM_KEY]"),n=n.replace(Xn,o=>r(o));for(let o of Yn)o.lastIndex=0,n=n.replace(o,i=>r(i));return n=n.replace(Qn,(o,i,s,a)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(a)?`${i}=${s||""}${a}${s||""}`:`${i}=${s||""}${r(a)}${s||""}`),n=n.replace(er,(o,i,s,a)=>o.replace(a,r(a))),n=n.replace(tr,(o,i,s,a)=>`${i}${r(s)}${a}`),n}var G=1,It=Object.freeze(["alert","prepare"]),_t=Object.freeze(["LIVE","STALE","UNAVAILABLE","UNKNOWN"]),sr=/^[A-Za-z0-9](?:[A-Za-z0-9._:-]{0,126}[A-Za-z0-9])?$/,ar=new Set(["secret","webhooksecret","password","passphrase","privatekey","mnemonic","seed","authorization","apikey","accesstoken","bearertoken","signingkey"]);function D(e,t){for(let[n,r]of[["tenantId",e],["workflowId",t]])if(typeof r!="string"||!sr.test(r))throw new TypeError(`${n} must be a bounded, non-wildcard scope id`);return{tenantId:e,workflowId:t}}function P(e,t,{min:n=1,max:r=256}={}){if(typeof t!="string"||t.length<n||t.length>r||/[\u0000-\u001f\u007f]/.test(t))throw new TypeError(`${e} must be a string between ${n} and ${r} characters without control bytes`);return t}function J(e){if(!Je.includes(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function Pe(e){if(!It.includes(e))throw new TypeError(`notification work kind must be alert or prepare, got ${String(e)}`);return e}function fe(e,t="value",n=new Set){if(e!=null){if(typeof e=="function"||typeof e=="symbol"||typeof e=="bigint")throw new TypeError(`${t} must be JSON-safe`);if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError(`${t} must contain finite numbers`);if(typeof e=="object"){if(n.has(e))throw new TypeError(`${t} must not contain cycles`);if(!Array.isArray(e)&&Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw new TypeError(`${t} must contain plain JSON objects only`);if(n.add(e),Array.isArray(e))e.forEach((r,o)=>fe(r,`${t}[${o}]`,n));else for(let[r,o]of Object.entries(e)){let i=r.toLowerCase().replace(/[^a-z0-9]/g,"");if(ar.has(i))throw new TypeError(`${t}.${r} may contain secret material and is rejected`);fe(o,`${t}.${r}`,n)}n.delete(e)}}}function Ze(e,t,n){if(e==null)return e;if(typeof e=="string"){let o=Tt(e,{force:!0});if(o!==e)throw new TypeError(`${t} may contain secret material and is rejected`);return o}if(typeof e!="object")return e;if(n.has(e))throw new TypeError(`${t} must not contain cycles`);if(n.add(e),Array.isArray(e)){let o=e.map((i,s)=>Ze(i,`${t}[${s}]`,n));return n.delete(e),o}let r={};for(let[o,i]of Object.entries(e))r[o]=Ze(i,`${t}.${o}`,n);return n.delete(e),r}function X(e,{name:t="payload",maxBytes:n=64*1024}={}){fe(e,t);let r=Ze(e,t,new Set),o;try{o=Y(r)}catch(i){throw new TypeError(`${t} must be JSON-safe: ${i.message}`)}if(Buffer.byteLength(o)>n)throw new TypeError(`${t} exceeds ${n} bytes`);return JSON.parse(o)}function se(e){let t=typeof e=="string"?e.toUpperCase():e?.status?.toUpperCase?.();return _t.includes(t)?t:"UNKNOWN"}function ge(e){return ir("sha256").update(Y(e)).digest("hex")}function Ee({category:e,preferences:t,watch:n,watchId:r}={}){J(e);let o=kt({category:e,...r===void 0?{}:{watchId:r}},t,n);if(!o.deliver){let i=new Error(`notification category ${e} is not opted in`);throw i.name="NotificationOptInError",i.code="NOTIFICATION_NOT_OPTED_IN",i}return o}function C(e){if(!Number.isFinite(e))throw new TypeError("time must be finite");return new Date(Math.trunc(e)).toISOString()}function j(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function cr(e,{onError:t=()=>{}}={}){if(typeof e!="function")throw new TypeError("event append function is required");return Object.freeze({append(n){try{let r=e(Object.freeze({...n}));r&&typeof r.then=="function"&&r.catch(t)}catch(r){t(r)}}})}function K(e,t){if(e){if(typeof e.append!="function")throw new TypeError("eventSink must expose append(event)");e.append(t)}}import Nt from"node:path";import{homedir as lr}from"node:os";import{randomUUID as Ot}from"node:crypto";var Xe=1,Pt=new Set(["pending","leased","completed"]),ur=5*366*24*60;function dr(e=process.env){let t=e.ORACLE_CONFIG_DIR||Nt.join(lr(),".config","oracle");return Nt.join(t,"notification-schedules.v1.json")}function Re(e,t,n,r){if(!/^\d+$/.test(e))throw new TypeError(`invalid ${r} cron field`);let o=Number(e);if(!Number.isSafeInteger(o)||o<t||o>n)throw new TypeError(`${r} cron field is out of range`);return o}function Se(e,t,n,r,{weekday:o=!1}={}){let i=new Set,s=e==="*";if(!e||e.length>80)throw new TypeError(`invalid ${r} cron field`);for(let a of e.split(",")){if(!a)throw new TypeError(`invalid ${r} cron field`);let[c,h,p]=a.split("/");if(p!==void 0)throw new TypeError(`invalid ${r} cron step`);let w=h===void 0?1:Re(h,1,n-t+1,`${r} step`),T,v;if(c==="*")T=t,v=n;else if(c.includes("-")){let b=c.split("-");if(b.length!==2)throw new TypeError(`invalid ${r} cron range`);if(T=Re(b[0],t,n,r),v=Re(b[1],t,n,r),v<T)throw new TypeError(`invalid descending ${r} cron range`)}else if(T=Re(c,t,n,r),v=T,h!==void 0)throw new TypeError(`cron step requires * or a range in ${r}`);for(let b=T;b<=v;b+=w)i.add(o&&b===7?0:b)}if(i.size===0)throw new TypeError(`empty ${r} cron field`);return{values:i,wildcard:s}}function Le(e){if(typeof e!="string"||e.length>160)throw new TypeError("schedule must be a bounded string");let t=e.trim().toLowerCase();if(!t)throw new TypeError("schedule is required");if(t==="hourly")return Object.freeze({type:"interval",intervalMs:36e5,source:t});if(t==="daily")return Object.freeze({type:"interval",intervalMs:864e5,source:t});let n=t.match(/^every\s+([1-9]\d{0,5})\s*([mhd])$/);if(n){let s=n[2]==="m"?6e4:n[2]==="h"?36e5:864e5,a=Number(n[1])*s;if(!Number.isSafeInteger(a)||a<6e4||a>366*864e5)throw new TypeError("schedule interval must be between one minute and 366 days");return Object.freeze({type:"interval",intervalMs:a,source:t})}let r=t.match(/^at\s+(.+)$/);if(r){let s=r[1];if(!/^\d{4}-\d{2}-\d{2}t\d{2}:\d{2}:\d{2}(?:\.\d{3})?z$/.test(s))throw new TypeError("one-time schedule must use an ISO-8601 UTC time");let a=Date.parse(s);if(!Number.isFinite(a))throw new TypeError("invalid one-time schedule time");return Object.freeze({type:"at",atMs:a,source:`at ${new Date(a).toISOString()}`})}let o=t.split(/\s+/);if(o.length!==5)throw new TypeError(`invalid schedule: ${e}`);let i={minute:Se(o[0],0,59,"minute"),hour:Se(o[1],0,23,"hour"),day:Se(o[2],1,31,"day-of-month"),month:Se(o[3],1,12,"month"),weekday:Se(o[4],0,7,"day-of-week",{weekday:!0})};return Object.freeze({type:"cron",fields:i,source:t})}function $e(e,t){let n=typeof e=="string"?Le(e):e,r=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(r))throw new TypeError("after must be a valid time");if(n.type==="interval")return Math.trunc(r)+n.intervalMs;if(n.type==="at")return n.atMs>r?n.atMs:null;if(n.type!=="cron")throw new TypeError("unknown parsed schedule type");let o=Math.floor(r/6e4)*6e4+6e4;for(let i=0;i<ur;i+=1,o+=6e4){let s=new Date(o),a=n.fields,c=a.day.values.has(s.getUTCDate()),h=a.weekday.values.has(s.getUTCDay()),p=a.day.wildcard&&a.weekday.wildcard?!0:a.day.wildcard?h:a.weekday.wildcard?c:c||h;if(a.minute.values.has(s.getUTCMinutes())&&a.hour.values.has(s.getUTCHours())&&a.month.values.has(s.getUTCMonth()+1)&&p)return o}throw new RangeError("cron schedule has no occurrence within five years")}function pr(e){if(!e||e.schemaVersion!==G)throw new TypeError("invalid schedule record version");if(D(e.tenantId,e.workflowId),P("schedule id",e.id,{max:128}),P("idempotencyKey",e.idempotencyKey,{max:160}),P("schedule name",e.name,{max:160}),Pe(e.kind),J(e.category),Le(e.schedule),e.startAt!==null&&!Number.isFinite(Date.parse(e.startAt)))throw new TypeError("invalid schedule startAt");if(typeof e.enabled!="boolean")throw new TypeError("schedule enabled must be boolean");if(e.nextRunAt!==null&&!Number.isFinite(Date.parse(e.nextRunAt)))throw new TypeError("invalid schedule nextRunAt");if(!Number.isFinite(Date.parse(e.createdAt))||!Number.isFinite(Date.parse(e.updatedAt)))throw new TypeError("invalid schedule timestamps");if(X(e.payload),!/^[a-f0-9]{64}$/.test(e.definitionFingerprint))throw new TypeError("invalid schedule fingerprint")}function fr(e){if(!e||e.schemaVersion!==G)throw new TypeError("invalid scheduled work version");if(D(e.tenantId,e.workflowId),P("work id",e.id,{max:128}),P("schedule id",e.scheduleId,{max:128}),P("work idempotencyKey",e.idempotencyKey,{max:512}),Pe(e.kind),J(e.category),!Pt.has(e.status))throw new TypeError("invalid scheduled work status");if(!Number.isSafeInteger(e.attempts)||e.attempts<0)throw new TypeError("invalid scheduled work attempts");if(e.executionAllowed!==!1||e.custody!=="none")throw new TypeError("scheduled work crossed the custody boundary");if(!Number.isFinite(Date.parse(e.scheduledFor))||!Number.isFinite(Date.parse(e.createdAt)))throw new TypeError("invalid work time");if(e.lease!==null&&(P("lease owner",e.lease.owner,{max:128}),P("lease token",e.lease.token,{max:160}),!Number.isFinite(Date.parse(e.lease.until))))throw new TypeError("invalid work lease");X(e.payload)}function mr(e,t){return n=>{if(!n||n.schemaVersion!==Xe||!Array.isArray(n.schedules)||!Array.isArray(n.work))throw new TypeError("invalid schedule store schema");if(n.schedules.length>e||n.work.length>t)throw new TypeError("schedule store record bound exceeded");let r=new Set,o=new Set;for(let a of n.schedules){if(pr(a),r.has(a.id))throw new TypeError("duplicate schedule id");let c=`${a.tenantId}\0${a.workflowId}\0${a.idempotencyKey}`;if(o.has(c))throw new TypeError("duplicate scoped schedule idempotency key");r.add(a.id),o.add(c)}let i=new Set,s=new Set;for(let a of n.work){if(fr(a),i.has(a.id)||s.has(a.idempotencyKey))throw new TypeError("duplicate scheduled work identity");i.add(a.id),s.add(a.idempotencyKey)}}}function Q(e,t,n){return e.tenantId===t&&e.workflowId===n}function Ct(e,t,n){if(e.status!=="leased"||!e.lease||e.lease.token!==t)throw new Error("scheduled work lease token does not match");if(Date.parse(e.lease.until)<=n)throw new Error("scheduled work lease expired")}function hr({filePath:e=dr(),clock:t=()=>Date.now(),idFactory:n=()=>Ot(),leaseTokenFactory:r=()=>Ot(),eventSink:o,maxSchedules:i=1e3,maxWork:s=5e3,maxBytes:a=8*1024*1024}={}){if(!Number.isSafeInteger(i)||i<1||!Number.isSafeInteger(s)||s<1)throw new TypeError("schedule record bounds must be positive integers");let c=te({filePath:e,kind:"oracle-notification-schedules",clock:t,maxBytes:a,initialData:()=>({schemaVersion:Xe,schedules:[],work:[]}),validateData:mr(i,s)});function h(y={},d={}){let u=j(t),{tenantId:m,workflowId:f}=D(y.tenantId,y.workflowId),S=P("idempotencyKey",y.idempotencyKey,{max:160}),A=P("schedule name",y.name??S,{max:160}),g=Pe(y.kind??y.mode),l=J(y.category),E=Le(y.schedule),k=X(y.payload??{});g==="alert"&&Ee({category:l,preferences:d.preferences??y.preferences,watch:d.watch??y.watch,watchId:y.watchId});let x={tenantId:m,workflowId:f,idempotencyKey:S,name:A,kind:g,category:l,schedule:E.source,payload:k,startAt:y.startAt??null},_=ge(x),R=$e(E,u);if(y.startAt!==void 0){if(typeof y.startAt!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(y.startAt))throw new TypeError("startAt must be an ISO-8601 UTC time");if(R=Date.parse(y.startAt),!Number.isFinite(R)||R<=u)throw new TypeError("startAt must be in the future")}if(R===null||R<=u)throw new TypeError("schedule must have a future occurrence");let U=c.mutate(F=>{let N=F.schedules.find(q=>Q(q,m,f)&&q.idempotencyKey===S);if(N){if(N.definitionFingerprint!==_){let q=new Error("schedule idempotency key was reused with different content");throw q.code="IDEMPOTENCY_CONFLICT",q}return{...N,duplicate:!0}}if(F.schedules.length>=i)throw new Error("schedule capacity reached");let L=C(u),Z={schemaVersion:G,id:P("generated schedule id",String(n()),{max:128}),...x,definitionFingerprint:_,enabled:y.enabled!==!1,createdAt:L,updatedAt:L,lastMaterializedAt:null,nextRunAt:C(R)};return F.schedules.push(Z),Z});return U.duplicate||K(o,{type:"notification.schedule.created",at:C(u),tenantId:m,workflowId:f,scheduleId:U.id,kind:g,category:l}),U}function p({tenantId:y,workflowId:d}={}){return D(y,d),c.read().schedules.filter(u=>Q(u,y,d))}function w({tenantId:y,workflowId:d,id:u,enabled:m}={}){if(D(y,d),typeof m!="boolean")throw new TypeError("enabled must be boolean");let f=j(t),S=c.mutate(A=>{let g=A.schedules.find(l=>Q(l,y,d)&&l.id===u);if(!g)return null;if(g.enabled=m,g.updatedAt=C(f),m&&g.nextRunAt===null){let l=$e(g.schedule,f);if(l===null)throw new Error("a completed one-time schedule cannot be re-enabled");g.nextRunAt=C(l)}return g});return S&&K(o,{type:"notification.schedule.enabled",at:C(f),tenantId:y,workflowId:d,scheduleId:u,enabled:m}),S}function T({tenantId:y,workflowId:d,id:u}={}){D(y,d);let m=j(t),f=c.mutate(S=>{let A=S.schedules.findIndex(g=>Q(g,y,d)&&g.id===u);return A<0?!1:(S.schedules.splice(A,1),!0)});return f&&K(o,{type:"notification.schedule.removed",at:C(m),tenantId:y,workflowId:d,scheduleId:u}),f}function v({tenantId:y,workflowId:d,limit:u=100,until:m}={}){if(D(y,d),!Number.isSafeInteger(u)||u<1||u>1e3)throw new TypeError("limit must be between 1 and 1000");let f=m===void 0?j(t):typeof m=="string"?Date.parse(m):Number(m);if(!Number.isFinite(f))throw new TypeError("until must be a valid time");let S=c.mutate(A=>{let g=[],l=new Set(A.work.map(k=>k.idempotencyKey)),E=A.schedules.filter(k=>Q(k,y,d)&&k.enabled&&k.nextRunAt!==null&&Date.parse(k.nextRunAt)<=f).sort((k,x)=>k.nextRunAt.localeCompare(x.nextRunAt)||k.id.localeCompare(x.id));for(let k of E){for(;k.enabled&&k.nextRunAt!==null&&Date.parse(k.nextRunAt)<=f&&g.length<u;){let x=k.nextRunAt,_=`${y}:${d}:${k.id}:${x}`;if(!l.has(_)){if(A.work.length>=s)throw new Error("scheduled work capacity reached");let U={schemaVersion:G,id:P("generated work id",String(n()),{max:128}),tenantId:y,workflowId:d,scheduleId:k.id,idempotencyKey:_,kind:k.kind,category:k.category,payload:k.payload,evidence:se(k.payload?.evidence),scheduledFor:x,createdAt:C(f),status:"pending",attempts:0,lease:null,completedAt:null,custody:"none",executionAllowed:!1};A.work.push(U),g.push(U),l.add(_)}k.lastMaterializedAt=x;let R=$e(k.schedule,Date.parse(x));k.nextRunAt=R===null?null:C(R),R===null&&(k.enabled=!1),k.updatedAt=C(f)}if(g.length>=u)break}return g});for(let A of S)K(o,{type:"notification.schedule.work.created",at:C(f),tenantId:y,workflowId:d,scheduleId:A.scheduleId,workId:A.id,kind:A.kind,evidence:A.evidence});return S}function b({tenantId:y,workflowId:d,status:u}={}){if(D(y,d),u!==void 0&&!Pt.has(u))throw new TypeError("invalid work status");return c.read().work.filter(m=>Q(m,y,d)&&(u===void 0||m.status===u))}function I({tenantId:y,workflowId:d}={}){D(y,d);let u=j(t);return c.mutate(m=>{let f=0;for(let S of m.work)Q(S,y,d)&&S.status==="leased"&&Date.parse(S.lease.until)<=u&&(S.status="pending",S.lease=null,f+=1);return f})}function O({tenantId:y,workflowId:d,workerId:u,limit:m=1,leaseMs:f=3e4}={}){if(D(y,d),P("workerId",u,{max:128}),!Number.isSafeInteger(m)||m<1||m>100)throw new TypeError("claim limit must be between 1 and 100");if(!Number.isSafeInteger(f)||f<1e3||f>36e5)throw new TypeError("leaseMs must be between 1000 and 3600000");let S=j(t),A=c.mutate(g=>{let l=g.work.filter(E=>Q(E,y,d)&&(E.status==="pending"||E.status==="leased"&&Date.parse(E.lease.until)<=S)).sort((E,k)=>E.scheduledFor.localeCompare(k.scheduledFor)||E.id.localeCompare(k.id)).slice(0,m);for(let E of l)E.status="leased",E.attempts+=1,E.lease={owner:u,token:P("generated lease token",String(r()),{max:160}),until:C(S+f)};return l});for(let g of A)K(o,{type:"notification.schedule.work.claimed",at:C(S),tenantId:y,workflowId:d,workId:g.id,attempt:g.attempts});return A}function $({tenantId:y,workflowId:d,id:u,leaseToken:m}={}){D(y,d);let f=j(t),S=c.mutate(A=>{let g=A.work.find(l=>Q(l,y,d)&&l.id===u);return g?(Ct(g,m,f),g.status="completed",g.lease=null,g.completedAt=C(f),g):null});return S&&K(o,{type:"notification.schedule.work.completed",at:C(f),tenantId:y,workflowId:d,workId:u}),S}function B({tenantId:y,workflowId:d,id:u,leaseToken:m}={}){D(y,d);let f=j(t);return c.mutate(S=>{let A=S.work.find(g=>Q(g,y,d)&&g.id===u);return A?(Ct(A,m,f),A.status="pending",A.lease=null,A):null})}return Object.freeze({filePath:e,createSchedule:h,listSchedules:p,setEnabled:w,removeSchedule:T,materializeDue:v,listWork:b,recoverExpiredWork:I,claimWork:O,completeWork:$,releaseWork:B,inspect:c.inspect})}import Rt from"node:path";import{homedir as yr}from"node:os";import{randomUUID as $t}from"node:crypto";var Qe=1,Ft=Object.freeze(["pending","leased","delivered","dead_letter"]),Ut=new Set(Ft);function br(e=process.env){let t=e.ORACLE_CONFIG_DIR||Rt.join(yr(),".config","oracle");return Rt.join(t,"notification-outbox.v1.json")}function wr(e){if(!e||e.schemaVersion!==G)throw new TypeError("invalid outbox record version");if(D(e.tenantId,e.workflowId),P("message id",e.id,{max:128}),P("idempotencyKey",e.idempotencyKey,{max:200}),P("channel",e.channel,{max:32}),e.channel!=="webhook")throw new TypeError("P1 outbox supports webhook only");if(J(e.category),!Ut.has(e.status))throw new TypeError("invalid outbox state");if(!Number.isSafeInteger(e.attempts)||e.attempts<0)throw new TypeError("outbox attempts must be monotonic non-negative integers");if(!Number.isSafeInteger(e.maxAttempts)||e.maxAttempts<1||e.maxAttempts>100)throw new TypeError("invalid outbox maxAttempts");if(!Number.isFinite(Date.parse(e.createdAt))||!Number.isFinite(Date.parse(e.updatedAt))||!Number.isFinite(Date.parse(e.nextAttemptAt)))throw new TypeError("invalid outbox timestamp");if(e.destinationId!==null&&P("destinationId",e.destinationId,{max:160}),!/^[a-f0-9]{64}$/.test(e.contentFingerprint))throw new TypeError("invalid outbox fingerprint");if(e.lease!==null&&(P("lease owner",e.lease.owner,{max:128}),P("lease token",e.lease.token,{max:160}),!Number.isFinite(Date.parse(e.lease.until))))throw new TypeError("invalid outbox lease");if(e.lastError!==null&&P("lastError",e.lastError,{max:512}),e.replayOf!==null&&P("replayOf",e.replayOf,{max:128}),!Array.isArray(e.failures)||e.failures.length>100)throw new TypeError("invalid outbox failure records");for(let t of e.failures){if(!t||!Number.isSafeInteger(t.attempt)||t.attempt<1)throw new TypeError("invalid outbox failure attempt");if(!Number.isFinite(Date.parse(t.at)))throw new TypeError("invalid outbox failure time");if(P("failure code",t.code,{max:512}),typeof t.retryable!="boolean")throw new TypeError("failure retryable must be boolean");if(t.terminal!==!0&&t.terminal!==!1)throw new TypeError("failure terminal must be boolean")}if(e.executionAllowed!==!1||e.custody!=="none")throw new TypeError("outbox crossed the custody boundary");X(e.payload)}function gr(e){return t=>{if(!t||t.schemaVersion!==Qe||!Array.isArray(t.messages))throw new TypeError("invalid outbox store schema");if(t.messages.length>e)throw new TypeError("outbox record bound exceeded");let n=new Set,r=new Set;for(let o of t.messages){wr(o);let i=`${o.tenantId}\0${o.workflowId}\0${o.idempotencyKey}`;if(n.has(o.id)||r.has(i))throw new TypeError("duplicate outbox identity");n.add(o.id),r.add(i)}}}function ee(e,t,n){return e.tenantId===t&&e.workflowId===n}function Er(e){let t=e&&typeof e=="object"?e.code:null;if(typeof t=="string"&&/^[A-Z][A-Z0-9_.:-]{0,63}$/.test(t))return`delivery failed: ${t}`;let n=e&&typeof e=="object"?Number(e.status??e.statusCode):NaN;return Number.isInteger(n)&&n>=100&&n<=599?`delivery failed: HTTP_${n}`:"delivery failed"}function Lt(e,t,n){if(e.status!=="leased"||!e.lease||e.lease.token!==t)throw new Error("outbox lease token does not match");if(Date.parse(e.lease.until)<=n)throw new Error("outbox lease expired")}function Sr({filePath:e=br(),clock:t=()=>Date.now(),idFactory:n=()=>$t(),leaseTokenFactory:r=()=>$t(),eventSink:o,maxRecords:i=1e4,maxBytes:s=16*1024*1024,maxAttempts:a=5,baseBackoffMs:c=1e3,maxBackoffMs:h=36e5}={}){for(let[u,m,f,S]of[["maxRecords",i,1,1e5],["maxAttempts",a,1,100],["baseBackoffMs",c,1,864e5],["maxBackoffMs",h,1,7*864e5]])if(!Number.isSafeInteger(m)||m<f||m>S)throw new TypeError(`${u} is out of range`);if(c>h)throw new TypeError("baseBackoffMs cannot exceed maxBackoffMs");let p=te({filePath:e,kind:"oracle-notification-outbox",clock:t,maxBytes:s,initialData:()=>({schemaVersion:Qe,messages:[]}),validateData:gr(i)}),w=u=>Math.min(h,c*2**Math.min(30,Math.max(0,u-1)));function T(u,m){return Ee({category:u.category,preferences:m?.preferences??u.preferences,watch:m?.watch??u.watch,watchId:u.watchId})}function v(u){let{tenantId:m,workflowId:f}=D(u.tenantId,u.workflowId),S=J(u.category),A=P("idempotencyKey",u.idempotencyKey,{max:200}),g=u.channel??"webhook";if(g!=="webhook")throw new TypeError("P1 outbox supports webhook only; fiat/P2 channels are not available");let l=u.destinationId==null?null:P("destinationId",u.destinationId,{max:160}),E=X(u.payload??{}),k=se(u.evidence??u.payload?.evidence),x={tenantId:m,workflowId:f,idempotencyKey:A,category:S,channel:g,destinationId:l,payload:E,evidence:k};return{...x,contentFingerprint:ge(x)}}function b(u={},m={}){T(u,m);let f=v(u),S=j(t),A=p.mutate(g=>{let l=g.messages.find(x=>ee(x,f.tenantId,f.workflowId)&&x.idempotencyKey===f.idempotencyKey);if(l){if(l.contentFingerprint!==f.contentFingerprint){let x=new Error("outbox idempotency key was reused with different content");throw x.code="IDEMPOTENCY_CONFLICT",x}return{...l,duplicate:!0}}if(g.messages.length>=i)throw new Error("outbox capacity reached");let E=C(S),k={schemaVersion:G,id:P("generated message id",String(n()),{max:128}),...f,status:"pending",attempts:0,maxAttempts:u.maxAttempts===void 0?a:Number(u.maxAttempts),nextAttemptAt:E,lease:null,lastError:null,failures:[],createdAt:E,updatedAt:E,deliveredAt:null,deadLetteredAt:null,replayOf:null,custody:"none",executionAllowed:!1};if(!Number.isSafeInteger(k.maxAttempts)||k.maxAttempts<1||k.maxAttempts>a)throw new TypeError(`message maxAttempts must be between 1 and ${a}`);return g.messages.push(k),k});return A.duplicate||K(o,{type:"notification.outbox.enqueued",at:C(S),tenantId:f.tenantId,workflowId:f.workflowId,messageId:A.id,category:f.category,evidence:f.evidence}),A}function I({tenantId:u,workflowId:m,status:f}={}){if(D(u,m),f!==void 0&&!Ut.has(f))throw new TypeError("invalid outbox status");return p.read().messages.filter(S=>ee(S,u,m)&&(f===void 0||S.status===f))}function O({tenantId:u,workflowId:m}={}){D(u,m);let f=j(t),S=p.mutate(A=>{let g=[];for(let l of A.messages)!ee(l,u,m)||l.status!=="leased"||Date.parse(l.lease.until)>f||(l.lease=null,l.updatedAt=C(f),l.attempts>=l.maxAttempts?(l.status="dead_letter",l.lastError="delivery lease expired after final attempt",l.deadLetteredAt=C(f)):(l.status="pending",l.lastError="delivery lease expired before acknowledgement",l.nextAttemptAt=C(f+w(l.attempts))),g.push(l));return g});for(let A of S)K(o,{type:"notification.outbox.lease_recovered",at:C(f),tenantId:u,workflowId:m,messageId:A.id,status:A.status,attempt:A.attempts});return S}function $({tenantId:u,workflowId:m,workerId:f,limit:S=1,leaseMs:A=3e4}={}){if(D(u,m),P("workerId",f,{max:128}),!Number.isSafeInteger(S)||S<1||S>100)throw new TypeError("claim limit must be between 1 and 100");if(!Number.isSafeInteger(A)||A<1e3||A>36e5)throw new TypeError("leaseMs must be between 1000 and 3600000");let g=j(t),l=p.mutate(E=>{for(let x of E.messages)!ee(x,u,m)||x.status!=="leased"||Date.parse(x.lease.until)>g||(x.lease=null,x.updatedAt=C(g),x.attempts>=x.maxAttempts?(x.status="dead_letter",x.lastError="delivery lease expired after final attempt",x.deadLetteredAt=C(g)):(x.status="pending",x.lastError="delivery lease expired before acknowledgement",x.nextAttemptAt=C(g)));let k=E.messages.filter(x=>ee(x,u,m)&&x.status==="pending"&&Date.parse(x.nextAttemptAt)<=g&&x.attempts<x.maxAttempts).sort((x,_)=>x.nextAttemptAt.localeCompare(_.nextAttemptAt)||x.createdAt.localeCompare(_.createdAt)||x.id.localeCompare(_.id)).slice(0,S);for(let x of k)x.status="leased",x.attempts+=1,x.updatedAt=C(g),x.lease={owner:f,token:P("generated lease token",String(r()),{max:160}),until:C(g+A)};return k});for(let E of l)K(o,{type:"notification.outbox.claimed",at:C(g),tenantId:u,workflowId:m,messageId:E.id,attempt:E.attempts});return l}function B({tenantId:u,workflowId:m,id:f,leaseToken:S}={}){D(u,m);let A=j(t),g=p.mutate(l=>{let E=l.messages.find(k=>ee(k,u,m)&&k.id===f);return E?(Lt(E,S,A),E.status="delivered",E.lease=null,E.updatedAt=C(A),E.deliveredAt=C(A),E):null});return g&&K(o,{type:"notification.outbox.delivered",at:C(A),tenantId:u,workflowId:m,messageId:f,attempt:g.attempts}),g}function y({tenantId:u,workflowId:m,id:f,leaseToken:S,error:A,retryable:g=!0}={}){if(D(u,m),typeof g!="boolean")throw new TypeError("retryable must be boolean");let l=j(t),E=Er(A),k=p.mutate(x=>{let _=x.messages.find(U=>ee(U,u,m)&&U.id===f);if(!_)return null;Lt(_,S,l),_.lease=null,_.lastError=E;let R=!g||_.attempts>=_.maxAttempts;return _.failures=[..._.failures??[],{attempt:_.attempts,at:C(l),code:E,retryable:g,terminal:R}],_.updatedAt=C(l),R?(_.status="dead_letter",_.deadLetteredAt=C(l)):(_.status="pending",_.nextAttemptAt=C(l+w(_.attempts))),_});return k&&K(o,{type:k.status==="dead_letter"?"notification.outbox.dead_lettered":"notification.outbox.retry_scheduled",at:C(l),tenantId:u,workflowId:m,messageId:f,attempt:k.attempts,nextAttemptAt:k.nextAttemptAt}),k}function d({tenantId:u,workflowId:m,id:f,idempotencyKey:S}={},A={}){D(u,m);let g=P("replay idempotencyKey",S,{max:200}),E=p.read().messages.find(_=>ee(_,u,m)&&_.id===f);if(!E)return null;if(E.status!=="dead_letter"&&E.status!=="delivered")throw new Error("only delivered or dead-letter messages may be replayed");T({...E,preferences:A.preferences,watch:A.watch},A);let k=j(t),x=p.mutate(_=>{let R=_.messages.find(q=>ee(q,u,m)&&q.id===f);if(!R||R.status!=="dead_letter"&&R.status!=="delivered")throw new Error("replay source changed state");let U=_.messages.find(q=>ee(q,u,m)&&q.idempotencyKey===g),F={tenantId:u,workflowId:m,idempotencyKey:g,category:R.category,channel:R.channel,destinationId:R.destinationId,payload:R.payload,evidence:R.evidence},N=ge(F);if(U){if(U.contentFingerprint!==N||U.replayOf!==f){let q=new Error("replay idempotency key was reused with different content");throw q.code="IDEMPOTENCY_CONFLICT",q}return{...U,duplicate:!0}}if(_.messages.length>=i)throw new Error("outbox capacity reached");let L=C(k),Z={schemaVersion:G,id:P("generated message id",String(n()),{max:128}),...F,contentFingerprint:N,status:"pending",attempts:0,maxAttempts:R.maxAttempts,nextAttemptAt:L,lease:null,lastError:null,failures:[],createdAt:L,updatedAt:L,deliveredAt:null,deadLetteredAt:null,replayOf:f,custody:"none",executionAllowed:!1};return _.messages.push(Z),Z});return x.duplicate||K(o,{type:"notification.outbox.replayed",at:C(k),tenantId:u,workflowId:m,messageId:x.id,replayOf:f}),x}return Object.freeze({filePath:e,enqueue:b,list:I,claim:$,acknowledge:B,fail:y,recoverExpiredLeases:O,replay:d,backoffForAttempt:w,inspect:p.inspect})}import Ke from"node:path";import{homedir as gn}from"node:os";import{readFileSync as Jo}from"node:fs";import{createHash as Zo}from"node:crypto";z();z();import{getAddress as oo}from"ethers";import{types as Gt}from"node:util";function ct(e){if(!e||typeof e!="object"||Gt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ie(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Gt.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=ie(s.value,t,n+1)}return o}if(!ct(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);r[o]=ie(i.value,t,n+1)}return r}var to=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,no=/[<>&`*_~[\]()|\\]/g,ro=/[\u0000-\u001F\u007F]/g;function qe(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(to,"").replace(ro,"").replace(no,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}var Yt=Object.freeze({1:"https://eth.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com"}),Jt=e=>!!Yt[e];function io(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid NFT cursor");let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(!(n==="token_contract_address_hash"?/^0x[\da-f]{40}$/i.test(String(r)):n==="token_type"?["ERC-721","ERC-1155","ERC-404"].includes(r):["token_id","items_count"].includes(n)&&/^\d{1,100}$/.test(String(r))))throw new Error("invalid NFT cursor");t.set(n,String(r))}if(!t.size)throw new Error("empty NFT cursor");return t.toString()}async function Zt(e={},t={}){let n=oo(e.address),r=Yt[e.chainId];if(!r)throw new Error("Blockscout NFT chain not verified");let o=Math.min(3,Math.max(1,Math.trunc(Number(e.maxPages)||3))),i=[],s=[],a=new Set,c=null,h="",p=0,w=!1;for(;p<o;)try{let T=ie(await V(`${r}/api/v2/addresses/${n}/nft${h?`?${h}`:""}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??8e3,maxResponseBytes:2e6,redirectPolicy:"error",headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}}),"blockscout NFT inventory");if(!Array.isArray(T?.items))throw new Error("invalid NFT inventory response");p++;for(let b of T.items.slice(0,50)){let I=b.token;if(!/^0x[\da-f]{40}$/i.test(I?.address_hash||"")||!/^\d+$/.test(String(b.id??"")))throw new Error("invalid NFT identity");if(!["ERC-721","ERC-1155","ERC-404"].includes(I.type))throw new Error("invalid NFT standard");if(b.owner?.hash&&b.owner.hash.toLowerCase()!==n.toLowerCase())throw new Error("NFT owner mismatch");i.push({chain:e.chain,chainId:e.chainId,family:"evm",owner:n,contract:I.address_hash,tokenId:String(b.id),tokenStandard:I.type,collection:qe(I.name,{max:160,fallback:I.address_hash}),name:qe(b.metadata?.name||I.name,{max:160,fallback:`NFT ${b.id}`}),imageUrl:b.image_url||null,estimatedValueUsd:null,spam:["scam","spam"].includes(I.reputation)||I.is_spam===!0,source:"blockscout-owner-inventory",listingAdapter:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"owner indexer provides no acquisition cost"}})}if(T.items.length>50)throw new Error("NFT provider page exceeds 50 item bound");let v=T.next_page_params??null;if(!v){c=null,w=!0;break}if(c=null,h=io(v),c=Object.fromEntries(new URLSearchParams(h)),a.has(h))throw new Error("repeated NFT cursor");a.add(h)}catch(T){if(s.push(`blockscout: ${T.message}`.slice(0,300)),!p)throw T;break}return{nfts:i,complete:w,next:c,pages:p,truncated:!w,errors:s}}import{getAddress as bo}from"ethers";ke();z();var Rs=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"});z();var Ls=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),ut=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),dt=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"});ke();ke();var tn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);z();ke();z();function pt(e,t="address"){let n=String(e||"").trim();if(!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n))throw new Error(`solana-rpc: ${t} must be a base58 public key`);return n}z();function me(e,t="address"){let n=String(e||"").trim();if(!/^(bc1|tb1|bcrt1)[a-z0-9]{20,90}$/i.test(n)&&!/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(n))throw new Error(`bitcoin-esplora: ${t} must look like a Bitcoin address`);return n}var nn="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function he({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:rn(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([rn(t),...n]).has(c)){let p=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!p?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[nn]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${nn}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function rn(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function le(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}function on(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var uo=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function po(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=on(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=uo.includes(o)&&(i==="https:"||s)}}catch{n=!1}return le({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function fo(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:po(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function ft(e={},t={}){let n=me(e.address||e.addr,"address"),r=on(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],s=null;for(let a of i)try{let c=await fo(a,t),h=mo(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:h.length,inscriptions:h,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}function mo(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}z();z();z();var Pa=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood",2741:"abstract",solana:"solana"});z();var ho=Object.freeze({1:"https://eth.blockscout.com",10:"https://explorer.optimism.io",137:"https://polygon.blockscout.com",324:"https://zksync.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com",534352:"https://scrollscan.com"});var yo=Object.freeze(["block_number","index"]),Ba=new Set([...yo,"items_count","value","hash","inserted_at","fee"]);var hc=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function je(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function sn(e){if(!e)return null;try{return bo(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function an(e={},t=process.env){let n=e.addresses||{},r=sn(n.evm||e.evmAddress||je(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||je(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||je(t,"ORACLE_BITCOIN_ADDRESS"),s=sn(n.hyperliquid||e.hyperliquidAddress||je(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?pt(o,"portfolio Solana address"):null,bitcoin:i?me(i,"portfolio Bitcoin address"):null,hyperliquid:s}}z();import{readFileSync as go,existsSync as Eo}from"node:fs";import{getAddress as So,Interface as He,TypedDataEncoder as xc,parseUnits as vc}from"ethers";var wo=300*1e3,bc=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();var Ao="https://api.opensea.io/api/v2",xo="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",Nc=new He([`function ${xo}`]),Oc=new He(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),vo=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),ko=new Set(vo),To=new Set(["solana","flow"]);function Io(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Eo(e))return"";try{for(let t of go(e,"utf8").split(`
5
5
  `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Te(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||Io()}function ln(e={}){return he({provider:"opensea",defaultUrl:Ao,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Ve(e={}){return ln(e).baseUrl}function ze(e={}){return le({accept:"application/json"},{"x-api-key":Te(e)},ln(e).trusted)}function _o(e){let t=String(e||"ethereum").trim().toLowerCase();if(!ko.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function cn(e,t="address"){try{return So(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function un(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!To.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return cn(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function No(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,quantity:e.quantity==null&&e.balance==null?null:String(e.quantity??e.balance),collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function Oo(e,t={}){if(!e)throw new Error("collection slug required");if(!Te(t))throw new Error("OPENSEA_API_KEY required");return V(`${Ve(t)}/collections/${encodeURIComponent(e)}`,{headers:ze(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Co(e,t={}){if(!e)throw new Error("collection slug required");if(!Te(t))throw new Error("OPENSEA_API_KEY required");return V(`${Ve(t)}/collections/${encodeURIComponent(e)}/stats`,{headers:ze(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function dn(e,t={}){let n=await Oo(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;if(o==null){let w=await Co(e,t);r=w?.total||w?.stats||w||{},o=r.floor_price??r.floorPrice??null}let i=(Array.isArray(n.contracts)?n.contracts:[]).map(w=>({chain:String(w?.chain||w?.chain_identifier||n.chain||"").trim().toLowerCase(),address:String(w?.address||w?.contract_address||w?.contract||"").trim()})).filter(w=>w.chain&&w.address),s=String(t.expectedChain||"").trim().toLowerCase(),a=String(t.expectedContract||"").trim(),c=null;if(s&&a){let w=T=>s==="solana"?T:T.toLowerCase();if(c=i.find(T=>T.chain===s&&w(T.address)===w(a))||null,!c)throw new Error("opensea: collection identity does not match held contract")}let h=c?.chain||String(n.chain||"").trim().toLowerCase()||i[0]?.chain||"",p=String(n.floor_price_symbol||n.floorPriceSymbol||r.floor_price_symbol||r.floorPriceSymbol||"").trim().toUpperCase()||null;return{slug:n.collection||e,name:n.name||null,floor:o,chain:h||null,contracts:i,currency:p,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:i,fees:n.fees,category:n.category}}}async function ht(e={},t={}){if(!Te(t))throw new Error("OPENSEA_API_KEY required");let n=_o(e.chain),r=un(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let h=new URL(`${Ve(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);h.searchParams.set("limit",String(o)),e.collection&&h.searchParams.set("collection",String(e.collection)),a&&h.searchParams.set("next",a);let p=await V(h.toString(),{headers:ze(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let w of Array.isArray(p?.nfts)?p.nfts:[])s.push(No(w,n,r));a=p?.next?String(p.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function pn(e={},t={}){if(!Te(t))throw new Error("OPENSEA_API_KEY required");let n=un(e.address||e.owner),r=await V(`${Ve(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:ze(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var Cc=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});var Pc=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});var Rc=new He(["function setApprovalForAll(address operator,bool approved)"]),$c=new He(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"]);var Ro="https://api.satflow.com/v1";function fn(e={}){return he({provider:"satflow",defaultUrl:Ro,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function $o(e={}){return fn(e).baseUrl}function mn(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function Lo(e={}){return le({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":mn(e)},fn(e).trusted)}async function Fo(e,{method:t="GET",body:n,opts:r={}}={}){if(!mn(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${$o(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:Lo(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),h;try{h=JSON.parse(c)}catch{h=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return h}async function hn(e={},t={}){let n=me(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await Fo(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}z();z();var Yc=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]);var Uo=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],Mo=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,Do=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function Bo(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;Mo.test(n)&&t.push("url-in-name");let i=Uo.filter(h=>h.test(o)).length;i>0&&t.push(`lure-language:${i}`),Do.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function yn(e={}){let t=Bo(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}var qo=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),jo=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function yt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function ye(e,t){let n=await Be(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function Ho(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function Vo(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function zo(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function bn(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function Ko(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function Wo(e,t){let n=bn(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),s=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function Go(e){let t=new Map;for(let n of e){let r=bn(n);t.has(r)||t.set(r,n)}return[...t.values()]}function Yo(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function wn(e={},t={}){let n=new Date().toISOString(),r=an(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(d=>String(d).toLowerCase())):null,i=qo.filter(d=>!o||o.has(d.chain)),s=[],a=[],c=yt(t,"opensea"),h=r.evm?i.filter(d=>d.family!=="solana"):[],p=await ve(h,4,async d=>({row:d,result:await ye(`opensea-${d.chain}`,()=>ht({chain:d.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:d,result:u}of p)if(u.ok){let m=u.data.nfts.map(f=>({...f,family:d.family,chainId:d.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(...m),s.push({family:d.family,chain:d.chain,chainId:d.chainId,status:u.data.complete?"ok":"partial",count:m.length,complete:u.data.complete,next:u.data.next,source:"opensea"})}else{let m=Jt(d.chainId)?await ye(`blockscout-${d.chain}`,()=>Zt({chain:d.chain,chainId:d.chainId,address:r.evm,maxPages:e.maxPages},{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})):null;m?.ok?(a.push(...m.data.nfts),s.push({...d,status:m.data.complete?"ok":"partial",count:m.data.nfts.length,complete:m.data.complete,next:m.data.next,truncated:m.data.truncated,source:"blockscout",errors:[u.error,...m.data.errors]})):s.push({...d,status:"unavailable",count:null,complete:!1,error:u.error,errors:[u.error,...m?[m.error]:[]],source:"opensea"})}if(!r.evm)for(let d of i.filter(u=>u.family!=="solana"))s.push({family:d.family,chain:d.chain,chainId:d.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let d=await ye("opensea-solana",()=>ht({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(d.ok){let u=d.data.nfts.map(m=>({...m,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...u),s.push({family:"solana",chain:"solana",status:d.data.complete?"ok":"partial",count:u.length,complete:d.data.complete,next:d.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:d.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let d=await ye("satflow-wallet-contents",()=>hn({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},yt(t,"satflow")),t.timeoutMs??35e3);if(d.ok){let u=Ho(d.data.contents).map(f=>Vo(f,r.bitcoin));a.push(...u);let m=u.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:m?"ok":"partial",count:u.length,complete:m,source:"satflow"})}else{let u=await ye("bitcoin-meta-inscriptions",()=>ft({address:r.bitcoin},yt(t,"bitcoinMeta")),t.timeoutMs??35e3),m=u.ok&&u.data?.ok&&Array.isArray(u.data.inscriptions)?u.data.inscriptions:[];a.push(...m.map(f=>zo(f,r.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:m.length?"partial":"unavailable",count:m.length,complete:!1,source:m.length?"bitcoin-meta":"satflow",error:m.length?"Satflow unavailable; fallback has IDs only":d.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let w=[];if(e.includePnl!==!1)for(let d of[...new Set([r.evm,r.solana].filter(Boolean))]){let u=await ye(`opensea-pnl-${d}`,()=>pn({address:d},c),t.timeoutMs??35e3);w.push(u.ok?{status:"ok",...u.data}:{status:"unavailable",address:d,source:"opensea-indexed-account-pnl",error:u.error})}let T=Ko(e.costBasis),v=Go(a).map(d=>Wo(d,T)).map(d=>yn(d)),b=v.filter(d=>!d.spam),I=v.filter(d=>d.spam),O=b.filter(d=>d.estimatedValueUsd!=null&&Number.isFinite(Number(d.estimatedValueUsd))),$=Math.round(O.reduce((d,u)=>d+Number(u.estimatedValueUsd),0)*100)/100,B=b.length-O.length,y=s.filter(d=>d.status!=="ok"||d.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:s,unsupported:jo,inventory:{count:v.length,visibleCount:b.length,flaggedCount:I.length,items:v,visibleItems:b,flaggedItems:I},valuation:{estimatedCurrentValueUsd:$,valuedItems:O.length,unvaluedItems:B,complete:B===0&&y.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:Yo(b,w),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}var En=1,Xo=/^0x[0-9a-f]{40}$/,Qo=/^[1-9A-HJ-NP-Za-km-z]{32,64}$/,ei=/^[A-Z0-9][A-Z0-9._-]{1,15}$/;function ti(e=process.env){let t=e.ORACLE_CONFIG_DIR||Ke.join(gn(),".config","oracle");return Ke.join(t,"held-nft-pump.v1.json")}function ni(e=process.env){let t=e.ORACLE_CONFIG_DIR||Ke.join(gn(),".config","oracle"),n={};try{let o=JSON.parse(Jo(Ke.join(t,"portfolio.json"),"utf8"));n=o&&typeof o=="object"&&!Array.isArray(o)?o.addresses||o:{}}catch{}let r={evm:e.ORACLE_EVM_ADDRESS||n.evm,solana:e.ORACLE_SOLANA_ADDRESS||n.solana};return Object.fromEntries(Object.entries(r).filter(([,o])=>typeof o=="string"&&o.trim()).map(([o,i])=>[o,i.trim()]))}function ri(e){return{...e,ORACLE_DEFAULT_ADDRESS:"",MAD_OPERATOR_ADDRESS:""}}function Sn(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function oi(e){let t=e?.quantity??e?.balance??1;if(typeof t!="string"&&typeof t!="number"&&typeof t!="bigint"||!/^\d+$/.test(String(t)))return 0n;let n=BigInt(String(t));return n>0n?n:0n}function ii(e){return e<=BigInt(Number.MAX_SAFE_INTEGER)?Number(e):e.toString()}function si(e){if(!e||e.version!==En||!e.collections||typeof e.collections!="object"||Array.isArray(e.collections))throw new TypeError("invalid held NFT pump state");if(!Number.isSafeInteger(e.cursor??0)||(e.cursor??0)<0)throw new TypeError("invalid held NFT pump cursor");if(e.walletFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(e.walletFingerprint))throw new TypeError("invalid held NFT wallet fingerprint");if(e.walletChanged!==void 0&&typeof e.walletChanged!="boolean")throw new TypeError("invalid held NFT wallet-change marker");let t=e.failures??{};if(!t||typeof t!="object"||Array.isArray(t))throw new TypeError("invalid held NFT pump failures");let n=Object.entries(e.collections);if(n.length>1e4||Object.keys(t).length>1e4)throw new TypeError("held NFT pump state exceeds collection bound");for(let[r,o]of n){if(!r||r.length>260||!o||Sn(o.anchorFloor)===null)throw new TypeError("invalid held NFT floor record");if(!Number.isFinite(o.updatedAt)||o.updatedAt<0)throw new TypeError("invalid held NFT update time");if(o.lastAlertAt!==null&&(!Number.isFinite(o.lastAlertAt)||o.lastAlertAt<0))throw new TypeError("invalid held NFT alert time")}for(let r of Object.values(t))if(!r||!Number.isSafeInteger(r.count)||r.count<1||!Number.isFinite(r.nextCheckAt)||r.nextCheckAt<0)throw new TypeError("invalid held NFT provider backoff")}function An(e={}){let t=e?.inventory?.visibleItems??e?.inventory?.items??[],n=new Map;for(let r of Array.isArray(t)?t:[]){if(r?.spam===!0||r?.disabled===!0)continue;let o=String(r?.chain||"").trim().toLowerCase(),i=String(r?.contract||"").trim(),s=o==="solana"?i:i.toLowerCase(),a=String(r?.collection||"").trim().toLowerCase();if(!o||!a||!(o==="solana"?Qo.test(s):Xo.test(s)))continue;let c=oi(r);if(c===0n)continue;let h=`${o}:${s}`,p=n.get(h);p&&p.slug!==a||n.set(h,{key:h,chain:o,contract:s,slug:a,name:p?.name||String(r?.name||a),heldCountRaw:(p?.heldCountRaw||0n)+c})}return[...n.values()].map(({heldCountRaw:r,...o})=>({...o,heldCount:ii(r)})).sort((r,o)=>r.key.localeCompare(o.key))}function ai(e,t){let n=String(e?.currency||"").trim().toUpperCase();if(!ei.test(n))return{ok:!1,reason:"floor-currency-unavailable"};if(e?.chain&&String(e.chain).trim().toLowerCase()!==t.chain)return{ok:!1,reason:"floor-identity-mismatch"};let r=Array.isArray(e?.contracts)?e.contracts:Array.isArray(e?.raw?.contracts)?e.raw.contracts:[],o=t.chain==="solana"?t.contract:t.contract.toLowerCase();return r.some(s=>{let a=String(s?.address||s?.contract_address||s?.contract||"").trim(),c=t.chain==="solana"?a:a.toLowerCase(),h=String(s?.chain||s?.chain_identifier||"").trim().toLowerCase();return c===o&&h===t.chain})?{ok:!0,currency:n}:{ok:!1,reason:"floor-identity-mismatch"}}function ci(e,t,n,r,o){let i=Math.round((t/r.anchorFloor-1)*1e4)/100;return Object.freeze({type:"held_nft_floor_pump",category:"price",chain:e.chain,contract:e.contract,slug:e.slug,name:e.name,heldCount:e.heldCount,fromFloor:r.anchorFloor,floor:t,currency:n,changePct:i,observedAt:new Date(o).toISOString(),evidence:Object.freeze({source:"opensea-collection-floor",status:"provider-estimate",chain:e.chain,contract:e.contract,currency:n,observedAt:new Date(o).toISOString(),warning:"Floor is a provider estimate, not an executable bid or guaranteed liquidation value."}),custody:"none",executionAllowed:!1})}function li({filePath:e,env:t=process.env,clock:n=()=>Date.now(),inventoryFn:r=wn,floorFn:o=dn,notifyFn:i=async()=>({delivered:0}),thresholdPct:s=Number(t.ORACLE_NFT_PUMP_THRESHOLD_PCT??15),cooldownMs:a=Number(t.ORACLE_NFT_PUMP_COOLDOWN_HOURS??6)*36e5,maxFloorChecksPerTick:c=Number(t.ORACLE_NFT_PUMP_MAX_FLOORS_PER_TICK??20),inventoryPageSize:h=100,inventoryMaxPages:p=2}={}){if(typeof r!="function"||typeof o!="function"||typeof i!="function")throw new TypeError("held NFT watchdog functions are required");if(!Number.isFinite(s)||s<=0||s>1e3)throw new TypeError("held NFT pump threshold is out of range");if(!Number.isFinite(a)||a<6e4||a>30*864e5)throw new TypeError("held NFT pump cooldown is out of range");if(!Number.isSafeInteger(c)||c<1||c>100)throw new TypeError("held NFT floor budget is out of range");let w=te({filePath:e||ti(t),kind:"oracle-held-nft-pump",clock:n,maxBytes:4*1024*1024,initialData:()=>({version:En,cursor:0,collections:{},failures:{}}),validateData:si}),T=!1;function v(I,O){w.mutate($=>{$.failures||={};let B=Math.min(20,Number($.failures[I]?.count||0)+1);$.failures[I]={count:B,nextCheckAt:O+Math.min(6*36e5,3e5*2**Math.min(6,B-1))}})}async function b(){if(T)return{skipped:!0,reason:"tick-in-progress",alerts:[],unavailable:[]};T=!0;try{let I=Number(n());if(!Number.isFinite(I))throw new TypeError("held NFT watchdog clock is invalid");let O=ni(t),$=ri(t),B=Zo("sha256").update(JSON.stringify(Object.entries(O).sort())).digest("hex");w.mutate(l=>{let E=!!(l.walletFingerprint&&l.walletFingerprint!==B);E&&(l.collections={},l.failures={},l.cursor=0),l.walletFingerprint=B,l.walletChanged=E});let y=await r({addresses:O,includePnl:!1,pageSize:h,maxPages:p},{env:$}),d=An(y),u=new Set(d.map(l=>l.key)),m=new Set((Array.isArray(y?.coverage)?y.coverage:[]).filter(l=>l?.status==="ok"&&l?.complete===!0).map(l=>String(l.chain||"").toLowerCase()).filter(Boolean));m.size&&w.mutate(l=>{for(let E of Object.keys(l.collections)){let k=E.slice(0,E.indexOf(":"));m.has(k)&&!u.has(E)&&delete l.collections[E]}for(let E of Object.keys(l.failures||{})){let k=E.slice(0,E.indexOf(":"));m.has(k)&&!u.has(E)&&delete l.failures[E]}});let f=w.mutate(l=>{let E=d.length?(l.cursor||0)%d.length:0;return l.cursor=d.length?(E+Math.min(c,d.length))%d.length:0,E}),S=[];for(let l=0;l<Math.min(c,d.length);l+=1)S.push(d[(f+l)%d.length]);let A=[],g=[];for(let l of S){let E=w.inspect().data.failures?.[l.key];if(E&&E.nextCheckAt>I){g.push({key:l.key,reason:"floor-provider-backoff"});continue}let k;try{k=await o(l.slug,{env:$,expectedChain:l.chain,expectedContract:l.contract})}catch{v(l.key,I),g.push({key:l.key,reason:"floor-provider-unavailable"});continue}let x=ai(k,l);if(!x.ok){v(l.key,I),g.push({key:l.key,reason:x.reason});continue}let _=Sn(k?.floor);if(_===null){v(l.key,I),g.push({key:l.key,reason:"floor-unavailable"});continue}let R=w.mutate(F=>{F.failures||={},delete F.failures[l.key];let N=F.collections[l.key];if(!N)return F.collections[l.key]={anchorFloor:_,lastAlertAt:null,updatedAt:I,currency:x.currency},null;if(N.updatedAt=I,N.currency!==x.currency)return N.anchorFloor=_,N.currency=x.currency,N.lastAlertAt=null,null;if(_<N.anchorFloor)return N.anchorFloor=_,N.currency=x.currency,null;if((_/N.anchorFloor-1)*100+1e-9<s)return null;if(N.lastAlertAt!==null&&I-N.lastAlertAt<a)return N.anchorFloor=_,N.currency=x.currency,null;let Z=ci({...l,name:k?.name||l.name},_,x.currency,N,I);return N.anchorFloor=_,N.lastAlertAt=I,N.updatedAt=I,N.currency=x.currency,Z});if(!R)continue;let U;try{U=await i(R)}catch{U=null}if(!U||Number(U.delivered||0)!==1){g.push({key:l.key,reason:"notification-delivery-failed"});continue}A.push(R)}return{provider:"held-nft-pump",readOnly:!0,custody:"none",executionAllowed:!1,heldCollections:d.length,checkedCollections:S.length,alerts:A,unavailable:g,coverage:y?.coverage??[]}}finally{T=!1}}return Object.freeze({filePath:w.filePath,tick:b,inspect:w.inspect})}function ue(e,t=160){return String(e??"").replace(/[\u0000-\u001f\u007f]/g," ").slice(0,t)}function bt(e){let t=Number(e);return Number.isFinite(t)?t:null}function ui(e,t={},n=process.env){let r=String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"");if(!r)return[];let o=String(n[`ORACLE_OWNER_${r}`]||"").split(/[\s,;]+/).filter(Boolean),i=Array.isArray(t.owners)?t.owners.map(String):[];return[...new Set([...o,...i].map(s=>s.trim()).filter(Boolean))]}function xn(e={}){let t=typeof e.heldCount=="string"&&/^\d+$/.test(e.heldCount)?e.heldCount:Number.isSafeInteger(Number(e.heldCount))?String(Number(e.heldCount)):"unknown",n=bt(e.fromFloor),r=bt(e.floor),o=bt(e.changePct),i=ue(e.currency||"unknown",16);return`ORACLE NFT \u2014 YOUR BAG IS PUMPING