@oracle-agent/oracle 0.35.39 → 0.35.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-sessions.mjs +11 -11
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +19 -19
- package/dist/bin/oracle-gateway.mjs +43 -43
- package/dist/bin/oracle-investigate.mjs +5 -5
- package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +18 -18
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/cli/commands/agent-session.mjs +18 -18
- package/dist/cli/commands/airdrop.mjs +8 -8
- package/dist/cli/commands/chat.mjs +207 -207
- package/dist/cli/commands/doctor.mjs +9 -9
- package/dist/cli/commands/eval.mjs +147 -197
- package/dist/cli/commands/farm.mjs +17 -17
- package/dist/cli/commands/follow.mjs +17 -17
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +211 -211
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +12 -12
- package/dist/cli/commands/resolve.mjs +7 -7
- package/dist/cli/commands/sign.mjs +4 -4
- package/dist/cli/commands/signer.mjs +14 -14
- package/dist/cli/commands/snipe.mjs +9 -9
- package/dist/cli/commands/strategy.mjs +4 -4
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +26 -26
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +2 -2
- package/dist/local-signer/runtime.mjs +8 -8
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +7 -7
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/teams/index.mjs +6 -6
- package/dist/tui/standalone-client.mjs +82 -82
- package/package.json +4 -4
- package/public/eval-report.json +3 -3
- package/public/oracle-splash/_variants/ice.html +2 -4
- package/public/oracle-splash/_variants/ivory.html +2 -4
- package/public/oracle-splash/assets/fonts/LICENSE-Cormorant-Garamond.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-IBM-Plex-Mono.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-Outfit.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-UnifrakturCook.txt +94 -0
- package/public/oracle-splash/assets/fonts/font-provenance.json +426 -0
- package/public/oracle-splash/assets/fonts/oracle-font-00.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-01.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-02.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-03.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-04.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-05.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-06.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-07.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-08.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-09.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-10.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-11.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-12.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-13.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-14.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-15.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-16.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-17.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-18.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-19.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-20.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-21.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-22.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-23.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-24.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-25.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-26.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-27.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-fonts.css +504 -0
- package/public/oracle-splash/assets/transport-probe-sw.js +2 -0
- package/public/oracle-splash/docs/browser-and-web/index.html +6 -6
- package/public/oracle-splash/docs/connectors/index.html +5 -5
- package/public/oracle-splash/docs/docs.css +4 -4
- package/public/oracle-splash/docs/docs.js +119 -7
- package/public/oracle-splash/docs/getting-started/index.html +5 -5
- package/public/oracle-splash/docs/index.html +6 -6
- package/public/oracle-splash/docs/reference/index.html +5 -5
- package/public/oracle-splash/docs/security/index.html +5 -5
- package/public/oracle-splash/docs/using-oracle/index.html +5 -5
- package/public/oracle-splash/download/index.html +8 -10
- package/public/oracle-splash/downloads/index.html +3 -5
- package/public/oracle-splash/eval/index.html +96 -0
- package/public/oracle-splash/index.html +16 -18
- package/public/oracle-splash/mesh-graph.svg +1 -1
- package/public/oracle-splash/pricing/index.html +6 -8
- package/public/oracle-splash/security/index.html +3 -5
- package/public/oracle-splash/what-it-does/index.html +4 -6
- package/public/oracle-splash/where-it-works/index.html +3 -5
- package/server.json +2 -2
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFile as yd,stat as bd}from"node:fs/promises";import{createHash as Hn}from"node:crypto";import{types as $t}from"node:util";var Hs=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),qs=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Gs=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Ws(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Js(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=Ws(n);if(qs.has(r)||Gs.some(o=>r.includes(o)))return!0}return!1}function Vr(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Ys=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Ks(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function Zs(e){let t=e.match(Ys)||[];for(let n of t){let r=Ks(n),o=Vr(r),s=o?Vr(o):null;for(let i of[r,o,s])if(i&&Js(i))return!0}return!1}var Xs=Object.freeze([Object.freeze([120,112,114,118]),Object.freeze([115,107,45]),Object.freeze([103,104,112,95]),Object.freeze([103,104,111,95]),Object.freeze([103,104,117,95]),Object.freeze([103,104,115,95]),Object.freeze([103,104,114,95]),Object.freeze([103,105,116,104,117,98,95,112,97,116,95]),Object.freeze([97,107,105,97]),Object.freeze([97,115,105,97])]);function Ze(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function Xe(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of Xs){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function J(e){return typeof e!="string"||e.length===0?!1:Hs.some(t=>t.test(e))?!0:Zs(e)}import{createHash as Xr}from"node:crypto";import{createHash as ri}from"node:crypto";import{types as Ue}from"node:util";import ct from"node:net";import Qs from"node:dns";var ei=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Zt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=l=>{if(!l)return[];let f=l.split(":"),u=f.at(-1);if(u?.includes(".")){let h=u.split(".").map(Number);if(h.length!==4||h.some(p=>!Number.isInteger(p)||p<0||p>255))return null;f.splice(f.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return f.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:f.map(h=>Number.parseInt(h,16))},[r,o]=t.split("::"),s=n(r),i=n(o);if(!s||!i)return null;let a=t.includes("::"),c=8-s.length-i.length;if(!a&&c!==0||a&&c<1)return null;let d=[...s,...Array(Math.max(0,c)).fill(0),...i];return d.length!==8?null:Uint8Array.from(d.flatMap(l=>[l>>8,l&255]))}function Ln(e,t,n){let r=Math.floor(n/8),o=n%8;for(let i=0;i<r;i+=1)if(e[i]!==t[i])return!1;if(!o)return!0;let s=255<<8-o;return(e[r]&s)===(t[r]&s)}function Pn(e){if(ct.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(ct.isIPv6(e)){let t=Zt(e);if(!t)return!1;let n=Zt("::ffff:0:0");return Ln(t,n,96)?Pn([...t.slice(12)].join(".")):Ln(t,Zt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>Ln(t,Zt(o),s)):!1}return!1}function ti(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(ei.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ct.isIP(n);return r!==0&&!Pn(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Cn(e,{lookupFn:t=Qs.promises.lookup}={}){let n=ti(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ct.isIPv6(n.host)?6:4}]};let r;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=>!Pn(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function jn({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let f=await t();n=f.Agent,r=f.fetch}catch(f){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${f?.message||f}`);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 o=f=>String(f).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,i=f=>(Array.isArray(f)?f:[f]).map(u=>typeof u=="string"?{address:u}:u).filter(u=>u&&u.address).map(u=>({address:u.address,family:u.family||(ct.isIPv6(u.address)?6:4)})),a=(f,u,h)=>{s.set(o(f),i(typeof u=="string"?[{address:u,family:h}]:u))},c=f=>{let u=o(f);if(ct.isIP(u))return[{address:u,family:ct.isIPv6(u)?6:4}];let h=s.get(u);if(!h||!h.length)throw new Error(`refused: unpinned host ${f} during pinned fetch`);return h},d=new n({connect:{lookup(f,u,h){let p;try{p=c(f)}catch(m){return h(m)}return u?.all?h(null,p):h(null,p[0].address,p[0].family)}}}),l=ni((f,u={})=>r(f,{...u,dispatcher:d}),a);return{dispatcher:d,fetch:l,pin:a,resolve:c,async close(){try{await d.destroy()}catch{}}}}var kn=Symbol.for("oracle.egressGuard.pinCapableFetch");function ni(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[kn]=Object.freeze({pin:t}),e}function Dn(e){return typeof e=="function"&&typeof e[kn]?.pin=="function"}function zr(e,t,n){if(!Dn(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[kn].pin(t,n)}var oi=new Set([408,425,429,500,502,503,504]),Br=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),si=2,Hr=4e3,ii=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ai=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ci=AbortSignal.prototype.throwIfAborted,li=EventTarget.prototype.addEventListener,qr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Un=e=>e?ii.call(e):!1,di=e=>e?ai.call(e):void 0,ui=new Set([301,302,303,307,308]),Qt=3,Vd=64*1024,Me=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function Y(e){return Qe(`HTTP JSON body refused: ${e}`)}function fi(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 Ue[t]=="function"&&Ue[t](e))}function pi(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>Me.bytes)throw Y("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>Me.bytes)throw Y("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,f)=>{if(r+=1,r>Me.nodes)throw Y("node limit exceeded");if(f>Me.depth)throw Y("depth limit exceeded");if(l===null){a("null");return}if(typeof l=="string"){a(c(l));return}if(typeof l=="boolean"){a(l?"true":"false");return}if(typeof l=="number"){if(!Number.isFinite(l))throw Y("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw Y("unsupported non-JSON value");if(Ue.isProxy(l))throw Y("proxy value");if(fi(l))throw Y("unsupported exotic object");if(i.has(l))throw Y("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw Y("symbol-keyed fields are unsupported");if(Array.isArray(l)){let p=Object.getPrototypeOf(l),m=0;for(;p!==null;){if(Ue.isProxy(p))throw Y("proxy array prototype");if(m+=1,m>Me.depth)throw Y("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(l.length>Me.arrayLength)throw Y("array length limit exceeded");for(let y=0;y<l.length;y+=1){let E=Object.getOwnPropertyDescriptor(l,String(y));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw Y("array entries must be dense enumerable own data")}let g=0;for(let y in l){if(s+=1,s>Me.fields)throw Y("enumeration limit exceeded");if(Object.hasOwn(l,y)&&(g+=1,g>l.length))throw Y("named array fields are unsupported")}if(g!==l.length)throw Y("array entries must be dense enumerable own data");a("[");for(let y=0;y<l.length;y+=1)y&&a(","),d(Object.getOwnPropertyDescriptor(l,String(y)).value,f+1);a("]");return}let u=Object.getPrototypeOf(l);if(u!==Object.prototype&&u!==null)throw Y("non-plain object");let h=[];for(let p in l){if(s+=1,s>Me.fields)throw Y("enumeration limit exceeded");if(!Object.hasOwn(l,p))continue;if(o+=1,o>Me.fields)throw Y("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,p);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw Y("object fields must be enumerable own data");h.push([p,m.value])}a("{");for(let p=0;p<h.length;p+=1)p&&a(","),a(c(h[p][0])),a(":"),d(h[p][1],f+1);a("}")}finally{i.delete(l)}};return d(e,0),t.join("")}function mi(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(Ue.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 s=Object.getOwnPropertyDescriptor(e,r);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=s.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");t[r]=String(i)}return t}function hi(){return Object.assign(Object.create(null),{Accept:"application/json"})}function gi(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 yi(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var $n=new Map,Gr=new WeakMap,Wr=1;function Xt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Gr.get(e);return t||(t=Wr,Wr+=1,Gr.set(e,t)),`reference:${t}`}var bi=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Ei=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Jr(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?bi.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 Yr(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(Jr);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Jr(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Ei.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Oi(e,t,n,r={},o=null){let s=ri("sha256"),i=(c,d)=>{let l=String(d);s.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),s.update("=").update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l).update(`
|
|
3
|
-
`)};i("method",e),i("url",t),Object.keys(n||{}).map((c,d)=>({name:c.toLowerCase(),order:d,value:String(n[c])})).sort((c,d)=>c.name.localeCompare(d.name)||c.order-d.order).forEach((c,d)=>{i(`header-name-${d}`,c.name),i(`header-value-${d}`,c.value)}),i("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${c}`,r[c]??"-");return s.digest("hex")}function wi(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Hr):Math.min(250*2**e,Hr)+Math.floor(Math.random()*100)}var Ai=e=>new Promise(t=>setTimeout(t,e));function Qe(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Mn(e,t,n){return Qe(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function lt(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Ii(e){return e?e.byteLength??e.length??0:0}async function Si(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(lt(e),!r))throw Mn(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let f=await e.text(),u=Buffer.byteLength(f,"utf8");if(u>t){if(!r)throw Mn(n,`body ${u} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let a=[],c=0,d=!1;try{for(;;){let{value:f,done:u}=await i.read();if(u)break;if(f&&(a.push(Buffer.from(f)),c+=Ii(f),c>t)){d=!0;break}}}finally{if(d)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!r))throw Mn(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function Ni(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ti(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:s,lookupFn:i,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:l=!1,importUndici:f,validateResponse:u,signal:h,redirectPolicy:p="follow",maxRedirects:m=Qt}){let g=new AbortController,y=setTimeout(()=>g.abort(),s),E=h?qr?qr([h,g.signal]):h:g.signal,S=null,_=t,R=i?{lookupFn:i}:{};if(c&&!a&&!Dn(_))throw Qe(`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 C=async(v,{status:T=null}={})=>{let D=await Cn(v,R);if(!D.ok)throw Qe(T==null?`HTTP refused ${v}: ${D.error}`:`HTTP redirect to ${v} ${D.error}`,T==null?{}:{status:T});let ee=new URL(v).hostname;if(a){if(S&&(await S.close(),S=null),!S)try{S=await jn({requireUndici:!0,...f?{importUndici:f}:{}})}catch(x){throw Qe(T==null?`HTTP refused ${v}: ${x?.message||x}`:`HTTP redirect to ${v} refused: ${x?.message||x}`,T==null?{}:{status:T})}S.pin(ee,D.addresses),_=S.fetch}else zr(_,ee,D.addresses);return D};try{let v=String(e),T=Object.assign(Object.create(null),r||{});c&&await C(v);for(let D=0;D<=m;D+=1){let ee=Object.assign(Object.create(null),{method:n,headers:T,body:o,signal:E,redirect:"manual",dispatcher:void 0}),x=await _(v,ee);if((p==="error"||m===0)&&x.status>=300&&x.status<400)throw lt(x),Qe(`HTTP ${x.status} ${n} redirect refused`,{status:x.status,redirectRefused:!0});if(ui.has(x.status)){let se=l===!0&&n==="POST"&&[307,308].includes(x.status)&&Yr(n,o);if(n!=="GET"&&n!=="HEAD"&&!se){lt(x);let N=new Error(`HTTP ${x.status} ${n} ${v} redirected non-idempotent request`);throw N.status=x.status,N}if(D===m)throw lt(x),Qe(`HTTP ${x.status} ${n} redirect budget exhausted`,{status:x.status,redirectRefused:!0});let ue=x.headers?.get?.("location"),F;try{F=gi(ue,v)}catch(N){throw lt(x),N}let w=!yi(F,v);if(lt(x),w&&n==="POST"){let N=new Error(`HTTP ${x.status} ${n} cross-origin redirect refused`);throw N.status=x.status,N}if(w&&l){let N=new Error(`HTTP ${x.status} ${n} cross-origin redirect refused`);throw N.status=x.status,N.retryable=!1,N}if(w&&(T=hi(T)),c)await C(F,{status:x.status});else if(w){let N=await Cn(F,R);if(!N.ok){let L=new Error(`HTTP redirect from ${v} ${N.error}`);throw L.status=x.status,L.retryable=!1,L}a&&N.addresses?.length&&(S||(S=await jn(f?{importUndici:f}:{})),S&&(S.pin(new URL(F).hostname,N.addresses),_=S.fetch))}v=F;continue}if(typeof u=="function")try{await u(x,{url:v})}catch(se){throw lt(x),Qe(se?.message||String(se))}let le=await Si(x,d,{url:v,onOversize:()=>g.abort()}),Le=Ni(le);if(!x.ok){let se=new Error(`HTTP ${x.status} ${n} ${v}`);throw se.status=x.status,se.retryAfter=x.headers?.get?.("retry-after")??null,se.body=Le??le.slice(0,300),se}return Le??le}throw new Error(`HTTP redirect loop for ${e}`)}catch(v){if(g.signal.aborted&&!Un(h)){let T=v&&(typeof v=="object"||typeof v=="function")&&!Ue.isProxy(v)?v:null,D=T?Object.getOwnPropertyDescriptor(T,"oversize"):null;if(!(D&&Object.hasOwn(D,"value")&&D.value===!0))try{if(!T)throw new TypeError("unsafe rejection");Object.defineProperties(T,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let x=new Error("HTTP request timed out");throw Object.defineProperties(x,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),x}}throw v}finally{clearTimeout(y),S&&await S.close()}}async function K(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Ue.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 L of Object.getOwnPropertyNames(t)){let j=Object.getOwnPropertyDescriptor(t,L);if(!(L==="toJSON"&&j&&Object.hasOwn(j,"value")&&j.value===void 0)){if(!n.has(L))throw new TypeError("HTTP options contain unknown fields");if(!j||!j.enumerable||!Object.hasOwn(j,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=L=>{if(t==null||!Object.hasOwn(t,L))return;let j=Object.getOwnPropertyDescriptor(t,L);if(!j||!Object.hasOwn(j,"value"))throw new TypeError("HTTP options must contain own data properties");return j.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 s=r("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=r("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>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>Qt))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${Qt}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=a??"follow",l=d==="error"?0:c??Qt;for(let L of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let j=r(L);if(j!==void 0&&typeof j!="boolean")throw new TypeError(`HTTP ${L} must be boolean`)}let f=r("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=r("signal");if(u!==void 0){if(Ue.isProxy(u)||!(u instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Un(u)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let L of["importUndici","lookupFn","validateResponse"]){let j=r(L);if(j!==void 0&&typeof j!="function")throw new TypeError(`HTTP ${L} must be a function`)}let h=r("fetchImpl"),p=h||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=s??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),E=mi(y),S=Object.assign(Object.create(null),E);Object.keys(S).some(L=>L.toLowerCase()==="accept")||(S.Accept="application/json");let _=r("body");_!=null&&typeof _!="string"&&(Object.keys(S).find(j=>j.toLowerCase()==="content-type")||(S["Content-Type"]="application/json"),_=pi(_));let R=i??si,C=r("lookupFn"),v=!h,T=r("untrustedUrl")===!0,D=r("sameOriginRedirectsOnly")===!0,ee=r("importUndici"),x=r("validateResponse"),le=u,Le=f??null,se=async()=>{let L;for(let j=0;j<=R;j++){le&&ci.call(le);try{return await Ti(e,{fetchImpl:p,method:g,headers:S,body:_,timeoutMs:m,lookupFn:C,realFetch:v,untrustedUrl:T,maxResponseBytes:Le,sameOriginRedirectsOnly:D,importUndici:ee,validateResponse:x,signal:le,redirectPolicy:d,maxRedirects:l})}catch(ge){L=ge;let Se=P=>{if(!ge||typeof ge!="object"&&typeof ge!="function"||Ue.isProxy(ge))return;let q=Object.getOwnPropertyDescriptor(ge,P);return q&&Object.hasOwn(q,"value")?q.value:void 0},_e=Se("status"),$e=Se("oracleTimeout")===!0||Se("name")==="AbortError"||Se("name")==="TimeoutError"||Un(le),Yt=new Set([408,425,429]),ht=Se("retryable")===!1?!1:_e!=null?Yt.has(_e)||oi.has(_e)&&Br.has(g):!$e&&Br.has(g);if(j===R||!ht)throw ge;let A=wi(j,Se("retryAfter"));le?await new Promise((P,q)=>{let z=setTimeout(P,A);li.call(le,"abort",()=>{clearTimeout(z),q(di(le)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Ai(A)}}throw L};if(!(r("dedupe")!==!1&&!le&&Yr(g,_)))return se();let F=Oi(g,e,S,{untrustedUrl:T,maxResponseBytes:Le,sameOriginRedirectsOnly:D,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:R,fetchImpl:Xt(p),realFetch:v,lookupFn:Xt(C),importUndici:Xt(ee),validateResponse:Xt(x)},_),w=$n.get(F);if(w)return w;let N=se().finally(()=>$n.delete(F));return $n.set(F,N),N}import{types as yt}from"node:util";function be(e){if(!e||typeof e!="object"||yt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function he(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&yt.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function Fe(e,t,n="provider response",r=null,o=0){if(typeof t!="string"||t.length===0)return e;if(o>64)throw new Error(`${n} exceeds the credential guard nesting bound`);let s=r??{nodes:0,active:new Set};if(s.nodes+=1,s.nodes>2e5)throw new Error(`${n} exceeds the credential guard node bound`);if(e==null)return e;if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error(`${n} reflected an attached credential`);return e}if(!e||typeof e!="object"||yt.isProxy(e)||s.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);s.active.add(e);try{if(Array.isArray(e)){for(let i=0;i<e.length;i+=1){let a=Object.getOwnPropertyDescriptor(e,String(i));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Fe(a.value,t,n,s,o+1)}return e}if(!be(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let i of Object.keys(e)){if(i.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Fe(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function Z(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(yt.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=Z(i.value,t,n+1)}return o}if(!be(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Z(s.value,t,n+1)}return r}var Kr=Symbol("oracle.provider-failure-metadata"),_i=new Set(["provider-response-too-large","provider-timeout"]);function bt(e,t){let n=t&&typeof t=="object"&&!yt.isProxy(t)?t:null,r=n?Object.getOwnPropertyDescriptor(n,"status"):null,o=r&&Object.hasOwn(r,"value")&&Number.isInteger(r.value)&&r.value>=400&&r.value<=599?r.value:null,s=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},i=s("oversize")===!0?"provider-response-too-large":s("oracleTimeout")===!0||s("name")==="AbortError"||s("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||i!==null)&&Object.defineProperty(e,Kr,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function Zr(e){if(!e||typeof e!="object"||yt.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Kr);if(!t||!Object.hasOwn(t,"value")||!t.value||typeof t.value!="object")return null;let n=Number.isInteger(t.value.status)&&t.value.status>=400&&t.value.status<=599?t.value.status:null,r=_i.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Fn="https://blockstream.info/liquid/api";function vi(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Fn).replace(/\/$/,"")}var xi="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Ri(e){let t=0n;for(let s of e){let i=xi.indexOf(s);if(i<0)return null;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex"),o=e.length-e.replace(/^1+/u,"").length;return Buffer.concat([Buffer.alloc(o),r])}function Li(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return Xr("sha256").update(Xr("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var Pi="qpzry9x8gf2tvdw0s3jn54khce6mua7l",Qr=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function Ci(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<Qr.length;o+=1)r>>BigInt(o)&1n&&(t^=Qr[o])}return t}function ji(e){let t=0,n=0,r=[];for(let o of e)for(t=t<<5|o,n+=5;n>=8;)n-=8,r.push(t>>n&255);return n>=5||(t<<8-n&255)!==0?null:r}function en(e){let t=String(e??"").trim();if(t!==t.toLowerCase()&&t!==t.toUpperCase())return!1;let n=t.toLowerCase(),r=n.lastIndexOf("1");if(r<1||r+13>=n.length)return!1;let o=n.slice(0,r);if(!["lq","tlq","el"].includes(o))return!1;let s=[];for(let f of n.slice(r+1)){let u=Pi.indexOf(f);if(u<0)return!1;s.push(u)}let i=[...o].map(f=>f.charCodeAt(0)>>5).concat([0],[...o].map(f=>f.charCodeAt(0)&31),s),a=s[0],c=a===0?1n:0x455972a3350f7a1n;if(a>16||Ci(i)!==c)return!1;let d=ji(s.slice(1,-12));if(!d||d.length<35||d.length>73||![2,3].includes(d[0]))return!1;let l=d.length-33;return l>=2&&l<=40&&(a!==0||[20,32].includes(l))}function jt(e){let t=String(e??"").trim();if(en(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=Ri(t);return!!(n&&n.length===59&&Li(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function ki(e,t="address"){let n=String(e||"").trim(),o=(n===n.toLowerCase()||n===n.toUpperCase())&&/^(?:ex1|tex1)[a-z0-9]{20,200}$/i.test(n)||en(n),s=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||jt(n);if(!o&&!s)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (P/Q P2PKH, G/H P2SH, ex1\u2026, lq1\u2026)`);return o?n.toLowerCase():n}async function Di(e,t={}){return Z(await K(`${vi(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function eo(e={},t={}){let n=ki(e.address||e.addr,"address"),r=await Di(`/address/${n}`,t);if(!r||typeof r!="object"||Array.isArray(r)||!r.chain_stats||typeof r.chain_stats!="object"||Array.isArray(r.chain_stats)||!r.mempool_stats||typeof r.mempool_stats!="object"||Array.isArray(r.mempool_stats)||!Number.isFinite(Number(r.chain_stats.tx_count))||!Number.isFinite(Number(r.mempool_stats.tx_count)))throw new Error("liquid-esplora: address info returned an invalid response");let o=r.chain_stats,s=r.mempool_stats,i=m=>{if(Number.isSafeInteger(m)&&m>=0)return m;if(typeof m!="string"||!/^\d+$/u.test(m))return null;let g=Number(m);return Number.isSafeInteger(g)&&g>=0?g:null},a=i(o.tx_count),c=i(s.tx_count);if(a==null||c==null)throw new Error("liquid-esplora: address info returned invalid transaction counts");let d=a+c;if(!Number.isSafeInteger(d))throw new Error("liquid-esplora: address info returned invalid transaction counts");let l=[o.funded_txo_sum,o.spent_txo_sum,s.funded_txo_sum,s.spent_txo_sum],f=l.some(m=>m!=null),u=f?l.map(i):[];if(f&&u.some(m=>m==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let h=f?u[0]+u[2]:null,p=f?u[1]+u[3]:null;if(f&&(!Number.isSafeInteger(h)||!Number.isSafeInteger(p)||p>h))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:d,balanceSats:f?String(h-p):null,confidential:jt(n),note:f?void 0:jt(n)?"Liquid amounts are blinded; unblind locally with the wallet's blinding key.":"Liquid balance sums were unavailable from Esplora.",chainStats:o,mempoolStats:s,raw:r}}import{types as io}from"node:util";import{base58 as to}from"@scure/base";function no(e,t,n,r,o=!1){if(typeof e!="string"||e.length<t||e.length>n||!/^[1-9A-HJ-NP-Za-km-z]+$/u.test(e)||Ze(e))return!1;try{let s=to.decode(e);return s.length===r&&(!o||!Xe(s))&&to.encode(s)===e}catch{return!1}}function tn(e){return no(e,32,44,32)}function nn(e){return no(e,64,88,64,!0)}var Vn="oracle.investigator-cursor/1",$i=2*1024,Mi=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),ro=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),Ui=Object.freeze(["block_number","index"]),zn=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Fi(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function ao(e,t=new Set){if(!e||typeof e!="object"||Object.isFrozen(e)||t.has(e))return e;t.add(e);for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&Object.hasOwn(r,"value")&&ao(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function M(e){throw new zn(e)}function co(e,t){return(!e||typeof e!="object"||io.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&M(`${t} must be a plain object`),e}function rn(e,t,n){co(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&M(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return Fi(a)||M(`${n}.toJSON is invalid`),!1}),s=t.filter(i=>!Object.hasOwn(e,i));(o.length!==t.length||o.some(i=>!r.has(i))||s.length)&&M(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&M(`${n} fields must be enumerable own data`)}}function fe(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&M(`${n} fields must be own data`),r.value}function Ve(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&M(`${t} is invalid`),e}function oo(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=Ve(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||J(t))&&M("chain is invalid"),t}function Vi(e){return e===e.toLowerCase()||e===e.toUpperCase()}function zi(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Bi(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;return n===null||zi(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function so(e,t,n){let r=Ve(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&M("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!tn(r))&&M("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Vi(r),s=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),i=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!s||!i)&&M("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Bi(r):null;return o||M("address is invalid for the cursor family"),o}M("family does not support cursors")}function Hi(e){rn(e,Ui,"EVM payload");let t=fe(e,"block_number","cursor"),n=fe(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&M("EVM payload values are invalid"),{block_number:t,index:n}}function qi(e){rn(e,["lt","hash"],"TON payload");let t=Ve(fe(e,"lt","cursor"),"TON payload.lt",40),n=Ve(fe(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||Ze(n))&&M("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||Xe(r))&&M("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function Gi(e,t){if(e==="evm")return Hi(t);if(e==="ton")return qi(t);let n=Ve(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&M("Bitcoin payload must be a transaction id"),e==="solana"&&!nn(n)&&M("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||M(`${e} does not support cursors`),n}function Wi(e){let t=r=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if((!r||typeof r!="object"||io.isProxy(r))&&M("envelope is not own-data JSON"),Array.isArray(r)){let s=[];for(let i=0;i<r.length;i+=1){let a=Object.getOwnPropertyDescriptor(r,String(i));(!a||!Object.hasOwn(a,"value"))&&M("envelope is not own-data JSON"),s.push(t(a.value))}return`[${s.join(",")}]`}let o=[];for(let s of Object.keys(r))o.push(`${JSON.stringify(s)}:${t(fe(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>$i&&M("envelope exceeds the byte limit")}function Et(e,t={}){if(e==null)return null;rn(e,Mi,"envelope"),fe(e,"schemaVersion","cursor")!==Vn&&M("schemaVersion is unsupported");let n=Ve(fe(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(ro,n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))&&M("family is invalid");let r=oo(fe(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&M("chain is invalid for the cursor family");let o=so(n,r,fe(e,"address","cursor")),s=Ve(fe(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==ro[n]||J(s))&&M("provider is invalid"),co(t,"expected binding");let i=h=>Object.hasOwn(t,h)?fe(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:Ve(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:oo(i("chain")),d=i("address")===void 0?void 0:so(n,r,i("address")),l=i("provider")===void 0?void 0:Ve(i("provider"),"expected provider",64);a!==void 0&&n!==a&&M("family binding does not match the request"),c!==void 0&&r!==c&&M("chain binding does not match the request"),d!==void 0&&o!==d&&M("address binding does not match the request"),l!==void 0&&s!==l&&M("provider binding does not match the request");let f=Gi(n,fe(e,"payload","cursor")),u={schemaVersion:Vn,family:n,chain:r,address:o,provider:s,payload:f};return Wi(u),ao(u)}function lo(e,t){return rn(e,["family","chain","address","provider"],"binding"),Et({schemaVersion:Vn,family:fe(e,"family","binding"),chain:fe(e,"chain","binding"),address:fe(e,"address","binding"),provider:fe(e,"provider","binding"),payload:t},e)}function dt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))dt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var cn="oracle.investigator-collection/1",Ji=dt(["wallet","token","tx","launch"]),Mt=dt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),Yi=dt(["COMPLETE","PARTIAL","UNKNOWN"]),Pe=dt({maxDepth:3,maxNodes:250,maxEdges:1e3}),au=dt({depth:2,nodes:100,edges:400});var ie=dt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),cu=new Set(Ji),lu=new Set(Mt),du=new Set(Yi);var Ki=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,mo=/^(?:ibc\/[0-9a-fA-F]{64}|(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/,Zi=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),Xi=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,Qi=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,ea=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),ta=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),na=new Set(["auth","key","token","xapikey"]),ra=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),oa=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),ln=32,uo=64,sa=5,ia=512,aa=262144,qn=262144,ho=524288,sn=524288,kt=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function I(e,t){throw new kt(e,t)}function an(e,t){return(!e||typeof e!="object"||$t.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&I(`${t} must be a plain object`,"invalid-object"),e}function Kn(e,t,n){an(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&I(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});(o.length>r.size||o.some(s=>!r.has(s)))&&I(`${n} has unknown field(s)`,"unknown-field");for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!i.enumerable||!Object.hasOwn(i,"value"))&&I(`${n}.${s} must be enumerable own data`,"invalid-component")}return e}function go(e){if(!/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e))return!1;let t=e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1");return!J(t)}function ca(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Zn(e){if(typeof e!="string")return null;if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}return t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0])||![0,255].includes(t[1])||ca(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function la(e){return Zn(e)!==null}var da="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ua(e){let t=0n;for(let o of e){let s=da.indexOf(o);if(s<0)return null;t=t*58n+BigInt(s)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex");return Buffer.concat([Buffer.alloc(e.length-e.replace(/^1+/u,"").length),r])}function fa(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=ua(e);if(!t||t.length!==59||t[0]!==12||![39,57].includes(t[1])||![2,3].includes(t[2]))return!1;let n=t.subarray(0,-4);return Hn("sha256").update(Hn("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function pa(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||en(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||fa(e)||/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(e)||/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)||la(e)}function ma(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?pa(e):t==="coinType"?go(e):t==="denom"?/^ibc\/[0-9a-fA-F]{64}$/u.test(e):t==="ibcHash"||t==="assetId"?/^[0-9a-fA-F]{64}$/u.test(e):t==="digest"?/^sha256:[0-9a-f]{64}$/u.test(e):mo.test(e)}function Gn(e,t,n){if(n>12&&I("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>ho&&I("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||$t.isProxy(e))&&I("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&I("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-component"),t.active.add(e);try{if(Array.isArray(e)){for(let c of Object.getOwnPropertyNames(e))c!=="length"&&(c==="toJSON"&&Object.getOwnPropertyDescriptor(e,c)?.value===void 0||/^(?:0|[1-9]\d*)$/u.test(c)||I("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>sn&&I("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));(!d||!Object.hasOwn(d,"value"))&&I("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Gn(d.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(a,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(a)}let r=Object.getPrototypeOf(e);r!==Object.prototype&&r!==null&&I("value must be a plain object","invalid-component");let o=Object.getOwnPropertyNames(e);for(let a of o){let c=Object.getOwnPropertyDescriptor(e,a);a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0||(!c||!c.enumerable||!Object.hasOwn(c,"value"))&&I(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>sn&&I("value exceeds the freeze field limit","data-limit");let i=r===null?Object.create(null):{};for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Gn(c.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(i,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(i)}finally{t.active.delete(e)}}function ze(e){return Gn(e,{nodes:0,fields:0,active:new Set},0)}function B(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&I(`${t} must be an own data field`,"invalid-component"),n.value}function Wn(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&I(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function yo(e,t,{max:n=ia,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&I(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&Qi.test(e)||r&&(mo.test(e)||go(e))||o&&ma(e,o))&&!Xi.test(e);return J(e)&&!i&&I(`${t} contains secret-shaped material`,"secret-material"),e}function ha(e,t){(!Ki.test(e)||/^[0-9a-f]{64}$/iu.test(e)||J(e))&&I(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!ra.has(n);return(na.has(n)||r||oa.some(o=>n.includes(o)))&&I(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function dn(e,t,n,r="data-limit"){$t.isProxy(e)&&I(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||I(`${t} must be an array`,"invalid-component"),e.length>n&&I(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){Object.hasOwn(e,s)||I(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&I(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function Jn(e,t){if(!Number.isInteger(t)||t<1||e.length<t)return;let n=Object.getOwnPropertyDescriptor(e,String(e.length-t));return n&&Object.hasOwn(n,"value")?n.value:void 0}function ga(e){let t=Jn(e,1);return typeof t=="string"&&Zi.has(t)?t:e.length===2&&e[0]==="subject"&&e[1]==="identifier"?"identifier":e.length===2&&e[0]==="node"&&e[1]==="reference"?"reference":e.length===2&&e[0]==="evidence"&&e[1]==="subject"||e.length===3&&e[0]==="evidence"&&Number.isInteger(e[1])&&e[2]==="subject"?"subject":null}function ya(e){let t=Jn(e,1);return typeof t=="string"&&ea.has(t)?!0:Number.isInteger(t)&&ta.has(Jn(e,2))}function Dt(e,t,n,r,o){if(n>sa&&I(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>aa&&I(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return yo(e,t,{publicIdentifierField:ga(o),allowDeterministicRecordId:ya(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||$t.isProxy(e))&&I(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&I(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>uo&&I(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),dn(e,t,uo).map((a,c)=>Dt(a,`${t}[${c}]`,n+1,r,[...o,c]));an(e,t);let s=Object.keys(e);s.length>ln&&I(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){ha(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,Dt(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function Yn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&I("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>ho&&I("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&$t.isProxy(e)&&I("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&I("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=dn(e,"canonical value",ie.evidence,"invalid-json");return r.fields+=c.length,r.fields>sn&&I("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Yn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&I("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>ln&&I("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>sn&&I("value exceeds canonical JSON field limit","invalid-json"),i.sort(),`{${i.map(c=>{let d=Object.getOwnPropertyDescriptor(e,c);return(!d||!Object.hasOwn(d,"value"))&&I("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Yn(d.value,r,n+1)}`}).join(",")}}`}finally{r.active.delete(e)}}(e===void 0||typeof e=="bigint"||typeof e=="function"||typeof e=="symbol"||typeof e=="number"&&!Number.isFinite(e))&&I("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&I("value is not canonical JSON","invalid-json"),o}function et(e){return`sha256:${Hn("sha256").update(Yn(e)).digest("hex")}`}function tt(e,t){let n=yo(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||I("id kind must be a lowercase slug","invalid-id"),`${n}_${et(t).slice(7)}`}function on(e,t,n,r){let o=dn(e,t,n,"component-limit");return r.fields+=o.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>Dt(s,`${t}[${i}]`,0,r,[t,i]))}function Xn(e){let t=["subject","entities","events","evidence","coverage","gaps"];Kn(e,t,"components"),Wn(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=Dt(B(e,"subject"),"subject",0,n,["subject"]),o=on(B(e,"entities"),"entities",Pe.maxNodes,n),s=on(B(e,"events"),"events",Pe.maxEdges,n),i=on(B(e,"evidence"),"evidence",ie.evidence,n),a=Dt(B(e,"coverage"),"coverage",0,n,["coverage"]),c=on(B(e,"gaps"),"gaps",Pe.maxNodes,n);return ze({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}var fo=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),ba=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function Ea(e,t,n){if(e===null)return null;if(Kn(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&I("collector output.cursor fields are invalid","invalid-cursor"),B(e,"requested")===null&&B(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&I("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:Et(B(e,"requested"),r),next:Et(B(e,"next"),r)}}catch{I("collector cursor binding or payload is invalid","invalid-cursor")}}function Bn(e,t){let n=new Set;for(let r of e)(!r||typeof r!="object"||!Object.hasOwn(r,"id")||typeof r.id!="string"||r.id.length===0)&&I(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&I(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function Oa(e){let t=e.subject,n=typeof t.chain=="string"&&t.chain.length>0||Number.isSafeInteger(t.chain)&&t.chain>=0;(!Object.hasOwn(t,"family")||typeof t.family!="string"||t.family.length===0||!Object.hasOwn(t,"chain")||!n||!Object.hasOwn(t,"address")||typeof t.address!="string"||t.address.length===0)&&I("collector subject identity is invalid","invalid-reference");let r=e.coverage.source;(!Object.hasOwn(e.coverage,"source")||r!==null&&(typeof r!="string"||r.length===0)||e.coverage.collectorStatus!=="UNAVAILABLE"&&r===null)&&I("collector coverage source is invalid","invalid-reference");let o=Bn(e.entities,"entity");e.entities.some(i=>Object.hasOwn(i,"family")&&i.family===t.family&&Object.hasOwn(i,"chain")&&i.chain===t.chain&&Object.hasOwn(i,"address")&&i.address===t.address)||I("collector subject entity reference is missing","invalid-reference"),Bn(e.events,"event");let s=Bn(e.evidence,"evidence");for(let i of e.events){for(let a of["from","to"])(!Object.hasOwn(i,a)||i[a]!=null&&(typeof i[a]!="string"||!o.has(i[a])))&&I(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(i,"evidenceRefs")||!Array.isArray(i.evidenceRefs)||i.evidenceRefs.some(a=>typeof a!="string"||!s.has(a))||new Set(i.evidenceRefs).size!==i.evidenceRefs.length)&&I("collector event evidence references are invalid","invalid-reference")}}function po(e,t,n=ln){let r=Object.keys(e);r.length>n&&I(`${t} exceeds the field limit`,"data-limit");let o=[];for(let s of r){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!Object.hasOwn(i,"value"))&&I(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function Qn(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];Kn(e,t,"collector output"),Wn(e,t,"collector output"),B(e,"schemaVersion")!==cn&&I("collector output.schemaVersion is unsupported","invalid-schema-version"),B(e,"execution")!=="read-only"&&B(e,"execution")!=="READ_ONLY"&&I("collector output must be read-only","invalid-posture"),ba.has(B(e,"status"))||I("collector output.status is invalid","invalid-status"),Array.isArray(B(e,"evidence"))||I("collector output.evidence must be an array","invalid-component"),an(B(e,"coverage"),"collector output.coverage");let n=Xn({subject:B(e,"subject"),entities:B(e,"entities"),events:B(e,"events"),evidence:dn(B(e,"evidence"),"collector output.evidence",Pe.maxEdges,"component-limit").map(o=>{an(o,"collector evidence"),Wn(o,["status"],"collector evidence");let s=B(o,"status"),i=typeof s=="string"&&Object.hasOwn(fo,s)?fo[s]:null;return i||I("collector evidence status is invalid","invalid-status"),{...po(o,"collector evidence"),status:i}}),coverage:{...po(B(e,"coverage"),"collector coverage",ln-1),collectorStatus:B(e,"status")},gaps:B(e,"gaps")});Oa(n);let r=Ea(B(e,"cursor"),n.subject,n.coverage.source);return ze({...n,cursor:r})}import{types as mr}from"node:util";var un=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"}),er=Object.freeze(["block_number","index"]),bo=new Set([...er,"items_count","value","hash","inserted_at","fee"]);function Ut(e){return Number.isSafeInteger(e)&&e>=0}function nt(e,t,n,r=!1){let o=Object.getOwnPropertyDescriptor(e,t);if(!o){if(r)throw new Error(`${n} is missing a cursor field`);return}if(!o.enumerable||!Object.hasOwn(o,"value"))throw new Error(`${n} cursor fields must be enumerable own data`);return o.value}function wa(e){if(!be(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==er.length||t.some(o=>!er.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=nt(e,"block_number","blockscout transaction",!0),r=nt(e,"index","blockscout transaction",!0);if(!Ut(n)||!Ut(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function Aa(e){if(!be(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>bo.size||t.some(a=>!bo.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=nt(e,"block_number","blockscout provider",!0),r=nt(e,"index","blockscout provider",!0);if(!Ut(n)||!Ut(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=nt(e,"items_count","blockscout provider");if(o!==void 0&&!Ut(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=nt(e,a,"blockscout provider");if(c!==void 0&&(typeof c!="string"||c.length===0||c.length>100||!/^\d+$/u.test(c)))throw new Error("blockscout transactions returned an invalid next cursor")}let s=nt(e,"hash","blockscout provider");if(s!==void 0&&(typeof s!="string"||!/^0x[0-9a-f]{64}$/iu.test(s)))throw new Error("blockscout transactions returned an invalid next cursor");let i=nt(e,"inserted_at","blockscout provider");if(i!==void 0&&(typeof i!="string"||i.length>64||!Number.isFinite(Date.parse(i))))throw new Error("blockscout transactions returned an invalid next cursor");return{block_number:n,index:r}}function Ia(e,t={}){let n=Number(e),r=t.baseUrl||un[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Eo(e){return!!un[Number(e)]}async function Oo(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=Math.min(50,Math.max(1,Math.trunc(Number(e.limit)||20))),o=new URLSearchParams,s=e.cursor;if(s!=null){let h=wa(s);for(let[p,m]of Object.entries(h))m!=null&&o.set(p,String(m))}let i=`${Ia(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=Z(await K(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,headers:{accept:"application/json","user-agent":"OracleInvestigator/1.0"}}),"blockscout transactions response"),c=he(a,"items");if(!be(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,f=he(a,"next_page_params");if(f!=null){if(!be(f))throw new Error("blockscout transactions returned an invalid next cursor");l=Aa(f)}let u=c.length>d.length?null:l;return{provider:"blockscout",chainId:n,address:String(e.address),limit:r,cursor:s??null,nextCursor:u,pageComplete:c.length<=d.length&&l==null,count:d.length,truncated:c.length>d.length,transactions:d,raw:{items:d,next_page_params:u}}}var Sa="mainnet-beta",tr="https://api.mainnet-beta.solana.com";function Na(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||tr).trim()}function Ta(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}async function _a(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=Z(await K(Na(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!be(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=he(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${he(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return he(o,"result")}async function wo(e={},t={}){let n=Ta(e.address||e.account,"address"),r=Math.min(1e3,Math.max(1,Math.trunc(Number(e.limit)||20))),o={limit:r};e.before&&(o.before=String(e.before)),e.until&&(o.until=String(e.until)),e.commitment&&(o.commitment=String(e.commitment)),e.minContextSlot!=null&&(o.minContextSlot=Number(e.minContextSlot));let s=await _a("getSignaturesForAddress",[n,o],t);if(!Array.isArray(s))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let i=s.slice(0,r);return{provider:"solana-rpc",cluster:Sa,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:i.length===r?i[i.length-1]?.signature??null:null,pageComplete:s.length<r,count:i.length,truncated:s.length>i.length,signatures:i,raw:i}}var va="mainnet",nr="https://mempool.space/api",rr="https://mempool.space/testnet/api";function Ao(e={}){return String(e.network||process.env.BTC_NETWORK||va).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function xa(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Ao(e)==="testnet"?rr:nr}function Ra(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}async function La(e,t={}){let n=`${xa(t)}${e.startsWith("/")?e:`/${e}`}`;return Z(await K(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function Io(e={},t={}){let n=Ra(e.address||e.addr,"address"),r=Math.min(25,Math.max(1,Math.trunc(Number(e.limit)||20))),o=e.cursor||e.lastSeenTxid||null;if(o!=null&&!/^[0-9a-f]{64}$/i.test(String(o)))throw new Error("bitcoin-esplora: transaction cursor must be a 64-char txid");let s=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,i=await La(s,t);if(!Array.isArray(i))throw new Error("bitcoin-esplora address history returned an invalid response");let a=i.slice(0,r),c=i.length>a.length,d=!c&&i.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:Ao(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:d,pageComplete:!c&&i.length<25,count:a.length,truncated:c,transactions:a,raw:a}}var or="https://api.hyperliquid.xyz/info",sr="https://api.hyperliquid-testnet.xyz/info";function Pa({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let n=process.env.HL_API_URL.replace(/\/$/,"");return n.endsWith("/info")?n:`${n}/info`}return e||process.env.HL_TESTNET==="1"?sr:or}async function Ca(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Pa(t);return Z(await K(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function So(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Ca({type:"userFills",user:e},t)}var No="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ot({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let i=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(i===String(t).replace(/\/$/,""))return{baseUrl:i,trusted:!0,host:To(t)};let a;try{a=new URL(i)}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([To(t),...n]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:i,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:i,trusted:!0,host:c}}if(String(process.env[No]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${No}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function To(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ce(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function wt(e,t,n){let r={...e};if(!n)return r;for(let[o,s]of Object.entries(t||{}))s&&(r[o]=s);return r}var ir="https://api.trongrid.io",ja=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],ka="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function Da(e={}){return Ot({provider:"tron-public",defaultUrl:ir,hosts:ja,url:e.baseUrl||process.env.TRON_API_URL||""})}function $a(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return Ce(t)}function Ma(e,t){return wt({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Ua(e,t={}){let n=Da(t),r=$a(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Ma(n.trusted,r)}),"tron-public response");return Fe(o,n.trusted?r:"","tron-public response")}function _o(e,t="address"){let n=String(e??"").trim();if(!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(n))throw new Error(`tron-public: ${t} must be a base58 Tron address (T\u2026)`);return n}function Fa(e){return bt({error:"tron-public request failed"},e)}function Va(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}async function vo(e={},t={}){try{let n=_o(e.address||e.account,"address"),r=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||20)))),o=Math.min(200,r+1),s=new URLSearchParams({limit:String(o)}),i=e.contract===void 0?ka:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",_o(i,"contract")),e.onlyConfirmed!==!1&&s.set("only_confirmed","true"),e.minTimestamp&&s.set("min_timestamp",String(Number(e.minTimestamp))),e.maxTimestamp&&s.set("max_timestamp",String(Number(e.maxTimestamp)));let a=await Ua(`/v1/accounts/${n}/transactions/trc20?${s.toString()}`,t);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.data))throw new Error("tron-public: TRC20 transfers returned an invalid response");let c=a.data.slice(0,r+1),d=c.slice(0,r);return{provider:"tron-public",address:n,contract:i&&String(i).toLowerCase()!=="all"?String(i):null,limit:r,count:d.length,truncated:c.length>r||!!a.meta?.links?.next,pageComplete:c.length<o&&!a.meta?.links?.next,transfers:d.map(l=>({txId:l.transaction_id??null,from:l.from??null,to:l.to??null,direction:l.from===n?"out":l.to===n?"in":null,raw:l.value==null?null:String(l.value),amount:l.value==null?null:Va(l.value,l.token_info?.decimals),symbol:l.token_info?.symbol??null,decimals:l.token_info?.decimals??null,tokenAddress:l.token_info?.address??null,blockTimestamp:l.block_timestamp??null,type:l.type??null}))}}catch(n){return Fa(n)}}var lr="https://toncenter.com/api",za=["toncenter.com","testnet.toncenter.com"];function Ba(e={}){return Ot({provider:"ton-public",defaultUrl:lr,hosts:za,url:e.baseUrl||process.env.TON_API_URL||""})}function Ha(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return Ce(t)}function qa(e,t){return wt({Accept:"application/json"},{"X-API-Key":t},e)}async function Ga(e,t={}){let n=Ba(t),r=Ha(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:qa(n.trusted,r)}),"ton-public response");return Fe(o,n.trusted?r:"","ton-public response")}function Wa(e,t="address"){let n=String(e??"").trim();if(/^-?\d+:[0-9a-fA-F]{64}$/.test(n)||/^[A-Za-z0-9_-]{48}$/.test(n))return n;throw new Error(`ton-public: ${t} must be a raw (0:hex) or base64url TON address`)}function Ja(e){return bt({error:"ton-public request failed"},e)}function Ya(e,t){if(!be(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(he(e,"ok")===!1)throw new Error(`ton-public: ${t} was rejected`);if(!Object.hasOwn(e,"result"))throw new Error(`ton-public: ${t} response is missing result`);return he(e,"result")}function ar(e){let t=String(e??"").trim();if(Ze(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(t))throw new Error("ton-public: transaction hash is invalid");let n=Buffer.from(t.replace(/-/g,"+").replace(/_/g,"/"),"base64");if(n.length!==32||Xe(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function cr(e,t,{nullable:n=!0}={}){if(e==null&&n)return null;let r=typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?String(e):e;if(typeof r!="string"||r.length===0||r.length>100||!/^\d+$/u.test(r))throw new Error(`ton-public: ${t} is not a bounded unsigned amount`);return r}async function xo(e={},t={}){try{let n=Wa(e.address||e.account,"address"),r=Math.min(100,Math.max(1,Math.trunc(Number(e.limit||10)))),o=e.lt!==void 0||e.hash!==void 0;if(o&&(e.lt===void 0||e.hash===void 0))throw new Error("ton-public: transaction cursor requires both lt and hash");let s=o?{lt:String(e.lt),hash:ar(e.hash)}:null;if(s&&!/^\d+$/u.test(s.lt))throw new Error("ton-public: transaction cursor lt is invalid");let i=s?Math.min(100,r+1):r,a=new URLSearchParams({address:n,limit:String(i)});s&&(a.set("lt",s.lt),a.set("hash",s.hash));let c=Ya(await Ga(`/v2/getTransactions?${a.toString()}`,t),"getTransactions");if(!Array.isArray(c))throw new Error("ton-public: getTransactions returned an invalid response");let d=c.slice(0,i);if(s){let m=d[0]?.transaction_id,g=m?.hash==null?null:ar(m.hash);if(String(m?.lt??"")!==s.lt||g!==s.hash)throw new Error("ton-public: cursor boundary was not returned exactly");d.shift()}let f=d.slice(0,r).map(m=>{if(!m||typeof m!="object"||!m.transaction_id||typeof m.transaction_id!="object")throw new Error("ton-public: malformed transaction row");let g=ar(m.transaction_id.hash),y=String(m.transaction_id.lt??"");if(y.length>100||!/^\d+$/u.test(y))throw new Error("ton-public: malformed transaction logical time");if(m.in_msg!=null&&(typeof m.in_msg!="object"||Array.isArray(m.in_msg)))throw new Error("ton-public: malformed inbound message");if(m.out_msgs!=null&&!Array.isArray(m.out_msgs))throw new Error("ton-public: malformed outbound messages");let E=Array.isArray(m.out_msgs),S=m.out_msgs??[];if(S.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let _=0n;for(let C of S){if(!C||typeof C!="object"||Array.isArray(C))throw new Error("ton-public: malformed outbound message");_+=BigInt(cr(C.value??"0","outbound message value",{nullable:!1}))}let R=E?String(_):null;if(R!=null&&R.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:m.utime??null,feeNano:cr(m.fee,"transaction fee"),inMessageValueNano:cr(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:S.length,outMessageValueNano:R}}),u=c.length>=i,h=f.length>0?f[f.length-1]:null,p=u&&h?{lt:h.lt,hash:h.hash}:null;return{provider:"ton-public",address:n,limit:r,count:f.length,cursor:s,nextCursor:p,pageComplete:!u,continuationUnknown:u&&!p,transactions:f}}catch(n){return Ja(n)}}var Be=Object.freeze({cosmoshub:Object.freeze({lcd:"https://cosmos-rest.publicnode.com",denom:"uatom",symbol:"ATOM",decimals:6,prefix:"cosmos"}),osmosis:Object.freeze({lcd:"https://osmosis-rest.publicnode.com",denom:"uosmo",symbol:"OSMO",decimals:6,prefix:"osmo"}),celestia:Object.freeze({lcd:"https://celestia-rest.publicnode.com",denom:"utia",symbol:"TIA",decimals:6,prefix:"celestia"}),injective:Object.freeze({lcd:"https://injective-rest.publicnode.com",denom:"inj",symbol:"INJ",decimals:18,prefix:"inj"}),neutron:Object.freeze({lcd:"https://rest.cosmos.directory/neutron",denom:"untrn",symbol:"NTRN",decimals:6,prefix:"neutron"}),dydx:Object.freeze({lcd:"https://dydx-rest.publicnode.com",denom:"adydx",symbol:"DYDX",decimals:18,prefix:"dydx"}),noble:Object.freeze({lcd:"https://rest.cosmos.directory/noble",denom:"uusdc",symbol:"USDC",decimals:6,prefix:"noble"}),kava:Object.freeze({lcd:"https://kava-rest.publicnode.com",denom:"ukava",symbol:"KAVA",decimals:6,prefix:"kava"})}),Ro="cosmoshub";function Ka(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function Za(e={},t={}){let n=(c,d)=>c!=null&&Object.hasOwn(Object(c),d)?c[d]:void 0,r=String(n(e,"chain")||n(t,"chain")||process.env.COSMOS_CHAIN||Ro).trim().toLowerCase(),o=Object.hasOwn(Be,r)?Be[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=Ka(r)||r===Ro&&process.env.COSMOS_LCD_URL||"",a=(s||i||o?.lcd||"").replace(/\/$/,"");if(!a)throw new Error(`cosmos-lcd: unknown chain '${r}' \u2014 pass lcdUrl or set COSMOS_LCD_URL_${r.toUpperCase()} (known: ${Object.keys(Be).join(", ")})`);return{chain:r,lcd:a,nativeDenom:o?.denom??null,symbol:o?.symbol??null,decimals:o?.decimals??null,prefix:o?.prefix??null,known:!!o}}async function Xa(e,t,n={}){return Z(await K(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly,headers:{Accept:"application/json"}}),"cosmos-lcd response")}function Qa(e,t="address"){let n=String(e??"").trim();if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new Error(`cosmos-lcd: ${t} must be a uniformly-cased bech32 Cosmos address`);let r=n.toLowerCase();if(!/^[a-z][a-z0-9]{1,15}1[02-9ac-hj-np-z]{6,90}$/.test(r))throw new Error(`cosmos-lcd: ${t} must be a bech32 Cosmos address`);return r}function ec(e){return{error:String(e?.message||e).slice(0,200)}}function tc(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}function nc(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function rc(e,t){let n=e?.denom??null,r=e?.amount==null?null:String(e.amount),o=n!=null&&n===t.nativeDenom;return{denom:n,amount:r,ibcHash:nc(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?tc(r,t.decimals):null}}async function Lo(e={},t={}){try{let n=Za(e,t),r=Qa(e.address||e.account,"address"),o=Math.min(500,Math.max(1,Math.trunc(Number(e.limit||100)))),s=Math.min(501,o+1),i=await Xa(n,`/cosmos/bank/v1beta1/balances/${r}?pagination.limit=${s}`,t);if(!i||typeof i!="object"||Array.isArray(i)||!Array.isArray(i.balances))throw new Error("cosmos-lcd: balances returned an invalid response");let a=i.balances.slice(0,o+1),d=a.slice(0,o).map(f=>rc(f,n)),l=d.find(f=>f.native)||null;return{provider:"cosmos-lcd",chain:n.chain,lcd:n.lcd,address:r,count:d.length,truncated:a.length>o||!!i.pagination?.next_key,nativeDenom:n.nativeDenom,nativeAmount:l?.amount??"0",native:l?.display??null,ibcDenomCount:d.filter(f=>f.ibcHash).length,balances:d,nextKey:i?.pagination?.next_key??null}}catch(n){return ec(n)}}var ur="https://fullnode.mainnet.aptoslabs.com",dr="0x1::aptos_coin::AptosCoin",fn=8;function jo(e={}){return Ot({provider:"aptos-public",defaultUrl:ur,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function ko(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return Ce(t)}function Do(e,t){return wt({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function Po(e,t={}){let n=jo(t),r=ko(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Do(n.trusted,r)}),"aptos-public response");return Fe(o,n.trusted?r:"","aptos-public response")}function oc(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`aptos-public: ${t} must be a 0x-prefixed Aptos address`);return`0x${n.slice(2).padStart(64,"0")}`}function sc(e){return bt({error:"aptos-public request failed"},e)}function Co(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}function ic(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function $o(e={},t={}){try{let n=oc(e.address||e.owner,"address"),r=e.coinType?String(e.coinType).trim():"",o=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||200))));if(r){let f=null,u="view";try{let p=jo(t),m=ko(t),g=Fe(Z(await K(`${p.baseUrl}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Do(p.trusted,m)}),"aptos-public view response"),p.trusted?m:"","aptos-public view response");if(!Array.isArray(g)||g.length===0||!/^\d+$/u.test(String(g[0])))throw new Error("aptos-public: coin balance view returned an invalid response");f=String(g[0])}catch{u="coinstore";let p=await Po(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(p?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");f=String(p.data.coin.value)}let h=r===dr;return{provider:"aptos-public",address:n,source:u,count:1,balances:[{coinType:r,raw:f??"0",decimals:h?fn:null,symbol:h?"APT":null,amount:h?Co(f??"0",fn):null}]}}let s=Math.min(201,o+1),i=await Po(`/v1/accounts/${n}/resources?limit=${s}`,t);if(!Array.isArray(i))throw new Error("aptos-public: account resources returned an invalid response");let a=i.slice(0,s),c=[];for(let f of a){if(!f||typeof f!="object"||Array.isArray(f)||typeof f.type!="string"||f.type.length===0||f.type.length>512||!f.data||typeof f.data!="object"||Array.isArray(f.data))throw new Error("aptos-public: account resources contained a malformed row");let u=ic(f.type);if(!u)continue;let h=String(f.data?.coin?.value??"");if(!/^\d+$/u.test(h))throw new Error("aptos-public: coin store contained an invalid balance");let p=u===dr;c.push({coinType:u,raw:h,decimals:p?fn:null,symbol:p?"APT":null,amount:p?Co(h,fn):null,frozen:f?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(f=>f.coinType===dr)||null;return{provider:"aptos-public",address:n,source:"coinstore",count:d.length,truncated:i.length>o||c.length>o,aptRaw:l?.raw??"0",apt:l?.amount??"0",balances:d}}catch(n){return sc(n)}}var hr="oracle.investigator-fact-projection/1",Ho=4*1024*1024;function Oe(e){return ze(e)}var rt=ze({evm:Oe({status:"AVAILABLE",mode:"transaction-history",source:"blockscout",chainIds:Object.freeze([1,10,137,324,8453,42161,534352]),chainStatus:Object.freeze({1:"AVAILABLE",10:"AVAILABLE",137:"AVAILABLE",324:"AVAILABLE",8453:"AVAILABLE",42161:"AVAILABLE",534352:"AVAILABLE",56:"UNAVAILABLE",130:"UNAVAILABLE",143:"UNAVAILABLE",360:"UNAVAILABLE",988:"UNAVAILABLE",999:"UNAVAILABLE",1329:"UNAVAILABLE",1868:"UNAVAILABLE",2020:"UNAVAILABLE",2741:"UNAVAILABLE",4326:"UNAVAILABLE",4663:"UNAVAILABLE",5031:"UNAVAILABLE",8333:"UNAVAILABLE",33139:"UNAVAILABLE",43114:"UNAVAILABLE",43419:"UNAVAILABLE",57073:"UNAVAILABLE",69e3:"UNAVAILABLE",80094:"UNAVAILABLE",81457:"UNAVAILABLE",7777777:"UNAVAILABLE"}),maxLimit:50,cursor:"CONDITIONAL",cursorMode:"conditional",cursorReason:"A continuation is exposed only when Blockscout does not over-return and force client truncation",facts:"Bounded Blockscout transaction fact projections"}),solana:Oe({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:Oe({status:"AVAILABLE",mode:"transaction-history",source:"bitcoin-esplora",chainIds:Object.freeze(["mainnet","testnet"]),maxLimit:25,cursor:!0,facts:"Bounded Esplora transaction facts with input/output summaries"}),hyperliquid:Oe({status:"AVAILABLE",mode:"fill-history",source:"hyperliquid-info",chainIds:Object.freeze(["hyperliquid-mainnet","hyperliquid-testnet"]),maxLimit:1e3,cursor:!1,facts:"Bounded public userFills fact projections"}),tron:Oe({status:"AVAILABLE",mode:"trc20-transfer-history",source:"tron-public",chainIds:Object.freeze(["tron-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded confirmed TRC20 transfer facts, not native TRX history"}),ton:Oe({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:Oe({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(Be)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:Oe({status:"EVIDENCE_ONLY",mode:"holdings",source:"aptos-public",chainIds:Object.freeze(["aptos-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded legacy CoinStore holding facts only; Fungible Asset enumeration and transaction history are not collected"}),liquid:Oe({status:"EVIDENCE_ONLY",mode:"address-state",source:"liquid-esplora",chainIds:Object.freeze(["liquid-mainnet"]),maxLimit:1,cursor:!1,facts:"Bounded address transaction-count and confidentiality-form facts only; per-asset balances and transaction timeline are unavailable"}),sui:Oe({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:Oe({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":Oe({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["celestia-mainnet"]),maxLimit:0,cursor:!1,reason:"DA address history is unavailable; Cosmos account state uses family cosmos and chainId celestia"}),unsupported:Oe({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})});var Mo=Object.freeze({eth:"evm",ethereum:"evm",base:"evm",arbitrum:"evm",optimism:"evm",polygon:"evm",polymarket:"evm",bsc:"evm",avalanche:"evm",abstract:"evm",stable:"evm",robinhood:"evm",hyperevm:"evm",sol:"solana",btc:"bitcoin",hl:"hyperliquid","the-open-network":"ton","liquid-bitcoin":"liquid",celestia:"cosmos"}),Uo=Object.freeze({eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999,celestia:"celestia"}),Fo=Object.freeze({evm:1,solana:"mainnet-beta",bitcoin:"mainnet",hyperliquid:"hyperliquid-mainnet",tron:"tron-mainnet",ton:"ton-mainnet",cosmos:"cosmoshub",aptos:"aptos-mainnet",liquid:"liquid-mainnet",sui:"sui-mainnet",stacks:"stacks-mainnet","celestia-da":"celestia-mainnet"}),ac=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),yn=Symbol("missing-public-fact"),pn=8;function cc(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Mo,t)?Mo[t]:t)||"unsupported"}function On(e){return be(e)&&Object.getPrototypeOf(e)===Object.prototype}function U(e,t){return he(e,t)}function Ge(e){return be(e)}function pr(e,t=0){if(t>8)throw new Error("investigator collector: provider row exceeds the nesting bound");if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(mr.isProxy(e)||e.length>1e4)throw new Error("investigator collector: provider array exceeds the length bound");let o=new Array(e.length);for(let s=0;s<e.length;s+=1){if(!Object.hasOwn(e,s))throw new Error("investigator collector: provider array must contain dense own entries");let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider array entries must be own data");o[s]=pr(i.value,t+1)}return o}if(!Ge(e))throw new Error("investigator collector: provider row contains a non-JSON value");let n=Object.keys(e);if(n.length>256)throw new Error("investigator collector: provider row exceeds the field bound");let r=Object.create(null);for(let o of n){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider row fields must be own data");r[o]=pr(s.value,t+1)}return r}function lc(e){if(!On(e))throw new Error("investigator collector: wallet request must be a plain object");let t=new Set(["family","chainId","address","limit","cursor"]);if(Object.getOwnPropertySymbols(e).length>0)throw new Error("investigator collector: wallet request has unknown fields");let n=Object.getOwnPropertyNames(e);if(n.length>t.size||n.some(r=>!t.has(r)))throw new Error("investigator collector: wallet request has unknown fields");for(let r of n){let o=Object.getOwnPropertyDescriptor(e,r);if(!o||!o.enumerable||!Object.hasOwn(o,"value"))throw new Error("investigator collector: wallet request fields must be enumerable own data")}}function dc(e){if(!Ge(e))throw new Error("investigator collector: internal options must be a plain object");let t=new Set(["now","transports","fetchImpl","timeoutMs"]);if(Object.keys(e).filter(s=>!t.has(s)).length)throw new Error("investigator collector: internal options have unknown fields");let r=U(e,"fetchImpl"),o=U(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!On(o))throw new Error("investigator collector: transports must be a plain object");for(let s of Object.keys(o)){let i=Object.getOwnPropertyDescriptor(o,s);if(!i||!Object.hasOwn(i,"value")||typeof i.value!="function")throw new Error("investigator collector: transports must contain own data functions")}}}function uc(e){let t=U(e,"now"),n=typeof t=="function"?t():t??new Date,r=n instanceof Date?n:new Date(n);if(!Number.isFinite(r.getTime()))throw new Error("investigator collector: now must be a valid date");return r.toISOString()}function fc(e,t,n){let r=Object.hasOwn(Uo,t)?Uo[t]:void 0,o=Object.hasOwn(Fo,e)?Fo[e]:void 0,s=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(s)||s<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return s}if(typeof s!="string"||s.length===0||s.length>96||/[\u0000-\u001f\u007f]/u.test(s)||/:\/\//u.test(s)||/^[0-9a-f]{64}$/iu.test(s)||J(s))throw new Error("investigator collector: chainId is invalid");return s}function mn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function pc(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function qo(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[o,s]=e.split(":");return`${o}:${s.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;if(n===null)return null;let r=t[34]<<8|t[35];return pc(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function gr(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&jt(e)}function we(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return tn(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&mn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&mn(n),s=r||/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n),i=o||/^[mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n);return t==="mainnet"?s:t==="testnet"?i:!1}if(e==="tron")return/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(n);if(e==="ton")return qo(n)!==null;if(e==="cosmos"){if(!mn(n))return!1;let r=Object.hasOwn(Be,t)?Be[t]?.prefix:void 0,o=/^([a-z][a-z0-9]{1,15})1[02-9ac-hj-np-z]{6,90}$/u.exec(n.toLowerCase());return!!(o&&(!r||o[1]===r))}return e==="aptos"||e==="sui"?/^0x[0-9a-fA-F]{1,64}$/u.test(n):e==="liquid"?/^ex1[a-z0-9]{20,200}$/iu.test(n)&&mn(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||gr(n):e==="stacks"?/^(?:SP|SM|ST|SN)[A-Z0-9]{20,50}$/u.test(n):e==="celestia-da"?/^celestia1[02-9ac-hj-np-z]{6,90}$/u.test(n):/^[A-Za-z0-9][A-Za-z0-9:._-]{0,255}$/u.test(n)}function ve(e,t){return["evm","hyperliquid","cosmos"].includes(e)?t.toLowerCase():["aptos","sui"].includes(e)?`0x${t.slice(2).toLowerCase().padStart(64,"0")}`:e==="bitcoin"&&/^(?:bc1|tb1)/iu.test(t)||e==="liquid"&&/^(?:ex1|lq1)/iu.test(t)?t.toLowerCase():e==="ton"?qo(t)??t:t}function mc(e,t,n){if(typeof n!="string"||n.length===0||n.length>256||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("investigator collector: address is invalid");let r=n.trim();if(!r||/:\/\//u.test(r)||!we(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&we(e,t,r)||e==="liquid"&&gr(r);if(J(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return ve(e,r)}function hc(e,t){if(t.maxLimit===0){if(e!==void 0)throw new Error("investigator collector: limit is not accepted for an unavailable family");return{requested:null,applied:0}}let n=e??Math.min(20,t.maxLimit);if(!Number.isInteger(n)||n<1||n>t.maxLimit)throw new Error(`investigator collector: limit must be an integer from 1 through ${t.maxLimit}`);return{requested:n,applied:n}}function gc(e,t,n){if(t===rt.unsupported)return;if(![...Array.isArray(t.chainIds)?t.chainIds:[],...Object.keys(t.chainStatus||{}).map(o=>e==="evm"?Number(o):o)].some(o=>String(o)===String(n)))throw new Error(`investigator collector: chainId is not declared for ${e}`)}function Go(e={}){lc(e);let t=U(e,"family"),n=typeof t=="string"?t.trim().toLowerCase():"";if(n.length>63||!/^[a-z][a-z0-9-]*$/u.test(n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))throw new Error("investigator collector: family is invalid");let r=cc(n),o=Object.hasOwn(rt,r)?rt[r]:rt.unsupported,s=fc(r,n,U(e,"chainId"));gc(r,o,s);let i=mc(r,s,U(e,"address")),a=hc(U(e,"limit"),o),c=U(e,"cursor"),d=c===void 0?null:Et(c,{family:r,chain:s,address:i,provider:o.source});if(d&&!o.cursor)throw new Error(`investigator collector: ${r} does not support cursors`);return{requestedFamily:n,family:r,chain:s,address:i,limits:a,cursor:d,capability:o}}function Ft(e,t){return`${e}_${et(t).slice(7,55)}`}function Wo(e,t,n){return Ft("entity",{family:e,chain:t,address:n,kind:"address"})}function yc(e){return{id:Wo(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function wn(e,t,n,r=[]){return{schemaVersion:cn,execution:"read-only",status:t,subject:e,entities:[yc(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function qe(e,t){return{code:e,message:t}}var bn=Object.freeze({"provider-auth":"The upstream provider rejected its credential.","provider-rate-limited":"The upstream provider rate-limited the request.","provider-timeout":"The upstream provider request timed out.","provider-response-too-large":"The upstream response exceeded the allowed byte limit.","provider-invalid-response":"The upstream provider returned an invalid response.","provider-rejected":"The upstream provider rejected the request.","provider-unavailable":"The upstream provider is unavailable."});function gn(e,t="provider-unavailable"){let n=i=>he(e,i),r=n("status"),o=Number.isInteger(r)&&r>=400&&r<=599?r:null,s=t;return n("oversize")===!0?s="provider-response-too-large":o===401||o===403?s="provider-auth":o===408||n("oracleTimeout")===!0||n("name")==="AbortError"||n("name")==="TimeoutError"?s="provider-timeout":o===429?s="provider-rate-limited":o!==null&&o<500?s="provider-rejected":Object.hasOwn(bn,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:bn[s]})}function Jo(e,t,n,r,o,s=!1){return{id:Ft("evidence",{family:r.family,chain:r.chain,address:r.address,source:t,status:e,facts:o}),status:e,source:t,observedAt:n,publicFacts:o,projection:{schemaVersion:hr,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:s,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function fr(e,t,n,r,o,s){let i=t?.source||null,a=he(r,"code"),c=a&&Object.hasOwn(bn,a)?Object.freeze({code:a,httpStatus:he(r,"httpStatus")??null,message:bn[a]}):gn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=wn(e,"UNKNOWN",{mode:t?.mode||"none",source:i,requestedLimit:n?.requested??null,appliedLimit:n?.applied??null,returned:0,historyAvailable:t?.mode!=="holdings"&&t?.status==="AVAILABLE",cursorSupported:t?.cursor||!1,failureCode:c.code,httpStatus:c.httpStatus},[{code:c.code,source:i,status:"UNKNOWN",httpStatus:c.httpStatus,message:c.message}]);return l.evidence.push(Jo("ERROR",i,o,e,d,!0)),l.cursor=t?.cursor?{requested:s,next:null}:null,l}function hn(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=wn(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[qe("unavailable",r)]);return o.evidence.push(Jo("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function bc(e){let t=e==="tron"?["TRONGRID_API_KEY","TRON_PRO_API_KEY"]:e==="ton"?["TONCENTER_API_KEY","TON_API_KEY"]:e==="aptos"?["APTOS_API_KEY"]:[];for(let n of t){let r=Ce(process.env[n]);if(r)return r}return null}function He(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof U(n,"fetchImpl")=="function"?U(n,"fetchImpl"):void 0,timeoutMs:U(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:Ho,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:un[Number(t.chainId)]}):e==="solana"?s({rpcUrl:tr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?rr:nr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?sr:or}):e==="tron"?s({baseUrl:ir}):e==="ton"?s({baseUrl:lr}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(Be,t.chainId)?Be[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:ur}):e==="liquid"?s({baseUrl:Fn}):o}var Vo=Object.freeze({evm:(e,t,n)=>Oo(e,He("evm",e,t,n)),solana:(e,t,n)=>wo(e,He("solana",e,t,n)),bitcoin:(e,t,n)=>Io(e,He("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>So(e.address,He("hyperliquid",e,t,n)),tron:(e,t,n)=>vo(e,He("tron",e,t,n)),ton:(e,t,n)=>xo(e,He("ton",e,t,n)),cosmos:(e,t,n)=>Lo(Object.assign(Object.create(null),e,{chain:e.chainId}),He("cosmos",e,t,n)),aptos:(e,t,n)=>$o(e,He("aptos",e,t,n)),liquid:(e,t,n)=>eo(e,He("liquid",e,t,n))});function Ec(e,t,n,r){let o=U(n,"transports"),s=o&&Object.hasOwn(o,e)?o[e]:null,i=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=s||i;if(a)return d=>a(d,n);let c=Object.hasOwn(Vo,e)?Vo[e]:null;return c?d=>c(d,n,r):void 0}function ae(e){return typeof e=="string"?e||null:U(e,"hash")||U(e,"address")||null}function Yo(e,t,n=256){if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))return yn;let r=ac.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,s=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),i=t==="coinType"&&/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e)&&!J(o),a=r&&(/^(?:(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/u.test(e)||s||i);return J(e)&&!a?yn:e}function k(e,t,n,r,o){let s=Yo(r,n,o);return s===yn||r===void 0?!1:(e[n]=s,t.push(n),!0)}function yr(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=Ge(t)?Object.keys(t):[],a=new Set(o.filter(l=>Object.hasOwn(t,l))),c=Math.max(0,i.length-a.size),d=!!(s.inputsTruncated||s.outputsTruncated);return{schemaVersion:hr,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||d,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...s}}function Oc(e,t){let n={},r=[];k(n,r,"transactionHash",e.hash),k(n,r,"blockNumber",e.block_number),k(n,r,"timestamp",e.timestamp),k(n,r,"fromAddress",ae(e.from)),k(n,r,"toAddress",ae(e.to)),k(n,r,"createdContractAddress",It("evm",t,ae(e.created_contract))?ae(e.created_contract):void 0),k(n,r,"value",e.value),k(n,r,"status",e.status),k(n,r,"fee",Ge(e.fee)?e.fee.value:e.fee),k(n,r,"gasUsed",e.gas_used),k(n,r,"gasLimit",e.gas_limit),k(n,r,"nonce",e.nonce);let o=ae(e.token);return k(n,r,"tokenAddress",typeof o=="string"&&we("evm",t,o)?o:void 0),k(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:yr("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function wc(e,t){if(!Ge(e))return null;let n={},r=[];return k(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),k(n,r,"outputIndex",e.vout),k(n,r,"coinbase",e.is_coinbase),k(n,r,"sequence",e.sequence),k(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&we("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),k(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function Ac(e,t,n){if(!Ge(e))return null;let r={index:t},o=[];return k(r,o,"address",typeof e.scriptpubkey_address=="string"&&we("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),k(r,o,"value",e.value),k(r,o,"scriptType",e.scriptpubkey_type,64),r}function Ic(e,t){let n={},r=[];k(n,r,"transactionId",e.txid),k(n,r,"version",e.version),k(n,r,"locktime",e.locktime),k(n,r,"size",e.size),k(n,r,"weight",e.weight),k(n,r,"fee",e.fee);let o={},s=[];k(o,s,"confirmed",e.status?.confirmed),k(o,s,"blockHeight",e.status?.block_height),k(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),k(o,s,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let i=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=i.slice(0,pn).map(l=>wc(l,t)).filter(Boolean),d=a.slice(0,pn).map((l,f)=>Ac(l,f,t)).filter(Boolean);return c.length&&(n.inputs=c,r.push("inputs")),d.length&&(n.outputs=d,r.push("outputs")),{facts:n,projection:yr("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:i.length,inputSelected:c.length,inputsTruncated:i.length>pn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>pn})}}function ut(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):U(t,a);k(r,o,i,l,c),typeof a=="string"?s.push(a):typeof d=="string"&&s.push(d)}return{facts:r,projection:yr(e,t,o,{sourceFields:s})}}function En(e,t,n){return e==="evm"?Oc(n,t):e==="bitcoin"?Ic(n,t):e==="solana"?ut(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>U(r,"err")!==null&&U(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?ut(e,n,[["coin","coin",64],["price","px"],["size","sz"],["side","side",16],["time","time"],["startPosition","startPosition"],["direction","dir",64],["closedPnl","closedPnl"],["transactionHash","hash"],["orderId","oid"],["crossed","crossed"],["fee","fee"],["tradeId","tid"],["feeToken","feeToken",64],["builderFee","builderFee"],["twapId","twapId"]]):e==="tron"?ut(e,n,[["transactionId","txId"],["fromAddress","from"],["toAddress","to"],["direction","direction",16],["rawAmount","raw"],["amount","amount"],["tokenSymbolUntrusted","symbol",64],["decimals","decimals"],["tokenAddress","tokenAddress"],["blockTimestamp","blockTimestamp"],["type","type",64]]):e==="ton"?ut(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?ut(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?ut(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):ut(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function St(e,t,n=null,r=0){if(!t)return;let o=n??{nodes:0,active:new Set};if(o.nodes+=1,o.nodes>1e5||r>12)throw new Error("investigator collector: projected provider response exceeded the credential guard bound");if(e!=null){if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error("investigator collector: provider response reflected its attached credential");return}if(!e||typeof e!="object"||mr.isProxy(e)||o.active.has(e))throw new Error("investigator collector: projected provider response is not own-data JSON");o.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");St(i.value,t,o,r+1)}return}for(let s of Object.keys(e)){if(s.includes(t))throw new Error("investigator collector: provider response reflected its attached credential");let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");St(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function Ko(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!J(e)}function je(e,t=100,{nullable:n=!0}={}){return e==null?n:Number.isSafeInteger(e)&&e>=0?!0:typeof e=="string"&&e.length>0&&e.length<=t&&/^\d+$/u.test(e)&&!J(e)}function Sc(e,t=100,{nullable:n=!0}={}){return e==null?n:typeof e=="number"?Number.isFinite(e):typeof e=="string"&&e.length>0&&e.length<=t&&/^-?\d+(?:\.\d+)?$/u.test(e)&&!J(e)}function At(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:Ko(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Nc(e){if(typeof e!="string"||Ze(e)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(e))return!1;try{let t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64");return t.length===32&&!Xe(t)}catch{return!1}}function It(e,t,n){return n==null||typeof n=="string"&&we(e,t,n)}function Zo(e,t,n){return`${e}:${String(t)}:${n}`}function zo(e,t,n){let r=ae(n);return typeof r=="string"&&we(e,t,r)?Zo(e,t,ve(e,r)):null}function Nt(e,t,n){return typeof t=="string"&&typeof n=="string"&&ve(e,t)===ve(e,n)}function Tc(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(s=>{let i=s?.prevout?.scriptpubkey_address;return typeof i=="string"&&we("bitcoin",t,i)&&Nt("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&we("bitcoin",t,i)&&Nt("bitcoin",i,n)})}function _c(e,t,n,r){if(!Ge(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&It("evm",t,ae(r.from))&&It("evm",t,ae(r.to))&&It("evm",t,ae(r.created_contract))&&[ae(r.from),ae(r.to),ae(r.created_contract)].some(o=>Nt("evm",o,n))&&je(r.block_number,32)&&je(r.value,100)&&At(r.timestamp,{iso:!0});if(e==="solana")return nn(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&At(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&Ge(r.status)&&Tc(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&je(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&At(r.status.block_time);if(e==="hyperliquid"){let o=Ko(r.coin,64)&&/^[A-Za-z0-9@._:/-]+$/u.test(r.coin),s=r.hash==null||/^0x[0-9a-f]{64}$/iu.test(String(r.hash)),i=r.tid==null||je(r.tid,32,{nullable:!1});return o&&s&&i&&(r.hash!=null||r.tid!=null)&&Sc(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&At(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&we("tron",t,r.from)&&typeof r.to=="string"&&we("tron",t,r.to)&&[r.from,r.to].some(o=>Nt("tron",o,n))&&typeof r.tokenAddress=="string"&&we("tron",t,r.tokenAddress)&&je(r.raw,100,{nullable:!1})&&At(r.blockTimestamp):e==="ton"?Nc(r.hash)&&je(r.lt,40,{nullable:!1})&&It("ton",t,r.inMessageSource)&&It("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>Nt("ton",o,n))&&je(r.inMessageValueNano,100)&&At(r.utime):!1}function vc(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:On(t)?e==="evm"||e==="bitcoin"||e==="ton"?U(t,"transactions")??null:e==="solana"?U(t,"signatures")??null:e==="tron"?U(t,"transfers")??null:null:null}function Bo(e,t,n){if(e==="evm")return{type:"transaction",from:ae(n.from)?ve("evm",ae(n.from)):null,to:ae(n.to)??ae(n.created_contract)?ve("evm",ae(n.to)??ae(n.created_contract)):null,asset:zo("evm",t,n.token),amount:n.value==null?null:String(n.value),transactionId:n.hash,blockHeight:n.block_number==null?null:String(n.block_number),timestamp:n.timestamp??null,locator:{transactionId:n.hash,blockHeight:n.block_number??null}};if(e==="solana")return{type:"signature",from:null,to:null,asset:null,amount:null,transactionId:n.signature,blockHeight:null,timestamp:n.blockTime??null,locator:{signature:n.signature,slot:n.slot}};if(e==="bitcoin")return{type:"transaction",from:null,to:null,asset:null,amount:null,transactionId:n.txid,blockHeight:n.status.block_height==null?null:String(n.status.block_height),timestamp:n.status.block_time??null,locator:{transactionId:n.txid,height:n.status.block_height??null}};if(e==="hyperliquid"){let r=Yo(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===yn?null:Zo("hyperliquid",t,r),amount:n.sz==null?null:String(n.sz),transactionId:n.hash??String(n.tid),blockHeight:null,timestamp:n.time??null,locator:{transactionId:n.hash??null,tradeId:n.tid??null}}}return e==="tron"?{type:"token-transfer",from:n.from?ve("tron",n.from):null,to:n.to?ve("tron",n.to):null,asset:zo("tron",t,n.tokenAddress),amount:n.raw==null?null:String(n.raw),transactionId:n.txId,blockHeight:null,timestamp:n.blockTimestamp??null,locator:{transactionId:n.txId,fromAddress:n.from??null,toAddress:n.to??null,tokenAddress:n.tokenAddress??null,rawAmount:n.raw==null?null:String(n.raw),blockTimestamp:n.blockTimestamp??null}}:{type:"transaction",from:n.inMessageSource?ve("ton",n.inMessageSource):null,to:n.inMessageDestination?ve("ton",n.inMessageDestination):null,asset:null,amount:n.inMessageValueNano==null?null:String(n.inMessageValueNano),transactionId:n.hash,blockHeight:null,timestamp:n.utime??null,locator:{transactionId:n.hash,logicalTime:n.lt}}}function xc(e){let t=e.entities[0].id,n=new Map([[e.subject.address,t]]);for(let r of e.events)for(let o of["from","to"]){let s=r[o];if(!s)continue;let i=ve(e.subject.family,s),a=n.get(i);a||(a=Wo(e.subject.family,e.subject.chain,i),n.set(i,a),e.entities.push({id:a,family:e.subject.family,chain:e.subject.chain,address:i,kind:"address"})),r[o]=a}}function Xo(e,t){if(mr.isProxy(e)||!Array.isArray(e))throw new Error("investigator collector: provider rows must be an array");if(e.length>1e4)throw new Error("investigator collector: provider row count exceeds the bound");let n=Math.min(e.length,t),r=new Array(n);for(let o=0;o<n;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider rows must contain dense own data");r[o]=pr(s.value)}return r}function Rc(e,t,n,r,o,s,i,a){let c=Xo(o,n.applied+1);if(c.some(v=>!_c(e.family,e.chain,e.address,v)))throw new Error(`${t.source} returned a malformed history row`);let d=c.length>n.applied,l=c.slice(0,n.applied),f=!!(!Array.isArray(r)&&U(r,"truncated")),u=Array.isArray(r)?null:U(r,"nextCursor")??null;for(let v of l)St(En(e.family,e.chain,v).facts,a),St(Bo(e.family,e.chain,v),a);St(u,a);let h=!!(!Array.isArray(r)&&U(r,"continuationUnknown")),p=!Array.isArray(r)&&U(r,"pageComplete")===!0,m=u!=null&&!t.cursor,g=l.length===n.applied&&u==null&&!p,y=[];(f||d)&&y.push(qe("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&y.push(qe("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(qe("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=f||d||h||m||g||e.family==="tron",S=null;if(t.cursor&&u!=null&&!d)try{S=lo({family:e.family,chain:e.chain,address:e.address,provider:t.source},u)}catch{y.push(qe("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let _=wn(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:l.length,historyAvailable:!0,cursorSupported:t.cursor},y),R=new Set,C=new Set;return l.forEach(v=>{let T=Bo(e.family,e.chain,v),D=En(e.family,e.chain,v),ee=Ft("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:T.locator,publicFacts:D.facts}),x=Ft("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:T.type,locator:T.locator,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp});if(R.has(x))throw new Error(`${t.source} returned duplicate event identity`);if(C.has(ee))throw new Error(`${t.source} returned duplicate evidence identity`);R.add(x),C.add(ee),_.evidence.push({id:ee,status:"OBSERVED",source:t.source,observedAt:s,locator:T.locator,publicFacts:D.facts,projection:D.projection}),_.events.push({id:x,type:T.type,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp,evidenceRefs:[ee]})}),xc(_),t.cursor&&(_.cursor={requested:i,next:S}),_}function Lc(e,t){return On(t)?e==="liquid"?U(t,"provider")==="liquid-esplora"&&Number.isFinite(U(t,"txCount"))?[t]:null:U(t,"balances")??null:null}function Pc(e,t,n,r){if(!Ge(r))return!1;if(e==="cosmos"){let o=/^ibc\/[0-9a-f]{64}$/iu.test(String(r.denom??""));return typeof r.denom=="string"&&r.denom.length>0&&r.denom.length<=256&&!/[\u0000-\u001f\u007f]/u.test(r.denom)&&(!J(r.denom)||o)&&je(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),s=/^0x[0-9a-f]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(o),i=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return s&&!J(i)&&je(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&we("liquid",t,r.address)&&Nt("liquid",r.address,n)&&r.confidential===gr(r.address)&&(r.balanceSats===null||je(r.balanceSats,100,{nullable:!1})):!1}function Cc(e,t,n,r,o,s,i){let a=Xo(o,n.applied+1);if(a.some(h=>!Pc(e.family,e.chain,e.address,h)))throw new Error(`${t.source} returned a malformed evidence row`);let c=a.slice(0,n.applied);for(let h of c)St(En(e.family,e.chain,h).facts,i);let d=!!U(r,"truncated")||a.length>n.applied,l=[qe("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(qe("fungible-assets-unavailable","Aptos collection enumerates legacy CoinStore resources only; Fungible Asset balances were not checked")),e.family==="liquid"&&c.some(h=>h.balanceSats===null)){let h=c.some(p=>p.confidential===!0);l.push(qe("asset-balances-unavailable",h?"Liquid balance values are blinded for this confidential address":"Liquid Esplora did not expose per-asset sums for this unconfidential multi-asset address"))}d&&l.push(qe("response-truncated","provider evidence exceeded the safe record bound"));let f=wn(e,"PARTIAL",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:c.length,historyAvailable:!1,cursorSupported:!1,...e.family==="aptos"?{holdingCoverage:"legacy-coinstore-only"}:{},...e.family==="liquid"?{balanceCoverage:c.some(h=>h.balanceSats===null)?"unavailable":"provider-supplied"}:{}},l),u=new Set;return c.forEach(h=>{let p=En(e.family,e.chain,h),m=Ft("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:p.facts});if(u.has(m))throw new Error(`${t.source} returned duplicate evidence identity`);u.add(m),f.evidence.push({id:m,status:"OBSERVED",source:t.source,observedAt:s,locator:{address:e.address},publicFacts:p.facts,projection:p.projection})}),f}async function Qo(e={},t={}){dc(t);let n=Go(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=uc(t);if(c.status==="UNAVAILABLE"||c===rt.unsupported)return hn(d,c,l);if(!c.chainIds.some(g=>String(g)===String(o)))return hn(d,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},l);if(r==="evm"&&!Eo(o))return hn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let f=bc(r),u=Ec(r,c,t,f);if(typeof u!="function")return hn(d,{...c,reason:"collector transport is unavailable"},l);let h=a?.payload??null,p=Object.assign(Object.create(null),{address:s,chainId:o,limit:i.applied,cursor:h});r==="solana"&&(p.before=h),r==="tron"&&(p.contract="all",p.onlyConfirmed=!0),r==="ton"&&h&&(p.lt=h.lt,p.hash=h.hash);let m;try{m=await u(p)}catch(g){return fr(d,c,i,gn(g),l,a)}if(U(m,"error")){let g=Zr(m),y=g?Object.assign(Object.create(null),{...g.status===null?{}:{status:g.status},...g.code==="provider-response-too-large"?{oversize:!0}:g.code==="provider-timeout"?{oracleTimeout:!0}:{}}):null,E=g?.status!==null&&g?.status!==void 0?"provider-unavailable":"provider-rejected";return fr(d,c,i,gn(y,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=Lc(r,m);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return Cc(d,c,i,m,y,l,f)}let g=vc(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return Rc(d,c,i,m,g,l,a,f)}catch{return fr(d,c,i,gn(null,"provider-invalid-response"),l,a)}}var jc=Object.freeze(Object.create(null));async function es(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return Qo(e,jc)}import{createHash as kc}from"node:crypto";import{types as Ee}from"node:util";var Dc="oracle.coordination/1",bf=ze({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Ef=ze({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),$c=Object.freeze({COMMON_NON_SERVICE_FUNDER:18,DEPLOYER_LINKED_BUYERS:22,EXPLICIT_BRIDGE_LINK:5,FRESH_WALLET_CLUSTER:18,LP_REMOVAL:20,PEEL_CHAIN:18,SUPPLY_CONCENTRATION:18,SYNCHRONIZED_ACTIVITY:18}),xe=Object.freeze({maxEntities:Pe.maxNodes,maxEvents:Pe.maxEdges,maxEvidence:ie.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),zt=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),Bt=new Set(["FUND","FUNDING"]),ls=new Set([...zt,...Bt,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),Mc=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),Uc=new Set(["CREATOR","DEPLOYER"]),ts=new Set(Mt),ns=new Set(["LIVE","INDEXED"]);var rs=250,Fc=32,Vc=32,ne=(e,t)=>e<t?-1:e>t?1:0,re=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},Ae=e=>(re(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",pe=e=>re(typeof e=="object"&&e!==null?O(e,"id"):e),ce=e=>[...new Set(e.filter(Boolean))].sort(ne),zc=(e,t)=>ne(e.id,t.id),ke=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},Bc=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,Sr=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=re(e);if(!t)return null;let n=Bc.exec(t);if(!n)return null;let[,r,o,s,i,a,c,d="",l]=n,[f,u,h,p,m,g]=[r,o,s,i,a,c].map(Number);if(u<1||u>12||h<1||p>23||m>59||g>59)return null;if(l!=="Z"){let[_,R]=l.slice(1).split(":").map(Number);if(_>23||R>59)return null}let y=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(f,u-1,h),E.setUTCHours(p,m,g,y),E.getUTCFullYear()!==f||E.getUTCMonth()!==u-1||E.getUTCDate()!==h||E.getUTCHours()!==p||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let S=Date.parse(t);return Number.isFinite(S)?S:null},ds=e=>Array.isArray(e)?e:[],O=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&Ee.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0},G=(e,t=64)=>{if(ot(e,t))return[];if(!Array.isArray(e))return[];let n=[],r=Math.min(e.length,t);for(let o=0;o<r;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));s&&Object.hasOwn(s,"value")&&n.push(s.value)}return n},ot=(e,t=64)=>{if(e==null)return!1;if(Ee.isProxy(e)||!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>t||Object.getOwnPropertySymbols(e).length>0)return!0;let n=new Set(["length"]);for(let r=0;r<e.length;r+=1)n.add(String(r));for(let r of Object.getOwnPropertyNames(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(!(r==="toJSON"&&o&&Object.hasOwn(o,"value")&&o.value===void 0&&o.enumerable===!1)&&!n.has(r))return!0}for(let r=0;r<e.length;r+=1){let o=Object.getOwnPropertyDescriptor(e,String(r));if(!o||!o.enumerable||!Object.hasOwn(o,"value"))return!0}return!1},We=(e,t={})=>Object.assign(Object.create(null),e,t),In=(e,t)=>{let n=Object.create(null);for(let r of t){let o=Object.getOwnPropertyDescriptor(e,r);o&&Object.hasOwn(o,"value")&&(n[r]=o.value)}return n},br=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),Hc=Object.freeze(["id","status"]),Er=Object.freeze(["id","type","from","fromEntityId","funderId","to","toEntityId","recipientId","actor","actorEntityId","buyerId","asset","assetId","tokenId","timestamp","amount","value","quantity","totalSupply","supply","holders","pool","poolId","sourceChain","fromChain","destinationChain","toChain","bridgeTransferId","transactionId","transactionHash","txId","txid","hash","blockHeight","blockNumber","transactionIndex","logIndex","eventIndex","index","evidenceRefs","data"]),qc=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),Gc=Object.freeze(["numerator","denominator","bps"]),Wc=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),Jc=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function us(e){return ce([Ae(O(e,"kind")),...G(O(e,"roles")).map(Ae),...G(O(e,"tags")).map(t=>Ae(!t||typeof t!="object"?t:O(t,"name")??O(t,"value")))])}function Nr(e){return e?O(e,"isService")===!0?!0:us(e).some(t=>Mc.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function fs(e){return Uc.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function An(e){return us(e).some(fs)}function Yc(e){if(!An(e)||Nr(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(O(e,r)!==void 0)return!1;let t=G(O(e,"roles")).map(Ae),n=G(O(e,"tags")).map(r=>Ae(r&&typeof r=="object"?O(r,"name")??O(r,"value"):r));return[...t,...n].every(fs)}function Ie(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[s,i=""]=e.split(".");return{raw:`${s}${i}`.replace(/^0+(?=\d)/u,""),decimals:i.length}}if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e))return null;let t=s=>{if(!Object.hasOwn(e,s))return{present:!1,value:void 0};let i=Object.getOwnPropertyDescriptor(e,s);return!i||!Object.hasOwn(i,"value")?{present:!0,invalid:!0}:{present:!0,value:i.value}},n=t("decimals");if(n.invalid||n.present&&n.value!=null&&(!Number.isInteger(n.value)||n.value<0||n.value>255))return null;let r=n.value==null?0:n.value,o=[];for(let s of["raw","atoms","baseUnits"]){let i=t(s);if(i.invalid)return null;if(!(!i.present||i.value==null)){if(typeof i.value!="string"||!/^\d+$/u.test(i.value)||i.value.length>512)return null;o.push(i.value.replace(/^0+(?=\d)/u,""))}}for(let s of["value","decimal","amount"]){let i=t(s);if(i.invalid)return null;if(!i.present||i.value==null)continue;if(typeof i.value!="string"||!/^\d+(?:\.\d+)?$/u.test(i.value)||i.value.length>512)return null;let[a,c=""]=i.value.split(".");if(c.length>r)return null;o.push(`${a}${c.padEnd(r,"0")}`.replace(/^0+(?=\d)/u,""))}return o.length===0||new Set(o).size!==1?null:{raw:o[0],decimals:r}}function _t(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function ps(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=_t(e,n),o=_t(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function Kc(e,t){let n=ps(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function Zc(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=_t(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=_t(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function ms(e){if(e&&typeof e=="object"){if(Ee.isProxy(e)||Array.isArray(e)||!xt(e,Gc)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=O(e,"numerator"),c=O(e,"denominator"),d=O(e,"bps"),l=a!=null||c!=null,f=null;if(l&&(a==null||c==null||(f=ps(Ie(a),Ie(c)),!f)))return null;let u=null;if(d!=null){if(!Number.isInteger(d)||d<0||d>1e4)return null;u={numerator:BigInt(d),denominator:10000n}}return!f&&!u||f&&u&&Number(f.numerator*10000n/f.denominator)!==d?null:f??u}let t=re(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),s=BigInt(`${n}${r}`),i=s<=o?o:o*100n;return s<=i?{numerator:s,denominator:i}:null}function Xc(e){if(!Array.isArray(e)||e.length>Pe.maxNodes)return!1;let t=[];for(let n of e){if(!n||typeof n.numerator!="bigint"||typeof n.denominator!="bigint"||n.numerator<0n||n.denominator<=0n||n.numerator>n.denominator)return!1;t.push(n)}for(;t.length>1;){let n=[];for(let r=0;r<t.length;r+=2){if(r+1>=t.length){n.push(t[r]);continue}let o=t[r],s=t[r+1],i=o.numerator*s.denominator+s.numerator*o.denominator,a=o.denominator*s.denominator;if(i>a)return!1;n.push({numerator:i,denominator:a})}t=n}return t.length===0||t[0].numerator<=t[0].denominator}function Qc(e){let t=ms(e);return t?Number(t.numerator*10000n/t.denominator):null}var Tt=Symbol("alias-conflict");function Ne(e,t,n){let r=null,o=null;for(let s of t){if(!Object.hasOwn(e,s))continue;let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!Object.hasOwn(i,"value"))return Tt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return Tt;let d=typeof c=="object"?c.identity:c,l=typeof c=="object"&&Object.hasOwn(c,"value")?c.value:c;if(o!==null&&d!==o)return Tt;r=l,o=d}return r}function Tr(e,t=64){if(e===void 0)return[];if(ot(e,t))return null;let n=G(e,t).map(pe);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(ne)}function hs(e){let t=e.raw,n=e.decimals;for(;n>0&&t.endsWith("0");)t=t.slice(0,-1),n-=1;return`${t||"0"}:${n}`}function Ir(e,t){return Ne(e,t,n=>{let r=Ie(n);return r?{identity:hs(r),value:n}:null})}function Or(e,t){return Ne(e,t,n=>{let r;if(Number.isSafeInteger(n)&&n>=0)r=String(n);else if(typeof n=="string"&&/^\d{1,40}$/u.test(n.trim()))r=n.trim().replace(/^0+(?=\d)/u,"");else return null;return{identity:r,value:r}})}function xt(e,t){let n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let r=Object.getOwnPropertyNames(e).filter(i=>{let a=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});if(r.length>t.length)return!1;let o=new Set(t),s={nodes:0,fields:0,active:new Set([e])};for(let i of r){if(!o.has(i))return!1;let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!a.enumerable||!Object.hasOwn(a,"value")||!vt(a.value,s,0))return!1}return!0}function vt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>ie.dataNodes||n>ie.dataDepth)return!1;if(e==null||typeof e=="boolean")return!0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="string")return e.length<=ie.string;if(!e||typeof e!="object"||Ee.isProxy(e)||r.active.has(e))return!1;r.active.add(e);try{if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||e.length>ie.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let d=0;d<e.length;d+=1)c.add(String(d));for(let d of a){let l=Object.getOwnPropertyDescriptor(e,d);if(!(d==="toJSON"&&l&&Object.hasOwn(l,"value")&&l.value===void 0&&l.enumerable===!1)&&(typeof d!="string"||!c.has(d)))return!1}if(r.fields+=e.length,r.fields>ie.dataTotalFields)return!1;for(let d=0;d<e.length;d+=1){let l=Object.getOwnPropertyDescriptor(e,String(d));if(!l||!l.enumerable||!Object.hasOwn(l,"value")||!vt(l.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let s=Reflect.ownKeys(e),i=[];for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);if(!(a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0&&c.enumerable===!1)){if(typeof a!="string"||!c||!c.enumerable||!Object.hasOwn(c,"value"))return!1;i.push([a,c.value])}}return i.length>ie.dataFields||(r.fields+=i.length,r.fields>ie.dataTotalFields)?!1:i.every(([,a])=>vt(a,r,n+1))}finally{r.active.delete(e)}}function gs(e,t){let n=O(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||Ee.isProxy(n)||Array.isArray(n)||!vt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>ie.dataFields)return null;let o=In(e,t);for(let s of r){let i=Object.getOwnPropertyDescriptor(n,s);if(!i||!Object.hasOwn(i,"value"))return null;if(!(!t.includes(s)||s==="data")){if(Object.hasOwn(o,s))return null;o[s]=i.value}}return o}function el(e){if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e)||!xt(e,qc))return null;let t=Ne(e,["entityId","entity","holder"],pe),n=Ir(e,["balance","amount"]),r=Tr(O(e,"evidenceRefs"));return!t||t===Tt||n===Tt||n===null||r===null?null:We({},{entityId:t,balance:n,evidenceRefs:r})}function tl(e){if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e)||!xt(e,br))return null;let t=gs(e,br);if(!t||Object.hasOwn(t,"isService")&&typeof O(t,"isService")!="boolean")return null;let n=pe(O(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=O(t,d);if(l!=null&&Sr(l)===null)return null}let r=O(t,"roles"),o=O(t,"tags"),s=O(t,"evidenceRefs");if([r,o,s].some(d=>ot(d)))return null;let i=O(t,"supplyShare");if(i!==void 0&&Qc(i)===null)return null;let a=In(t,br);a.roles=G(r),a.tags=G(o);let c=Tr(s);return c===null?null:(a.evidenceRefs=c,We(a,{id:n}))}function nl(e){if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e)||!xt(e,Wc))return null;let t=pe(O(e,"id"));if(!t)return null;let n=O(e,"status"),r=typeof n=="string"?n:"MISSING";return We(In(e,Hc),{id:t,status:r})}function rl(e){if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e)||!xt(e,Er))return null;let t=gs(e,Er);if(!t)return null;let n=pe(O(t,"id"));if(!n||ot(O(t,"holders"))||ot(O(t,"evidenceRefs")))return null;let r=Ne(t,["from","fromEntityId","funderId"],pe),o=Ne(t,["to","toEntityId","recipientId"],pe),s=Ne(t,["actor","actorEntityId","buyerId"],pe),i=Ne(t,["asset","assetId","tokenId"],pe),a=Ne(t,["pool","poolId"],pe),c=Ne(t,["sourceChain","fromChain"],re),d=Ne(t,["destinationChain","toChain"],re),l=Ne(t,["transactionId","transactionHash","txId","txid","hash"],pe),f=Ne(t,["bridgeTransferId"],pe),u=Or(t,["blockHeight","blockNumber"]),h=Or(t,["transactionIndex"]),p=Or(t,["eventIndex","logIndex","index"]),m=Ir(t,["amount","value","quantity"]),g=Ir(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,f,u,h,p,m,g].includes(Tt))return null;let y=Tr(O(t,"evidenceRefs"));if(y===null)return null;let E=O(t,"timestamp"),S=Sr(E);if(E!=null&&S===null)return null;let R=G(O(t,"holders")).map(el);if(R.some(T=>T===null))return null;let C=R.map(T=>T.entityId);if(new Set(C).size!==C.length)return null;let v=In(t,Er);return v.holders=R,We(v,{id:n,type:Ae(O(t,"type")),from:r,to:o,actor:s,asset:i,pool:a,sourceChain:c,destinationChain:d,bridgeTransferId:f,transactionId:l,blockPosition:u,transactionPosition:h,eventPosition:p,amount:m,totalSupply:g,timestampMs:S,evidenceRefs:y})}function wr(e,t,n,r,o,s){if(Ee.isProxy(e))return s(r,"A proxy record array was refused."),{records:[],overflow:!1,malformed:!0};if(!Array.isArray(e))return{records:[],overflow:!1,malformed:!1};if(e.length>n)return s(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(ot(e,n))return s(r,"The record array must be an ordinary dense own-data array."),{records:[],overflow:!1,malformed:!0};let i=[],a=0;for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));if(!d||!Object.hasOwn(d,"value")){a+=1;continue}let l=t(d.value);l?i.push(l):a+=1}return i.sort(zc),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function Vt(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function ol(e){let t=re(O(e,"family")),n=re(O(e,"address")),r=O(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):re(r);if(!t||!o||!n)return null;let s=t.toLowerCase(),i=["evm","ethereum","eth","eip155"].includes(s)?"eip155":s,a=n;["eip155","hyperliquid"].includes(i)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(i==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(i)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),i==="ton"&&(a=Zn(a)??a);let c=o.toLowerCase();if(i==="eip155"){let d=c.match(/^(?:eip155:)?(\d+)$/u)?.[1];d&&(c=BigInt(d).toString())}return`${i.length}:${i}|${c.length}:${c}|${a.length}:${a}`}function sl(e){let t=new Map;for(let n of e){let r=ol(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function os(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Ar(e){let t=Ie(e);return t?hs(t):"-"}function il(e){let t=G(O(e,"holders")).map(n=>`${os(O(n,"entityId"))}:${Ar(O(n,"balance"))}`).sort().join(";");return[e.type,e.from,e.to,e.actor,e.asset,e.pool,e.sourceChain,e.destinationChain,e.bridgeTransferId,e.timestampMs,Ar(O(e,"amount")),Ar(O(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(os).join("|")}function al(e){let t=new Set;for(let n of e){let r=il(n);if(t.has(r))return!0;t.add(r)}return!1}function Je(e,t,n,r,o,s,i=[]){let a=kc("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:ce(n),reasons:o,caveats:ce(i),evidenceRefs:ce(r),score:$c[e]}}function cl(e,t,n){let r=[...e].sort((l,f)=>l.timestampMs-f.timestampMs||ne(l.id,f.id)),o=[],s=new Map,i=0,a=0,c=l=>{let f=l.actor??l.from;f&&s.set(f,(s.get(f)??0)+1)},d=l=>{let f=l.actor??l.from;if(!f)return;let u=(s.get(f)??0)-1;u<=0?s.delete(f):s.set(f,u)};for(;i<r.length;){for(;a<r.length&&r[a].timestampMs-r[i].timestampMs<=t;)c(r[a]),a+=1;s.size>=n?(o.push(r.slice(i,a)),i=a,s.clear()):(d(r[i]),i+=1,a<i&&(a=i))}return o}function H(e,t){let n=G(O(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function ss(e,t){let n=G(O(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function te(e,t){return typeof e=="string"&&t.has(e)}function is(e){let t=O(e,"type");if(!ls.has(t))return!1;let n=O(e,"from"),r=O(e,"to"),o=O(e,"actor")??n,s=O(e,"asset"),i=O(e,"timestampMs");if(Bt.has(t))return!!(n&&r);if(zt.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(re(O(e,"sourceChain"))&&re(O(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=G(O(e,"holders")).some(c=>pe(O(c,"entityId"))&&Ie(O(c,"balance")));return!!(s&&Ie(O(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Ie(O(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function Ht(e,t){let n=new Map;for(let r of e){let o=t(r);o&&(n.has(o)||n.set(o,[]),n.get(o).push(r))}return n}function ll(e,t,n,r,o){let s=e.filter(d=>Bt.has(d.type)&&te(d.from,t)&&te(d.to,t)&&H(d,n).length),i=Ht(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([f],[u])=>ne(f,u))){let f=t.get(d);if(Nr(f))continue;let u=ce(l.map(g=>g.to).filter(g=>g!==d));if(u.length<r.minCommonRecipients)continue;let h=H(f,n);if(h.length===0){c.add(d);continue}let p=new Set(u),m=l.filter(g=>p.has(g.to));a.push(Je("COMMON_NON_SERVICE_FUNDER",d,[d,...u],[...h,...m.flatMap(g=>H(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:u.length,eventIds:ce(m.map(g=>g.id))}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["A common funding source is a coordination signal, not an identity conclusion."]))}return c.size>0&&o("FUNDER_CLASSIFICATION_EVIDENCE_UNRESOLVED",`${c.size} non-service funder premise(s) lacked usable entity evidence and were excluded.`),a}function dl(e,t,n,r){let o=e.filter(a=>zt.has(a.type)&&te(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&H(a,n).length).map(a=>We(a,{actor:a.actor??a.from})),s=Ht(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>ne(d,l)))for(let d of cl(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=ce(d.map(h=>h.actor)),[f,u]=a.split("\0");i.push(Je("SYNCHRONIZED_ACTIVITY",`${f.toLowerCase()}:${u}:${d[0].id}`,l,d.flatMap(h=>H(h,n)),[{activityType:f,asset:u,actorCount:l.length,windowSeconds:Math.floor((d[d.length-1].timestampMs-d[0].timestampMs)/1e3),eventIds:d.map(h=>h.id)}],{fact:"HIGH",coordination:l.length>=4?"HIGH":"MEDIUM"},["Timing proximity alone does not establish common control."]))}return i}function ul(e,t,n){if(!e)return null;if(O(e,"fresh")===!0)return"fresh";let r=O(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=O(e,"firstSeenAt"),s=O(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=Sr(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function fl(e,t,n,r,o){let s=e.filter(l=>zt.has(l.type)&&te(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&H(l,n).length).map(l=>We(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let f=t.get(l.actor),u=ul(f,l.timestampMs,r);if(!u)continue;let h=H(f,n);if(h.length===0){a.add(l.actor);continue}i.push(We(l,{freshnessBasis:u,freshnessEvidenceRefs:h}))}a.size>0&&o("FRESHNESS_EVIDENCE_UNRESOLVED",`${a.size} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let c=Ht(i,l=>l.asset),d=[];for(let[l,f]of[...c].sort(([u],[h])=>ne(u,h))){let u=ce(f.map(p=>p.actor));if(u.length<r.minClusterSize)continue;let h=u.map(p=>{let m=f.filter(g=>g.actor===p);return{entityId:p,bases:ce(m.map(g=>g.freshnessBasis)),evidenceRefs:ce(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(Je("FRESH_WALLET_CLUSTER",l,u,[...f.flatMap(p=>H(p,n)),...h.flatMap(p=>p.evidenceRefs)],[{asset:l,walletCount:u.length,eventIds:ce(f.map(p=>p.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:h}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return d}function pl(e,t,n,r,o){let s=new Map,i=new Set,a=(p,m)=>{if(!(!te(p,t)||m.length===0)){s.has(p)||s.set(p,new Set);for(let g of m)s.get(p).add(g)}};for(let p of t.values()){if(!An(p))continue;let m=H(p,n);m.length===0?i.add(p.id):a(p.id,m)}for(let p of e)p.type==="DEPLOY"&&a(p.from??p.actor,H(p,n));let c=[...i].filter(p=>!s.has(p));c.length>0&&o("DEPLOYER_EVIDENCE_UNRESOLVED",`${c.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`);let d=e.filter(p=>Bt.has(p.type)&&s.has(p.from)&&te(p.to,t)&&H(p,n).length),l=Ht(d,p=>p.to),f=e.filter(p=>p.type==="BUY"&&te(p.actor??p.from,t)&&p.asset&&H(p,n).length).map(p=>We(p,{actor:p.actor??p.from})),u=new Map;for(let p of f){let m=ce(ds(l.get(p.actor)).map(g=>g.from));if(m.length>Vc)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let g of m){let y=`${g}\0${p.asset}`;u.has(y)||u.set(y,[]),u.get(y).push(p)}}let h=[];for(let[p,m]of[...u].sort(([g],[y])=>ne(g,y))){let g=ce(m.map(C=>C.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,E]=p.split("\0"),S=new Set(g),_=d.filter(C=>C.from===y&&S.has(C.to)),R=ce([...s.get(y)??[]]);h.push(Je("DEPLOYER_LINKED_BUYERS",`${y}:${E}`,[y,...g],[...R,..._.flatMap(C=>H(C,n)),...m.flatMap(C=>H(C,n))],[{deployer:y,asset:E,buyerCount:g.length,deployerEvidenceRefs:R,fundingEventIds:ce(_.map(C=>C.id)),buyEventIds:ce(m.map(C=>C.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function ml(e,t,n,r,o,s){let i=[],a=e.filter(f=>f.type==="SUPPLY_SNAPSHOT"&&f.asset&&H(f,r).length),c=0;for(let f of a){let u=Ie(O(f,"totalSupply")??O(f,"supply")),h=G(O(f,"holders")),p=h.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||ot(O(y,"evidenceRefs")))return null;let E=G(O(y,"evidenceRefs")).map(pe);return E.length===0||E.some(S=>!r.has(S))?null:{entityId:pe(O(y,"entityId")),balance:Ie(O(y,"balance")),evidenceRefs:ce(E)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(p.length!==h.length||!Zc(u,p)){c+=1;continue}let g=p.map(y=>({...y,shareBps:Kc(y.balance,u)})).filter(y=>y.shareBps!==null).sort((y,E)=>E.shareBps-y.shareBps||ne(y.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(Je("SUPPLY_CONCENTRATION",`${f.asset}:${f.id}`,[g.entityId],[...H(f,r),...g.evidenceRefs],[{asset:f.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:u,snapshotEventId:f.id}],{fact:"HIGH",coordination:"LOW"},["Supply concentration is a structural fact and is not proof of coordinated control."]))}if(c>0&&s("SUPPLY_SEMANTICS_UNRESOLVED",`${c} supply snapshot(s) had impossible or incomplete total/holder arithmetic and were excluded.`),a.length)return i;let d=t.map(f=>{let u=ms(f.supplyShare);return u?{entity:f,fraction:u,shareBps:Number(u.numerator*10000n/u.denominator)}:null}).filter(Boolean).sort((f,u)=>u.shareBps-f.shareBps||ne(f.entity.id,u.entity.id));if(!Xc(d.map(f=>f.fraction)))return s("SUPPLY_SEMANTICS_UNRESOLVED","Entity supply shares exceeded the total and were excluded."),i;let l=d[0];if(l&&l.shareBps>=o.concentrationThresholdBps){let f=G(O(l.entity,"evidenceRefs")).map(pe),u=f.length>0&&f.every(h=>r.has(h))?ce(f):[];u.length&&i.push(Je("SUPPLY_CONCENTRATION",l.entity.id,[l.entity.id],u,[{topHolder:l.entity.id,topHolderShareBps:l.shareBps}],{fact:"MEDIUM",coordination:"LOW"},["No total-supply snapshot was supplied; the exact caller-provided share was used."]))}return i}function hl(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&H(r,n).length).filter(r=>te(r.actor??r.from??r.to,t)).map(r=>Je("LP_REMOVAL",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Ie(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function gl(e,t){let n=0,r=e.length;for(;n<r;){let o=Math.floor((n+r)/2);e[o].timestampMs<t?n=o+1:r=o}return n}function yl(e,t,n,r,o){let s=e.filter(u=>u.type==="TRANSFER"&&te(u.from,t)&&te(u.to,t)&&u.from!==u.to&&re(u.asset)&&u.timestampMs!==null&&Ie(u.amount)&&H(u,n).length).map(u=>We(u,{parsedAmount:Ie(u.amount)})).sort((u,h)=>u.timestampMs-h.timestampMs||ne(u.id,h.id)),i=Ht(s,u=>`${u.from}\0${u.asset}`),a=[],c=new Set,d=!1;function l(u,h,p,m){let g=ds(i.get(`${u.to}\0${u.asset}`)),y=gl(g,u.timestampMs),E=[],S=0,_=y;for(;_<g.length&&S<Fc;_+=1){let R=g[_];if(R.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(S+=1,c.has(R.id)||p.has(R.id)||m.has(R.to)||R.from!==u.to||R.asset!==u.asset)continue;let C=Math.max(u.parsedAmount.decimals,R.parsedAmount.decimals),v=_t(u.parsedAmount,C),T=_t(R.parsedAmount,C);v!==null&&T!==null&&T>0n&&T<v&&E.push(R)}return _<g.length&&g[_].timestampMs-h.timestampMs<=r.peelWindowSeconds*1e3&&(d=!0),E}function f(u){if(u.length>=3)return u;let h=new Set(u.map(m=>m.id)),p=new Set([u[0].from,...u.map(m=>m.to)]);for(let m of l(u[u.length-1],u[0],h,p)){let g=f([...u,m]);if(g)return g}return null}for(let u of s){if(c.has(u.id))continue;let h=f([u]);if(!h)continue;let p=[...h];for(;p.length<r.maxPeelDepth;){let m=new Set(p.map(E=>E.id)),g=new Set([p[0].from,...p.map(E=>E.to)]),[y]=l(p[p.length-1],p[0],m,g);if(!y)break;p.push(y)}p.forEach(m=>c.add(m.id)),a.push(p)}return d&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(u=>Je("PEEL_CHAIN",u[0].id,[u[0].from,...u.map(h=>h.to)],u.flatMap(h=>H(h,n)),[{hopCount:u.length,asset:u[0].asset,eventIds:u.map(h=>h.id),amounts:u.map(h=>h.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function bl(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&re(r.sourceChain)&&re(r.destinationChain)&&H(r,n).length).filter(r=>te(r.actor??r.from??r.to,t)).map(r=>Je("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,sourceChain:re(r.sourceChain),destinationChain:re(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Ie(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function El(e){let t=Object.create(null);for(let n of e)t[n.kind]=(t[n.kind]??0)+1;return Object.fromEntries(Object.entries(t).sort(([n],[r])=>ne(n,r)))}function as(e,t){return G(O(e,"holders")).some(n=>!te(O(n,"entityId"),t))?!1:Bt.has(e.type)||e.type==="TRANSFER"?te(e.from,t)&&te(e.to,t):zt.has(e.type)?te(e.actor??e.from,t):e.type==="DEPLOY"?te(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?te(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?G(O(e,"holders")).every(n=>te(O(n,"entityId"),t)):!0}function Ol(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||Ee.isProxy(e)){t("MALFORMED_COVERAGE","Coverage must contain own data fields.",{fatal:!0});return}let n=[],r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0){t("MALFORMED_COVERAGE","Coverage must contain ordinary own data without symbol fields.",{fatal:!0});return}let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0&&i.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([s,i.value])}for(let[s,i]of n.sort(([a],[c])=>ne(a,c))){let a=i;if(i&&typeof i=="object"&&!vt(i)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(i&&typeof i=="object"&&!Array.isArray(i)){let l=Object.getOwnPropertyDescriptor(i,"status");if(l&&!Object.hasOwn(l,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=l?l.value:void 0}if(typeof a!="string")continue;let c=Ae(a),d=Ae(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var wl=Object.freeze(Object.keys(xe)),Al=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function cs(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||Ee.isProxy(e)||Array.isArray(e))return!1;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});if(o.length>t.length||o.some(s=>!t.includes(s)))return!1;for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")||n&&(typeof i.value!="number"||!Number.isFinite(i.value)))return!1}return!0}function ys(e,t={}){let n=cs(t,wl,{numeric:!0}),r=n?t:{},o={maxEntities:ke(O(r,"maxEntities"),xe.maxEntities,1,Pe.maxNodes),maxEvents:ke(O(r,"maxEvents"),xe.maxEvents,1,Pe.maxEdges),maxEvidence:ke(O(r,"maxEvidence"),xe.maxEvidence,1,ie.evidence),minClusterSize:ke(O(r,"minClusterSize"),xe.minClusterSize,2,10),minCommonRecipients:ke(O(r,"minCommonRecipients"),xe.minCommonRecipients,2,10),syncWindowSeconds:ke(O(r,"syncWindowSeconds"),xe.syncWindowSeconds,1,3600),freshWalletSeconds:ke(O(r,"freshWalletSeconds"),xe.freshWalletSeconds,60,2592e3),peelWindowSeconds:ke(O(r,"peelWindowSeconds"),xe.peelWindowSeconds,60,604800),maxPeelDepth:ke(O(r,"maxPeelDepth"),xe.maxPeelDepth,3,8),concentrationThresholdBps:ke(O(r,"concentrationThresholdBps"),xe.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,N,{fatal:L=!1}={})=>{L&&(i=!0);let j=Ae(w||"UNSPECIFIED_GAP"),ge=re(N)??"Input is incomplete.",Se=s.get(j);if(Se){ne(ge,Se.message)<0&&s.set(j,{code:j,status:"UNKNOWN",message:ge});return}if(s.size>=rs-1){i=!0,s.has("GAP_LIMIT_REACHED")||s.set("GAP_LIMIT_REACHED",{code:"GAP_LIMIT_REACHED",status:"UNKNOWN",message:`Gap output exceeded the deterministic limit of ${rs}.`});return}s.set(j,{code:j,status:"UNKNOWN",message:ge})},c=({entities:w=[],events:N=[],evidenceById:L=new Map,eventWithEvidence:j=[],analyzableEvents:ge=[],findings:Se=[]}={})=>{let _e=i?[]:Se;_e.length>ie.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${ie.findings}.`,{fatal:!0}),_e=[]);let $e=[...s.values()].sort((q,z)=>ne(q.code,z.code)),ht=i||$e.some(q=>q.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(q.code))?"UNKNOWN":$e.length?"PARTIAL":"OK",A=Math.min(100,_e.reduce((q,z)=>q+z.score,0)),P=A>=60?"HIGH":A>=25?"MEDIUM":ht==="OK"?"LOW":"UNKNOWN";return ze({schemaVersion:Dc,execution:"read-only",reportOnly:!0,status:ht,risk:{score:A,level:P},metrics:{entityCount:w.length,eventCount:N.length,evidenceCount:L.size,evidencedEventCount:j.length,eligibleEventCount:ge.length,findingCounts:El(_e),bounds:o},findings:_e,gaps:$e})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!cs(e,Al))return a("INVALID_INPUT","Expected a bounded own-data coordination envelope.",{fatal:!0}),c();if(!e||typeof e!="object"||Array.isArray(e))return a("INVALID_INPUT","Expected an object containing normalized entities, events, and evidence.",{fatal:!0}),c();for(let w of["subject","chain"]){let N=O(e,w);if(N!==void 0&&!vt(N))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=wr(O(e,"entities"),tl,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=wr(O(e,"events"),rl,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),f=wr(O(e,"evidence"),nl,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),u=d.records,h=l.records,p=f.records;(d.overflow||l.overflow||f.overflow||d.malformed||l.malformed||f.malformed)&&(i=!0),Array.isArray(O(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(O(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(O(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),Vt(u)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),Vt(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),Vt(p)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),al(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),sl(u)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=Vt(u)?new Map:new Map(u.map(w=>[w.id,w])),g=p.filter(w=>!ts.has(w.status)),y=p.filter(w=>ts.has(w.status)&&!ns.has(w.status));g.length>0&&a("EVIDENCE_STATUS_INVALID",`${g.length} evidence record(s) had a missing or invalid status and were excluded.`),y.length>0&&a("EVIDENCE_STATUS_UNUSABLE",`${y.length} evidence record(s) did not have LIVE or INDEXED status and were excluded.`);let E=Vt(p)?new Map:new Map(p.filter(w=>ns.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let S=u.filter(w=>{let N=G(O(w,"evidenceRefs"));return N.length>0&&N.some(L=>!E.has(L))});S.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${S.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let _=new Set(h.filter(w=>w.type==="DEPLOY"&&te(w.from??w.actor,m)&&H(w,E).length>0).map(w=>w.from??w.actor)),R=u.filter(w=>{let N=G(O(w,"roles")).length>0||G(O(w,"tags")).length>0||Nr(w)||An(w)||O(w,"isService")!==void 0||O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0||O(w,"supplyShare")!==void 0,L=ss(w,E)||Yc(w)&&_.has(w.id);return N&&!L}),C=R.filter(w=>O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0);C.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${C.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let v=u.filter(w=>An(w)&&!ss(w,E)&&!_.has(w.id));v.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${v.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),R.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${R.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let T=h.filter(w=>G(O(w,"holders")).some(N=>{let L=G(O(N,"evidenceRefs"));return L.length===0||L.some(j=>!E.has(j))}));T.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${T.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),Ol(O(e,"coverage"),a);let D=O(e,"gaps");if(ot(D,ie.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${ie.gaps}.`,{fatal:!0});else{let w=[];for(let N of G(D,ie.gaps)){if(!N||typeof N!="object"||Ee.isProxy(N)||Array.isArray(N)||!xt(N,Jc)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let L=O(N,"code"),j=O(N,"message");if(L!==void 0&&re(L)===null||j!==void 0&&re(j)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:L??"UPSTREAM_GAP",message:j??"An upstream normalization gap was reported."})}w.sort((N,L)=>ne(Ae(N.code),Ae(L.code))||ne(N.message,L.message));for(let N of w)a(N.code,N.message)}let ee=h.filter(w=>H(w,E).length>0),x=h.filter(w=>H(w,E).length===0);x.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${x.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let le=ee.filter(w=>!ls.has(w.type)||!is(w));le.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${le.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Le=ee.filter(is),se=Le.filter(w=>!as(w,m));se.length&&a("EVENT_ENTITY_UNRESOLVED",`${se.length} event(s) contained unresolved entity references.`,{fatal:!0});let ue=Le.filter(w=>as(w,m));ue.length===0&&a("NO_ANALYZABLE_EVENTS","No fully referenced evidence-backed event had semantics supported by coordination analysis; no low-risk conclusion was produced.");let F=[];return i||(F=[...ll(ue,m,E,o,a),...pl(ue,m,E,o,a),...fl(ue,m,E,o,a),...ml(ue,u,m,E,o,a),...dl(ue,m,E,o),...hl(ue,m,E),...yl(ue,m,E,o,a),...bl(ue,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,N)=>ne(w.kind,N.kind)||ne(w.id,N.id)),new Set(F.map(w=>w.id)).size!==F.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),F=[])),c({entities:u,events:h,evidenceById:E,eventWithEvidence:ee,analyzableEvents:ue,findings:F})}import{types as mt}from"node:util";import{types as Is}from"node:util";var Tn="oracle.opensea-wallet-enrichment/1",Il="oracle.nft-overlap-input/1",Sl="oracle.nft-overlap/1",Ye="REQUEST_PATH_PLUS_MATCHED_PROFILE",Nl=de(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),Sf=de(["COMPLETE","PARTIAL","UNKNOWN"]),vr="OBSERVED",bs="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",Sn="UNKNOWN",X=de({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Lt=de({1:"ethereum",10:"optimism",130:"unichain",137:"polygon",143:"monad",360:"shape",988:"stablechain",999:"hyperevm",1329:"sei",1868:"soneium",2020:"ronin",2741:"abstract",4326:"megaeth",4663:"robinhood",5031:"somnia",8333:"b3",8453:"base",33139:"ape_chain",42161:"arbitrum",43114:"avalanche",43419:"gunzilla",57073:"ink",69e3:"animechain",80094:"bera_chain",81457:"blast",7777777:"zora"}),Rt=de(["OpenSea profile and inventory records are marketplace-indexed observations, not on-chain ownership proof.","No identity, common-control, intent, or wallet-owner inference is made.","Inventory is limited to one unpaginated page of at most 20 holdings."]),Tl=de(["Overlap is limited to exact canonical NFT identities and exact chain-bound OpenSea collection slugs in the supplied snapshots.","An exact OpenSea collection slug overlap is a marketplace-index observation, not an on-chain or common-control claim.","No identity, ownership, common-control, intent, risk, or wrongdoing conclusion is made."]),st=de({NOT_REQUESTED:"OpenSea enrichment was not requested.",UNSUPPORTED_CHAIN_FAMILY:"OpenSea enrichment is unavailable for this chain family.",UNSUPPORTED_CHAIN:"OpenSea enrichment is unavailable for this fixed chain mapping.",INVALID_EVM_ADDRESS:"OpenSea enrichment requires a canonical EVM address.",API_KEY_UNAVAILABLE:"OpenSea enrichment is unavailable because its production API key is not configured.",PROFILE_AUTHENTICATION_FAILED:"The OpenSea profile request was not authenticated.",PROFILE_ACCESS_FORBIDDEN:"The OpenSea profile request was forbidden.",PROFILE_RATE_LIMITED:"The OpenSea profile request was rate limited.",PROFILE_UPSTREAM_UNAVAILABLE:"The OpenSea profile service was unavailable.",PROFILE_TIMEOUT:"The OpenSea profile request timed out.",PROFILE_REDIRECT_REFUSED:"The OpenSea profile response attempted a redirect and was refused.",PROFILE_RESPONSE_TOO_LARGE:"The OpenSea profile response exceeded the fixed byte limit.",PROFILE_NOT_FOUND:"The OpenSea profile was not found.",PROFILE_MALFORMED:"The OpenSea profile response did not satisfy the bounded contract.",PROFILE_ADDRESS_MISMATCH:"The OpenSea profile did not match the requested canonical wallet.",PROFILE_TRANSPORT_FAILED:"The OpenSea profile request failed.",PROFILE_USERNAME_REJECTED:"Optional OpenSea username metadata was omitted because it did not satisfy the safe display contract.",INVENTORY_AUTHENTICATION_FAILED:"The OpenSea inventory request was not authenticated.",INVENTORY_ACCESS_FORBIDDEN:"The OpenSea inventory request was forbidden.",INVENTORY_RATE_LIMITED:"The OpenSea inventory request was rate limited.",INVENTORY_UPSTREAM_UNAVAILABLE:"The OpenSea inventory service was unavailable.",INVENTORY_TIMEOUT:"The OpenSea inventory request timed out.",INVENTORY_REDIRECT_REFUSED:"The OpenSea inventory response attempted a redirect and was refused.",INVENTORY_RESPONSE_TOO_LARGE:"The OpenSea inventory response exceeded the fixed byte limit.",INVENTORY_NOT_FOUND:"The OpenSea inventory was not found.",INVENTORY_MALFORMED:"The OpenSea inventory response did not satisfy the bounded contract.",INVENTORY_TRANSPORT_FAILED:"The OpenSea inventory request failed.",INVENTORY_CURSOR_PRESENT:"OpenSea reported another inventory page; no cursor was retained or followed.",INVENTORY_ROW_LIMIT:"OpenSea returned more than the fixed 20-row inventory bound.",INVENTORY_ROW_REJECTED:"At least one OpenSea inventory row did not satisfy the canonical holding contract.",INVENTORY_COLLECTION_REJECTED:"At least one canonical OpenSea holding lacked a valid bounded collection slug; exact NFT evidence was retained.",INVENTORY_DUPLICATE_HOLDING:"At least one duplicate OpenSea holding was collapsed.",INVENTORY_CONFLICTING_HOLDING:"At least one conflicting OpenSea collection association was excluded while exact-NFT evidence was retained."}),_l=de({CONFLICTING_DUPLICATE_SNAPSHOT:"Conflicting snapshots for the same chain and canonical wallet were excluded.",INPUT_COVERAGE_INCOMPLETE:"At least one included snapshot had incomplete relevant inventory coverage.",EXACT_NFT_COVERAGE_INCOMPLETE:"At least one included exact-NFT inventory was incomplete.",COLLECTION_COVERAGE_INCOMPLETE:"At least one included collection-slug inventory was incomplete.",PROFILE_METADATA_INCOMPLETE:"At least one matched profile omitted unsafe optional username metadata.",INELIGIBLE_HOLDING_EVIDENCE:"At least one holding lacked separate wallet-bound LIVE or INDEXED profile and holding evidence.",INSUFFICIENT_DISTINCT_WALLETS:"Fewer than two distinct canonical wallet IDs qualified for a negative overlap statement.",FINDINGS_TRUNCATED:"Deterministic finding limits omitted additional qualifying overlaps."}),Ss=new Set(Nl),vl=new Set(Mt),xr=new Set(["LIVE","INDEXED"]),oe=(e,t)=>e<t?-1:e>t?1:0,xl=/^0x[0-9a-fA-F]{40}$/u,Rl=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,Ll=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,Pl=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,Ns=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,Ts=/[\u0000-\u001f\u007f-\u009f]/u,Cl=(1n<<256n)-1n;function b(e,t="invalid-nft-overlap"){throw new kt(`nft-overlap: ${e}`,t)}function _s(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function vs(e){return!e||typeof e!="object"||Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function W(){return vs([])}function $(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function de(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&vs(e);let n;try{n=Reflect.ownKeys(e)}catch{b("normalized output could not be frozen safely","invalid-object")}for(let r of n){if(r==="toJSON")continue;let o;try{o=Object.getOwnPropertyDescriptor(e,r)}catch{b("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&de(o.value,t)}return Object.freeze(e),e}function Q(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||Is.isProxy(e))&&b(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{b(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&b(`${n} must be a plain object`,"invalid-object");let s=new Set(t),i=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{b(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&_s(c)||((typeof a!="string"||!s.has(a))&&b(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&b(`${n}.${a} must be an own data field`,"invalid-object"),i.set(a,c.value))}return Object.freeze({has:a=>i.has(a),get:a=>i.get(a)})}function Te(e,t,n,r=0){(!Array.isArray(e)||Is.isProxy(e))&&b(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{b(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&b(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{b(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let d=0;d<s;d+=1)a.add(String(d));let c=W();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{b(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&_s(l)||(typeof d!="string"||!a.has(d))&&b(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let d=0;d<s;d+=1){let l;try{l=Object.getOwnPropertyDescriptor(e,String(d))}catch{b(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&b(`${t} must be dense and contain only own data items`,"invalid-array"),$(c,l.value)}return c}function jl(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||Ts.test(e)||Ns.test(e))&&b(`${t} is not safe bounded text`,"invalid-string"),e}function ft(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&b(`${n} is not a deterministic ID`,"invalid-id"),e}function xs(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&b(`${t} is not a canonical digest`,"invalid-digest"),e}function Rr(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&b(`${t} must be a positive safe integer`,"invalid-chain"),e}function pt(e){return(typeof e!="string"||!xl.test(e))&&b("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function kl(e){(typeof e!="string"||e.length===0||e.length>78||!Rl.test(e))&&b("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{b("tokenId must be uint256","invalid-token-id")}return(t<0n||t>Cl)&&b("tokenId must be uint256","invalid-token-id"),t.toString(10)}function Dl(e){return(typeof e!="string"||!Ll.test(e))&&b("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Lr(e={}){let t=Q(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||b("canonical NFT input is missing a field","missing-field");let n={chainId:Rr(t.get("chainId"),"nft.chainId"),contract:pt(t.get("contract")),tokenId:kl(t.get("tokenId"))};return de({id:tt("nft",n),...n})}function Pr(e={}){let t=Q(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||b("canonical collection input is missing a field","missing-field");let n={chainId:Rr(t.get("chainId"),"collection.chainId"),slug:Dl(t.get("slug"))};return de({id:tt("collection",n),...n})}function _n(e={}){let t=Q(e,["family","chainId","address"],"canonical wallet input"),n=t.has("family")?t.get("family"):"evm",r=t.has("chainId")?t.get("chainId"):null,o=t.has("address")?t.get("address"):null,s=jl(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||b("wallet.family is invalid","invalid-family");let i=r===null?null:Rr(r,"wallet.chainId");if(o===null)return de({id:null,family:s,chainId:i,address:null});s!=="evm"&&b("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=pt(o);return de({id:tt("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function Cr(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!Pl.test(e)||Ts.test(e)||Ns.test(e)||J(e)?null:e}function $l(e,t="snapshot.wallet"){let n=Q(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||b(`${t} is missing a required field`,"missing-field");let r=_n({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&b(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function Es(e,t){let n=Q(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&b(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return Ss.has(r)||b(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&b(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function Ml(e){let t=Q(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||b("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");Ss.has(n)||b("snapshot.coverage.status is invalid","invalid-status");let r=Es(t.get("profile"),"snapshot.coverage.profile"),o=Es(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&b("inventory cannot be called before profile","invalid-count");let s=(a,c,d,l,f)=>n===a&&r.status===c&&r.calls===d&&o.status===l&&o.calls===f;return s("NOT_REQUESTED","NOT_REQUESTED",0,"NOT_REQUESTED",0)||s("UNAVAILABLE","UNAVAILABLE",0,"UNAVAILABLE",0)||s("UNKNOWN","UNKNOWN",1,"UNAVAILABLE",0)||n==="PARTIAL"&&["COMPLETE","PARTIAL"].includes(r.status)&&["COMPLETE","PARTIAL","UNKNOWN"].includes(o.status)&&r.calls===1&&o.calls===1&&(r.status!=="COMPLETE"||o.status!=="COMPLETE")||s("COMPLETE","COMPLETE",1,"COMPLETE",1)||b("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function Ul(e){let t=Te(e,"snapshot.gaps",Object.keys(st).length),n=W();for(let s=0;s<t.length;s+=1){let i=Q(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&b("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(st,a)||i.get("message")!==st[a])&&b("snapshot gap is not a fixed allowlisted gap","invalid-gap"),$(n,a)}let r=W(),o=new Set;for(let s of n)o.has(s)||(o.add(s),$(r,s));return r.sort(oe),r}function Fl(e){return Object.hasOwn(st,e)||b("OpenSea gap code is invalid","invalid-gap"),de({code:e,message:st[e]})}function Vl(e){let t=Q(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||b("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),s=t.get("walletId");if(vl.has(n)||b("OpenSea evidence status is invalid","invalid-status"),ft(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||b("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&b("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&b("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:pt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&b("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||b("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&b("holding evidence source is invalid","invalid-source");let i=ft(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:ft(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==Ye&&b("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:Ye}}b("OpenSea evidence kind is invalid","invalid-kind")}function qt(e={}){let t=Vl(e);return de({id:tt("evidence",t),digest:et(t),...t})}function zl(e,t){let n=Q(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(i=>n.has(i))||b("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(i=>n.has(i)).map(i=>[i,n.get(i)])),s=qt(o);return ft(n.get("id"),"evidence","evidence.id"),xs(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&b("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function Bl(e,t){if(e===null)return null;let n=Q(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&b("snapshot.profile is missing a required field","missing-field");let r=pt(n.get("address"));(!t.address||r!==t.address)&&b("profile address does not match snapshot wallet","profile-mismatch");let o=ft(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=Cr(n.get("username"));return(s===null||s!==n.get("username"))&&b("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function Hl(e,t,n){let r=Q(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||b("snapshot holding is missing a required field","missing-field");let s=Lr({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&b("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&b("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=Q(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||b("holding collection is missing a required field","missing-field"),i=Pr({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&b("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==Ye&&b("holding owner binding is invalid","invalid-owner-binding");let a=Te(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,X.citationsPerFinding,1).map(d=>ft(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(oe);return c.length!==a.length&&b("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:Ye,evidenceRefs:c}}function ql(e){return{schemaVersion:e.schemaVersion,wallet:e.wallet,requested:e.requested,coverage:e.coverage,profile:e.profile?{address:e.profile.address,evidenceRef:e.profile.evidenceRef}:null,holdings:e.holdings.map(t=>({id:t.id,chainId:t.chainId,contract:t.contract,tokenId:t.tokenId,collection:t.collection,ownerBinding:t.ownerBinding,evidenceRefs:t.evidenceRefs})),evidence:e.evidence.map(t=>({id:t.id,digest:t.digest})),gapCodes:e.gaps.map(t=>t.code)}}function Gl(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&b("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&b("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&b("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||s.length>0||i.length>0)&&(!n.chainId||!Object.hasOwn(Lt,n.chainId))&&b("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||s.length>0||i.length>0)&&b(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&b(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&b("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&b("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&b("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let y of i)d.has(y.id)&&b("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(y.id,y),n.id&&y.walletId!==n.id&&b("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let y=d.get(o.evidenceRef);(!y||y.kind!=="PROFILE"||y.address!==o.address)&&b("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,f=0;for(let y of s){l.has(y.id)&&b("snapshot holdings must be unique","duplicate-holding"),l.add(y.id),y.collection===null&&(f+=1);for(let E of y.evidenceRefs)d.has(E)||b("holding cites unknown evidence","invalid-reference")}let u=new Set,h=W(),p=W();for(let y of a)u.add(y.code),y.code.startsWith("PROFILE_")&&$(h,y.code),y.code.startsWith("INVENTORY_")&&$(p,y.code);let m=new Set(["UNSUPPORTED_CHAIN_FAMILY","UNSUPPORTED_CHAIN","INVALID_EVM_ADDRESS","API_KEY_UNAVAILABLE"]);r.status==="NOT_REQUESTED"&&(t||a.length!==1||!u.has("NOT_REQUESTED"))&&b("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&b("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(u.has("NOT_REQUESTED")||[...m].some(y=>u.has(y)))&&b("attempted coverage cannot contain an availability reason","invalid-coverage"),f>0&&!u.has("INVENTORY_COLLECTION_REJECTED")&&!u.has("INVENTORY_CONFLICTING_HOLDING")&&b("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&b("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&b("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&b("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&b("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(h.length===0||h.some(y=>y==="PROFILE_USERNAME_REJECTED"))&&b("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&b("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let g=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&p.length>0&&b("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(p.length===0||p.some(y=>!g.has(y)))&&b("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(p.length===0||p.some(y=>g.has(y)))&&b("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&p.length>0&&b("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&b("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&b("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&b("incomplete snapshot must contain a fixed gap","invalid-coverage")}function jr(e={}){let t=Q(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||b("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&b("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=Q(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?$l(r,"snapshot.wallet"):_n(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=Ml(t.get("coverage")),c=Te(t.get("evidence"),"snapshot.evidence",X.evidencePerSnapshot).map((E,S)=>{try{let _=Q(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${S}]`);return _.has("id")||_.has("digest")?zl(E,S):qt(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(R=>_.has(R)).map(R=>[R,_.get(R)])))}catch(_){throw _}}).sort((E,S)=>oe(E.id,S.id)),d=t.get("profile"),l=null;if(d!==null){let E=Q(d,["address","evidenceRef","username"],"snapshot.profile");l=Bl(Object.fromEntries(["address","evidenceRef","username"].filter(S=>E.has(S)).map(S=>[S,E.get(S)])),s)}let u=Te(t.get("holdings"),"snapshot.holdings",X.holdingsPerSnapshot).map((E,S)=>Hl(E,S,s)).sort((E,S)=>oe(E.id,S.id)),h=Te(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(st).length).map(E=>(Object.hasOwn(st,E)||b("snapshot gap code is invalid","invalid-gap"),E)),p=[...new Set(h)].sort(oe).map(Fl),m={schemaVersion:Tn,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:u,evidence:c,gaps:p,caveats:[...Rt]};Gl(m);let g=tt("opensea-snapshot",ql(m)),y=et(m);return de({...m,snapshotId:g,digest:y})}function Wl(e){let t=Q(e,["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],"OpenSea snapshot");["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"].every(i=>t.has(i))||b("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==Tn||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&b("OpenSea snapshot envelope is invalid","invalid-envelope"),Te(t.get("caveats"),"snapshot.caveats",Rt.length,Rt.length).some((i,a)=>i!==Rt[a])&&b("snapshot caveats are invalid","invalid-caveat");let o=Ul(t.get("gaps")),s=jr({requested:t.get("requested"),wallet:t.get("wallet"),coverage:t.get("coverage"),profile:t.get("profile"),holdings:t.get("holdings"),evidence:t.get("evidence"),gapCodes:o});return ft(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),xs(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&b("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function Jl(e){return{code:e,message:_l[e]}}function Yl(e,t,n,r){let o=e.profile;if(!o||!e.wallet.id)return null;let s=!1;for(let c of t.evidenceRefs)c===o.evidenceRef&&(s=!0);if(!s)return null;let i=n.get(o.evidenceRef);if(!i||i.kind!=="PROFILE"||!xr.has(i.status)||i.walletId!==e.wallet.id||i.address!==e.wallet.address||r.has(i.id))return null;let a=null;for(let c of t.evidenceRefs){let d=n.get(c);!d||d.id===i.id||d.kind!=="HOLDING"||!xr.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==Ye||r.has(d.id)||(!a||oe(d.id,a.id)<0)&&(a=d)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:Ye,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function Os(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let s=o.byWallet.get(r.walletId);(!s||oe(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function Kl(e,t,n){(!Array.isArray(n)||n.length<2||n.length>X.snapshots||n.length*2>X.citationsPerFinding)&&b("finding citations exceeded the fixed limit","citation-limit");let r=W();for(let l=0;l<n.length;l+=1)$(r,n[l]);r.sort((l,f)=>oe(l.walletId,f.walletId)||oe(l.snapshotId,f.snapshotId)||oe(l.holdingEvidence.id,f.holdingEvidence.id));let o=W(),s=W(),i=new Set;for(let l of r)$(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),$(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=W();for(let l of i)$(a,l);a.sort(oe);let c={kind:e,status:vr,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:tt(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:et(c),...c}}function _r(e,t){return`${e}:${t.canonical.id}`}function ws(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||oe(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function Zl(e,t,n){if(n<=0)return;if(e.length<n){$(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)oe(e[o].key,e[r].key)>0&&(r=o);oe(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function Xl(e,t){let n=0,r=0;for(let m of e.values())m.byWallet.size>=2&&(n+=1);for(let m of t.values())m.byWallet.size>=2&&(r+=1);let o=n+r,s=W(),i=new Set,a=ws(e),c=ws(t);if(a){let m={section:"exact",group:a,key:_r("exact",a)};$(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:_r("collection",c)};$(s,m),i.add(m.key)}let d=W(),l=X.findings-s.length,f=(m,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let E=_r(m,y);i.has(E)||Zl(d,{section:m,group:y,key:E},l)}};f("exact",e),f("collection",t);let u=W();for(let m of s)$(u,m);for(let m of d)$(u,m);u.length>X.findings&&b("finding selection exceeded the fixed limit","finding-limit"),u.sort((m,g)=>oe(m.key,g.key));let h=W(),p=W();for(let m of u)$(m.section==="exact"?h:p,m.group);return{exact:h,collections:p,exactCount:n,collectionCount:r,truncated:o>X.findings}}function Nn(e){return e.coverage.inventory.status==="COMPLETE"}function Ql(e){e.byWallet.size>X.snapshots&&b("finding wallet citations exceeded the snapshot limit","citation-limit");let t=W();for(let n of e.byWallet.values())$(t,n);return t.length*2>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),t}function As(e,t){let n=W();for(let r of t)$(n,Kl(e,r.canonical,Ql(r)));return n.sort((r,o)=>oe(r.id,o.id)),n}function Rs(e){arguments.length!==1&&b("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=Q(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&b("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==Il&&b("NFT overlap input schema is invalid","invalid-schema");let n=Te(t.get("snapshots"),"NFT overlap snapshots",X.snapshots,2),r=0;for(let A=0;A<n.length;A+=1){let P=Q(n[A],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${A}]`);for(let z of["holdings","evidence","gaps","caveats"])P.has(z)||b(`snapshot ${z} is required`,"missing-field");let q=Te(P.get("holdings"),`NFT overlap snapshots[${A}].holdings`,X.holdingsPerSnapshot);Te(P.get("evidence"),`NFT overlap snapshots[${A}].evidence`,X.evidencePerSnapshot),Te(P.get("gaps"),`NFT overlap snapshots[${A}].gaps`,Object.keys(st).length),Te(P.get("caveats"),`NFT overlap snapshots[${A}].caveats`,Rt.length,Rt.length),r+=q.length,r>X.totalHoldings&&b("total holdings exceed the fixed limit","holding-limit");for(let z=0;z<q.length;z+=1){let Ke=Q(q[z],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${A}].holdings[${z}]`);Ke.has("evidenceRefs")||b("holding evidenceRefs are required","missing-field"),Te(Ke.get("evidenceRefs"),`NFT overlap snapshots[${A}].holdings[${z}].evidenceRefs`,X.citationsPerFinding,1)}}let o=W();for(let A of n)$(o,Wl(A));let s=new Map;for(let A of o){let P=A.wallet.id&&A.wallet.chainId?`${A.wallet.id}:${A.wallet.chainId}`:`noncanonical:${A.snapshotId}`;s.has(P)||s.set(P,W()),$(s.get(P),A)}let i=W(),a=0,c=0,d=W();for(let A of s.keys())$(d,A);d.sort(oe);for(let A of d){let P=s.get(A),q=new Set;for(let z of P)q.add(z.digest);if(q.size>1&&!A.startsWith("noncanonical:")){c+=1;continue}P.sort((z,Ke)=>oe(z.snapshotId,Ke.snapshotId)),$(i,P[0]),a+=P.length-1}let l=new Map;for(let A of i)for(let P of A.evidence)l.has(P.id)||l.set(P.id,new Set),A.wallet.id&&l.get(P.id).add(A.wallet.id);let f=new Set;for(let[A,P]of l)P.size>1&&f.add(A);let u=new Map,h=new Map,p=new Set,m=new Map,g=new Map,y=0,E=0,S=!1,_=c>0,R=c>0;for(let A of i){let P=A.wallet.id;P&&p.add(P),A.coverage.profile.status==="PARTIAL"&&(S=!0);let q=new Map;for(let ye of A.evidence)q.set(ye.id,ye);let z=A.profile?q.get(A.profile.evidenceRef):null,Ke=!!(A.profile&&P&&z&&z.kind==="PROFILE"&&xr.has(z.status)&&z.walletId===P&&z.address===A.wallet.address&&!f.has(z.id)),Pt=Ke&&Nn(A),gt=Ke&&Nn(A);(Nn(A)||Nn(A))&&!Ke&&(y+=1);let Kt=new Set;A.profile&&Kt.add(A.profile.evidenceRef);for(let ye of A.holdings){let Ct=Yl(A,ye,q,f);if(!Ct){E+=1,Pt=!1,gt=!1;continue}Kt.add(Ct.profileEvidence.id),Kt.add(Ct.holdingEvidence.id),Os(u,ye.id,{id:ye.id,chainId:ye.chainId,contract:ye.contract,tokenId:ye.tokenId},Ct),ye.collection?Os(h,ye.collection.id,ye.collection,Ct):gt=!1}for(let ye of A.evidence)Kt.has(ye.id)||(E+=1,Pt=!1,gt=!1);P?(m.set(P,(m.has(P)?m.get(P):!0)&&Pt),g.set(P,(g.has(P)?g.get(P):!0)&>)):(Pt=!1,gt=!1),Pt||(_=!0),gt||(R=!0)}let C=new Set,v=new Set;for(let[A,P]of m)P&&C.add(A);for(let[A,P]of g)P&&v.add(A);let T=new Set;for(let A of C)v.has(A)&&T.add(A);let D=Xl(u,h),ee=As("EXACT_NFT_OVERLAP",D.exact),x=As("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",D.collections),le=!_&&p.size>=2&&C.size>=2,Le=!R&&p.size>=2&&v.size>=2,se=D.exactCount>0?vr:le?bs:Sn,ue=D.collectionCount>0?vr:Le?bs:Sn,F=W();c>0&&$(F,"CONFLICTING_DUPLICATE_SNAPSHOT"),(_||R)&&$(F,"INPUT_COVERAGE_INCOMPLETE"),_&&$(F,"EXACT_NFT_COVERAGE_INCOMPLETE"),R&&$(F,"COLLECTION_COVERAGE_INCOMPLETE"),S&&$(F,"PROFILE_METADATA_INCOMPLETE"),(y>0||E>0||f.size>0)&&$(F,"INELIGIBLE_HOLDING_EVIDENCE"),p.size<2&&D.exactCount===0&&D.collectionCount===0&&$(F,"INSUFFICIENT_DISTINCT_WALLETS"),D.truncated&&$(F,"FINDINGS_TRUNCATED");let w=W(),N=new Set;for(let A of F)N.has(A)||(N.add(A),$(w,A));w.sort(oe);let L=W();for(let A of w)$(L,Jl(A));let j=0;for(let A of u.values())j+=A.byWallet.size;let _e=!_&&!R&&!S&&!D.truncated&&p.size>=2?"COMPLETE":se!==Sn||ue!==Sn?"PARTIAL":"UNKNOWN",$e={schemaVersion:Sl,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:_e,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:p.size,completeDistinctWallets:T.size,completeExactNftWallets:C.size,completeCollectionWallets:v.size,qualifyingHoldings:j},exactNft:{state:se,findings:ee},collection:{state:ue,findings:x},gaps:L,caveats:[...Tl],limits:X},Yt=tt("nft-overlap-report",$e),ht=et($e);return de({...$e,reportId:Yt,digest:ht})}var js=128*1024,ks=1024*1024,Ds=8e3,ed=20,td=512,nd=1024,$s=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Ls=Object.freeze({evm:1,eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999}),vn=/[\u0000-\u001f\u007f-\u009f]/u,rd=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,od=Object.freeze(["family","chainId","address","includeOpenSea"]),sd=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),xn=(e,t)=>e<t?-1:e>t?1:0;function kr(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function Re(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function me(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function id(e){(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))&&me("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{me("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&me("args must be a plain object","invalid-object");let r=new Set(od),o=new Map;for(let s of n){if(typeof s!="string"||!r.has(s)){let a=typeof s=="string"?s.replace(/[^a-z0-9]/giu,"").toLowerCase():"symbol";sd.some(c=>a.includes(c))&&me("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),me("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{me(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&me(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function ad(e){let t=id(e);for(let d of["family","address"])t.has(d)||me(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||vn.test(n))&&me("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||me("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||vn.test(o))&&me("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&me("args.address must not be a URL","invalid-address");let i=$s.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(Ls,r)?Ls[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&me("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!vn.test(a)||Number.isSafeInteger(a)&&a>0)&&me("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&me("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function cd(e){let t=$s.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=pt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:_n({family:n,chainId:e.chainId,address:r}),evm:t}}function it({requested:e,target:t,status:n,profileStatus:r,inventoryStatus:o,profileCalls:s=0,inventoryCalls:i=0,profile:a=null,holdings:c=[],evidence:d=[],gaps:l=[]}){return jr({requested:e,wallet:t.wallet,coverage:{status:n,profile:{status:r,calls:s},inventory:{status:o,calls:i}},profile:a,holdings:c,evidence:d,gapCodes:l})}function ld(){let e=process.env,t;try{t=Object.getOwnPropertyDescriptor(e,"OPENSEA_API_KEY")}catch{return}return t&&"value"in t?t.value:void 0}function Ms(e){let t=Ce(e);return t&&t.length<=nd?t:null}function Dr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getPrototypeOf(e)}catch{throw new Error("malformed-response")}if(n!==Object.prototype&&n!==null)throw new Error("malformed-response");let r=new Map;for(let o of t){let s;try{s=Object.getOwnPropertyDescriptor(e,o)}catch{throw new Error("malformed-response")}if(s){if(!("value"in s))throw new Error("malformed-response");r.set(o,s.value)}}return r}function dd(e,t){if(!Array.isArray(e)||mt.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getOwnPropertyDescriptor(e,"length")}catch{throw new Error("malformed-response")}let r=n?.value;if(!Number.isInteger(r)||r<0)throw new Error("malformed-response");let o=Math.min(r,t),s=kr();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}Re(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function Gt(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function ud(e,t,n){let r=Dr(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=pt(r.get("address"))}catch{throw new Error("malformed-response")}if(o!==t){let a=new Error("profile-mismatch");throw a.profileMismatch=!0,a}let s,i=!1;if(r.has("username")&&r.get("username")!==null&&r.get("username")!==void 0){let a=r.get("username");s=Gt(a,n)?null:Cr(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function fd(e,t,n,r){let o=Dr(e,["nfts","next"]);if(!o.has("nfts"))throw new Error("malformed-response");let s=o.has("next")?o.get("next"):null;if(s!==null&&(typeof s!="string"||s.length===0||s.length>td||vn.test(s)||rd.test(s)||Gt(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=dd(o.get("nfts"),ed),c=kr();a&&Re(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&Re(c,"INVENTORY_CURSOR_PRESENT");let d=new Map,l=new Set;for(let h of i){let p,m;try{if(typeof h=="symbol")throw new Error("invalid-row");if(p=Dr(h,["identifier","contract","collection"]),!["identifier","contract"].every(E=>p.has(E)))throw new Error("invalid-row");if(![p.get("identifier"),p.get("contract")].every(E=>typeof E=="string"))throw new Error("invalid-row");if(Gt(p.get("identifier"),r)||Gt(p.get("contract"),r))throw new Error("invalid-row");m=Lr({chainId:t.chainId,contract:p.get("contract"),tokenId:p.get("identifier")})}catch{Re(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(p.has("collection")&&typeof p.get("collection")=="string"&&!Gt(p.get("collection"),r))try{g=Pr({chainId:t.chainId,slug:p.get("collection")})}catch{g=null}if(g===null&&Re(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){Re(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=d.get(m.id);if(y){let E=y.collection?.id??null,S=g?.id??null;E===null&&S!==null?(d.set(m.id,{nft:m,collection:g}),Re(c,"INVENTORY_DUPLICATE_HOLDING")):S===null||E===S?Re(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),Re(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let f=kr(),u=[n];for(let{nft:h,collection:p}of[...d.values()].sort((m,g)=>xn(m.nft.id,g.nft.id))){let m=qt({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:p?.id??null,ownerBinding:Ye});Re(u,m),Re(f,{...h,collection:p,ownerBinding:Ye,evidenceRefs:[n.id,m.id].sort(xn)})}return{holdings:f,evidence:u,gaps:[...new Set(c)].sort(xn)}}function at(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||mt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function Ps(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=at(e,"status"),o=at(e,"name"),s=at(e,"message");return at(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":at(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:at(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:at(e,"oracleTimeout")===!0||at(e,"timeout")===!0||o==="AbortError"||o==="TimeoutError"||r===408?`${n}_TIMEOUT`:r===401?`${n}_AUTHENTICATION_FAILED`:r===403?`${n}_ACCESS_FORBIDDEN`:r===404?`${n}_NOT_FOUND`:r===429?`${n}_RATE_LIMITED`:Number.isInteger(r)&&r>=500&&r<=599?`${n}_UPSTREAM_UNAVAILABLE`:s==="malformed-response"?`${n}_MALFORMED`:`${n}_TRANSPORT_FAILED`}function $r(e){let t=Object.create(null);for(let[n,r]of e)Object.defineProperty(t,n,{value:r,writable:!1,enumerable:!0,configurable:!1});return t}function pd(e){if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new TypeError("OpenSea transport requires safe headers");let t;try{t=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea transport could not inspect headers")}let n=new Set(["Accept","x-api-key"]);if(t.length!==n.size||t.some(o=>typeof o!="string"||!n.has(o)))throw new TypeError("OpenSea transport requires only its fixed headers");let r=new Map;for(let o of n){let s;try{s=Object.getOwnPropertyDescriptor(e,o)}catch{throw new TypeError("OpenSea transport could not inspect headers")}if(!s||!("value"in s))throw new TypeError("OpenSea transport requires own-data headers");r.set(o,s.value)}if(r.get("Accept")!=="application/json"||Ms(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return $r([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function md(e,t){if(typeof e!="string"||!e.startsWith("https://api.opensea.io/api/v2/"))throw new TypeError("OpenSea transport refused a non-fixed URL");if(!t||typeof t!="object"||mt.isProxy(t))throw new TypeError("OpenSea transport requires safe RequestInit");let n=Object.create(null);for(let r of["method","headers","body","signal","redirect"]){let o;try{o=Object.getOwnPropertyDescriptor(t,r)}catch{throw new TypeError("OpenSea transport could not inspect RequestInit")}if(o){if(!("value"in o))throw new TypeError("OpenSea transport requires own-data RequestInit");Object.defineProperty(n,r,{value:r==="headers"?pd(o.value):o.value,writable:!0,enumerable:!0,configurable:!0})}}return Object.defineProperty(n,"dispatcher",{value:void 0,writable:!0,enumerable:!0,configurable:!0}),globalThis.fetch(e,n)}function Cs(e,t){let n=$r([["x-api-key",e]]);return $r([["method","GET"],["headers",n],["fetchImpl",md],["timeoutMs",Ds],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function hd(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new TypeError("OpenSea internal client dependencies must be one non-Proxy object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(t!==Object.prototype&&t!==null)throw new TypeError("OpenSea internal client dependencies must be a plain object");let r=new Set(["requestJson","readApiKey"]),o=new Map;for(let s of n){if(typeof s!="string"||!r.has(s))throw new TypeError("OpenSea internal client dependencies have an unknown field");let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(!i||!("value"in i))throw new TypeError(`OpenSea internal client dependency ${s} must be an own data field`);o.set(s,i.value)}return o}function Us(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=hd(e),n=t.has("requestJson")?t.get("requestJson"):K,r=t.has("readApiKey")?t.get("readApiKey"):ld;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&me("exactly one args object is required","second-options-forbidden");let i=ad(s),a=cd(i);if(!i.includeOpenSea)return it({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(Lt,a.chainId))return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=Ms(r())}catch{c=null}if(!c)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["API_KEY_UNAVAILABLE"]});let d=`https://api.opensea.io/api/v2/accounts/${a.address}`,l;try{let E=await n(d,Cs(c,js));l=ud(E,a.address,c)}catch(E){return it({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[Ps(E,"profile")]})}let f=qt({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),u={address:a.address,evidenceRef:f.id,...l.username!==void 0?{username:l.username}:{}},h=l.usernameRejected?["PROFILE_USERNAME_REJECTED"]:[],m=`https://api.opensea.io/api/v2/chain/${Lt[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,Cs(c,ks));g=fd(E,a,f,c)}catch(E){return it({requested:!0,target:a,status:"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:u,evidence:[f],gaps:[...h,Ps(E,"inventory")]})}let y=[...new Set([...h,...g.gaps])].sort(xn);return it({requested:!0,target:a,status:y.length===0?"COMPLETE":"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:g.gaps.length===0?"COMPLETE":"PARTIAL",profileCalls:1,inventoryCalls:1,profile:u,holdings:g.holdings,evidence:g.evidence,gaps:y})}return Object.freeze({enrich:o})}var Rf=Object.freeze({profileMaxBytes:js,inventoryMaxBytes:ks,timeoutMs:Ds,retries:0,redirects:0,dedupe:!1});var gd=Us();async function Fs(e){if(arguments.length!==1){let t=new TypeError("opensea enrichment: exactly one args object is required");throw t.code="second-options-forbidden",t}return gd.enrich(e)}var Ur="oracle.investigator-cli/2",Mr=2*1024*1024,Ed=/^[^\u0000-\u001f\u007f]+$/u,Od=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),De=class extends Error{constructor(t){super(t),this.name="CliError"}};function V(e){throw new De(e)}function wd(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if(!r||typeof r!="object"||t.has(r))throw new De("output is not bounded own-data JSON");t.add(r);try{let s=" ".repeat(o),i=" ".repeat(o+1);if(Array.isArray(r)){let c=[];for(let d=0;d<r.length;d+=1){let l=Object.getOwnPropertyDescriptor(r,String(d));if(!l||!Object.hasOwn(l,"value"))throw new De("output is not bounded own-data JSON");c.push(n(l.value,o+1))}return c.length?`[
|
|
2
|
+
import{readFile as bd,stat as Ed}from"node:fs/promises";import{createHash as Hn}from"node:crypto";import{types as Mt}from"node:util";var qs=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),Gs=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Ws=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Js(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Ys(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=Js(n);if(Gs.has(r)||Ws.some(o=>r.includes(o)))return!0}return!1}function Vr(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Ks=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Zs(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function Xs(e){let t=e.match(Ks)||[];for(let n of t){let r=Zs(n),o=Vr(r),s=o?Vr(o):null;for(let i of[r,o,s])if(i&&Ys(i))return!0}return!1}var Qs=Object.freeze([Object.freeze([120,112,114,118]),Object.freeze([115,107,45]),Object.freeze([103,104,112,95]),Object.freeze([103,104,111,95]),Object.freeze([103,104,117,95]),Object.freeze([103,104,115,95]),Object.freeze([103,104,114,95]),Object.freeze([103,105,116,104,117,98,95,112,97,116,95]),Object.freeze([97,107,105,97]),Object.freeze([97,115,105,97])]);function Ze(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function Xe(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of Qs){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function Y(e){return typeof e!="string"||e.length===0?!1:qs.some(t=>t.test(e))?!0:Xs(e)}import{createHash as Qr}from"node:crypto";import{createHash as oi}from"node:crypto";import{types as Fe}from"node:util";import ct from"node:net";import ei from"node:dns";var ti=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Xt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=l=>{if(!l)return[];let f=l.split(":"),u=f.at(-1);if(u?.includes(".")){let h=u.split(".").map(Number);if(h.length!==4||h.some(p=>!Number.isInteger(p)||p<0||p>255))return null;f.splice(f.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return f.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:f.map(h=>Number.parseInt(h,16))},[r,o]=t.split("::"),s=n(r),i=n(o);if(!s||!i)return null;let a=t.includes("::"),c=8-s.length-i.length;if(!a&&c!==0||a&&c<1)return null;let d=[...s,...Array(Math.max(0,c)).fill(0),...i];return d.length!==8?null:Uint8Array.from(d.flatMap(l=>[l>>8,l&255]))}function Pn(e,t,n){let r=Math.floor(n/8),o=n%8;for(let i=0;i<r;i+=1)if(e[i]!==t[i])return!1;if(!o)return!0;let s=255<<8-o;return(e[r]&s)===(t[r]&s)}function Cn(e){if(ct.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(ct.isIPv6(e)){let t=Xt(e);if(!t)return!1;let n=Xt("::ffff:0:0");return Pn(t,n,96)?Cn([...t.slice(12)].join(".")):Pn(t,Xt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>Pn(t,Xt(o),s)):!1}return!1}function ni(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(ti.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ct.isIP(n);return r!==0&&!Cn(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function jn(e,{lookupFn:t=ei.promises.lookup}={}){let n=ni(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ct.isIPv6(n.host)?6:4}]};let r;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=>!Cn(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function kn({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let f=await t();n=f.Agent,r=f.fetch}catch(f){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${f?.message||f}`);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 o=f=>String(f).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,i=f=>(Array.isArray(f)?f:[f]).map(u=>typeof u=="string"?{address:u}:u).filter(u=>u&&u.address).map(u=>({address:u.address,family:u.family||(ct.isIPv6(u.address)?6:4)})),a=(f,u,h)=>{s.set(o(f),i(typeof u=="string"?[{address:u,family:h}]:u))},c=f=>{let u=o(f);if(ct.isIP(u))return[{address:u,family:ct.isIPv6(u)?6:4}];let h=s.get(u);if(!h||!h.length)throw new Error(`refused: unpinned host ${f} during pinned fetch`);return h},d=new n({connect:{lookup(f,u,h){let p;try{p=c(f)}catch(m){return h(m)}return u?.all?h(null,p):h(null,p[0].address,p[0].family)}}}),l=ri((f,u={})=>r(f,{...u,dispatcher:d}),a);return{dispatcher:d,fetch:l,pin:a,resolve:c,async close(){try{await d.destroy()}catch{}}}}var Dn=Symbol.for("oracle.egressGuard.pinCapableFetch");function ri(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[Dn]=Object.freeze({pin:t}),e}function $n(e){return typeof e=="function"&&typeof e[Dn]?.pin=="function"}function zr(e,t,n){if(!$n(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Dn].pin(t,n)}var si=new Set([408,425,429,500,502,503,504]),Br=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ii=2,Hr=4e3,ai=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ci=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,li=AbortSignal.prototype.throwIfAborted,di=EventTarget.prototype.addEventListener,qr=EventTarget.prototype.removeEventListener,Gr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,jt=e=>e?ai.call(e):!1,ui=e=>e?ci.call(e):void 0,fi=new Set([301,302,303,307,308]),en=3,zd=64*1024,Ue=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function K(e){return Qe(`HTTP JSON body refused: ${e}`)}function pi(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 Fe[t]=="function"&&Fe[t](e))}function mi(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>Ue.bytes)throw K("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>Ue.bytes)throw K("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,f)=>{if(r+=1,r>Ue.nodes)throw K("node limit exceeded");if(f>Ue.depth)throw K("depth limit exceeded");if(l===null){a("null");return}if(typeof l=="string"){a(c(l));return}if(typeof l=="boolean"){a(l?"true":"false");return}if(typeof l=="number"){if(!Number.isFinite(l))throw K("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw K("unsupported non-JSON value");if(Fe.isProxy(l))throw K("proxy value");if(pi(l))throw K("unsupported exotic object");if(i.has(l))throw K("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw K("symbol-keyed fields are unsupported");if(Array.isArray(l)){let p=Object.getPrototypeOf(l),m=0;for(;p!==null;){if(Fe.isProxy(p))throw K("proxy array prototype");if(m+=1,m>Ue.depth)throw K("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(l.length>Ue.arrayLength)throw K("array length limit exceeded");for(let y=0;y<l.length;y+=1){let E=Object.getOwnPropertyDescriptor(l,String(y));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw K("array entries must be dense enumerable own data")}let g=0;for(let y in l){if(s+=1,s>Ue.fields)throw K("enumeration limit exceeded");if(Object.hasOwn(l,y)&&(g+=1,g>l.length))throw K("named array fields are unsupported")}if(g!==l.length)throw K("array entries must be dense enumerable own data");a("[");for(let y=0;y<l.length;y+=1)y&&a(","),d(Object.getOwnPropertyDescriptor(l,String(y)).value,f+1);a("]");return}let u=Object.getPrototypeOf(l);if(u!==Object.prototype&&u!==null)throw K("non-plain object");let h=[];for(let p in l){if(s+=1,s>Ue.fields)throw K("enumeration limit exceeded");if(!Object.hasOwn(l,p))continue;if(o+=1,o>Ue.fields)throw K("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,p);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw K("object fields must be enumerable own data");h.push([p,m.value])}a("{");for(let p=0;p<h.length;p+=1)p&&a(","),a(c(h[p][0])),a(":"),d(h[p][1],f+1);a("}")}finally{i.delete(l)}};return d(e,0),t.join("")}function hi(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(Fe.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 s=Object.getOwnPropertyDescriptor(e,r);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=s.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");t[r]=String(i)}return t}function gi(){return Object.assign(Object.create(null),{Accept:"application/json"})}function yi(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 bi(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var Mn=new Map,Wr=new WeakMap,Jr=1;function Qt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Wr.get(e);return t||(t=Jr,Jr+=1,Wr.set(e,t)),`reference:${t}`}var Ei=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Oi=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Yr(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?Ei.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 Kr(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(Yr);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Yr(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Oi.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function wi(e,t,n,r={},o=null){let s=oi("sha256"),i=(c,d)=>{let l=String(d);s.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),s.update("=").update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l).update(`
|
|
3
|
+
`)};i("method",e),i("url",t),Object.keys(n||{}).map((c,d)=>({name:c.toLowerCase(),order:d,value:String(n[c])})).sort((c,d)=>c.name.localeCompare(d.name)||c.order-d.order).forEach((c,d)=>{i(`header-name-${d}`,c.name),i(`header-value-${d}`,c.value)}),i("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${c}`,r[c]??"-");return s.digest("hex")}function Ai(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Hr):Math.min(250*2**e,Hr)+Math.floor(Math.random()*100)}var Ii=e=>new Promise(t=>setTimeout(t,e));function Qe(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Un(e,t,n){return Qe(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function lt(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Si(e){return e?e.byteLength??e.length??0:0}async function Ni(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(lt(e),!r))throw Un(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let f=await e.text(),u=Buffer.byteLength(f,"utf8");if(u>t){if(!r)throw Un(n,`body ${u} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let a=[],c=0,d=!1;try{for(;;){let{value:f,done:u}=await i.read();if(u)break;if(f&&(a.push(Buffer.from(f)),c+=Si(f),c>t)){d=!0;break}}}finally{if(d)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!r))throw Un(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function Ti(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function _i(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:s,lookupFn:i,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:l=!1,importUndici:f,validateResponse:u,signal:h,redirectPolicy:p="follow",maxRedirects:m=en}){let g=null,y=t,E=i?{lookupFn:i}:{};if(c&&!a&&!$n(y))throw Qe(`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 S=new AbortController,x=setTimeout(()=>S.abort(),s),R=h?Gr?Gr([h,S.signal]):h:S.signal,C=async(_,{status:T=null}={})=>{let D=await jn(_,E);if(!D.ok)throw Qe(T==null?`HTTP refused ${_}: ${D.error}`:`HTTP redirect to ${_} ${D.error}`,T==null?{}:{status:T});let te=new URL(_).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await kn({requireUndici:!0,...f?{importUndici:f}:{}})}catch(v){throw Qe(T==null?`HTTP refused ${_}: ${v?.message||v}`:`HTTP redirect to ${_} refused: ${v?.message||v}`,T==null?{}:{status:T})}g.pin(te,D.addresses),y=g.fetch}else zr(y,te,D.addresses);return D};try{let _=String(e),T=Object.assign(Object.create(null),r||{});c&&await C(_);for(let D=0;D<=m;D+=1){let te=Object.assign(Object.create(null),{method:n,headers:T,body:o,signal:R,redirect:"manual",dispatcher:void 0}),v=await y(_,te);if((p==="error"||m===0)&&v.status>=300&&v.status<400)throw lt(v),Qe(`HTTP ${v.status} ${n} redirect refused`,{status:v.status,redirectRefused:!0});if(fi.has(v.status)){let ie=l===!0&&n==="POST"&&[307,308].includes(v.status)&&Kr(n,o);if(n!=="GET"&&n!=="HEAD"&&!ie){lt(v);let N=new Error(`HTTP ${v.status} ${n} ${_} redirected non-idempotent request`);throw N.status=v.status,N}if(D===m)throw lt(v),Qe(`HTTP ${v.status} ${n} redirect budget exhausted`,{status:v.status,redirectRefused:!0});let ue=v.headers?.get?.("location"),F;try{F=yi(ue,_)}catch(N){throw lt(v),N}let w=!bi(F,_);if(lt(v),w&&n==="POST"){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N}if(w&&l){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N.retryable=!1,N}if(w&&(T=gi(T)),c)await C(F,{status:v.status});else if(w){let N=await jn(F,E);if(!N.ok){let L=new Error(`HTTP redirect from ${_} ${N.error}`);throw L.status=v.status,L.retryable=!1,L}a&&N.addresses?.length&&(g||(g=await kn(f?{importUndici:f}:{})),g&&(g.pin(new URL(F).hostname,N.addresses),y=g.fetch))}_=F;continue}if(typeof u=="function")try{await u(v,{url:_})}catch(ie){throw lt(v),Qe(ie?.message||String(ie))}let J=await Ni(v,d,{url:_,onOversize:()=>S.abort()}),Pe=Ti(J);if(!v.ok){let ie=new Error(`HTTP ${v.status} ${n} ${_}`);throw ie.status=v.status,ie.retryAfter=v.headers?.get?.("retry-after")??null,ie.body=Pe??J.slice(0,300),ie}return Pe??J}throw new Error(`HTTP redirect loop for ${e}`)}catch(_){if(S.signal.aborted&&!jt(h)){let T=_&&(typeof _=="object"||typeof _=="function")&&!Fe.isProxy(_)?_:null,D=T?Object.getOwnPropertyDescriptor(T,"oversize"):null;if(!(D&&Object.hasOwn(D,"value")&&D.value===!0))try{if(!T)throw new TypeError("unsafe rejection");Object.defineProperties(T,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let v=new Error("HTTP request timed out");throw Object.defineProperties(v,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),v}}throw _}finally{clearTimeout(x),g&&await g.close()}}async function Z(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Fe.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 L of Object.getOwnPropertyNames(t)){let j=Object.getOwnPropertyDescriptor(t,L);if(!(L==="toJSON"&&j&&Object.hasOwn(j,"value")&&j.value===void 0)){if(!n.has(L))throw new TypeError("HTTP options contain unknown fields");if(!j||!j.enumerable||!Object.hasOwn(j,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=L=>{if(t==null||!Object.hasOwn(t,L))return;let j=Object.getOwnPropertyDescriptor(t,L);if(!j||!Object.hasOwn(j,"value"))throw new TypeError("HTTP options must contain own data properties");return j.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 s=r("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=r("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>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>en))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${en}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=a??"follow",l=d==="error"?0:c??en;for(let L of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let j=r(L);if(j!==void 0&&typeof j!="boolean")throw new TypeError(`HTTP ${L} must be boolean`)}let f=r("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=r("signal");if(u!==void 0){if(Fe.isProxy(u)||!(u instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{jt(u)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let L of["importUndici","lookupFn","validateResponse"]){let j=r(L);if(j!==void 0&&typeof j!="function")throw new TypeError(`HTTP ${L} must be a function`)}let h=r("fetchImpl"),p=h||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=s??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),E=hi(y),S=Object.assign(Object.create(null),E);Object.keys(S).some(L=>L.toLowerCase()==="accept")||(S.Accept="application/json");let x=r("body");x!=null&&typeof x!="string"&&(Object.keys(S).find(j=>j.toLowerCase()==="content-type")||(S["Content-Type"]="application/json"),x=mi(x));let R=i??ii,C=r("lookupFn"),_=!h,T=r("untrustedUrl")===!0,D=r("sameOriginRedirectsOnly")===!0,te=r("importUndici"),v=r("validateResponse"),J=u,Pe=f??null,ie=async()=>{let L;for(let j=0;j<=R;j++){J&&li.call(J);try{return await _i(e,{fetchImpl:p,method:g,headers:S,body:x,timeoutMs:m,lookupFn:C,realFetch:_,untrustedUrl:T,maxResponseBytes:Pe,sameOriginRedirectsOnly:D,importUndici:te,validateResponse:v,signal:J,redirectPolicy:d,maxRedirects:l})}catch(ge){L=ge;let Ne=P=>{if(!ge||typeof ge!="object"&&typeof ge!="function"||Fe.isProxy(ge))return;let q=Object.getOwnPropertyDescriptor(ge,P);return q&&Object.hasOwn(q,"value")?q.value:void 0},ve=Ne("status"),Me=Ne("oracleTimeout")===!0||Ne("name")==="AbortError"||Ne("name")==="TimeoutError"||jt(J),Kt=new Set([408,425,429]),ht=Ne("retryable")===!1?!1:ve!=null?Kt.has(ve)||si.has(ve)&&Br.has(g):!Me&&Br.has(g);if(j===R||!ht)throw ge;let A=Ai(j,Ne("retryAfter"));J?await new Promise((P,q)=>{let V,ye=()=>{clearTimeout(V),qr.call(J,"abort",ye),q(ui(J)||new DOMException("Aborted","AbortError"))};if(jt(J)){ye();return}V=setTimeout(()=>{qr.call(J,"abort",ye),P()},A),di.call(J,"abort",ye,{once:!0}),jt(J)&&ye()}):await Ii(A)}}throw L};if(!(r("dedupe")!==!1&&!J&&Kr(g,x)))return ie();let F=wi(g,e,S,{untrustedUrl:T,maxResponseBytes:Pe,sameOriginRedirectsOnly:D,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:R,fetchImpl:Qt(p),realFetch:_,lookupFn:Qt(C),importUndici:Qt(te),validateResponse:Qt(v)},x),w=Mn.get(F);if(w)return w;let N=ie().finally(()=>Mn.delete(F));return Mn.set(F,N),N}import{types as yt}from"node:util";function Ee(e){if(!e||typeof e!="object"||yt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function he(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&yt.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function Ve(e,t,n="provider response",r=null,o=0){if(typeof t!="string"||t.length===0)return e;if(o>64)throw new Error(`${n} exceeds the credential guard nesting bound`);let s=r??{nodes:0,active:new Set};if(s.nodes+=1,s.nodes>2e5)throw new Error(`${n} exceeds the credential guard node bound`);if(e==null)return e;if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error(`${n} reflected an attached credential`);return e}if(!e||typeof e!="object"||yt.isProxy(e)||s.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);s.active.add(e);try{if(Array.isArray(e)){for(let i=0;i<e.length;i+=1){let a=Object.getOwnPropertyDescriptor(e,String(i));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Ve(a.value,t,n,s,o+1)}return e}if(!Ee(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let i of Object.keys(e)){if(i.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);Ve(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function X(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(yt.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=X(i.value,t,n+1)}return o}if(!Ee(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);r[o]=X(s.value,t,n+1)}return r}var Zr=Symbol("oracle.provider-failure-metadata"),vi=new Set(["provider-response-too-large","provider-timeout"]);function bt(e,t){let n=t&&typeof t=="object"&&!yt.isProxy(t)?t:null,r=n?Object.getOwnPropertyDescriptor(n,"status"):null,o=r&&Object.hasOwn(r,"value")&&Number.isInteger(r.value)&&r.value>=400&&r.value<=599?r.value:null,s=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},i=s("oversize")===!0?"provider-response-too-large":s("oracleTimeout")===!0||s("name")==="AbortError"||s("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||i!==null)&&Object.defineProperty(e,Zr,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function Xr(e){if(!e||typeof e!="object"||yt.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Zr);if(!t||!Object.hasOwn(t,"value")||!t.value||typeof t.value!="object")return null;let n=Number.isInteger(t.value.status)&&t.value.status>=400&&t.value.status<=599?t.value.status:null,r=vi.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Fn="https://blockstream.info/liquid/api";function xi(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Fn).replace(/\/$/,"")}var Ri="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Li(e){let t=0n;for(let s of e){let i=Ri.indexOf(s);if(i<0)return null;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex"),o=e.length-e.replace(/^1+/u,"").length;return Buffer.concat([Buffer.alloc(o),r])}function Pi(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return Qr("sha256").update(Qr("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var Ci="qpzry9x8gf2tvdw0s3jn54khce6mua7l",eo=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function ji(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<eo.length;o+=1)r>>BigInt(o)&1n&&(t^=eo[o])}return t}function ki(e){let t=0,n=0,r=[];for(let o of e)for(t=t<<5|o,n+=5;n>=8;)n-=8,r.push(t>>n&255);return n>=5||(t<<8-n&255)!==0?null:r}function tn(e){let t=String(e??"").trim();if(t!==t.toLowerCase()&&t!==t.toUpperCase())return!1;let n=t.toLowerCase(),r=n.lastIndexOf("1");if(r<1||r+13>=n.length)return!1;let o=n.slice(0,r);if(!["lq","tlq","el"].includes(o))return!1;let s=[];for(let f of n.slice(r+1)){let u=Ci.indexOf(f);if(u<0)return!1;s.push(u)}let i=[...o].map(f=>f.charCodeAt(0)>>5).concat([0],[...o].map(f=>f.charCodeAt(0)&31),s),a=s[0],c=a===0?1n:0x455972a3350f7a1n;if(a>16||ji(i)!==c)return!1;let d=ki(s.slice(1,-12));if(!d||d.length<35||d.length>73||![2,3].includes(d[0]))return!1;let l=d.length-33;return l>=2&&l<=40&&(a!==0||[20,32].includes(l))}function kt(e){let t=String(e??"").trim();if(tn(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=Li(t);return!!(n&&n.length===59&&Pi(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function Di(e,t="address"){let n=String(e||"").trim(),o=(n===n.toLowerCase()||n===n.toUpperCase())&&/^(?:ex1|tex1)[a-z0-9]{20,200}$/i.test(n)||tn(n),s=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||kt(n);if(!o&&!s)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (P/Q P2PKH, G/H P2SH, ex1\u2026, lq1\u2026)`);return o?n.toLowerCase():n}async function $i(e,t={}){return X(await Z(`${xi(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function to(e={},t={}){let n=Di(e.address||e.addr,"address"),r=await $i(`/address/${n}`,t);if(!r||typeof r!="object"||Array.isArray(r)||!r.chain_stats||typeof r.chain_stats!="object"||Array.isArray(r.chain_stats)||!r.mempool_stats||typeof r.mempool_stats!="object"||Array.isArray(r.mempool_stats)||!Number.isFinite(Number(r.chain_stats.tx_count))||!Number.isFinite(Number(r.mempool_stats.tx_count)))throw new Error("liquid-esplora: address info returned an invalid response");let o=r.chain_stats,s=r.mempool_stats,i=m=>{if(Number.isSafeInteger(m)&&m>=0)return m;if(typeof m!="string"||!/^\d+$/u.test(m))return null;let g=Number(m);return Number.isSafeInteger(g)&&g>=0?g:null},a=i(o.tx_count),c=i(s.tx_count);if(a==null||c==null)throw new Error("liquid-esplora: address info returned invalid transaction counts");let d=a+c;if(!Number.isSafeInteger(d))throw new Error("liquid-esplora: address info returned invalid transaction counts");let l=[o.funded_txo_sum,o.spent_txo_sum,s.funded_txo_sum,s.spent_txo_sum],f=l.some(m=>m!=null),u=f?l.map(i):[];if(f&&u.some(m=>m==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let h=f?u[0]+u[2]:null,p=f?u[1]+u[3]:null;if(f&&(!Number.isSafeInteger(h)||!Number.isSafeInteger(p)||p>h))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:d,balanceSats:f?String(h-p):null,confidential:kt(n),note:f?void 0:kt(n)?"Liquid amounts are blinded; unblind locally with the wallet's blinding key.":"Liquid balance sums were unavailable from Esplora.",chainStats:o,mempoolStats:s,raw:r}}import{types as ao}from"node:util";import{base58 as no}from"@scure/base";function ro(e,t,n,r,o=!1){if(typeof e!="string"||e.length<t||e.length>n||!/^[1-9A-HJ-NP-Za-km-z]+$/u.test(e)||Ze(e))return!1;try{let s=no.decode(e);return s.length===r&&(!o||!Xe(s))&&no.encode(s)===e}catch{return!1}}function nn(e){return ro(e,32,44,32)}function rn(e){return ro(e,64,88,64,!0)}var Vn="oracle.investigator-cursor/1",Mi=2*1024,Ui=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),oo=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),Fi=Object.freeze(["block_number","index"]),zn=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Vi(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function co(e,t=new Set){if(!e||typeof e!="object"||Object.isFrozen(e)||t.has(e))return e;t.add(e);for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&Object.hasOwn(r,"value")&&co(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function M(e){throw new zn(e)}function lo(e,t){return(!e||typeof e!="object"||ao.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&M(`${t} must be a plain object`),e}function on(e,t,n){lo(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&M(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return Vi(a)||M(`${n}.toJSON is invalid`),!1}),s=t.filter(i=>!Object.hasOwn(e,i));(o.length!==t.length||o.some(i=>!r.has(i))||s.length)&&M(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&M(`${n} fields must be enumerable own data`)}}function fe(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&M(`${n} fields must be own data`),r.value}function ze(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&M(`${t} is invalid`),e}function so(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=ze(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||Y(t))&&M("chain is invalid"),t}function zi(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Bi(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Hi(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;return n===null||Bi(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function io(e,t,n){let r=ze(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&M("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!nn(r))&&M("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&zi(r),s=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),i=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!s||!i)&&M("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Hi(r):null;return o||M("address is invalid for the cursor family"),o}M("family does not support cursors")}function qi(e){on(e,Fi,"EVM payload");let t=fe(e,"block_number","cursor"),n=fe(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&M("EVM payload values are invalid"),{block_number:t,index:n}}function Gi(e){on(e,["lt","hash"],"TON payload");let t=ze(fe(e,"lt","cursor"),"TON payload.lt",40),n=ze(fe(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||Ze(n))&&M("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||Xe(r))&&M("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function Wi(e,t){if(e==="evm")return qi(t);if(e==="ton")return Gi(t);let n=ze(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&M("Bitcoin payload must be a transaction id"),e==="solana"&&!rn(n)&&M("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||M(`${e} does not support cursors`),n}function Ji(e){let t=r=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if((!r||typeof r!="object"||ao.isProxy(r))&&M("envelope is not own-data JSON"),Array.isArray(r)){let s=[];for(let i=0;i<r.length;i+=1){let a=Object.getOwnPropertyDescriptor(r,String(i));(!a||!Object.hasOwn(a,"value"))&&M("envelope is not own-data JSON"),s.push(t(a.value))}return`[${s.join(",")}]`}let o=[];for(let s of Object.keys(r))o.push(`${JSON.stringify(s)}:${t(fe(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Mi&&M("envelope exceeds the byte limit")}function Et(e,t={}){if(e==null)return null;on(e,Ui,"envelope"),fe(e,"schemaVersion","cursor")!==Vn&&M("schemaVersion is unsupported");let n=ze(fe(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(oo,n)||/^[0-9a-f]{64}$/iu.test(n)||Y(n))&&M("family is invalid");let r=so(fe(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&M("chain is invalid for the cursor family");let o=io(n,r,fe(e,"address","cursor")),s=ze(fe(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==oo[n]||Y(s))&&M("provider is invalid"),lo(t,"expected binding");let i=h=>Object.hasOwn(t,h)?fe(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:ze(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:so(i("chain")),d=i("address")===void 0?void 0:io(n,r,i("address")),l=i("provider")===void 0?void 0:ze(i("provider"),"expected provider",64);a!==void 0&&n!==a&&M("family binding does not match the request"),c!==void 0&&r!==c&&M("chain binding does not match the request"),d!==void 0&&o!==d&&M("address binding does not match the request"),l!==void 0&&s!==l&&M("provider binding does not match the request");let f=Wi(n,fe(e,"payload","cursor")),u={schemaVersion:Vn,family:n,chain:r,address:o,provider:s,payload:f};return Ji(u),co(u)}function uo(e,t){return on(e,["family","chain","address","provider"],"binding"),Et({schemaVersion:Vn,family:fe(e,"family","binding"),chain:fe(e,"chain","binding"),address:fe(e,"address","binding"),provider:fe(e,"provider","binding"),payload:t},e)}function dt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))dt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var ln="oracle.investigator-collection/1",Yi=dt(["wallet","token","tx","launch"]),Ut=dt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),Ki=dt(["COMPLETE","PARTIAL","UNKNOWN"]),Ce=dt({maxDepth:3,maxNodes:250,maxEdges:1e3}),cu=dt({depth:2,nodes:100,edges:400});var ae=dt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),lu=new Set(Yi),du=new Set(Ut),uu=new Set(Ki);var Zi=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,ho=/^(?:ibc\/[0-9a-fA-F]{64}|(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/,Xi=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),Qi=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,ea=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,ta=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),na=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),ra=new Set(["auth","key","token","xapikey"]),oa=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),sa=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),dn=32,fo=64,ia=5,aa=512,ca=262144,qn=262144,go=524288,an=524288,Dt=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function I(e,t){throw new Dt(e,t)}function cn(e,t){return(!e||typeof e!="object"||Mt.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&I(`${t} must be a plain object`,"invalid-object"),e}function Kn(e,t,n){cn(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&I(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});(o.length>r.size||o.some(s=>!r.has(s)))&&I(`${n} has unknown field(s)`,"unknown-field");for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!i.enumerable||!Object.hasOwn(i,"value"))&&I(`${n}.${s} must be enumerable own data`,"invalid-component")}return e}function yo(e){if(!/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e))return!1;let t=e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1");return!Y(t)}function la(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Zn(e){if(typeof e!="string")return null;if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[r,o]=e.split(":");return`${r}:${o.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}return t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0])||![0,255].includes(t[1])||la(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function da(e){return Zn(e)!==null}var ua="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function fa(e){let t=0n;for(let o of e){let s=ua.indexOf(o);if(s<0)return null;t=t*58n+BigInt(s)}let n=t.toString(16);n.length%2&&(n=`0${n}`);let r=t===0n?Buffer.alloc(0):Buffer.from(n,"hex");return Buffer.concat([Buffer.alloc(e.length-e.replace(/^1+/u,"").length),r])}function pa(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=fa(e);if(!t||t.length!==59||t[0]!==12||![39,57].includes(t[1])||![2,3].includes(t[2]))return!1;let n=t.subarray(0,-4);return Hn("sha256").update(Hn("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function ma(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||tn(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||pa(e)||/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(e)||/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)||da(e)}function ha(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?ma(e):t==="coinType"?yo(e):t==="denom"?/^ibc\/[0-9a-fA-F]{64}$/u.test(e):t==="ibcHash"||t==="assetId"?/^[0-9a-fA-F]{64}$/u.test(e):t==="digest"?/^sha256:[0-9a-f]{64}$/u.test(e):ho.test(e)}function Gn(e,t,n){if(n>12&&I("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>go&&I("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||Mt.isProxy(e))&&I("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&I("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-component"),t.active.add(e);try{if(Array.isArray(e)){for(let c of Object.getOwnPropertyNames(e))c!=="length"&&(c==="toJSON"&&Object.getOwnPropertyDescriptor(e,c)?.value===void 0||/^(?:0|[1-9]\d*)$/u.test(c)||I("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>an&&I("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));(!d||!Object.hasOwn(d,"value"))&&I("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Gn(d.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(a,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(a)}let r=Object.getPrototypeOf(e);r!==Object.prototype&&r!==null&&I("value must be a plain object","invalid-component");let o=Object.getOwnPropertyNames(e);for(let a of o){let c=Object.getOwnPropertyDescriptor(e,a);a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0||(!c||!c.enumerable||!Object.hasOwn(c,"value"))&&I(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>an&&I("value exceeds the freeze field limit","data-limit");let i=r===null?Object.create(null):{};for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Gn(c.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(i,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(i)}finally{t.active.delete(e)}}function Be(e){return Gn(e,{nodes:0,fields:0,active:new Set},0)}function B(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&I(`${t} must be an own data field`,"invalid-component"),n.value}function Wn(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&I(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function bo(e,t,{max:n=aa,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&I(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&ea.test(e)||r&&(ho.test(e)||yo(e))||o&&ha(e,o))&&!Qi.test(e);return Y(e)&&!i&&I(`${t} contains secret-shaped material`,"secret-material"),e}function ga(e,t){(!Zi.test(e)||/^[0-9a-f]{64}$/iu.test(e)||Y(e))&&I(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!oa.has(n);return(ra.has(n)||r||sa.some(o=>n.includes(o)))&&I(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function un(e,t,n,r="data-limit"){Mt.isProxy(e)&&I(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||I(`${t} must be an array`,"invalid-component"),e.length>n&&I(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){Object.hasOwn(e,s)||I(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&I(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function Jn(e,t){if(!Number.isInteger(t)||t<1||e.length<t)return;let n=Object.getOwnPropertyDescriptor(e,String(e.length-t));return n&&Object.hasOwn(n,"value")?n.value:void 0}function ya(e){let t=Jn(e,1);return typeof t=="string"&&Xi.has(t)?t:e.length===2&&e[0]==="subject"&&e[1]==="identifier"?"identifier":e.length===2&&e[0]==="node"&&e[1]==="reference"?"reference":e.length===2&&e[0]==="evidence"&&e[1]==="subject"||e.length===3&&e[0]==="evidence"&&Number.isInteger(e[1])&&e[2]==="subject"?"subject":null}function ba(e){let t=Jn(e,1);return typeof t=="string"&&ta.has(t)?!0:Number.isInteger(t)&&na.has(Jn(e,2))}function $t(e,t,n,r,o){if(n>ia&&I(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>ca&&I(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return bo(e,t,{publicIdentifierField:ya(o),allowDeterministicRecordId:ba(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||Mt.isProxy(e))&&I(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&I(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>fo&&I(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),un(e,t,fo).map((a,c)=>$t(a,`${t}[${c}]`,n+1,r,[...o,c]));cn(e,t);let s=Object.keys(e);s.length>dn&&I(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){ga(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,$t(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function Yn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&I("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>go&&I("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&Mt.isProxy(e)&&I("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&I("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=un(e,"canonical value",ae.evidence,"invalid-json");return r.fields+=c.length,r.fields>an&&I("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Yn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&I("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>dn&&I("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>an&&I("value exceeds canonical JSON field limit","invalid-json"),i.sort(),`{${i.map(c=>{let d=Object.getOwnPropertyDescriptor(e,c);return(!d||!Object.hasOwn(d,"value"))&&I("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Yn(d.value,r,n+1)}`}).join(",")}}`}finally{r.active.delete(e)}}(e===void 0||typeof e=="bigint"||typeof e=="function"||typeof e=="symbol"||typeof e=="number"&&!Number.isFinite(e))&&I("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&I("value is not canonical JSON","invalid-json"),o}function et(e){return`sha256:${Hn("sha256").update(Yn(e)).digest("hex")}`}function tt(e,t){let n=bo(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||I("id kind must be a lowercase slug","invalid-id"),`${n}_${et(t).slice(7)}`}function sn(e,t,n,r){let o=un(e,t,n,"component-limit");return r.fields+=o.length,r.fields>qn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>$t(s,`${t}[${i}]`,0,r,[t,i]))}function Xn(e){let t=["subject","entities","events","evidence","coverage","gaps"];Kn(e,t,"components"),Wn(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=$t(B(e,"subject"),"subject",0,n,["subject"]),o=sn(B(e,"entities"),"entities",Ce.maxNodes,n),s=sn(B(e,"events"),"events",Ce.maxEdges,n),i=sn(B(e,"evidence"),"evidence",ae.evidence,n),a=$t(B(e,"coverage"),"coverage",0,n,["coverage"]),c=sn(B(e,"gaps"),"gaps",Ce.maxNodes,n);return Be({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}var po=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),Ea=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function Oa(e,t,n){if(e===null)return null;if(Kn(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&I("collector output.cursor fields are invalid","invalid-cursor"),B(e,"requested")===null&&B(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&I("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:Et(B(e,"requested"),r),next:Et(B(e,"next"),r)}}catch{I("collector cursor binding or payload is invalid","invalid-cursor")}}function Bn(e,t){let n=new Set;for(let r of e)(!r||typeof r!="object"||!Object.hasOwn(r,"id")||typeof r.id!="string"||r.id.length===0)&&I(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&I(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function wa(e){let t=e.subject,n=typeof t.chain=="string"&&t.chain.length>0||Number.isSafeInteger(t.chain)&&t.chain>=0;(!Object.hasOwn(t,"family")||typeof t.family!="string"||t.family.length===0||!Object.hasOwn(t,"chain")||!n||!Object.hasOwn(t,"address")||typeof t.address!="string"||t.address.length===0)&&I("collector subject identity is invalid","invalid-reference");let r=e.coverage.source;(!Object.hasOwn(e.coverage,"source")||r!==null&&(typeof r!="string"||r.length===0)||e.coverage.collectorStatus!=="UNAVAILABLE"&&r===null)&&I("collector coverage source is invalid","invalid-reference");let o=Bn(e.entities,"entity");e.entities.some(i=>Object.hasOwn(i,"family")&&i.family===t.family&&Object.hasOwn(i,"chain")&&i.chain===t.chain&&Object.hasOwn(i,"address")&&i.address===t.address)||I("collector subject entity reference is missing","invalid-reference"),Bn(e.events,"event");let s=Bn(e.evidence,"evidence");for(let i of e.events){for(let a of["from","to"])(!Object.hasOwn(i,a)||i[a]!=null&&(typeof i[a]!="string"||!o.has(i[a])))&&I(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(i,"evidenceRefs")||!Array.isArray(i.evidenceRefs)||i.evidenceRefs.some(a=>typeof a!="string"||!s.has(a))||new Set(i.evidenceRefs).size!==i.evidenceRefs.length)&&I("collector event evidence references are invalid","invalid-reference")}}function mo(e,t,n=dn){let r=Object.keys(e);r.length>n&&I(`${t} exceeds the field limit`,"data-limit");let o=[];for(let s of r){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!Object.hasOwn(i,"value"))&&I(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function Qn(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];Kn(e,t,"collector output"),Wn(e,t,"collector output"),B(e,"schemaVersion")!==ln&&I("collector output.schemaVersion is unsupported","invalid-schema-version"),B(e,"execution")!=="read-only"&&B(e,"execution")!=="READ_ONLY"&&I("collector output must be read-only","invalid-posture"),Ea.has(B(e,"status"))||I("collector output.status is invalid","invalid-status"),Array.isArray(B(e,"evidence"))||I("collector output.evidence must be an array","invalid-component"),cn(B(e,"coverage"),"collector output.coverage");let n=Xn({subject:B(e,"subject"),entities:B(e,"entities"),events:B(e,"events"),evidence:un(B(e,"evidence"),"collector output.evidence",Ce.maxEdges,"component-limit").map(o=>{cn(o,"collector evidence"),Wn(o,["status"],"collector evidence");let s=B(o,"status"),i=typeof s=="string"&&Object.hasOwn(po,s)?po[s]:null;return i||I("collector evidence status is invalid","invalid-status"),{...mo(o,"collector evidence"),status:i}}),coverage:{...mo(B(e,"coverage"),"collector coverage",dn-1),collectorStatus:B(e,"status")},gaps:B(e,"gaps")});wa(n);let r=Oa(B(e,"cursor"),n.subject,n.coverage.source);return Be({...n,cursor:r})}import{types as mr}from"node:util";var fn=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"}),er=Object.freeze(["block_number","index"]),Eo=new Set([...er,"items_count","value","hash","inserted_at","fee"]);function Ft(e){return Number.isSafeInteger(e)&&e>=0}function nt(e,t,n,r=!1){let o=Object.getOwnPropertyDescriptor(e,t);if(!o){if(r)throw new Error(`${n} is missing a cursor field`);return}if(!o.enumerable||!Object.hasOwn(o,"value"))throw new Error(`${n} cursor fields must be enumerable own data`);return o.value}function Aa(e){if(!Ee(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==er.length||t.some(o=>!er.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=nt(e,"block_number","blockscout transaction",!0),r=nt(e,"index","blockscout transaction",!0);if(!Ft(n)||!Ft(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function Ia(e){if(!Ee(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>Eo.size||t.some(a=>!Eo.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=nt(e,"block_number","blockscout provider",!0),r=nt(e,"index","blockscout provider",!0);if(!Ft(n)||!Ft(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=nt(e,"items_count","blockscout provider");if(o!==void 0&&!Ft(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=nt(e,a,"blockscout provider");if(c!==void 0&&(typeof c!="string"||c.length===0||c.length>100||!/^\d+$/u.test(c)))throw new Error("blockscout transactions returned an invalid next cursor")}let s=nt(e,"hash","blockscout provider");if(s!==void 0&&(typeof s!="string"||!/^0x[0-9a-f]{64}$/iu.test(s)))throw new Error("blockscout transactions returned an invalid next cursor");let i=nt(e,"inserted_at","blockscout provider");if(i!==void 0&&(typeof i!="string"||i.length>64||!Number.isFinite(Date.parse(i))))throw new Error("blockscout transactions returned an invalid next cursor");return{block_number:n,index:r}}function Sa(e,t={}){let n=Number(e),r=t.baseUrl||fn[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Oo(e){return!!fn[Number(e)]}async function wo(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=Math.min(50,Math.max(1,Math.trunc(Number(e.limit)||20))),o=new URLSearchParams,s=e.cursor;if(s!=null){let h=Aa(s);for(let[p,m]of Object.entries(h))m!=null&&o.set(p,String(m))}let i=`${Sa(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=X(await Z(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,headers:{accept:"application/json","user-agent":"OracleInvestigator/1.0"}}),"blockscout transactions response"),c=he(a,"items");if(!Ee(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,f=he(a,"next_page_params");if(f!=null){if(!Ee(f))throw new Error("blockscout transactions returned an invalid next cursor");l=Ia(f)}let u=c.length>d.length?null:l;return{provider:"blockscout",chainId:n,address:String(e.address),limit:r,cursor:s??null,nextCursor:u,pageComplete:c.length<=d.length&&l==null,count:d.length,truncated:c.length>d.length,transactions:d,raw:{items:d,next_page_params:u}}}var Na="mainnet-beta",tr="https://api.mainnet-beta.solana.com";function Ta(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||tr).trim()}function _a(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}async function va(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=X(await Z(Ta(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!Ee(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=he(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${he(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return he(o,"result")}async function Ao(e={},t={}){let n=_a(e.address||e.account,"address"),r=Math.min(1e3,Math.max(1,Math.trunc(Number(e.limit)||20))),o={limit:r};e.before&&(o.before=String(e.before)),e.until&&(o.until=String(e.until)),e.commitment&&(o.commitment=String(e.commitment)),e.minContextSlot!=null&&(o.minContextSlot=Number(e.minContextSlot));let s=await va("getSignaturesForAddress",[n,o],t);if(!Array.isArray(s))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let i=s.slice(0,r);return{provider:"solana-rpc",cluster:Na,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:i.length===r?i[i.length-1]?.signature??null:null,pageComplete:s.length<r,count:i.length,truncated:s.length>i.length,signatures:i,raw:i}}var xa="mainnet",nr="https://mempool.space/api",rr="https://mempool.space/testnet/api";function Io(e={}){return String(e.network||process.env.BTC_NETWORK||xa).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Ra(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Io(e)==="testnet"?rr:nr}function La(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}async function Pa(e,t={}){let n=`${Ra(t)}${e.startsWith("/")?e:`/${e}`}`;return X(await Z(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function So(e={},t={}){let n=La(e.address||e.addr,"address"),r=Math.min(25,Math.max(1,Math.trunc(Number(e.limit)||20))),o=e.cursor||e.lastSeenTxid||null;if(o!=null&&!/^[0-9a-f]{64}$/i.test(String(o)))throw new Error("bitcoin-esplora: transaction cursor must be a 64-char txid");let s=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,i=await Pa(s,t);if(!Array.isArray(i))throw new Error("bitcoin-esplora address history returned an invalid response");let a=i.slice(0,r),c=i.length>a.length,d=!c&&i.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:Io(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:d,pageComplete:!c&&i.length<25,count:a.length,truncated:c,transactions:a,raw:a}}var or="https://api.hyperliquid.xyz/info",sr="https://api.hyperliquid-testnet.xyz/info";function Ca({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let n=process.env.HL_API_URL.replace(/\/$/,"");return n.endsWith("/info")?n:`${n}/info`}return e||process.env.HL_TESTNET==="1"?sr:or}async function ja(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Ca(t);return X(await Z(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function No(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ja({type:"userFills",user:e},t)}var To="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ot({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let i=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(i===String(t).replace(/\/$/,""))return{baseUrl:i,trusted:!0,host:_o(t)};let a;try{a=new URL(i)}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([_o(t),...n]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:i,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:i,trusted:!0,host:c}}if(String(process.env[To]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${To}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function _o(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function je(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function wt(e,t,n){let r={...e};if(!n)return r;for(let[o,s]of Object.entries(t||{}))s&&(r[o]=s);return r}var ir="https://api.trongrid.io",ka=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],Da="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function $a(e={}){return Ot({provider:"tron-public",defaultUrl:ir,hosts:ka,url:e.baseUrl||process.env.TRON_API_URL||""})}function Ma(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return je(t)}function Ua(e,t){return wt({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Fa(e,t={}){let n=$a(t),r=Ma(t),o=X(await Z(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Ua(n.trusted,r)}),"tron-public response");return Ve(o,n.trusted?r:"","tron-public response")}function vo(e,t="address"){let n=String(e??"").trim();if(!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(n))throw new Error(`tron-public: ${t} must be a base58 Tron address (T\u2026)`);return n}function Va(e){return bt({error:"tron-public request failed"},e)}function za(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}async function xo(e={},t={}){try{let n=vo(e.address||e.account,"address"),r=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||20)))),o=Math.min(200,r+1),s=new URLSearchParams({limit:String(o)}),i=e.contract===void 0?Da:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",vo(i,"contract")),e.onlyConfirmed!==!1&&s.set("only_confirmed","true"),e.minTimestamp&&s.set("min_timestamp",String(Number(e.minTimestamp))),e.maxTimestamp&&s.set("max_timestamp",String(Number(e.maxTimestamp)));let a=await Fa(`/v1/accounts/${n}/transactions/trc20?${s.toString()}`,t);if(!a||typeof a!="object"||Array.isArray(a)||!Array.isArray(a.data))throw new Error("tron-public: TRC20 transfers returned an invalid response");let c=a.data.slice(0,r+1),d=c.slice(0,r);return{provider:"tron-public",address:n,contract:i&&String(i).toLowerCase()!=="all"?String(i):null,limit:r,count:d.length,truncated:c.length>r||!!a.meta?.links?.next,pageComplete:c.length<o&&!a.meta?.links?.next,transfers:d.map(l=>({txId:l.transaction_id??null,from:l.from??null,to:l.to??null,direction:l.from===n?"out":l.to===n?"in":null,raw:l.value==null?null:String(l.value),amount:l.value==null?null:za(l.value,l.token_info?.decimals),symbol:l.token_info?.symbol??null,decimals:l.token_info?.decimals??null,tokenAddress:l.token_info?.address??null,blockTimestamp:l.block_timestamp??null,type:l.type??null}))}}catch(n){return Va(n)}}var lr="https://toncenter.com/api",Ba=["toncenter.com","testnet.toncenter.com"];function Ha(e={}){return Ot({provider:"ton-public",defaultUrl:lr,hosts:Ba,url:e.baseUrl||process.env.TON_API_URL||""})}function qa(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return je(t)}function Ga(e,t){return wt({Accept:"application/json"},{"X-API-Key":t},e)}async function Wa(e,t={}){let n=Ha(t),r=qa(t),o=X(await Z(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Ga(n.trusted,r)}),"ton-public response");return Ve(o,n.trusted?r:"","ton-public response")}function Ja(e,t="address"){let n=String(e??"").trim();if(/^-?\d+:[0-9a-fA-F]{64}$/.test(n)||/^[A-Za-z0-9_-]{48}$/.test(n))return n;throw new Error(`ton-public: ${t} must be a raw (0:hex) or base64url TON address`)}function Ya(e){return bt({error:"ton-public request failed"},e)}function Ka(e,t){if(!Ee(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(he(e,"ok")===!1)throw new Error(`ton-public: ${t} was rejected`);if(!Object.hasOwn(e,"result"))throw new Error(`ton-public: ${t} response is missing result`);return he(e,"result")}function ar(e){let t=String(e??"").trim();if(Ze(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(t))throw new Error("ton-public: transaction hash is invalid");let n=Buffer.from(t.replace(/-/g,"+").replace(/_/g,"/"),"base64");if(n.length!==32||Xe(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function cr(e,t,{nullable:n=!0}={}){if(e==null&&n)return null;let r=typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?String(e):e;if(typeof r!="string"||r.length===0||r.length>100||!/^\d+$/u.test(r))throw new Error(`ton-public: ${t} is not a bounded unsigned amount`);return r}async function Ro(e={},t={}){try{let n=Ja(e.address||e.account,"address"),r=Math.min(100,Math.max(1,Math.trunc(Number(e.limit||10)))),o=e.lt!==void 0||e.hash!==void 0;if(o&&(e.lt===void 0||e.hash===void 0))throw new Error("ton-public: transaction cursor requires both lt and hash");let s=o?{lt:String(e.lt),hash:ar(e.hash)}:null;if(s&&!/^\d+$/u.test(s.lt))throw new Error("ton-public: transaction cursor lt is invalid");let i=s?Math.min(100,r+1):r,a=new URLSearchParams({address:n,limit:String(i)});s&&(a.set("lt",s.lt),a.set("hash",s.hash));let c=Ka(await Wa(`/v2/getTransactions?${a.toString()}`,t),"getTransactions");if(!Array.isArray(c))throw new Error("ton-public: getTransactions returned an invalid response");let d=c.slice(0,i);if(s){let m=d[0]?.transaction_id,g=m?.hash==null?null:ar(m.hash);if(String(m?.lt??"")!==s.lt||g!==s.hash)throw new Error("ton-public: cursor boundary was not returned exactly");d.shift()}let f=d.slice(0,r).map(m=>{if(!m||typeof m!="object"||!m.transaction_id||typeof m.transaction_id!="object")throw new Error("ton-public: malformed transaction row");let g=ar(m.transaction_id.hash),y=String(m.transaction_id.lt??"");if(y.length>100||!/^\d+$/u.test(y))throw new Error("ton-public: malformed transaction logical time");if(m.in_msg!=null&&(typeof m.in_msg!="object"||Array.isArray(m.in_msg)))throw new Error("ton-public: malformed inbound message");if(m.out_msgs!=null&&!Array.isArray(m.out_msgs))throw new Error("ton-public: malformed outbound messages");let E=Array.isArray(m.out_msgs),S=m.out_msgs??[];if(S.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let x=0n;for(let C of S){if(!C||typeof C!="object"||Array.isArray(C))throw new Error("ton-public: malformed outbound message");x+=BigInt(cr(C.value??"0","outbound message value",{nullable:!1}))}let R=E?String(x):null;if(R!=null&&R.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:m.utime??null,feeNano:cr(m.fee,"transaction fee"),inMessageValueNano:cr(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:S.length,outMessageValueNano:R}}),u=c.length>=i,h=f.length>0?f[f.length-1]:null,p=u&&h?{lt:h.lt,hash:h.hash}:null;return{provider:"ton-public",address:n,limit:r,count:f.length,cursor:s,nextCursor:p,pageComplete:!u,continuationUnknown:u&&!p,transactions:f}}catch(n){return Ya(n)}}var He=Object.freeze({cosmoshub:Object.freeze({lcd:"https://cosmos-rest.publicnode.com",denom:"uatom",symbol:"ATOM",decimals:6,prefix:"cosmos"}),osmosis:Object.freeze({lcd:"https://osmosis-rest.publicnode.com",denom:"uosmo",symbol:"OSMO",decimals:6,prefix:"osmo"}),celestia:Object.freeze({lcd:"https://celestia-rest.publicnode.com",denom:"utia",symbol:"TIA",decimals:6,prefix:"celestia"}),injective:Object.freeze({lcd:"https://injective-rest.publicnode.com",denom:"inj",symbol:"INJ",decimals:18,prefix:"inj"}),neutron:Object.freeze({lcd:"https://rest.cosmos.directory/neutron",denom:"untrn",symbol:"NTRN",decimals:6,prefix:"neutron"}),dydx:Object.freeze({lcd:"https://dydx-rest.publicnode.com",denom:"adydx",symbol:"DYDX",decimals:18,prefix:"dydx"}),noble:Object.freeze({lcd:"https://rest.cosmos.directory/noble",denom:"uusdc",symbol:"USDC",decimals:6,prefix:"noble"}),kava:Object.freeze({lcd:"https://kava-rest.publicnode.com",denom:"ukava",symbol:"KAVA",decimals:6,prefix:"kava"})}),Lo="cosmoshub";function Za(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function Xa(e={},t={}){let n=(c,d)=>c!=null&&Object.hasOwn(Object(c),d)?c[d]:void 0,r=String(n(e,"chain")||n(t,"chain")||process.env.COSMOS_CHAIN||Lo).trim().toLowerCase(),o=Object.hasOwn(He,r)?He[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=Za(r)||r===Lo&&process.env.COSMOS_LCD_URL||"",a=(s||i||o?.lcd||"").replace(/\/$/,"");if(!a)throw new Error(`cosmos-lcd: unknown chain '${r}' \u2014 pass lcdUrl or set COSMOS_LCD_URL_${r.toUpperCase()} (known: ${Object.keys(He).join(", ")})`);return{chain:r,lcd:a,nativeDenom:o?.denom??null,symbol:o?.symbol??null,decimals:o?.decimals??null,prefix:o?.prefix??null,known:!!o}}async function Qa(e,t,n={}){return X(await Z(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly,headers:{Accept:"application/json"}}),"cosmos-lcd response")}function ec(e,t="address"){let n=String(e??"").trim();if(n!==n.toLowerCase()&&n!==n.toUpperCase())throw new Error(`cosmos-lcd: ${t} must be a uniformly-cased bech32 Cosmos address`);let r=n.toLowerCase();if(!/^[a-z][a-z0-9]{1,15}1[02-9ac-hj-np-z]{6,90}$/.test(r))throw new Error(`cosmos-lcd: ${t} must be a bech32 Cosmos address`);return r}function tc(e){return{error:String(e?.message||e).slice(0,200)}}function nc(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}function rc(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function oc(e,t){let n=e?.denom??null,r=e?.amount==null?null:String(e.amount),o=n!=null&&n===t.nativeDenom;return{denom:n,amount:r,ibcHash:rc(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?nc(r,t.decimals):null}}async function Po(e={},t={}){try{let n=Xa(e,t),r=ec(e.address||e.account,"address"),o=Math.min(500,Math.max(1,Math.trunc(Number(e.limit||100)))),s=Math.min(501,o+1),i=await Qa(n,`/cosmos/bank/v1beta1/balances/${r}?pagination.limit=${s}`,t);if(!i||typeof i!="object"||Array.isArray(i)||!Array.isArray(i.balances))throw new Error("cosmos-lcd: balances returned an invalid response");let a=i.balances.slice(0,o+1),d=a.slice(0,o).map(f=>oc(f,n)),l=d.find(f=>f.native)||null;return{provider:"cosmos-lcd",chain:n.chain,lcd:n.lcd,address:r,count:d.length,truncated:a.length>o||!!i.pagination?.next_key,nativeDenom:n.nativeDenom,nativeAmount:l?.amount??"0",native:l?.display??null,ibcDenomCount:d.filter(f=>f.ibcHash).length,balances:d,nextKey:i?.pagination?.next_key??null}}catch(n){return tc(n)}}var ur="https://fullnode.mainnet.aptoslabs.com",dr="0x1::aptos_coin::AptosCoin",pn=8;function ko(e={}){return Ot({provider:"aptos-public",defaultUrl:ur,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function Do(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return je(t)}function $o(e,t){return wt({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function Co(e,t={}){let n=ko(t),r=Do(t),o=X(await Z(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:$o(n.trusted,r)}),"aptos-public response");return Ve(o,n.trusted?r:"","aptos-public response")}function sc(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`aptos-public: ${t} must be a 0x-prefixed Aptos address`);return`0x${n.slice(2).padStart(64,"0")}`}function ic(e){return bt({error:"aptos-public request failed"},e)}function jo(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),s=o.slice(0,o.length-n),i=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return i?`${s}.${i}`:s}function ac(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function Mo(e={},t={}){try{let n=sc(e.address||e.owner,"address"),r=e.coinType?String(e.coinType).trim():"",o=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||200))));if(r){let f=null,u="view";try{let p=ko(t),m=Do(t),g=Ve(X(await Z(`${p.baseUrl}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:$o(p.trusted,m)}),"aptos-public view response"),p.trusted?m:"","aptos-public view response");if(!Array.isArray(g)||g.length===0||!/^\d+$/u.test(String(g[0])))throw new Error("aptos-public: coin balance view returned an invalid response");f=String(g[0])}catch{u="coinstore";let p=await Co(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(p?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");f=String(p.data.coin.value)}let h=r===dr;return{provider:"aptos-public",address:n,source:u,count:1,balances:[{coinType:r,raw:f??"0",decimals:h?pn:null,symbol:h?"APT":null,amount:h?jo(f??"0",pn):null}]}}let s=Math.min(201,o+1),i=await Co(`/v1/accounts/${n}/resources?limit=${s}`,t);if(!Array.isArray(i))throw new Error("aptos-public: account resources returned an invalid response");let a=i.slice(0,s),c=[];for(let f of a){if(!f||typeof f!="object"||Array.isArray(f)||typeof f.type!="string"||f.type.length===0||f.type.length>512||!f.data||typeof f.data!="object"||Array.isArray(f.data))throw new Error("aptos-public: account resources contained a malformed row");let u=ac(f.type);if(!u)continue;let h=String(f.data?.coin?.value??"");if(!/^\d+$/u.test(h))throw new Error("aptos-public: coin store contained an invalid balance");let p=u===dr;c.push({coinType:u,raw:h,decimals:p?pn:null,symbol:p?"APT":null,amount:p?jo(h,pn):null,frozen:f?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(f=>f.coinType===dr)||null;return{provider:"aptos-public",address:n,source:"coinstore",count:d.length,truncated:i.length>o||c.length>o,aptRaw:l?.raw??"0",apt:l?.amount??"0",balances:d}}catch(n){return ic(n)}}var hr="oracle.investigator-fact-projection/1",qo=4*1024*1024;function we(e){return Be(e)}var rt=Be({evm:we({status:"AVAILABLE",mode:"transaction-history",source:"blockscout",chainIds:Object.freeze([1,10,137,324,8453,42161,534352]),chainStatus:Object.freeze({1:"AVAILABLE",10:"AVAILABLE",137:"AVAILABLE",324:"AVAILABLE",8453:"AVAILABLE",42161:"AVAILABLE",534352:"AVAILABLE",56:"UNAVAILABLE",130:"UNAVAILABLE",143:"UNAVAILABLE",360:"UNAVAILABLE",988:"UNAVAILABLE",999:"UNAVAILABLE",1329:"UNAVAILABLE",1868:"UNAVAILABLE",2020:"UNAVAILABLE",2741:"UNAVAILABLE",4326:"UNAVAILABLE",4663:"UNAVAILABLE",5031:"UNAVAILABLE",8333:"UNAVAILABLE",33139:"UNAVAILABLE",43114:"UNAVAILABLE",43419:"UNAVAILABLE",57073:"UNAVAILABLE",69e3:"UNAVAILABLE",80094:"UNAVAILABLE",81457:"UNAVAILABLE",7777777:"UNAVAILABLE"}),maxLimit:50,cursor:"CONDITIONAL",cursorMode:"conditional",cursorReason:"A continuation is exposed only when Blockscout does not over-return and force client truncation",facts:"Bounded Blockscout transaction fact projections"}),solana:we({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:we({status:"AVAILABLE",mode:"transaction-history",source:"bitcoin-esplora",chainIds:Object.freeze(["mainnet","testnet"]),maxLimit:25,cursor:!0,facts:"Bounded Esplora transaction facts with input/output summaries"}),hyperliquid:we({status:"AVAILABLE",mode:"fill-history",source:"hyperliquid-info",chainIds:Object.freeze(["hyperliquid-mainnet","hyperliquid-testnet"]),maxLimit:1e3,cursor:!1,facts:"Bounded public userFills fact projections"}),tron:we({status:"AVAILABLE",mode:"trc20-transfer-history",source:"tron-public",chainIds:Object.freeze(["tron-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded confirmed TRC20 transfer facts, not native TRX history"}),ton:we({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(He)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"aptos-public",chainIds:Object.freeze(["aptos-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded legacy CoinStore holding facts only; Fungible Asset enumeration and transaction history are not collected"}),liquid:we({status:"EVIDENCE_ONLY",mode:"address-state",source:"liquid-esplora",chainIds:Object.freeze(["liquid-mainnet"]),maxLimit:1,cursor:!1,facts:"Bounded address transaction-count and confidentiality-form facts only; per-asset balances and transaction timeline are unavailable"}),sui:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["celestia-mainnet"]),maxLimit:0,cursor:!1,reason:"DA address history is unavailable; Cosmos account state uses family cosmos and chainId celestia"}),unsupported:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})});var Uo=Object.freeze({eth:"evm",ethereum:"evm",base:"evm",arbitrum:"evm",optimism:"evm",polygon:"evm",polymarket:"evm",bsc:"evm",avalanche:"evm",abstract:"evm",stable:"evm",robinhood:"evm",hyperevm:"evm",sol:"solana",btc:"bitcoin",hl:"hyperliquid","the-open-network":"ton","liquid-bitcoin":"liquid",celestia:"cosmos"}),Fo=Object.freeze({eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999,celestia:"celestia"}),Vo=Object.freeze({evm:1,solana:"mainnet-beta",bitcoin:"mainnet",hyperliquid:"hyperliquid-mainnet",tron:"tron-mainnet",ton:"ton-mainnet",cosmos:"cosmoshub",aptos:"aptos-mainnet",liquid:"liquid-mainnet",sui:"sui-mainnet",stacks:"stacks-mainnet","celestia-da":"celestia-mainnet"}),cc=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),bn=Symbol("missing-public-fact"),mn=8;function lc(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Uo,t)?Uo[t]:t)||"unsupported"}function wn(e){return Ee(e)&&Object.getPrototypeOf(e)===Object.prototype}function U(e,t){return he(e,t)}function We(e){return Ee(e)}function pr(e,t=0){if(t>8)throw new Error("investigator collector: provider row exceeds the nesting bound");if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(mr.isProxy(e)||e.length>1e4)throw new Error("investigator collector: provider array exceeds the length bound");let o=new Array(e.length);for(let s=0;s<e.length;s+=1){if(!Object.hasOwn(e,s))throw new Error("investigator collector: provider array must contain dense own entries");let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider array entries must be own data");o[s]=pr(i.value,t+1)}return o}if(!We(e))throw new Error("investigator collector: provider row contains a non-JSON value");let n=Object.keys(e);if(n.length>256)throw new Error("investigator collector: provider row exceeds the field bound");let r=Object.create(null);for(let o of n){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider row fields must be own data");r[o]=pr(s.value,t+1)}return r}function dc(e){if(!wn(e))throw new Error("investigator collector: wallet request must be a plain object");let t=new Set(["family","chainId","address","limit","cursor"]);if(Object.getOwnPropertySymbols(e).length>0)throw new Error("investigator collector: wallet request has unknown fields");let n=Object.getOwnPropertyNames(e);if(n.length>t.size||n.some(r=>!t.has(r)))throw new Error("investigator collector: wallet request has unknown fields");for(let r of n){let o=Object.getOwnPropertyDescriptor(e,r);if(!o||!o.enumerable||!Object.hasOwn(o,"value"))throw new Error("investigator collector: wallet request fields must be enumerable own data")}}function uc(e){if(!We(e))throw new Error("investigator collector: internal options must be a plain object");let t=new Set(["now","transports","fetchImpl","timeoutMs"]);if(Object.keys(e).filter(s=>!t.has(s)).length)throw new Error("investigator collector: internal options have unknown fields");let r=U(e,"fetchImpl"),o=U(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!wn(o))throw new Error("investigator collector: transports must be a plain object");for(let s of Object.keys(o)){let i=Object.getOwnPropertyDescriptor(o,s);if(!i||!Object.hasOwn(i,"value")||typeof i.value!="function")throw new Error("investigator collector: transports must contain own data functions")}}}function fc(e){let t=U(e,"now"),n=typeof t=="function"?t():t??new Date,r=n instanceof Date?n:new Date(n);if(!Number.isFinite(r.getTime()))throw new Error("investigator collector: now must be a valid date");return r.toISOString()}function pc(e,t,n){let r=Object.hasOwn(Fo,t)?Fo[t]:void 0,o=Object.hasOwn(Vo,e)?Vo[e]:void 0,s=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(s)||s<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return s}if(typeof s!="string"||s.length===0||s.length>96||/[\u0000-\u001f\u007f]/u.test(s)||/:\/\//u.test(s)||/^[0-9a-f]{64}$/iu.test(s)||Y(s))throw new Error("investigator collector: chainId is invalid");return s}function hn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function mc(e){let t=0;for(let n of e){t^=n<<8;for(let r=0;r<8;r+=1)t=t&32768?(t<<1^4129)&65535:t<<1&65535}return t}function Go(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[o,s]=e.split(":");return`${o}:${s.toLowerCase()}`}if(!/^[A-Za-z0-9_-]{48}$/u.test(e))return null;let t;try{t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64")}catch{return null}if(t.length!==36||(t[0]&128)!==0||![17,81].includes(t[0]))return null;let n=t[1]===0?"0":t[1]===255?"-1":null;if(n===null)return null;let r=t[34]<<8|t[35];return mc(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function gr(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&kt(e)}function Ae(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return nn(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&hn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&hn(n),s=r||/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n),i=o||/^[mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n);return t==="mainnet"?s:t==="testnet"?i:!1}if(e==="tron")return/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(n);if(e==="ton")return Go(n)!==null;if(e==="cosmos"){if(!hn(n))return!1;let r=Object.hasOwn(He,t)?He[t]?.prefix:void 0,o=/^([a-z][a-z0-9]{1,15})1[02-9ac-hj-np-z]{6,90}$/u.exec(n.toLowerCase());return!!(o&&(!r||o[1]===r))}return e==="aptos"||e==="sui"?/^0x[0-9a-fA-F]{1,64}$/u.test(n):e==="liquid"?/^ex1[a-z0-9]{20,200}$/iu.test(n)&&hn(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||gr(n):e==="stacks"?/^(?:SP|SM|ST|SN)[A-Z0-9]{20,50}$/u.test(n):e==="celestia-da"?/^celestia1[02-9ac-hj-np-z]{6,90}$/u.test(n):/^[A-Za-z0-9][A-Za-z0-9:._-]{0,255}$/u.test(n)}function xe(e,t){return["evm","hyperliquid","cosmos"].includes(e)?t.toLowerCase():["aptos","sui"].includes(e)?`0x${t.slice(2).toLowerCase().padStart(64,"0")}`:e==="bitcoin"&&/^(?:bc1|tb1)/iu.test(t)||e==="liquid"&&/^(?:ex1|lq1)/iu.test(t)?t.toLowerCase():e==="ton"?Go(t)??t:t}function hc(e,t,n){if(typeof n!="string"||n.length===0||n.length>256||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("investigator collector: address is invalid");let r=n.trim();if(!r||/:\/\//u.test(r)||!Ae(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&Ae(e,t,r)||e==="liquid"&&gr(r);if(Y(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return xe(e,r)}function gc(e,t){if(t.maxLimit===0){if(e!==void 0)throw new Error("investigator collector: limit is not accepted for an unavailable family");return{requested:null,applied:0}}let n=e??Math.min(20,t.maxLimit);if(!Number.isInteger(n)||n<1||n>t.maxLimit)throw new Error(`investigator collector: limit must be an integer from 1 through ${t.maxLimit}`);return{requested:n,applied:n}}function yc(e,t,n){if(t===rt.unsupported)return;if(![...Array.isArray(t.chainIds)?t.chainIds:[],...Object.keys(t.chainStatus||{}).map(o=>e==="evm"?Number(o):o)].some(o=>String(o)===String(n)))throw new Error(`investigator collector: chainId is not declared for ${e}`)}function Wo(e={}){dc(e);let t=U(e,"family"),n=typeof t=="string"?t.trim().toLowerCase():"";if(n.length>63||!/^[a-z][a-z0-9-]*$/u.test(n)||/^[0-9a-f]{64}$/iu.test(n)||Y(n))throw new Error("investigator collector: family is invalid");let r=lc(n),o=Object.hasOwn(rt,r)?rt[r]:rt.unsupported,s=pc(r,n,U(e,"chainId"));yc(r,o,s);let i=hc(r,s,U(e,"address")),a=gc(U(e,"limit"),o),c=U(e,"cursor"),d=c===void 0?null:Et(c,{family:r,chain:s,address:i,provider:o.source});if(d&&!o.cursor)throw new Error(`investigator collector: ${r} does not support cursors`);return{requestedFamily:n,family:r,chain:s,address:i,limits:a,cursor:d,capability:o}}function Vt(e,t){return`${e}_${et(t).slice(7,55)}`}function Jo(e,t,n){return Vt("entity",{family:e,chain:t,address:n,kind:"address"})}function bc(e){return{id:Jo(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function An(e,t,n,r=[]){return{schemaVersion:ln,execution:"read-only",status:t,subject:e,entities:[bc(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function Ge(e,t){return{code:e,message:t}}var En=Object.freeze({"provider-auth":"The upstream provider rejected its credential.","provider-rate-limited":"The upstream provider rate-limited the request.","provider-timeout":"The upstream provider request timed out.","provider-response-too-large":"The upstream response exceeded the allowed byte limit.","provider-invalid-response":"The upstream provider returned an invalid response.","provider-rejected":"The upstream provider rejected the request.","provider-unavailable":"The upstream provider is unavailable."});function yn(e,t="provider-unavailable"){let n=i=>he(e,i),r=n("status"),o=Number.isInteger(r)&&r>=400&&r<=599?r:null,s=t;return n("oversize")===!0?s="provider-response-too-large":o===401||o===403?s="provider-auth":o===408||n("oracleTimeout")===!0||n("name")==="AbortError"||n("name")==="TimeoutError"?s="provider-timeout":o===429?s="provider-rate-limited":o!==null&&o<500?s="provider-rejected":Object.hasOwn(En,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:En[s]})}function Yo(e,t,n,r,o,s=!1){return{id:Vt("evidence",{family:r.family,chain:r.chain,address:r.address,source:t,status:e,facts:o}),status:e,source:t,observedAt:n,publicFacts:o,projection:{schemaVersion:hr,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:s,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function fr(e,t,n,r,o,s){let i=t?.source||null,a=he(r,"code"),c=a&&Object.hasOwn(En,a)?Object.freeze({code:a,httpStatus:he(r,"httpStatus")??null,message:En[a]}):yn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=An(e,"UNKNOWN",{mode:t?.mode||"none",source:i,requestedLimit:n?.requested??null,appliedLimit:n?.applied??null,returned:0,historyAvailable:t?.mode!=="holdings"&&t?.status==="AVAILABLE",cursorSupported:t?.cursor||!1,failureCode:c.code,httpStatus:c.httpStatus},[{code:c.code,source:i,status:"UNKNOWN",httpStatus:c.httpStatus,message:c.message}]);return l.evidence.push(Yo("ERROR",i,o,e,d,!0)),l.cursor=t?.cursor?{requested:s,next:null}:null,l}function gn(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=An(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[Ge("unavailable",r)]);return o.evidence.push(Yo("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function Ec(e){let t=e==="tron"?["TRONGRID_API_KEY","TRON_PRO_API_KEY"]:e==="ton"?["TONCENTER_API_KEY","TON_API_KEY"]:e==="aptos"?["APTOS_API_KEY"]:[];for(let n of t){let r=je(process.env[n]);if(r)return r}return null}function qe(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof U(n,"fetchImpl")=="function"?U(n,"fetchImpl"):void 0,timeoutMs:U(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:qo,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:fn[Number(t.chainId)]}):e==="solana"?s({rpcUrl:tr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?rr:nr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?sr:or}):e==="tron"?s({baseUrl:ir}):e==="ton"?s({baseUrl:lr}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(He,t.chainId)?He[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:ur}):e==="liquid"?s({baseUrl:Fn}):o}var zo=Object.freeze({evm:(e,t,n)=>wo(e,qe("evm",e,t,n)),solana:(e,t,n)=>Ao(e,qe("solana",e,t,n)),bitcoin:(e,t,n)=>So(e,qe("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>No(e.address,qe("hyperliquid",e,t,n)),tron:(e,t,n)=>xo(e,qe("tron",e,t,n)),ton:(e,t,n)=>Ro(e,qe("ton",e,t,n)),cosmos:(e,t,n)=>Po(Object.assign(Object.create(null),e,{chain:e.chainId}),qe("cosmos",e,t,n)),aptos:(e,t,n)=>Mo(e,qe("aptos",e,t,n)),liquid:(e,t,n)=>to(e,qe("liquid",e,t,n))});function Oc(e,t,n,r){let o=U(n,"transports"),s=o&&Object.hasOwn(o,e)?o[e]:null,i=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=s||i;if(a)return d=>a(d,n);let c=Object.hasOwn(zo,e)?zo[e]:null;return c?d=>c(d,n,r):void 0}function ce(e){return typeof e=="string"?e||null:U(e,"hash")||U(e,"address")||null}function Ko(e,t,n=256){if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))return bn;let r=cc.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,s=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),i=t==="coinType"&&/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e)&&!Y(o),a=r&&(/^(?:(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/u.test(e)||s||i);return Y(e)&&!a?bn:e}function k(e,t,n,r,o){let s=Ko(r,n,o);return s===bn||r===void 0?!1:(e[n]=s,t.push(n),!0)}function yr(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=We(t)?Object.keys(t):[],a=new Set(o.filter(l=>Object.hasOwn(t,l))),c=Math.max(0,i.length-a.size),d=!!(s.inputsTruncated||s.outputsTruncated);return{schemaVersion:hr,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||d,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...s}}function wc(e,t){let n={},r=[];k(n,r,"transactionHash",e.hash),k(n,r,"blockNumber",e.block_number),k(n,r,"timestamp",e.timestamp),k(n,r,"fromAddress",ce(e.from)),k(n,r,"toAddress",ce(e.to)),k(n,r,"createdContractAddress",It("evm",t,ce(e.created_contract))?ce(e.created_contract):void 0),k(n,r,"value",e.value),k(n,r,"status",e.status),k(n,r,"fee",We(e.fee)?e.fee.value:e.fee),k(n,r,"gasUsed",e.gas_used),k(n,r,"gasLimit",e.gas_limit),k(n,r,"nonce",e.nonce);let o=ce(e.token);return k(n,r,"tokenAddress",typeof o=="string"&&Ae("evm",t,o)?o:void 0),k(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:yr("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function Ac(e,t){if(!We(e))return null;let n={},r=[];return k(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),k(n,r,"outputIndex",e.vout),k(n,r,"coinbase",e.is_coinbase),k(n,r,"sequence",e.sequence),k(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&Ae("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),k(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function Ic(e,t,n){if(!We(e))return null;let r={index:t},o=[];return k(r,o,"address",typeof e.scriptpubkey_address=="string"&&Ae("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),k(r,o,"value",e.value),k(r,o,"scriptType",e.scriptpubkey_type,64),r}function Sc(e,t){let n={},r=[];k(n,r,"transactionId",e.txid),k(n,r,"version",e.version),k(n,r,"locktime",e.locktime),k(n,r,"size",e.size),k(n,r,"weight",e.weight),k(n,r,"fee",e.fee);let o={},s=[];k(o,s,"confirmed",e.status?.confirmed),k(o,s,"blockHeight",e.status?.block_height),k(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),k(o,s,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let i=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=i.slice(0,mn).map(l=>Ac(l,t)).filter(Boolean),d=a.slice(0,mn).map((l,f)=>Ic(l,f,t)).filter(Boolean);return c.length&&(n.inputs=c,r.push("inputs")),d.length&&(n.outputs=d,r.push("outputs")),{facts:n,projection:yr("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:i.length,inputSelected:c.length,inputsTruncated:i.length>mn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>mn})}}function ut(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):U(t,a);k(r,o,i,l,c),typeof a=="string"?s.push(a):typeof d=="string"&&s.push(d)}return{facts:r,projection:yr(e,t,o,{sourceFields:s})}}function On(e,t,n){return e==="evm"?wc(n,t):e==="bitcoin"?Sc(n,t):e==="solana"?ut(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>U(r,"err")!==null&&U(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?ut(e,n,[["coin","coin",64],["price","px"],["size","sz"],["side","side",16],["time","time"],["startPosition","startPosition"],["direction","dir",64],["closedPnl","closedPnl"],["transactionHash","hash"],["orderId","oid"],["crossed","crossed"],["fee","fee"],["tradeId","tid"],["feeToken","feeToken",64],["builderFee","builderFee"],["twapId","twapId"]]):e==="tron"?ut(e,n,[["transactionId","txId"],["fromAddress","from"],["toAddress","to"],["direction","direction",16],["rawAmount","raw"],["amount","amount"],["tokenSymbolUntrusted","symbol",64],["decimals","decimals"],["tokenAddress","tokenAddress"],["blockTimestamp","blockTimestamp"],["type","type",64]]):e==="ton"?ut(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?ut(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?ut(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):ut(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function St(e,t,n=null,r=0){if(!t)return;let o=n??{nodes:0,active:new Set};if(o.nodes+=1,o.nodes>1e5||r>12)throw new Error("investigator collector: projected provider response exceeded the credential guard bound");if(e!=null){if(["string","number","boolean"].includes(typeof e)){if(String(e).includes(t))throw new Error("investigator collector: provider response reflected its attached credential");return}if(!e||typeof e!="object"||mr.isProxy(e)||o.active.has(e))throw new Error("investigator collector: projected provider response is not own-data JSON");o.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");St(i.value,t,o,r+1)}return}for(let s of Object.keys(e)){if(s.includes(t))throw new Error("investigator collector: provider response reflected its attached credential");let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");St(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function Zo(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!Y(e)}function ke(e,t=100,{nullable:n=!0}={}){return e==null?n:Number.isSafeInteger(e)&&e>=0?!0:typeof e=="string"&&e.length>0&&e.length<=t&&/^\d+$/u.test(e)&&!Y(e)}function Nc(e,t=100,{nullable:n=!0}={}){return e==null?n:typeof e=="number"?Number.isFinite(e):typeof e=="string"&&e.length>0&&e.length<=t&&/^-?\d+(?:\.\d+)?$/u.test(e)&&!Y(e)}function At(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:Zo(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Tc(e){if(typeof e!="string"||Ze(e)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(e))return!1;try{let t=Buffer.from(e.replace(/-/gu,"+").replace(/_/gu,"/"),"base64");return t.length===32&&!Xe(t)}catch{return!1}}function It(e,t,n){return n==null||typeof n=="string"&&Ae(e,t,n)}function Xo(e,t,n){return`${e}:${String(t)}:${n}`}function Bo(e,t,n){let r=ce(n);return typeof r=="string"&&Ae(e,t,r)?Xo(e,t,xe(e,r)):null}function Nt(e,t,n){return typeof t=="string"&&typeof n=="string"&&xe(e,t)===xe(e,n)}function _c(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(s=>{let i=s?.prevout?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&Nt("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&Nt("bitcoin",i,n)})}function vc(e,t,n,r){if(!We(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&It("evm",t,ce(r.from))&&It("evm",t,ce(r.to))&&It("evm",t,ce(r.created_contract))&&[ce(r.from),ce(r.to),ce(r.created_contract)].some(o=>Nt("evm",o,n))&&ke(r.block_number,32)&&ke(r.value,100)&&At(r.timestamp,{iso:!0});if(e==="solana")return rn(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&At(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&We(r.status)&&_c(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&ke(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&At(r.status.block_time);if(e==="hyperliquid"){let o=Zo(r.coin,64)&&/^[A-Za-z0-9@._:/-]+$/u.test(r.coin),s=r.hash==null||/^0x[0-9a-f]{64}$/iu.test(String(r.hash)),i=r.tid==null||ke(r.tid,32,{nullable:!1});return o&&s&&i&&(r.hash!=null||r.tid!=null)&&Nc(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&At(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&Ae("tron",t,r.from)&&typeof r.to=="string"&&Ae("tron",t,r.to)&&[r.from,r.to].some(o=>Nt("tron",o,n))&&typeof r.tokenAddress=="string"&&Ae("tron",t,r.tokenAddress)&&ke(r.raw,100,{nullable:!1})&&At(r.blockTimestamp):e==="ton"?Tc(r.hash)&&ke(r.lt,40,{nullable:!1})&&It("ton",t,r.inMessageSource)&&It("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>Nt("ton",o,n))&&ke(r.inMessageValueNano,100)&&At(r.utime):!1}function xc(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:wn(t)?e==="evm"||e==="bitcoin"||e==="ton"?U(t,"transactions")??null:e==="solana"?U(t,"signatures")??null:e==="tron"?U(t,"transfers")??null:null:null}function Ho(e,t,n){if(e==="evm")return{type:"transaction",from:ce(n.from)?xe("evm",ce(n.from)):null,to:ce(n.to)??ce(n.created_contract)?xe("evm",ce(n.to)??ce(n.created_contract)):null,asset:Bo("evm",t,n.token),amount:n.value==null?null:String(n.value),transactionId:n.hash,blockHeight:n.block_number==null?null:String(n.block_number),timestamp:n.timestamp??null,locator:{transactionId:n.hash,blockHeight:n.block_number??null}};if(e==="solana")return{type:"signature",from:null,to:null,asset:null,amount:null,transactionId:n.signature,blockHeight:null,timestamp:n.blockTime??null,locator:{signature:n.signature,slot:n.slot}};if(e==="bitcoin")return{type:"transaction",from:null,to:null,asset:null,amount:null,transactionId:n.txid,blockHeight:n.status.block_height==null?null:String(n.status.block_height),timestamp:n.status.block_time??null,locator:{transactionId:n.txid,height:n.status.block_height??null}};if(e==="hyperliquid"){let r=Ko(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===bn?null:Xo("hyperliquid",t,r),amount:n.sz==null?null:String(n.sz),transactionId:n.hash??String(n.tid),blockHeight:null,timestamp:n.time??null,locator:{transactionId:n.hash??null,tradeId:n.tid??null}}}return e==="tron"?{type:"token-transfer",from:n.from?xe("tron",n.from):null,to:n.to?xe("tron",n.to):null,asset:Bo("tron",t,n.tokenAddress),amount:n.raw==null?null:String(n.raw),transactionId:n.txId,blockHeight:null,timestamp:n.blockTimestamp??null,locator:{transactionId:n.txId,fromAddress:n.from??null,toAddress:n.to??null,tokenAddress:n.tokenAddress??null,rawAmount:n.raw==null?null:String(n.raw),blockTimestamp:n.blockTimestamp??null}}:{type:"transaction",from:n.inMessageSource?xe("ton",n.inMessageSource):null,to:n.inMessageDestination?xe("ton",n.inMessageDestination):null,asset:null,amount:n.inMessageValueNano==null?null:String(n.inMessageValueNano),transactionId:n.hash,blockHeight:null,timestamp:n.utime??null,locator:{transactionId:n.hash,logicalTime:n.lt}}}function Rc(e){let t=e.entities[0].id,n=new Map([[e.subject.address,t]]);for(let r of e.events)for(let o of["from","to"]){let s=r[o];if(!s)continue;let i=xe(e.subject.family,s),a=n.get(i);a||(a=Jo(e.subject.family,e.subject.chain,i),n.set(i,a),e.entities.push({id:a,family:e.subject.family,chain:e.subject.chain,address:i,kind:"address"})),r[o]=a}}function Qo(e,t){if(mr.isProxy(e)||!Array.isArray(e))throw new Error("investigator collector: provider rows must be an array");if(e.length>1e4)throw new Error("investigator collector: provider row count exceeds the bound");let n=Math.min(e.length,t),r=new Array(n);for(let o=0;o<n;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider rows must contain dense own data");r[o]=pr(s.value)}return r}function Lc(e,t,n,r,o,s,i,a){let c=Qo(o,n.applied+1);if(c.some(_=>!vc(e.family,e.chain,e.address,_)))throw new Error(`${t.source} returned a malformed history row`);let d=c.length>n.applied,l=c.slice(0,n.applied),f=!!(!Array.isArray(r)&&U(r,"truncated")),u=Array.isArray(r)?null:U(r,"nextCursor")??null;for(let _ of l)St(On(e.family,e.chain,_).facts,a),St(Ho(e.family,e.chain,_),a);St(u,a);let h=!!(!Array.isArray(r)&&U(r,"continuationUnknown")),p=!Array.isArray(r)&&U(r,"pageComplete")===!0,m=u!=null&&!t.cursor,g=l.length===n.applied&&u==null&&!p,y=[];(f||d)&&y.push(Ge("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&y.push(Ge("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(Ge("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=f||d||h||m||g||e.family==="tron",S=null;if(t.cursor&&u!=null&&!d)try{S=uo({family:e.family,chain:e.chain,address:e.address,provider:t.source},u)}catch{y.push(Ge("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let x=An(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:l.length,historyAvailable:!0,cursorSupported:t.cursor},y),R=new Set,C=new Set;return l.forEach(_=>{let T=Ho(e.family,e.chain,_),D=On(e.family,e.chain,_),te=Vt("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:T.locator,publicFacts:D.facts}),v=Vt("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:T.type,locator:T.locator,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp});if(R.has(v))throw new Error(`${t.source} returned duplicate event identity`);if(C.has(te))throw new Error(`${t.source} returned duplicate evidence identity`);R.add(v),C.add(te),x.evidence.push({id:te,status:"OBSERVED",source:t.source,observedAt:s,locator:T.locator,publicFacts:D.facts,projection:D.projection}),x.events.push({id:v,type:T.type,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp,evidenceRefs:[te]})}),Rc(x),t.cursor&&(x.cursor={requested:i,next:S}),x}function Pc(e,t){return wn(t)?e==="liquid"?U(t,"provider")==="liquid-esplora"&&Number.isFinite(U(t,"txCount"))?[t]:null:U(t,"balances")??null:null}function Cc(e,t,n,r){if(!We(r))return!1;if(e==="cosmos"){let o=/^ibc\/[0-9a-f]{64}$/iu.test(String(r.denom??""));return typeof r.denom=="string"&&r.denom.length>0&&r.denom.length<=256&&!/[\u0000-\u001f\u007f]/u.test(r.denom)&&(!Y(r.denom)||o)&&ke(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),s=/^0x[0-9a-f]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(o),i=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return s&&!Y(i)&&ke(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&Ae("liquid",t,r.address)&&Nt("liquid",r.address,n)&&r.confidential===gr(r.address)&&(r.balanceSats===null||ke(r.balanceSats,100,{nullable:!1})):!1}function jc(e,t,n,r,o,s,i){let a=Qo(o,n.applied+1);if(a.some(h=>!Cc(e.family,e.chain,e.address,h)))throw new Error(`${t.source} returned a malformed evidence row`);let c=a.slice(0,n.applied);for(let h of c)St(On(e.family,e.chain,h).facts,i);let d=!!U(r,"truncated")||a.length>n.applied,l=[Ge("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(Ge("fungible-assets-unavailable","Aptos collection enumerates legacy CoinStore resources only; Fungible Asset balances were not checked")),e.family==="liquid"&&c.some(h=>h.balanceSats===null)){let h=c.some(p=>p.confidential===!0);l.push(Ge("asset-balances-unavailable",h?"Liquid balance values are blinded for this confidential address":"Liquid Esplora did not expose per-asset sums for this unconfidential multi-asset address"))}d&&l.push(Ge("response-truncated","provider evidence exceeded the safe record bound"));let f=An(e,"PARTIAL",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:c.length,historyAvailable:!1,cursorSupported:!1,...e.family==="aptos"?{holdingCoverage:"legacy-coinstore-only"}:{},...e.family==="liquid"?{balanceCoverage:c.some(h=>h.balanceSats===null)?"unavailable":"provider-supplied"}:{}},l),u=new Set;return c.forEach(h=>{let p=On(e.family,e.chain,h),m=Vt("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:p.facts});if(u.has(m))throw new Error(`${t.source} returned duplicate evidence identity`);u.add(m),f.evidence.push({id:m,status:"OBSERVED",source:t.source,observedAt:s,locator:{address:e.address},publicFacts:p.facts,projection:p.projection})}),f}async function es(e={},t={}){uc(t);let n=Wo(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=fc(t);if(c.status==="UNAVAILABLE"||c===rt.unsupported)return gn(d,c,l);if(!c.chainIds.some(g=>String(g)===String(o)))return gn(d,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},l);if(r==="evm"&&!Oo(o))return gn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let f=Ec(r),u=Oc(r,c,t,f);if(typeof u!="function")return gn(d,{...c,reason:"collector transport is unavailable"},l);let h=a?.payload??null,p=Object.assign(Object.create(null),{address:s,chainId:o,limit:i.applied,cursor:h});r==="solana"&&(p.before=h),r==="tron"&&(p.contract="all",p.onlyConfirmed=!0),r==="ton"&&h&&(p.lt=h.lt,p.hash=h.hash);let m;try{m=await u(p)}catch(g){return fr(d,c,i,yn(g),l,a)}if(U(m,"error")){let g=Xr(m),y=g?Object.assign(Object.create(null),{...g.status===null?{}:{status:g.status},...g.code==="provider-response-too-large"?{oversize:!0}:g.code==="provider-timeout"?{oracleTimeout:!0}:{}}):null,E=g?.status!==null&&g?.status!==void 0?"provider-unavailable":"provider-rejected";return fr(d,c,i,yn(y,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=Pc(r,m);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return jc(d,c,i,m,y,l,f)}let g=xc(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return Lc(d,c,i,m,g,l,a,f)}catch{return fr(d,c,i,yn(null,"provider-invalid-response"),l,a)}}var kc=Object.freeze(Object.create(null));async function ts(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return es(e,kc)}import{createHash as Dc}from"node:crypto";import{types as Oe}from"node:util";var $c="oracle.coordination/1",Ef=Be({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Of=Be({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Mc=Object.freeze({COMMON_NON_SERVICE_FUNDER:18,DEPLOYER_LINKED_BUYERS:22,EXPLICIT_BRIDGE_LINK:5,FRESH_WALLET_CLUSTER:18,LP_REMOVAL:20,PEEL_CHAIN:18,SUPPLY_CONCENTRATION:18,SYNCHRONIZED_ACTIVITY:18}),Re=Object.freeze({maxEntities:Ce.maxNodes,maxEvents:Ce.maxEdges,maxEvidence:ae.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),Bt=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),Ht=new Set(["FUND","FUNDING"]),ds=new Set([...Bt,...Ht,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),Uc=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),Fc=new Set(["CREATOR","DEPLOYER"]),ns=new Set(Ut),rs=new Set(["LIVE","INDEXED"]);var os=250,Vc=32,zc=32,re=(e,t)=>e<t?-1:e>t?1:0,oe=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},Ie=e=>(oe(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",pe=e=>oe(typeof e=="object"&&e!==null?O(e,"id"):e),le=e=>[...new Set(e.filter(Boolean))].sort(re),Bc=(e,t)=>re(e.id,t.id),De=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},Hc=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,Sr=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=oe(e);if(!t)return null;let n=Hc.exec(t);if(!n)return null;let[,r,o,s,i,a,c,d="",l]=n,[f,u,h,p,m,g]=[r,o,s,i,a,c].map(Number);if(u<1||u>12||h<1||p>23||m>59||g>59)return null;if(l!=="Z"){let[x,R]=l.slice(1).split(":").map(Number);if(x>23||R>59)return null}let y=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(f,u-1,h),E.setUTCHours(p,m,g,y),E.getUTCFullYear()!==f||E.getUTCMonth()!==u-1||E.getUTCDate()!==h||E.getUTCHours()!==p||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let S=Date.parse(t);return Number.isFinite(S)?S:null},us=e=>Array.isArray(e)?e:[],O=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&Oe.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0},G=(e,t=64)=>{if(ot(e,t))return[];if(!Array.isArray(e))return[];let n=[],r=Math.min(e.length,t);for(let o=0;o<r;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));s&&Object.hasOwn(s,"value")&&n.push(s.value)}return n},ot=(e,t=64)=>{if(e==null)return!1;if(Oe.isProxy(e)||!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>t||Object.getOwnPropertySymbols(e).length>0)return!0;let n=new Set(["length"]);for(let r=0;r<e.length;r+=1)n.add(String(r));for(let r of Object.getOwnPropertyNames(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(!(r==="toJSON"&&o&&Object.hasOwn(o,"value")&&o.value===void 0&&o.enumerable===!1)&&!n.has(r))return!0}for(let r=0;r<e.length;r+=1){let o=Object.getOwnPropertyDescriptor(e,String(r));if(!o||!o.enumerable||!Object.hasOwn(o,"value"))return!0}return!1},Je=(e,t={})=>Object.assign(Object.create(null),e,t),Sn=(e,t)=>{let n=Object.create(null);for(let r of t){let o=Object.getOwnPropertyDescriptor(e,r);o&&Object.hasOwn(o,"value")&&(n[r]=o.value)}return n},br=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),qc=Object.freeze(["id","status"]),Er=Object.freeze(["id","type","from","fromEntityId","funderId","to","toEntityId","recipientId","actor","actorEntityId","buyerId","asset","assetId","tokenId","timestamp","amount","value","quantity","totalSupply","supply","holders","pool","poolId","sourceChain","fromChain","destinationChain","toChain","bridgeTransferId","transactionId","transactionHash","txId","txid","hash","blockHeight","blockNumber","transactionIndex","logIndex","eventIndex","index","evidenceRefs","data"]),Gc=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),Wc=Object.freeze(["numerator","denominator","bps"]),Jc=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),Yc=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function fs(e){return le([Ie(O(e,"kind")),...G(O(e,"roles")).map(Ie),...G(O(e,"tags")).map(t=>Ie(!t||typeof t!="object"?t:O(t,"name")??O(t,"value")))])}function Nr(e){return e?O(e,"isService")===!0?!0:fs(e).some(t=>Uc.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function ps(e){return Fc.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function In(e){return fs(e).some(ps)}function Kc(e){if(!In(e)||Nr(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(O(e,r)!==void 0)return!1;let t=G(O(e,"roles")).map(Ie),n=G(O(e,"tags")).map(r=>Ie(r&&typeof r=="object"?O(r,"name")??O(r,"value"):r));return[...t,...n].every(ps)}function Se(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[s,i=""]=e.split(".");return{raw:`${s}${i}`.replace(/^0+(?=\d)/u,""),decimals:i.length}}if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return null;let t=s=>{if(!Object.hasOwn(e,s))return{present:!1,value:void 0};let i=Object.getOwnPropertyDescriptor(e,s);return!i||!Object.hasOwn(i,"value")?{present:!0,invalid:!0}:{present:!0,value:i.value}},n=t("decimals");if(n.invalid||n.present&&n.value!=null&&(!Number.isInteger(n.value)||n.value<0||n.value>255))return null;let r=n.value==null?0:n.value,o=[];for(let s of["raw","atoms","baseUnits"]){let i=t(s);if(i.invalid)return null;if(!(!i.present||i.value==null)){if(typeof i.value!="string"||!/^\d+$/u.test(i.value)||i.value.length>512)return null;o.push(i.value.replace(/^0+(?=\d)/u,""))}}for(let s of["value","decimal","amount"]){let i=t(s);if(i.invalid)return null;if(!i.present||i.value==null)continue;if(typeof i.value!="string"||!/^\d+(?:\.\d+)?$/u.test(i.value)||i.value.length>512)return null;let[a,c=""]=i.value.split(".");if(c.length>r)return null;o.push(`${a}${c.padEnd(r,"0")}`.replace(/^0+(?=\d)/u,""))}return o.length===0||new Set(o).size!==1?null:{raw:o[0],decimals:r}}function _t(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function ms(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=_t(e,n),o=_t(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function Zc(e,t){let n=ms(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function Xc(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=_t(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=_t(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function hs(e){if(e&&typeof e=="object"){if(Oe.isProxy(e)||Array.isArray(e)||!xt(e,Wc)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=O(e,"numerator"),c=O(e,"denominator"),d=O(e,"bps"),l=a!=null||c!=null,f=null;if(l&&(a==null||c==null||(f=ms(Se(a),Se(c)),!f)))return null;let u=null;if(d!=null){if(!Number.isInteger(d)||d<0||d>1e4)return null;u={numerator:BigInt(d),denominator:10000n}}return!f&&!u||f&&u&&Number(f.numerator*10000n/f.denominator)!==d?null:f??u}let t=oe(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),s=BigInt(`${n}${r}`),i=s<=o?o:o*100n;return s<=i?{numerator:s,denominator:i}:null}function Qc(e){if(!Array.isArray(e)||e.length>Ce.maxNodes)return!1;let t=[];for(let n of e){if(!n||typeof n.numerator!="bigint"||typeof n.denominator!="bigint"||n.numerator<0n||n.denominator<=0n||n.numerator>n.denominator)return!1;t.push(n)}for(;t.length>1;){let n=[];for(let r=0;r<t.length;r+=2){if(r+1>=t.length){n.push(t[r]);continue}let o=t[r],s=t[r+1],i=o.numerator*s.denominator+s.numerator*o.denominator,a=o.denominator*s.denominator;if(i>a)return!1;n.push({numerator:i,denominator:a})}t=n}return t.length===0||t[0].numerator<=t[0].denominator}function el(e){let t=hs(e);return t?Number(t.numerator*10000n/t.denominator):null}var Tt=Symbol("alias-conflict");function Te(e,t,n){let r=null,o=null;for(let s of t){if(!Object.hasOwn(e,s))continue;let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!Object.hasOwn(i,"value"))return Tt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return Tt;let d=typeof c=="object"?c.identity:c,l=typeof c=="object"&&Object.hasOwn(c,"value")?c.value:c;if(o!==null&&d!==o)return Tt;r=l,o=d}return r}function Tr(e,t=64){if(e===void 0)return[];if(ot(e,t))return null;let n=G(e,t).map(pe);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(re)}function gs(e){let t=e.raw,n=e.decimals;for(;n>0&&t.endsWith("0");)t=t.slice(0,-1),n-=1;return`${t||"0"}:${n}`}function Ir(e,t){return Te(e,t,n=>{let r=Se(n);return r?{identity:gs(r),value:n}:null})}function Or(e,t){return Te(e,t,n=>{let r;if(Number.isSafeInteger(n)&&n>=0)r=String(n);else if(typeof n=="string"&&/^\d{1,40}$/u.test(n.trim()))r=n.trim().replace(/^0+(?=\d)/u,"");else return null;return{identity:r,value:r}})}function xt(e,t){let n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let r=Object.getOwnPropertyNames(e).filter(i=>{let a=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});if(r.length>t.length)return!1;let o=new Set(t),s={nodes:0,fields:0,active:new Set([e])};for(let i of r){if(!o.has(i))return!1;let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!a.enumerable||!Object.hasOwn(a,"value")||!vt(a.value,s,0))return!1}return!0}function vt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>ae.dataNodes||n>ae.dataDepth)return!1;if(e==null||typeof e=="boolean")return!0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="string")return e.length<=ae.string;if(!e||typeof e!="object"||Oe.isProxy(e)||r.active.has(e))return!1;r.active.add(e);try{if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||e.length>ae.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let d=0;d<e.length;d+=1)c.add(String(d));for(let d of a){let l=Object.getOwnPropertyDescriptor(e,d);if(!(d==="toJSON"&&l&&Object.hasOwn(l,"value")&&l.value===void 0&&l.enumerable===!1)&&(typeof d!="string"||!c.has(d)))return!1}if(r.fields+=e.length,r.fields>ae.dataTotalFields)return!1;for(let d=0;d<e.length;d+=1){let l=Object.getOwnPropertyDescriptor(e,String(d));if(!l||!l.enumerable||!Object.hasOwn(l,"value")||!vt(l.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let s=Reflect.ownKeys(e),i=[];for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);if(!(a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0&&c.enumerable===!1)){if(typeof a!="string"||!c||!c.enumerable||!Object.hasOwn(c,"value"))return!1;i.push([a,c.value])}}return i.length>ae.dataFields||(r.fields+=i.length,r.fields>ae.dataTotalFields)?!1:i.every(([,a])=>vt(a,r,n+1))}finally{r.active.delete(e)}}function ys(e,t){let n=O(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||Oe.isProxy(n)||Array.isArray(n)||!vt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>ae.dataFields)return null;let o=Sn(e,t);for(let s of r){let i=Object.getOwnPropertyDescriptor(n,s);if(!i||!Object.hasOwn(i,"value"))return null;if(!(!t.includes(s)||s==="data")){if(Object.hasOwn(o,s))return null;o[s]=i.value}}return o}function tl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!xt(e,Gc))return null;let t=Te(e,["entityId","entity","holder"],pe),n=Ir(e,["balance","amount"]),r=Tr(O(e,"evidenceRefs"));return!t||t===Tt||n===Tt||n===null||r===null?null:Je({},{entityId:t,balance:n,evidenceRefs:r})}function nl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!xt(e,br))return null;let t=ys(e,br);if(!t||Object.hasOwn(t,"isService")&&typeof O(t,"isService")!="boolean")return null;let n=pe(O(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=O(t,d);if(l!=null&&Sr(l)===null)return null}let r=O(t,"roles"),o=O(t,"tags"),s=O(t,"evidenceRefs");if([r,o,s].some(d=>ot(d)))return null;let i=O(t,"supplyShare");if(i!==void 0&&el(i)===null)return null;let a=Sn(t,br);a.roles=G(r),a.tags=G(o);let c=Tr(s);return c===null?null:(a.evidenceRefs=c,Je(a,{id:n}))}function rl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!xt(e,Jc))return null;let t=pe(O(e,"id"));if(!t)return null;let n=O(e,"status"),r=typeof n=="string"?n:"MISSING";return Je(Sn(e,qc),{id:t,status:r})}function ol(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!xt(e,Er))return null;let t=ys(e,Er);if(!t)return null;let n=pe(O(t,"id"));if(!n||ot(O(t,"holders"))||ot(O(t,"evidenceRefs")))return null;let r=Te(t,["from","fromEntityId","funderId"],pe),o=Te(t,["to","toEntityId","recipientId"],pe),s=Te(t,["actor","actorEntityId","buyerId"],pe),i=Te(t,["asset","assetId","tokenId"],pe),a=Te(t,["pool","poolId"],pe),c=Te(t,["sourceChain","fromChain"],oe),d=Te(t,["destinationChain","toChain"],oe),l=Te(t,["transactionId","transactionHash","txId","txid","hash"],pe),f=Te(t,["bridgeTransferId"],pe),u=Or(t,["blockHeight","blockNumber"]),h=Or(t,["transactionIndex"]),p=Or(t,["eventIndex","logIndex","index"]),m=Ir(t,["amount","value","quantity"]),g=Ir(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,f,u,h,p,m,g].includes(Tt))return null;let y=Tr(O(t,"evidenceRefs"));if(y===null)return null;let E=O(t,"timestamp"),S=Sr(E);if(E!=null&&S===null)return null;let R=G(O(t,"holders")).map(tl);if(R.some(T=>T===null))return null;let C=R.map(T=>T.entityId);if(new Set(C).size!==C.length)return null;let _=Sn(t,Er);return _.holders=R,Je(_,{id:n,type:Ie(O(t,"type")),from:r,to:o,actor:s,asset:i,pool:a,sourceChain:c,destinationChain:d,bridgeTransferId:f,transactionId:l,blockPosition:u,transactionPosition:h,eventPosition:p,amount:m,totalSupply:g,timestampMs:S,evidenceRefs:y})}function wr(e,t,n,r,o,s){if(Oe.isProxy(e))return s(r,"A proxy record array was refused."),{records:[],overflow:!1,malformed:!0};if(!Array.isArray(e))return{records:[],overflow:!1,malformed:!1};if(e.length>n)return s(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(ot(e,n))return s(r,"The record array must be an ordinary dense own-data array."),{records:[],overflow:!1,malformed:!0};let i=[],a=0;for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));if(!d||!Object.hasOwn(d,"value")){a+=1;continue}let l=t(d.value);l?i.push(l):a+=1}return i.sort(Bc),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function zt(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function sl(e){let t=oe(O(e,"family")),n=oe(O(e,"address")),r=O(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):oe(r);if(!t||!o||!n)return null;let s=t.toLowerCase(),i=["evm","ethereum","eth","eip155"].includes(s)?"eip155":s,a=n;["eip155","hyperliquid"].includes(i)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(i==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(i)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),i==="ton"&&(a=Zn(a)??a);let c=o.toLowerCase();if(i==="eip155"){let d=c.match(/^(?:eip155:)?(\d+)$/u)?.[1];d&&(c=BigInt(d).toString())}return`${i.length}:${i}|${c.length}:${c}|${a.length}:${a}`}function il(e){let t=new Map;for(let n of e){let r=sl(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function ss(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Ar(e){let t=Se(e);return t?gs(t):"-"}function al(e){let t=G(O(e,"holders")).map(n=>`${ss(O(n,"entityId"))}:${Ar(O(n,"balance"))}`).sort().join(";");return[e.type,e.from,e.to,e.actor,e.asset,e.pool,e.sourceChain,e.destinationChain,e.bridgeTransferId,e.timestampMs,Ar(O(e,"amount")),Ar(O(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(ss).join("|")}function cl(e){let t=new Set;for(let n of e){let r=al(n);if(t.has(r))return!0;t.add(r)}return!1}function Ye(e,t,n,r,o,s,i=[]){let a=Dc("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:le(n),reasons:o,caveats:le(i),evidenceRefs:le(r),score:Mc[e]}}function ll(e,t,n){let r=[...e].sort((l,f)=>l.timestampMs-f.timestampMs||re(l.id,f.id)),o=[],s=new Map,i=0,a=0,c=l=>{let f=l.actor??l.from;f&&s.set(f,(s.get(f)??0)+1)},d=l=>{let f=l.actor??l.from;if(!f)return;let u=(s.get(f)??0)-1;u<=0?s.delete(f):s.set(f,u)};for(;i<r.length;){for(;a<r.length&&r[a].timestampMs-r[i].timestampMs<=t;)c(r[a]),a+=1;s.size>=n?(o.push(r.slice(i,a)),i=a,s.clear()):(d(r[i]),i+=1,a<i&&(a=i))}return o}function H(e,t){let n=G(O(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function is(e,t){let n=G(O(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function ne(e,t){return typeof e=="string"&&t.has(e)}function as(e){let t=O(e,"type");if(!ds.has(t))return!1;let n=O(e,"from"),r=O(e,"to"),o=O(e,"actor")??n,s=O(e,"asset"),i=O(e,"timestampMs");if(Ht.has(t))return!!(n&&r);if(Bt.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(oe(O(e,"sourceChain"))&&oe(O(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=G(O(e,"holders")).some(c=>pe(O(c,"entityId"))&&Se(O(c,"balance")));return!!(s&&Se(O(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Se(O(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function qt(e,t){let n=new Map;for(let r of e){let o=t(r);o&&(n.has(o)||n.set(o,[]),n.get(o).push(r))}return n}function dl(e,t,n,r,o){let s=e.filter(d=>Ht.has(d.type)&&ne(d.from,t)&&ne(d.to,t)&&H(d,n).length),i=qt(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([f],[u])=>re(f,u))){let f=t.get(d);if(Nr(f))continue;let u=le(l.map(g=>g.to).filter(g=>g!==d));if(u.length<r.minCommonRecipients)continue;let h=H(f,n);if(h.length===0){c.add(d);continue}let p=new Set(u),m=l.filter(g=>p.has(g.to));a.push(Ye("COMMON_NON_SERVICE_FUNDER",d,[d,...u],[...h,...m.flatMap(g=>H(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:u.length,eventIds:le(m.map(g=>g.id))}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["A common funding source is a coordination signal, not an identity conclusion."]))}return c.size>0&&o("FUNDER_CLASSIFICATION_EVIDENCE_UNRESOLVED",`${c.size} non-service funder premise(s) lacked usable entity evidence and were excluded.`),a}function ul(e,t,n,r){let o=e.filter(a=>Bt.has(a.type)&&ne(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&H(a,n).length).map(a=>Je(a,{actor:a.actor??a.from})),s=qt(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>re(d,l)))for(let d of ll(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=le(d.map(h=>h.actor)),[f,u]=a.split("\0");i.push(Ye("SYNCHRONIZED_ACTIVITY",`${f.toLowerCase()}:${u}:${d[0].id}`,l,d.flatMap(h=>H(h,n)),[{activityType:f,asset:u,actorCount:l.length,windowSeconds:Math.floor((d[d.length-1].timestampMs-d[0].timestampMs)/1e3),eventIds:d.map(h=>h.id)}],{fact:"HIGH",coordination:l.length>=4?"HIGH":"MEDIUM"},["Timing proximity alone does not establish common control."]))}return i}function fl(e,t,n){if(!e)return null;if(O(e,"fresh")===!0)return"fresh";let r=O(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=O(e,"firstSeenAt"),s=O(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=Sr(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function pl(e,t,n,r,o){let s=e.filter(l=>Bt.has(l.type)&&ne(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&H(l,n).length).map(l=>Je(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let f=t.get(l.actor),u=fl(f,l.timestampMs,r);if(!u)continue;let h=H(f,n);if(h.length===0){a.add(l.actor);continue}i.push(Je(l,{freshnessBasis:u,freshnessEvidenceRefs:h}))}a.size>0&&o("FRESHNESS_EVIDENCE_UNRESOLVED",`${a.size} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let c=qt(i,l=>l.asset),d=[];for(let[l,f]of[...c].sort(([u],[h])=>re(u,h))){let u=le(f.map(p=>p.actor));if(u.length<r.minClusterSize)continue;let h=u.map(p=>{let m=f.filter(g=>g.actor===p);return{entityId:p,bases:le(m.map(g=>g.freshnessBasis)),evidenceRefs:le(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(Ye("FRESH_WALLET_CLUSTER",l,u,[...f.flatMap(p=>H(p,n)),...h.flatMap(p=>p.evidenceRefs)],[{asset:l,walletCount:u.length,eventIds:le(f.map(p=>p.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:h}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return d}function ml(e,t,n,r,o){let s=new Map,i=new Set,a=(p,m)=>{if(!(!ne(p,t)||m.length===0)){s.has(p)||s.set(p,new Set);for(let g of m)s.get(p).add(g)}};for(let p of t.values()){if(!In(p))continue;let m=H(p,n);m.length===0?i.add(p.id):a(p.id,m)}for(let p of e)p.type==="DEPLOY"&&a(p.from??p.actor,H(p,n));let c=[...i].filter(p=>!s.has(p));c.length>0&&o("DEPLOYER_EVIDENCE_UNRESOLVED",`${c.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`);let d=e.filter(p=>Ht.has(p.type)&&s.has(p.from)&&ne(p.to,t)&&H(p,n).length),l=qt(d,p=>p.to),f=e.filter(p=>p.type==="BUY"&&ne(p.actor??p.from,t)&&p.asset&&H(p,n).length).map(p=>Je(p,{actor:p.actor??p.from})),u=new Map;for(let p of f){let m=le(us(l.get(p.actor)).map(g=>g.from));if(m.length>zc)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let g of m){let y=`${g}\0${p.asset}`;u.has(y)||u.set(y,[]),u.get(y).push(p)}}let h=[];for(let[p,m]of[...u].sort(([g],[y])=>re(g,y))){let g=le(m.map(C=>C.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,E]=p.split("\0"),S=new Set(g),x=d.filter(C=>C.from===y&&S.has(C.to)),R=le([...s.get(y)??[]]);h.push(Ye("DEPLOYER_LINKED_BUYERS",`${y}:${E}`,[y,...g],[...R,...x.flatMap(C=>H(C,n)),...m.flatMap(C=>H(C,n))],[{deployer:y,asset:E,buyerCount:g.length,deployerEvidenceRefs:R,fundingEventIds:le(x.map(C=>C.id)),buyEventIds:le(m.map(C=>C.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function hl(e,t,n,r,o,s){let i=[],a=e.filter(f=>f.type==="SUPPLY_SNAPSHOT"&&f.asset&&H(f,r).length),c=0;for(let f of a){let u=Se(O(f,"totalSupply")??O(f,"supply")),h=G(O(f,"holders")),p=h.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||ot(O(y,"evidenceRefs")))return null;let E=G(O(y,"evidenceRefs")).map(pe);return E.length===0||E.some(S=>!r.has(S))?null:{entityId:pe(O(y,"entityId")),balance:Se(O(y,"balance")),evidenceRefs:le(E)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(p.length!==h.length||!Xc(u,p)){c+=1;continue}let g=p.map(y=>({...y,shareBps:Zc(y.balance,u)})).filter(y=>y.shareBps!==null).sort((y,E)=>E.shareBps-y.shareBps||re(y.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(Ye("SUPPLY_CONCENTRATION",`${f.asset}:${f.id}`,[g.entityId],[...H(f,r),...g.evidenceRefs],[{asset:f.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:u,snapshotEventId:f.id}],{fact:"HIGH",coordination:"LOW"},["Supply concentration is a structural fact and is not proof of coordinated control."]))}if(c>0&&s("SUPPLY_SEMANTICS_UNRESOLVED",`${c} supply snapshot(s) had impossible or incomplete total/holder arithmetic and were excluded.`),a.length)return i;let d=t.map(f=>{let u=hs(f.supplyShare);return u?{entity:f,fraction:u,shareBps:Number(u.numerator*10000n/u.denominator)}:null}).filter(Boolean).sort((f,u)=>u.shareBps-f.shareBps||re(f.entity.id,u.entity.id));if(!Qc(d.map(f=>f.fraction)))return s("SUPPLY_SEMANTICS_UNRESOLVED","Entity supply shares exceeded the total and were excluded."),i;let l=d[0];if(l&&l.shareBps>=o.concentrationThresholdBps){let f=G(O(l.entity,"evidenceRefs")).map(pe),u=f.length>0&&f.every(h=>r.has(h))?le(f):[];u.length&&i.push(Ye("SUPPLY_CONCENTRATION",l.entity.id,[l.entity.id],u,[{topHolder:l.entity.id,topHolderShareBps:l.shareBps}],{fact:"MEDIUM",coordination:"LOW"},["No total-supply snapshot was supplied; the exact caller-provided share was used."]))}return i}function gl(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Ye("LP_REMOVAL",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function yl(e,t){let n=0,r=e.length;for(;n<r;){let o=Math.floor((n+r)/2);e[o].timestampMs<t?n=o+1:r=o}return n}function bl(e,t,n,r,o){let s=e.filter(u=>u.type==="TRANSFER"&&ne(u.from,t)&&ne(u.to,t)&&u.from!==u.to&&oe(u.asset)&&u.timestampMs!==null&&Se(u.amount)&&H(u,n).length).map(u=>Je(u,{parsedAmount:Se(u.amount)})).sort((u,h)=>u.timestampMs-h.timestampMs||re(u.id,h.id)),i=qt(s,u=>`${u.from}\0${u.asset}`),a=[],c=new Set,d=!1;function l(u,h,p,m){let g=us(i.get(`${u.to}\0${u.asset}`)),y=yl(g,u.timestampMs),E=[],S=0,x=y;for(;x<g.length&&S<Vc;x+=1){let R=g[x];if(R.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(S+=1,c.has(R.id)||p.has(R.id)||m.has(R.to)||R.from!==u.to||R.asset!==u.asset)continue;let C=Math.max(u.parsedAmount.decimals,R.parsedAmount.decimals),_=_t(u.parsedAmount,C),T=_t(R.parsedAmount,C);_!==null&&T!==null&&T>0n&&T<_&&E.push(R)}return x<g.length&&g[x].timestampMs-h.timestampMs<=r.peelWindowSeconds*1e3&&(d=!0),E}function f(u){if(u.length>=3)return u;let h=new Set(u.map(m=>m.id)),p=new Set([u[0].from,...u.map(m=>m.to)]);for(let m of l(u[u.length-1],u[0],h,p)){let g=f([...u,m]);if(g)return g}return null}for(let u of s){if(c.has(u.id))continue;let h=f([u]);if(!h)continue;let p=[...h];for(;p.length<r.maxPeelDepth;){let m=new Set(p.map(E=>E.id)),g=new Set([p[0].from,...p.map(E=>E.to)]),[y]=l(p[p.length-1],p[0],m,g);if(!y)break;p.push(y)}p.forEach(m=>c.add(m.id)),a.push(p)}return d&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(u=>Ye("PEEL_CHAIN",u[0].id,[u[0].from,...u.map(h=>h.to)],u.flatMap(h=>H(h,n)),[{hopCount:u.length,asset:u[0].asset,eventIds:u.map(h=>h.id),amounts:u.map(h=>h.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function El(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&oe(r.sourceChain)&&oe(r.destinationChain)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Ye("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,sourceChain:oe(r.sourceChain),destinationChain:oe(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function Ol(e){let t=Object.create(null);for(let n of e)t[n.kind]=(t[n.kind]??0)+1;return Object.fromEntries(Object.entries(t).sort(([n],[r])=>re(n,r)))}function cs(e,t){return G(O(e,"holders")).some(n=>!ne(O(n,"entityId"),t))?!1:Ht.has(e.type)||e.type==="TRANSFER"?ne(e.from,t)&&ne(e.to,t):Bt.has(e.type)?ne(e.actor??e.from,t):e.type==="DEPLOY"?ne(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?ne(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?G(O(e,"holders")).every(n=>ne(O(n,"entityId"),t)):!0}function wl(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||Oe.isProxy(e)){t("MALFORMED_COVERAGE","Coverage must contain own data fields.",{fatal:!0});return}let n=[],r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0){t("MALFORMED_COVERAGE","Coverage must contain ordinary own data without symbol fields.",{fatal:!0});return}let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0&&i.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([s,i.value])}for(let[s,i]of n.sort(([a],[c])=>re(a,c))){let a=i;if(i&&typeof i=="object"&&!vt(i)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(i&&typeof i=="object"&&!Array.isArray(i)){let l=Object.getOwnPropertyDescriptor(i,"status");if(l&&!Object.hasOwn(l,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=l?l.value:void 0}if(typeof a!="string")continue;let c=Ie(a),d=Ie(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var Al=Object.freeze(Object.keys(Re)),Il=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function ls(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return!1;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});if(o.length>t.length||o.some(s=>!t.includes(s)))return!1;for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")||n&&(typeof i.value!="number"||!Number.isFinite(i.value)))return!1}return!0}function bs(e,t={}){let n=ls(t,Al,{numeric:!0}),r=n?t:{},o={maxEntities:De(O(r,"maxEntities"),Re.maxEntities,1,Ce.maxNodes),maxEvents:De(O(r,"maxEvents"),Re.maxEvents,1,Ce.maxEdges),maxEvidence:De(O(r,"maxEvidence"),Re.maxEvidence,1,ae.evidence),minClusterSize:De(O(r,"minClusterSize"),Re.minClusterSize,2,10),minCommonRecipients:De(O(r,"minCommonRecipients"),Re.minCommonRecipients,2,10),syncWindowSeconds:De(O(r,"syncWindowSeconds"),Re.syncWindowSeconds,1,3600),freshWalletSeconds:De(O(r,"freshWalletSeconds"),Re.freshWalletSeconds,60,2592e3),peelWindowSeconds:De(O(r,"peelWindowSeconds"),Re.peelWindowSeconds,60,604800),maxPeelDepth:De(O(r,"maxPeelDepth"),Re.maxPeelDepth,3,8),concentrationThresholdBps:De(O(r,"concentrationThresholdBps"),Re.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,N,{fatal:L=!1}={})=>{L&&(i=!0);let j=Ie(w||"UNSPECIFIED_GAP"),ge=oe(N)??"Input is incomplete.",Ne=s.get(j);if(Ne){re(ge,Ne.message)<0&&s.set(j,{code:j,status:"UNKNOWN",message:ge});return}if(s.size>=os-1){i=!0,s.has("GAP_LIMIT_REACHED")||s.set("GAP_LIMIT_REACHED",{code:"GAP_LIMIT_REACHED",status:"UNKNOWN",message:`Gap output exceeded the deterministic limit of ${os}.`});return}s.set(j,{code:j,status:"UNKNOWN",message:ge})},c=({entities:w=[],events:N=[],evidenceById:L=new Map,eventWithEvidence:j=[],analyzableEvents:ge=[],findings:Ne=[]}={})=>{let ve=i?[]:Ne;ve.length>ae.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${ae.findings}.`,{fatal:!0}),ve=[]);let Me=[...s.values()].sort((q,V)=>re(q.code,V.code)),ht=i||Me.some(q=>q.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(q.code))?"UNKNOWN":Me.length?"PARTIAL":"OK",A=Math.min(100,ve.reduce((q,V)=>q+V.score,0)),P=A>=60?"HIGH":A>=25?"MEDIUM":ht==="OK"?"LOW":"UNKNOWN";return Be({schemaVersion:$c,execution:"read-only",reportOnly:!0,status:ht,risk:{score:A,level:P},metrics:{entityCount:w.length,eventCount:N.length,evidenceCount:L.size,evidencedEventCount:j.length,eligibleEventCount:ge.length,findingCounts:Ol(ve),bounds:o},findings:ve,gaps:Me})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!ls(e,Il))return a("INVALID_INPUT","Expected a bounded own-data coordination envelope.",{fatal:!0}),c();if(!e||typeof e!="object"||Array.isArray(e))return a("INVALID_INPUT","Expected an object containing normalized entities, events, and evidence.",{fatal:!0}),c();for(let w of["subject","chain"]){let N=O(e,w);if(N!==void 0&&!vt(N))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=wr(O(e,"entities"),nl,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=wr(O(e,"events"),ol,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),f=wr(O(e,"evidence"),rl,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),u=d.records,h=l.records,p=f.records;(d.overflow||l.overflow||f.overflow||d.malformed||l.malformed||f.malformed)&&(i=!0),Array.isArray(O(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(O(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(O(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),zt(u)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),zt(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),zt(p)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),cl(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),il(u)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=zt(u)?new Map:new Map(u.map(w=>[w.id,w])),g=p.filter(w=>!ns.has(w.status)),y=p.filter(w=>ns.has(w.status)&&!rs.has(w.status));g.length>0&&a("EVIDENCE_STATUS_INVALID",`${g.length} evidence record(s) had a missing or invalid status and were excluded.`),y.length>0&&a("EVIDENCE_STATUS_UNUSABLE",`${y.length} evidence record(s) did not have LIVE or INDEXED status and were excluded.`);let E=zt(p)?new Map:new Map(p.filter(w=>rs.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let S=u.filter(w=>{let N=G(O(w,"evidenceRefs"));return N.length>0&&N.some(L=>!E.has(L))});S.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${S.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let x=new Set(h.filter(w=>w.type==="DEPLOY"&&ne(w.from??w.actor,m)&&H(w,E).length>0).map(w=>w.from??w.actor)),R=u.filter(w=>{let N=G(O(w,"roles")).length>0||G(O(w,"tags")).length>0||Nr(w)||In(w)||O(w,"isService")!==void 0||O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0||O(w,"supplyShare")!==void 0,L=is(w,E)||Kc(w)&&x.has(w.id);return N&&!L}),C=R.filter(w=>O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0);C.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${C.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let _=u.filter(w=>In(w)&&!is(w,E)&&!x.has(w.id));_.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${_.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),R.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${R.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let T=h.filter(w=>G(O(w,"holders")).some(N=>{let L=G(O(N,"evidenceRefs"));return L.length===0||L.some(j=>!E.has(j))}));T.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${T.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),wl(O(e,"coverage"),a);let D=O(e,"gaps");if(ot(D,ae.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${ae.gaps}.`,{fatal:!0});else{let w=[];for(let N of G(D,ae.gaps)){if(!N||typeof N!="object"||Oe.isProxy(N)||Array.isArray(N)||!xt(N,Yc)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let L=O(N,"code"),j=O(N,"message");if(L!==void 0&&oe(L)===null||j!==void 0&&oe(j)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:L??"UPSTREAM_GAP",message:j??"An upstream normalization gap was reported."})}w.sort((N,L)=>re(Ie(N.code),Ie(L.code))||re(N.message,L.message));for(let N of w)a(N.code,N.message)}let te=h.filter(w=>H(w,E).length>0),v=h.filter(w=>H(w,E).length===0);v.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${v.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let J=te.filter(w=>!ds.has(w.type)||!as(w));J.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${J.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Pe=te.filter(as),ie=Pe.filter(w=>!cs(w,m));ie.length&&a("EVENT_ENTITY_UNRESOLVED",`${ie.length} event(s) contained unresolved entity references.`,{fatal:!0});let ue=Pe.filter(w=>cs(w,m));ue.length===0&&a("NO_ANALYZABLE_EVENTS","No fully referenced evidence-backed event had semantics supported by coordination analysis; no low-risk conclusion was produced.");let F=[];return i||(F=[...dl(ue,m,E,o,a),...ml(ue,m,E,o,a),...pl(ue,m,E,o,a),...hl(ue,u,m,E,o,a),...ul(ue,m,E,o),...gl(ue,m,E),...bl(ue,m,E,o,a),...El(ue,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,N)=>re(w.kind,N.kind)||re(w.id,N.id)),new Set(F.map(w=>w.id)).size!==F.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),F=[])),c({entities:u,events:h,evidenceById:E,eventWithEvidence:te,analyzableEvents:ue,findings:F})}import{types as mt}from"node:util";import{types as Ss}from"node:util";var _n="oracle.opensea-wallet-enrichment/1",Sl="oracle.nft-overlap-input/1",Nl="oracle.nft-overlap/1",Ke="REQUEST_PATH_PLUS_MATCHED_PROFILE",Tl=de(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),Nf=de(["COMPLETE","PARTIAL","UNKNOWN"]),vr="OBSERVED",Es="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",Nn="UNKNOWN",Q=de({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Lt=de({1:"ethereum",10:"optimism",130:"unichain",137:"polygon",143:"monad",360:"shape",988:"stablechain",999:"hyperevm",1329:"sei",1868:"soneium",2020:"ronin",2741:"abstract",4326:"megaeth",4663:"robinhood",5031:"somnia",8333:"b3",8453:"base",33139:"ape_chain",42161:"arbitrum",43114:"avalanche",43419:"gunzilla",57073:"ink",69e3:"animechain",80094:"bera_chain",81457:"blast",7777777:"zora"}),Rt=de(["OpenSea profile and inventory records are marketplace-indexed observations, not on-chain ownership proof.","No identity, common-control, intent, or wallet-owner inference is made.","Inventory is limited to one unpaginated page of at most 20 holdings."]),_l=de(["Overlap is limited to exact canonical NFT identities and exact chain-bound OpenSea collection slugs in the supplied snapshots.","An exact OpenSea collection slug overlap is a marketplace-index observation, not an on-chain or common-control claim.","No identity, ownership, common-control, intent, risk, or wrongdoing conclusion is made."]),st=de({NOT_REQUESTED:"OpenSea enrichment was not requested.",UNSUPPORTED_CHAIN_FAMILY:"OpenSea enrichment is unavailable for this chain family.",UNSUPPORTED_CHAIN:"OpenSea enrichment is unavailable for this fixed chain mapping.",INVALID_EVM_ADDRESS:"OpenSea enrichment requires a canonical EVM address.",API_KEY_UNAVAILABLE:"OpenSea enrichment is unavailable because its production API key is not configured.",PROFILE_AUTHENTICATION_FAILED:"The OpenSea profile request was not authenticated.",PROFILE_ACCESS_FORBIDDEN:"The OpenSea profile request was forbidden.",PROFILE_RATE_LIMITED:"The OpenSea profile request was rate limited.",PROFILE_UPSTREAM_UNAVAILABLE:"The OpenSea profile service was unavailable.",PROFILE_TIMEOUT:"The OpenSea profile request timed out.",PROFILE_REDIRECT_REFUSED:"The OpenSea profile response attempted a redirect and was refused.",PROFILE_RESPONSE_TOO_LARGE:"The OpenSea profile response exceeded the fixed byte limit.",PROFILE_NOT_FOUND:"The OpenSea profile was not found.",PROFILE_MALFORMED:"The OpenSea profile response did not satisfy the bounded contract.",PROFILE_ADDRESS_MISMATCH:"The OpenSea profile did not match the requested canonical wallet.",PROFILE_TRANSPORT_FAILED:"The OpenSea profile request failed.",PROFILE_USERNAME_REJECTED:"Optional OpenSea username metadata was omitted because it did not satisfy the safe display contract.",INVENTORY_AUTHENTICATION_FAILED:"The OpenSea inventory request was not authenticated.",INVENTORY_ACCESS_FORBIDDEN:"The OpenSea inventory request was forbidden.",INVENTORY_RATE_LIMITED:"The OpenSea inventory request was rate limited.",INVENTORY_UPSTREAM_UNAVAILABLE:"The OpenSea inventory service was unavailable.",INVENTORY_TIMEOUT:"The OpenSea inventory request timed out.",INVENTORY_REDIRECT_REFUSED:"The OpenSea inventory response attempted a redirect and was refused.",INVENTORY_RESPONSE_TOO_LARGE:"The OpenSea inventory response exceeded the fixed byte limit.",INVENTORY_NOT_FOUND:"The OpenSea inventory was not found.",INVENTORY_MALFORMED:"The OpenSea inventory response did not satisfy the bounded contract.",INVENTORY_TRANSPORT_FAILED:"The OpenSea inventory request failed.",INVENTORY_CURSOR_PRESENT:"OpenSea reported another inventory page; no cursor was retained or followed.",INVENTORY_ROW_LIMIT:"OpenSea returned more than the fixed 20-row inventory bound.",INVENTORY_ROW_REJECTED:"At least one OpenSea inventory row did not satisfy the canonical holding contract.",INVENTORY_COLLECTION_REJECTED:"At least one canonical OpenSea holding lacked a valid bounded collection slug; exact NFT evidence was retained.",INVENTORY_DUPLICATE_HOLDING:"At least one duplicate OpenSea holding was collapsed.",INVENTORY_CONFLICTING_HOLDING:"At least one conflicting OpenSea collection association was excluded while exact-NFT evidence was retained."}),vl=de({CONFLICTING_DUPLICATE_SNAPSHOT:"Conflicting snapshots for the same chain and canonical wallet were excluded.",INPUT_COVERAGE_INCOMPLETE:"At least one included snapshot had incomplete relevant inventory coverage.",EXACT_NFT_COVERAGE_INCOMPLETE:"At least one included exact-NFT inventory was incomplete.",COLLECTION_COVERAGE_INCOMPLETE:"At least one included collection-slug inventory was incomplete.",PROFILE_METADATA_INCOMPLETE:"At least one matched profile omitted unsafe optional username metadata.",INELIGIBLE_HOLDING_EVIDENCE:"At least one holding lacked separate wallet-bound LIVE or INDEXED profile and holding evidence.",INSUFFICIENT_DISTINCT_WALLETS:"Fewer than two distinct canonical wallet IDs qualified for a negative overlap statement.",FINDINGS_TRUNCATED:"Deterministic finding limits omitted additional qualifying overlaps."}),Ns=new Set(Tl),xl=new Set(Ut),xr=new Set(["LIVE","INDEXED"]),se=(e,t)=>e<t?-1:e>t?1:0,Rl=/^0x[0-9a-fA-F]{40}$/u,Ll=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,Pl=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,Cl=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,Ts=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,_s=/[\u0000-\u001f\u007f-\u009f]/u,jl=(1n<<256n)-1n;function b(e,t="invalid-nft-overlap"){throw new Dt(`nft-overlap: ${e}`,t)}function vs(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function xs(e){return!e||typeof e!="object"||Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function W(){return xs([])}function $(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function de(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&xs(e);let n;try{n=Reflect.ownKeys(e)}catch{b("normalized output could not be frozen safely","invalid-object")}for(let r of n){if(r==="toJSON")continue;let o;try{o=Object.getOwnPropertyDescriptor(e,r)}catch{b("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&de(o.value,t)}return Object.freeze(e),e}function ee(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||Ss.isProxy(e))&&b(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{b(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&b(`${n} must be a plain object`,"invalid-object");let s=new Set(t),i=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{b(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&vs(c)||((typeof a!="string"||!s.has(a))&&b(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&b(`${n}.${a} must be an own data field`,"invalid-object"),i.set(a,c.value))}return Object.freeze({has:a=>i.has(a),get:a=>i.get(a)})}function _e(e,t,n,r=0){(!Array.isArray(e)||Ss.isProxy(e))&&b(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{b(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&b(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{b(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let d=0;d<s;d+=1)a.add(String(d));let c=W();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{b(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&vs(l)||(typeof d!="string"||!a.has(d))&&b(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let d=0;d<s;d+=1){let l;try{l=Object.getOwnPropertyDescriptor(e,String(d))}catch{b(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&b(`${t} must be dense and contain only own data items`,"invalid-array"),$(c,l.value)}return c}function kl(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||_s.test(e)||Ts.test(e))&&b(`${t} is not safe bounded text`,"invalid-string"),e}function ft(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&b(`${n} is not a deterministic ID`,"invalid-id"),e}function Rs(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&b(`${t} is not a canonical digest`,"invalid-digest"),e}function Rr(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&b(`${t} must be a positive safe integer`,"invalid-chain"),e}function pt(e){return(typeof e!="string"||!Rl.test(e))&&b("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function Dl(e){(typeof e!="string"||e.length===0||e.length>78||!Ll.test(e))&&b("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{b("tokenId must be uint256","invalid-token-id")}return(t<0n||t>jl)&&b("tokenId must be uint256","invalid-token-id"),t.toString(10)}function $l(e){return(typeof e!="string"||!Pl.test(e))&&b("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Lr(e={}){let t=ee(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||b("canonical NFT input is missing a field","missing-field");let n={chainId:Rr(t.get("chainId"),"nft.chainId"),contract:pt(t.get("contract")),tokenId:Dl(t.get("tokenId"))};return de({id:tt("nft",n),...n})}function Pr(e={}){let t=ee(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||b("canonical collection input is missing a field","missing-field");let n={chainId:Rr(t.get("chainId"),"collection.chainId"),slug:$l(t.get("slug"))};return de({id:tt("collection",n),...n})}function vn(e={}){let t=ee(e,["family","chainId","address"],"canonical wallet input"),n=t.has("family")?t.get("family"):"evm",r=t.has("chainId")?t.get("chainId"):null,o=t.has("address")?t.get("address"):null,s=kl(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||b("wallet.family is invalid","invalid-family");let i=r===null?null:Rr(r,"wallet.chainId");if(o===null)return de({id:null,family:s,chainId:i,address:null});s!=="evm"&&b("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=pt(o);return de({id:tt("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function Cr(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!Cl.test(e)||_s.test(e)||Ts.test(e)||Y(e)?null:e}function Ml(e,t="snapshot.wallet"){let n=ee(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||b(`${t} is missing a required field`,"missing-field");let r=vn({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&b(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function Os(e,t){let n=ee(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&b(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return Ns.has(r)||b(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&b(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function Ul(e){let t=ee(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||b("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");Ns.has(n)||b("snapshot.coverage.status is invalid","invalid-status");let r=Os(t.get("profile"),"snapshot.coverage.profile"),o=Os(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&b("inventory cannot be called before profile","invalid-count");let s=(a,c,d,l,f)=>n===a&&r.status===c&&r.calls===d&&o.status===l&&o.calls===f;return s("NOT_REQUESTED","NOT_REQUESTED",0,"NOT_REQUESTED",0)||s("UNAVAILABLE","UNAVAILABLE",0,"UNAVAILABLE",0)||s("UNKNOWN","UNKNOWN",1,"UNAVAILABLE",0)||n==="PARTIAL"&&["COMPLETE","PARTIAL"].includes(r.status)&&["COMPLETE","PARTIAL","UNKNOWN"].includes(o.status)&&r.calls===1&&o.calls===1&&(r.status!=="COMPLETE"||o.status!=="COMPLETE")||s("COMPLETE","COMPLETE",1,"COMPLETE",1)||b("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function Fl(e){let t=_e(e,"snapshot.gaps",Object.keys(st).length),n=W();for(let s=0;s<t.length;s+=1){let i=ee(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&b("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(st,a)||i.get("message")!==st[a])&&b("snapshot gap is not a fixed allowlisted gap","invalid-gap"),$(n,a)}let r=W(),o=new Set;for(let s of n)o.has(s)||(o.add(s),$(r,s));return r.sort(se),r}function Vl(e){return Object.hasOwn(st,e)||b("OpenSea gap code is invalid","invalid-gap"),de({code:e,message:st[e]})}function zl(e){let t=ee(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||b("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),s=t.get("walletId");if(xl.has(n)||b("OpenSea evidence status is invalid","invalid-status"),ft(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||b("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&b("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&b("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:pt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&b("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||b("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&b("holding evidence source is invalid","invalid-source");let i=ft(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:ft(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==Ke&&b("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:Ke}}b("OpenSea evidence kind is invalid","invalid-kind")}function Gt(e={}){let t=zl(e);return de({id:tt("evidence",t),digest:et(t),...t})}function Bl(e,t){let n=ee(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(i=>n.has(i))||b("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(i=>n.has(i)).map(i=>[i,n.get(i)])),s=Gt(o);return ft(n.get("id"),"evidence","evidence.id"),Rs(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&b("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function Hl(e,t){if(e===null)return null;let n=ee(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&b("snapshot.profile is missing a required field","missing-field");let r=pt(n.get("address"));(!t.address||r!==t.address)&&b("profile address does not match snapshot wallet","profile-mismatch");let o=ft(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=Cr(n.get("username"));return(s===null||s!==n.get("username"))&&b("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function ql(e,t,n){let r=ee(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||b("snapshot holding is missing a required field","missing-field");let s=Lr({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&b("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&b("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=ee(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||b("holding collection is missing a required field","missing-field"),i=Pr({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&b("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==Ke&&b("holding owner binding is invalid","invalid-owner-binding");let a=_e(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,Q.citationsPerFinding,1).map(d=>ft(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(se);return c.length!==a.length&&b("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:Ke,evidenceRefs:c}}function Gl(e){return{schemaVersion:e.schemaVersion,wallet:e.wallet,requested:e.requested,coverage:e.coverage,profile:e.profile?{address:e.profile.address,evidenceRef:e.profile.evidenceRef}:null,holdings:e.holdings.map(t=>({id:t.id,chainId:t.chainId,contract:t.contract,tokenId:t.tokenId,collection:t.collection,ownerBinding:t.ownerBinding,evidenceRefs:t.evidenceRefs})),evidence:e.evidence.map(t=>({id:t.id,digest:t.digest})),gapCodes:e.gaps.map(t=>t.code)}}function Wl(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&b("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&b("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&b("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||s.length>0||i.length>0)&&(!n.chainId||!Object.hasOwn(Lt,n.chainId))&&b("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||s.length>0||i.length>0)&&b(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&b(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&b("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&b("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&b("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let y of i)d.has(y.id)&&b("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(y.id,y),n.id&&y.walletId!==n.id&&b("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let y=d.get(o.evidenceRef);(!y||y.kind!=="PROFILE"||y.address!==o.address)&&b("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,f=0;for(let y of s){l.has(y.id)&&b("snapshot holdings must be unique","duplicate-holding"),l.add(y.id),y.collection===null&&(f+=1);for(let E of y.evidenceRefs)d.has(E)||b("holding cites unknown evidence","invalid-reference")}let u=new Set,h=W(),p=W();for(let y of a)u.add(y.code),y.code.startsWith("PROFILE_")&&$(h,y.code),y.code.startsWith("INVENTORY_")&&$(p,y.code);let m=new Set(["UNSUPPORTED_CHAIN_FAMILY","UNSUPPORTED_CHAIN","INVALID_EVM_ADDRESS","API_KEY_UNAVAILABLE"]);r.status==="NOT_REQUESTED"&&(t||a.length!==1||!u.has("NOT_REQUESTED"))&&b("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&b("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(u.has("NOT_REQUESTED")||[...m].some(y=>u.has(y)))&&b("attempted coverage cannot contain an availability reason","invalid-coverage"),f>0&&!u.has("INVENTORY_COLLECTION_REJECTED")&&!u.has("INVENTORY_CONFLICTING_HOLDING")&&b("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&b("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&b("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&b("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&b("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(h.length===0||h.some(y=>y==="PROFILE_USERNAME_REJECTED"))&&b("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&b("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let g=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&p.length>0&&b("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(p.length===0||p.some(y=>!g.has(y)))&&b("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(p.length===0||p.some(y=>g.has(y)))&&b("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&p.length>0&&b("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&b("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&b("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&b("incomplete snapshot must contain a fixed gap","invalid-coverage")}function jr(e={}){let t=ee(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||b("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&b("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=ee(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?Ml(r,"snapshot.wallet"):vn(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=Ul(t.get("coverage")),c=_e(t.get("evidence"),"snapshot.evidence",Q.evidencePerSnapshot).map((E,S)=>{try{let x=ee(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${S}]`);return x.has("id")||x.has("digest")?Bl(E,S):Gt(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(R=>x.has(R)).map(R=>[R,x.get(R)])))}catch(x){throw x}}).sort((E,S)=>se(E.id,S.id)),d=t.get("profile"),l=null;if(d!==null){let E=ee(d,["address","evidenceRef","username"],"snapshot.profile");l=Hl(Object.fromEntries(["address","evidenceRef","username"].filter(S=>E.has(S)).map(S=>[S,E.get(S)])),s)}let u=_e(t.get("holdings"),"snapshot.holdings",Q.holdingsPerSnapshot).map((E,S)=>ql(E,S,s)).sort((E,S)=>se(E.id,S.id)),h=_e(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(st).length).map(E=>(Object.hasOwn(st,E)||b("snapshot gap code is invalid","invalid-gap"),E)),p=[...new Set(h)].sort(se).map(Vl),m={schemaVersion:_n,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:u,evidence:c,gaps:p,caveats:[...Rt]};Wl(m);let g=tt("opensea-snapshot",Gl(m)),y=et(m);return de({...m,snapshotId:g,digest:y})}function Jl(e){let t=ee(e,["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],"OpenSea snapshot");["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"].every(i=>t.has(i))||b("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==_n||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&b("OpenSea snapshot envelope is invalid","invalid-envelope"),_e(t.get("caveats"),"snapshot.caveats",Rt.length,Rt.length).some((i,a)=>i!==Rt[a])&&b("snapshot caveats are invalid","invalid-caveat");let o=Fl(t.get("gaps")),s=jr({requested:t.get("requested"),wallet:t.get("wallet"),coverage:t.get("coverage"),profile:t.get("profile"),holdings:t.get("holdings"),evidence:t.get("evidence"),gapCodes:o});return ft(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),Rs(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&b("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function Yl(e){return{code:e,message:vl[e]}}function Kl(e,t,n,r){let o=e.profile;if(!o||!e.wallet.id)return null;let s=!1;for(let c of t.evidenceRefs)c===o.evidenceRef&&(s=!0);if(!s)return null;let i=n.get(o.evidenceRef);if(!i||i.kind!=="PROFILE"||!xr.has(i.status)||i.walletId!==e.wallet.id||i.address!==e.wallet.address||r.has(i.id))return null;let a=null;for(let c of t.evidenceRefs){let d=n.get(c);!d||d.id===i.id||d.kind!=="HOLDING"||!xr.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==Ke||r.has(d.id)||(!a||se(d.id,a.id)<0)&&(a=d)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:Ke,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function ws(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let s=o.byWallet.get(r.walletId);(!s||se(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function Zl(e,t,n){(!Array.isArray(n)||n.length<2||n.length>Q.snapshots||n.length*2>Q.citationsPerFinding)&&b("finding citations exceeded the fixed limit","citation-limit");let r=W();for(let l=0;l<n.length;l+=1)$(r,n[l]);r.sort((l,f)=>se(l.walletId,f.walletId)||se(l.snapshotId,f.snapshotId)||se(l.holdingEvidence.id,f.holdingEvidence.id));let o=W(),s=W(),i=new Set;for(let l of r)$(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>Q.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),$(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=W();for(let l of i)$(a,l);a.sort(se);let c={kind:e,status:vr,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:tt(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:et(c),...c}}function _r(e,t){return`${e}:${t.canonical.id}`}function As(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||se(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function Xl(e,t,n){if(n<=0)return;if(e.length<n){$(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)se(e[o].key,e[r].key)>0&&(r=o);se(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function Ql(e,t){let n=0,r=0;for(let m of e.values())m.byWallet.size>=2&&(n+=1);for(let m of t.values())m.byWallet.size>=2&&(r+=1);let o=n+r,s=W(),i=new Set,a=As(e),c=As(t);if(a){let m={section:"exact",group:a,key:_r("exact",a)};$(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:_r("collection",c)};$(s,m),i.add(m.key)}let d=W(),l=Q.findings-s.length,f=(m,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let E=_r(m,y);i.has(E)||Xl(d,{section:m,group:y,key:E},l)}};f("exact",e),f("collection",t);let u=W();for(let m of s)$(u,m);for(let m of d)$(u,m);u.length>Q.findings&&b("finding selection exceeded the fixed limit","finding-limit"),u.sort((m,g)=>se(m.key,g.key));let h=W(),p=W();for(let m of u)$(m.section==="exact"?h:p,m.group);return{exact:h,collections:p,exactCount:n,collectionCount:r,truncated:o>Q.findings}}function Tn(e){return e.coverage.inventory.status==="COMPLETE"}function ed(e){e.byWallet.size>Q.snapshots&&b("finding wallet citations exceeded the snapshot limit","citation-limit");let t=W();for(let n of e.byWallet.values())$(t,n);return t.length*2>Q.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),t}function Is(e,t){let n=W();for(let r of t)$(n,Zl(e,r.canonical,ed(r)));return n.sort((r,o)=>se(r.id,o.id)),n}function Ls(e){arguments.length!==1&&b("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=ee(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&b("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==Sl&&b("NFT overlap input schema is invalid","invalid-schema");let n=_e(t.get("snapshots"),"NFT overlap snapshots",Q.snapshots,2),r=0;for(let A=0;A<n.length;A+=1){let P=ee(n[A],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${A}]`);for(let V of["holdings","evidence","gaps","caveats"])P.has(V)||b(`snapshot ${V} is required`,"missing-field");let q=_e(P.get("holdings"),`NFT overlap snapshots[${A}].holdings`,Q.holdingsPerSnapshot);_e(P.get("evidence"),`NFT overlap snapshots[${A}].evidence`,Q.evidencePerSnapshot),_e(P.get("gaps"),`NFT overlap snapshots[${A}].gaps`,Object.keys(st).length),_e(P.get("caveats"),`NFT overlap snapshots[${A}].caveats`,Rt.length,Rt.length),r+=q.length,r>Q.totalHoldings&&b("total holdings exceed the fixed limit","holding-limit");for(let V=0;V<q.length;V+=1){let ye=ee(q[V],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${A}].holdings[${V}]`);ye.has("evidenceRefs")||b("holding evidenceRefs are required","missing-field"),_e(ye.get("evidenceRefs"),`NFT overlap snapshots[${A}].holdings[${V}].evidenceRefs`,Q.citationsPerFinding,1)}}let o=W();for(let A of n)$(o,Jl(A));let s=new Map;for(let A of o){let P=A.wallet.id&&A.wallet.chainId?`${A.wallet.id}:${A.wallet.chainId}`:`noncanonical:${A.snapshotId}`;s.has(P)||s.set(P,W()),$(s.get(P),A)}let i=W(),a=0,c=0,d=W();for(let A of s.keys())$(d,A);d.sort(se);for(let A of d){let P=s.get(A),q=new Set;for(let V of P)q.add(V.digest);if(q.size>1&&!A.startsWith("noncanonical:")){c+=1;continue}P.sort((V,ye)=>se(V.snapshotId,ye.snapshotId)),$(i,P[0]),a+=P.length-1}let l=new Map;for(let A of i)for(let P of A.evidence)l.has(P.id)||l.set(P.id,new Set),A.wallet.id&&l.get(P.id).add(A.wallet.id);let f=new Set;for(let[A,P]of l)P.size>1&&f.add(A);let u=new Map,h=new Map,p=new Set,m=new Map,g=new Map,y=0,E=0,S=!1,x=c>0,R=c>0;for(let A of i){let P=A.wallet.id;P&&p.add(P),A.coverage.profile.status==="PARTIAL"&&(S=!0);let q=new Map;for(let be of A.evidence)q.set(be.id,be);let V=A.profile?q.get(A.profile.evidenceRef):null,ye=!!(A.profile&&P&&V&&V.kind==="PROFILE"&&xr.has(V.status)&&V.walletId===P&&V.address===A.wallet.address&&!f.has(V.id)),Pt=ye&&Tn(A),gt=ye&&Tn(A);(Tn(A)||Tn(A))&&!ye&&(y+=1);let Zt=new Set;A.profile&&Zt.add(A.profile.evidenceRef);for(let be of A.holdings){let Ct=Kl(A,be,q,f);if(!Ct){E+=1,Pt=!1,gt=!1;continue}Zt.add(Ct.profileEvidence.id),Zt.add(Ct.holdingEvidence.id),ws(u,be.id,{id:be.id,chainId:be.chainId,contract:be.contract,tokenId:be.tokenId},Ct),be.collection?ws(h,be.collection.id,be.collection,Ct):gt=!1}for(let be of A.evidence)Zt.has(be.id)||(E+=1,Pt=!1,gt=!1);P?(m.set(P,(m.has(P)?m.get(P):!0)&&Pt),g.set(P,(g.has(P)?g.get(P):!0)&>)):(Pt=!1,gt=!1),Pt||(x=!0),gt||(R=!0)}let C=new Set,_=new Set;for(let[A,P]of m)P&&C.add(A);for(let[A,P]of g)P&&_.add(A);let T=new Set;for(let A of C)_.has(A)&&T.add(A);let D=Ql(u,h),te=Is("EXACT_NFT_OVERLAP",D.exact),v=Is("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",D.collections),J=!x&&p.size>=2&&C.size>=2,Pe=!R&&p.size>=2&&_.size>=2,ie=D.exactCount>0?vr:J?Es:Nn,ue=D.collectionCount>0?vr:Pe?Es:Nn,F=W();c>0&&$(F,"CONFLICTING_DUPLICATE_SNAPSHOT"),(x||R)&&$(F,"INPUT_COVERAGE_INCOMPLETE"),x&&$(F,"EXACT_NFT_COVERAGE_INCOMPLETE"),R&&$(F,"COLLECTION_COVERAGE_INCOMPLETE"),S&&$(F,"PROFILE_METADATA_INCOMPLETE"),(y>0||E>0||f.size>0)&&$(F,"INELIGIBLE_HOLDING_EVIDENCE"),p.size<2&&D.exactCount===0&&D.collectionCount===0&&$(F,"INSUFFICIENT_DISTINCT_WALLETS"),D.truncated&&$(F,"FINDINGS_TRUNCATED");let w=W(),N=new Set;for(let A of F)N.has(A)||(N.add(A),$(w,A));w.sort(se);let L=W();for(let A of w)$(L,Yl(A));let j=0;for(let A of u.values())j+=A.byWallet.size;let ve=!x&&!R&&!S&&!D.truncated&&p.size>=2?"COMPLETE":ie!==Nn||ue!==Nn?"PARTIAL":"UNKNOWN",Me={schemaVersion:Nl,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:ve,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:p.size,completeDistinctWallets:T.size,completeExactNftWallets:C.size,completeCollectionWallets:_.size,qualifyingHoldings:j},exactNft:{state:ie,findings:te},collection:{state:ue,findings:v},gaps:L,caveats:[..._l],limits:Q},Kt=tt("nft-overlap-report",Me),ht=et(Me);return de({...Me,reportId:Kt,digest:ht})}var ks=128*1024,Ds=1024*1024,$s=8e3,td=20,nd=512,rd=1024,Ms=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Ps=Object.freeze({evm:1,eth:1,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,polymarket:137,bsc:56,avalanche:43114,abstract:2741,stable:988,robinhood:4663,hyperevm:999}),xn=/[\u0000-\u001f\u007f-\u009f]/u,od=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,sd=Object.freeze(["family","chainId","address","includeOpenSea"]),id=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),Rn=(e,t)=>e<t?-1:e>t?1:0;function kr(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function Le(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function me(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function ad(e){(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))&&me("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{me("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&me("args must be a plain object","invalid-object");let r=new Set(sd),o=new Map;for(let s of n){if(typeof s!="string"||!r.has(s)){let a=typeof s=="string"?s.replace(/[^a-z0-9]/giu,"").toLowerCase():"symbol";id.some(c=>a.includes(c))&&me("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),me("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{me(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&me(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function cd(e){let t=ad(e);for(let d of["family","address"])t.has(d)||me(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||xn.test(n))&&me("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||me("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||xn.test(o))&&me("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&me("args.address must not be a URL","invalid-address");let i=Ms.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(Ps,r)?Ps[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&me("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!xn.test(a)||Number.isSafeInteger(a)&&a>0)&&me("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&me("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function ld(e){let t=Ms.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=pt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:vn({family:n,chainId:e.chainId,address:r}),evm:t}}function it({requested:e,target:t,status:n,profileStatus:r,inventoryStatus:o,profileCalls:s=0,inventoryCalls:i=0,profile:a=null,holdings:c=[],evidence:d=[],gaps:l=[]}){return jr({requested:e,wallet:t.wallet,coverage:{status:n,profile:{status:r,calls:s},inventory:{status:o,calls:i}},profile:a,holdings:c,evidence:d,gapCodes:l})}function dd(){let e=process.env,t;try{t=Object.getOwnPropertyDescriptor(e,"OPENSEA_API_KEY")}catch{return}return t&&"value"in t?t.value:void 0}function Us(e){let t=je(e);return t&&t.length<=rd?t:null}function Dr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getPrototypeOf(e)}catch{throw new Error("malformed-response")}if(n!==Object.prototype&&n!==null)throw new Error("malformed-response");let r=new Map;for(let o of t){let s;try{s=Object.getOwnPropertyDescriptor(e,o)}catch{throw new Error("malformed-response")}if(s){if(!("value"in s))throw new Error("malformed-response");r.set(o,s.value)}}return r}function ud(e,t){if(!Array.isArray(e)||mt.isProxy(e))throw new Error("malformed-response");let n;try{n=Object.getOwnPropertyDescriptor(e,"length")}catch{throw new Error("malformed-response")}let r=n?.value;if(!Number.isInteger(r)||r<0)throw new Error("malformed-response");let o=Math.min(r,t),s=kr();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}Le(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function Wt(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function fd(e,t,n){let r=Dr(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=pt(r.get("address"))}catch{throw new Error("malformed-response")}if(o!==t){let a=new Error("profile-mismatch");throw a.profileMismatch=!0,a}let s,i=!1;if(r.has("username")&&r.get("username")!==null&&r.get("username")!==void 0){let a=r.get("username");s=Wt(a,n)?null:Cr(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function pd(e,t,n,r){let o=Dr(e,["nfts","next"]);if(!o.has("nfts"))throw new Error("malformed-response");let s=o.has("next")?o.get("next"):null;if(s!==null&&(typeof s!="string"||s.length===0||s.length>nd||xn.test(s)||od.test(s)||Wt(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=ud(o.get("nfts"),td),c=kr();a&&Le(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&Le(c,"INVENTORY_CURSOR_PRESENT");let d=new Map,l=new Set;for(let h of i){let p,m;try{if(typeof h=="symbol")throw new Error("invalid-row");if(p=Dr(h,["identifier","contract","collection"]),!["identifier","contract"].every(E=>p.has(E)))throw new Error("invalid-row");if(![p.get("identifier"),p.get("contract")].every(E=>typeof E=="string"))throw new Error("invalid-row");if(Wt(p.get("identifier"),r)||Wt(p.get("contract"),r))throw new Error("invalid-row");m=Lr({chainId:t.chainId,contract:p.get("contract"),tokenId:p.get("identifier")})}catch{Le(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(p.has("collection")&&typeof p.get("collection")=="string"&&!Wt(p.get("collection"),r))try{g=Pr({chainId:t.chainId,slug:p.get("collection")})}catch{g=null}if(g===null&&Le(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){Le(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=d.get(m.id);if(y){let E=y.collection?.id??null,S=g?.id??null;E===null&&S!==null?(d.set(m.id,{nft:m,collection:g}),Le(c,"INVENTORY_DUPLICATE_HOLDING")):S===null||E===S?Le(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),Le(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let f=kr(),u=[n];for(let{nft:h,collection:p}of[...d.values()].sort((m,g)=>Rn(m.nft.id,g.nft.id))){let m=Gt({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:p?.id??null,ownerBinding:Ke});Le(u,m),Le(f,{...h,collection:p,ownerBinding:Ke,evidenceRefs:[n.id,m.id].sort(Rn)})}return{holdings:f,evidence:u,gaps:[...new Set(c)].sort(Rn)}}function at(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||mt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function Cs(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=at(e,"status"),o=at(e,"name"),s=at(e,"message");return at(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":at(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:at(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:at(e,"oracleTimeout")===!0||at(e,"timeout")===!0||o==="AbortError"||o==="TimeoutError"||r===408?`${n}_TIMEOUT`:r===401?`${n}_AUTHENTICATION_FAILED`:r===403?`${n}_ACCESS_FORBIDDEN`:r===404?`${n}_NOT_FOUND`:r===429?`${n}_RATE_LIMITED`:Number.isInteger(r)&&r>=500&&r<=599?`${n}_UPSTREAM_UNAVAILABLE`:s==="malformed-response"?`${n}_MALFORMED`:`${n}_TRANSPORT_FAILED`}function $r(e){let t=Object.create(null);for(let[n,r]of e)Object.defineProperty(t,n,{value:r,writable:!1,enumerable:!0,configurable:!1});return t}function md(e){if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new TypeError("OpenSea transport requires safe headers");let t;try{t=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea transport could not inspect headers")}let n=new Set(["Accept","x-api-key"]);if(t.length!==n.size||t.some(o=>typeof o!="string"||!n.has(o)))throw new TypeError("OpenSea transport requires only its fixed headers");let r=new Map;for(let o of n){let s;try{s=Object.getOwnPropertyDescriptor(e,o)}catch{throw new TypeError("OpenSea transport could not inspect headers")}if(!s||!("value"in s))throw new TypeError("OpenSea transport requires own-data headers");r.set(o,s.value)}if(r.get("Accept")!=="application/json"||Us(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return $r([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function hd(e,t){if(typeof e!="string"||!e.startsWith("https://api.opensea.io/api/v2/"))throw new TypeError("OpenSea transport refused a non-fixed URL");if(!t||typeof t!="object"||mt.isProxy(t))throw new TypeError("OpenSea transport requires safe RequestInit");let n=Object.create(null);for(let r of["method","headers","body","signal","redirect"]){let o;try{o=Object.getOwnPropertyDescriptor(t,r)}catch{throw new TypeError("OpenSea transport could not inspect RequestInit")}if(o){if(!("value"in o))throw new TypeError("OpenSea transport requires own-data RequestInit");Object.defineProperty(n,r,{value:r==="headers"?md(o.value):o.value,writable:!0,enumerable:!0,configurable:!0})}}return Object.defineProperty(n,"dispatcher",{value:void 0,writable:!0,enumerable:!0,configurable:!0}),globalThis.fetch(e,n)}function js(e,t){let n=$r([["x-api-key",e]]);return $r([["method","GET"],["headers",n],["fetchImpl",hd],["timeoutMs",$s],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function gd(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||mt.isProxy(e))throw new TypeError("OpenSea internal client dependencies must be one non-Proxy object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(t!==Object.prototype&&t!==null)throw new TypeError("OpenSea internal client dependencies must be a plain object");let r=new Set(["requestJson","readApiKey"]),o=new Map;for(let s of n){if(typeof s!="string"||!r.has(s))throw new TypeError("OpenSea internal client dependencies have an unknown field");let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(!i||!("value"in i))throw new TypeError(`OpenSea internal client dependency ${s} must be an own data field`);o.set(s,i.value)}return o}function Fs(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=gd(e),n=t.has("requestJson")?t.get("requestJson"):Z,r=t.has("readApiKey")?t.get("readApiKey"):dd;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&me("exactly one args object is required","second-options-forbidden");let i=cd(s),a=ld(i);if(!i.includeOpenSea)return it({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(Lt,a.chainId))return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=Us(r())}catch{c=null}if(!c)return it({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["API_KEY_UNAVAILABLE"]});let d=`https://api.opensea.io/api/v2/accounts/${a.address}`,l;try{let E=await n(d,js(c,ks));l=fd(E,a.address,c)}catch(E){return it({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[Cs(E,"profile")]})}let f=Gt({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),u={address:a.address,evidenceRef:f.id,...l.username!==void 0?{username:l.username}:{}},h=l.usernameRejected?["PROFILE_USERNAME_REJECTED"]:[],m=`https://api.opensea.io/api/v2/chain/${Lt[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,js(c,Ds));g=pd(E,a,f,c)}catch(E){return it({requested:!0,target:a,status:"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:u,evidence:[f],gaps:[...h,Cs(E,"inventory")]})}let y=[...new Set([...h,...g.gaps])].sort(Rn);return it({requested:!0,target:a,status:y.length===0?"COMPLETE":"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:g.gaps.length===0?"COMPLETE":"PARTIAL",profileCalls:1,inventoryCalls:1,profile:u,holdings:g.holdings,evidence:g.evidence,gaps:y})}return Object.freeze({enrich:o})}var Lf=Object.freeze({profileMaxBytes:ks,inventoryMaxBytes:Ds,timeoutMs:$s,retries:0,redirects:0,dedupe:!1});var yd=Fs();async function Vs(e){if(arguments.length!==1){let t=new TypeError("opensea enrichment: exactly one args object is required");throw t.code="second-options-forbidden",t}return yd.enrich(e)}var Ur="oracle.investigator-cli/2",Mr=2*1024*1024,Od=/^[^\u0000-\u001f\u007f]+$/u,wd=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),$e=class extends Error{constructor(t){super(t),this.name="CliError"}};function z(e){throw new $e(e)}function Ad(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if(!r||typeof r!="object"||t.has(r))throw new $e("output is not bounded own-data JSON");t.add(r);try{let s=" ".repeat(o),i=" ".repeat(o+1);if(Array.isArray(r)){let c=[];for(let d=0;d<r.length;d+=1){let l=Object.getOwnPropertyDescriptor(r,String(d));if(!l||!Object.hasOwn(l,"value"))throw new $e("output is not bounded own-data JSON");c.push(n(l.value,o+1))}return c.length?`[
|
|
4
4
|
${i}${c.join(`,
|
|
5
5
|
${i}`)}
|
|
6
|
-
${s}]`:"[]"}let a=[];for(let c of Object.keys(r)){let d=Object.getOwnPropertyDescriptor(r,c);if(!d||!Object.hasOwn(d,"value"))throw new
|
|
6
|
+
${s}]`:"[]"}let a=[];for(let c of Object.keys(r)){let d=Object.getOwnPropertyDescriptor(r,c);if(!d||!Object.hasOwn(d,"value"))throw new $e("output is not bounded own-data JSON");a.push(`${JSON.stringify(c)}: ${n(d.value,o+1)}`)}return a.length?`{
|
|
7
7
|
${i}${a.join(`,
|
|
8
8
|
${i}`)}
|
|
9
|
-
${s}}`:"{}"}finally{t.delete(r)}};return n(e,0)}function
|
|
10
|
-
`)}function
|
|
9
|
+
${s}}`:"{}"}finally{t.delete(r)}};return n(e,0)}function Yt(e){process.stdout.write(`${Ad(e)}
|
|
10
|
+
`)}function Jt(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||!Od.test(e))&&z(`${t} is invalid`),e}function Fr(e,t,n=new Set){let r={};for(let o=0;o<e.length;){let s=e[o];if(!t.has(s)&&!n.has(s)&&z("unknown option"),Object.hasOwn(r,s)&&z("duplicate option"),n.has(s)){r[s]=!0,o+=1;continue}let i=e[o+1];(i===void 0||i.startsWith("--"))&&z("option value is missing"),r[s]=i,o+=2}return r}function Ln(e,t){return Object.hasOwn(e,t)||z("required option is missing"),e[t]}function Id(e){if(e===void 0)return;/^[1-9]\d*$/u.test(e)||z("limit must be a positive integer");let t=Number(e);return Number.isSafeInteger(t)||z("limit must be a positive integer"),t}function Sd(e,t){if(e!==void 0){if(Jt(e,"chain id",96),wd.has(t)){/^[1-9]\d*$/u.test(e)||z("EVM chain id must be a positive integer");let n=Number(e);return Number.isSafeInteger(n)||z("EVM chain id must be a positive integer"),n}return e}}function Nd(e){if(e===void 0)return;let t=Jt(e,"cursor",2048);Buffer.byteLength(t,"utf8")>2048&&z("cursor exceeds the byte limit");let n;try{n=JSON.parse(t)}catch{z("cursor must be a versioned JSON envelope")}return(!n||typeof n!="object"||Array.isArray(n))&&z("cursor must be a versioned JSON envelope"),n}async function Td(){let e=[],t=0;for await(let n of process.stdin)t+=n.length,t>Mr&&z("input exceeds the size limit"),e.push(n);return Buffer.concat(e).toString("utf8")}async function zs(e){Jt(e,"input reference",4096);try{if(e==="-")return await Td();let t=await Ed(e);t.isFile()||z("input must be a file or stdin"),t.size>Mr&&z("input exceeds the size limit");let n=await bd(e);return n.length>Mr&&z("input exceeds the size limit"),n.toString("utf8")}catch(t){if(t instanceof $e)throw t;z("unable to read input")}}function Bs(e){try{let t=JSON.parse(e.replace(/^\uFEFF/u,""));return(!t||typeof t!="object"||Array.isArray(t))&&z("input must be a JSON object"),t}catch(t){if(t instanceof $e)throw t;z("input is not valid JSON")}}function _d(e){try{let t=Object.getOwnPropertyDescriptor(e,"schemaVersion");return(t&&Object.hasOwn(t,"value")?t.value:void 0)==="oracle.investigator-collection/1"?Qn(e):Xn(e)}catch{z("input does not satisfy the investigator collection/components contract")}}function vd(e){if(!e||typeof e!="object"||Array.isArray(e))return{input:"UNKNOWN"};let t=Object.getOwnPropertyDescriptor(e,"collectorStatus"),n=t&&Object.hasOwn(t,"value")?t.value:void 0;if(n!==void 0)return{collection:n==="COMPLETE"?"COMPLETE":n==="PARTIAL"?"PARTIAL":"UNKNOWN"};let r=[];for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))continue;let i=s.value,a=i;if(i&&typeof i=="object"&&!Array.isArray(i)){let c=Object.getOwnPropertyDescriptor(i,"status");a=c&&Object.hasOwn(c,"value")?c.value:void 0}["COMPLETE","PARTIAL","UNKNOWN"].includes(a)&&r.push([o,a])}return r.length>0?Object.fromEntries(r):{input:"UNKNOWN"}}function Hs(e){return bs({subject:e.subject,entities:e.entities,events:e.events,evidence:e.evidence,coverage:vd(e.coverage),gaps:e.gaps})}async function xd(e){e.length!==0&&z("help does not accept options"),Yt({schemaVersion:Ur,execution:"read-only",reportOnly:!0,command:"help",usage:"oracle-investigate <capabilities|wallet|analyze|overlap> [options]",commands:{capabilities:"print the static capability matrix",wallet:"collect bounded wallet evidence; --include-opensea is a valueless explicit opt-in",analyze:"analyze a bounded offline coordination JSON input",overlap:"analyze strict OpenSea snapshots offline with --input"}})}async function Rd(e){e.length!==0&&z("capabilities does not accept options"),Yt({schemaVersion:Ur,execution:"read-only",reportOnly:!0,command:"capabilities",capabilities:rt,openSea:{schemaVersion:_n,flag:"--include-opensea",chainSlugs:Lt,maxHoldings:Q.holdingsPerSnapshot,pagination:!1,identityInference:!1,launchRadar:{status:"UNAVAILABLE",reason:"OpenSea enrichment is investigator-only and is not a Launch Radar evidence source."}},nftOverlap:{command:"overlap --input <file|->",networkAccess:!1,limits:Q}})}async function Ld(e){let t=Fr(e,new Set(["--family","--address","--chain-id","--limit","--cursor"]),new Set(["--include-opensea"])),n=Jt(Ln(t,"--family"),"family",64).toLowerCase(),r=Jt(Ln(t,"--address"),"address",256),o=Sd(t["--chain-id"],n),s=Id(t["--limit"]),i=Nd(t["--cursor"]),a=t["--include-opensea"]===!0,c;try{c=await ts({family:n,address:r,chainId:o,limit:s,...i===void 0?{}:{cursor:i}})}catch{z("wallet arguments are invalid")}let d=await Vs({family:n,address:r,...o!==void 0?{chainId:o}:{},includeOpenSea:a}),l;try{l=Qn(c)}catch{z("collector output did not satisfy the investigator contract")}let f=Hs(l);Yt({schemaVersion:Ur,execution:"read-only",reportOnly:!0,command:"wallet",status:c.status,collection:c,coordination:f,openSea:d})}async function Pd(e){let t=Fr(e,new Set(["--input"])),n=Ln(t,"--input"),r=_d(Bs(await zs(n)));Yt(Hs(r))}async function Cd(e){let t=Fr(e,new Set(["--input"])),n=Ln(t,"--input");try{Yt(Ls(Bs(await zs(n))))}catch(r){if(r instanceof $e)throw r;z("input does not satisfy the NFT overlap contract")}}async function jd(){let[e,...t]=process.argv.slice(2);if(e==="--help"||e==="-h"||e==="help")return xd(t);if(e==="capabilities")return Rd(t);if(e==="wallet")return Ld(t);if(e==="analyze")return Pd(t);if(e==="overlap")return Cd(t);z("command must be --help, capabilities, wallet, analyze, or overlap")}try{await jd()}catch(e){let t=e instanceof $e?e.message:"operation failed";process.stderr.write(`oracle-investigate: ${t}
|
|
11
11
|
`),process.exitCode=1}
|