@oracle-agent/oracle 0.35.43 → 0.35.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/agent-sessions.mjs +24 -24
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +28 -28
  4. package/dist/bin/oracle-data-mcp.mjs +19 -19
  5. package/dist/bin/oracle-gateway.mjs +48 -48
  6. package/dist/bin/oracle-investigate.mjs +5 -5
  7. package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
  8. package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
  9. package/dist/bin/oracle-mev-shadow.mjs +6 -6
  10. package/dist/bin/oracle-public-server.mjs +5 -5
  11. package/dist/bin/oracle-route.mjs +26 -26
  12. package/dist/bin/oracle-scan.mjs +11 -11
  13. package/dist/bin/oracle.mjs +13 -12
  14. package/dist/cli/commands/account.mjs +39 -0
  15. package/dist/cli/commands/agent-session.mjs +23 -23
  16. package/dist/cli/commands/airdrop.mjs +10 -10
  17. package/dist/cli/commands/chat.mjs +218 -217
  18. package/dist/cli/commands/data.mjs +244 -8
  19. package/dist/cli/commands/doctor.mjs +7 -7
  20. package/dist/cli/commands/eval.mjs +157 -153
  21. package/dist/cli/commands/extension-policy.mjs +1 -1
  22. package/dist/cli/commands/farm.mjs +19 -19
  23. package/dist/cli/commands/fees.mjs +3 -3
  24. package/dist/cli/commands/follow.mjs +36 -36
  25. package/dist/cli/commands/mcp.mjs +6 -6
  26. package/dist/cli/commands/mint.mjs +11 -11
  27. package/dist/cli/commands/model.mjs +222 -221
  28. package/dist/cli/commands/quickstart.mjs +7 -7
  29. package/dist/cli/commands/receipt.mjs +11 -11
  30. package/dist/cli/commands/resolve.mjs +12 -12
  31. package/dist/cli/commands/session-vault.mjs +5 -5
  32. package/dist/cli/commands/sign.mjs +12 -12
  33. package/dist/cli/commands/signer.mjs +25 -25
  34. package/dist/cli/commands/snipe.mjs +11 -11
  35. package/dist/cli/commands/strategy.mjs +5 -5
  36. package/dist/cli/commands/swap.mjs +15 -15
  37. package/dist/cli/commands/venues.mjs +2 -2
  38. package/dist/data/desk-data.mjs +26 -26
  39. package/dist/data/names.mjs +3 -3
  40. package/dist/data/providers/farming.mjs +2 -2
  41. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  42. package/dist/index.mjs +44 -44
  43. package/dist/investigator/index.mjs +2 -2
  44. package/dist/launch-radar/index.mjs +5 -5
  45. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  46. package/dist/local-signer/index.mjs +7 -3
  47. package/dist/local-signer/runtime.mjs +22 -22
  48. package/dist/nft/universal-mint-router.mjs +4 -4
  49. package/dist/notifications/index.mjs +7 -7
  50. package/dist/router/index.mjs +3 -3
  51. package/dist/router/prepare-bridge.mjs +2 -2
  52. package/dist/router/prepare-route.mjs +3 -3
  53. package/dist/scanner/index.mjs +4 -4
  54. package/dist/strategy/index.mjs +3 -3
  55. package/dist/tui/standalone-client.mjs +90 -88
  56. package/package.json +1 -1
  57. package/public/eval-report.json +347 -13
  58. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  59. package/public/oracle-splash/docs/connectors/index.html +2 -2
  60. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  61. package/public/oracle-splash/docs/index.html +3 -3
  62. package/public/oracle-splash/docs/reference/index.html +2 -2
  63. package/public/oracle-splash/docs/security/index.html +2 -2
  64. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  65. package/public/oracle-splash/download/index.html +3 -3
  66. package/public/oracle-splash/downloads/index.html +1 -1
  67. package/public/oracle-splash/index.html +6 -6
  68. package/server.json +2 -2
@@ -1,2 +1,2 @@
1
- import{createHash as yr}from"node:crypto";import{types as en}from"node:util";var Ti=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])/]),_i=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),xi=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Ri(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Li(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=Ri(n);if(_i.has(r)||xi.some(o=>r.includes(o)))return!0}return!1}function ho(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Pi=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Ci(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function ki(e){let t=e.match(Pi)||[];for(let n of t){let r=Ci(n),o=ho(r),s=o?ho(o):null;for(let i of[r,o,s])if(i&&Li(i))return!0}return!1}var ji=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 pt(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function mt(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of ji){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 ae(e){return typeof e!="string"||e.length===0?!1:Ti.some(t=>t.test(e))?!0:ki(e)}import{createHash as To}from"node:crypto";import{createHash as Fi}from"node:crypto";import{types as Qe}from"node:util";import vt from"node:net";import Di from"node:dns";var $i=new Set(["localhost","metadata.google.internal","metadata.goog"]);function gn(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 or(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 sr(e){if(vt.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(vt.isIPv6(e)){let t=gn(e);if(!t)return!1;let n=gn("::ffff:0:0");return or(t,n,96)?sr([...t.slice(12)].join(".")):or(t,gn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>or(t,gn(o),s)):!1}return!1}function Mi(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($i.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=vt.isIP(n);return r!==0&&!sr(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function ir(e,{lookupFn:t=Di.promises.lookup}={}){let n=Mi(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:vt.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=>!sr(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function ar({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||(vt.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(vt.isIP(u))return[{address:u,family:vt.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=Ui((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 cr=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ui(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[cr]=Object.freeze({pin:t}),e}function lr(e){return typeof e=="function"&&typeof e[cr]?.pin=="function"}function go(e,t,n){if(!lr(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[cr].pin(t,n)}var Vi=new Set([408,425,429,500,502,503,504]),yo=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),zi=2,bo=4e3,Bi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Hi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,qi=AbortSignal.prototype.throwIfAborted,Gi=EventTarget.prototype.addEventListener,Eo=EventTarget.prototype.removeEventListener,Oo=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Jt=e=>e?Bi.call(e):!1,Wi=e=>e?Hi.call(e):void 0,Yi=new Set([301,302,303,307,308]),bn=3,Pu=64*1024,Xe=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function ce(e){return ht(`HTTP JSON body refused: ${e}`)}function Ki(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 Qe[t]=="function"&&Qe[t](e))}function Ji(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>Xe.bytes)throw ce("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>Xe.bytes)throw ce("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,f)=>{if(r+=1,r>Xe.nodes)throw ce("node limit exceeded");if(f>Xe.depth)throw ce("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 ce("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw ce("unsupported non-JSON value");if(Qe.isProxy(l))throw ce("proxy value");if(Ki(l))throw ce("unsupported exotic object");if(i.has(l))throw ce("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw ce("symbol-keyed fields are unsupported");if(Array.isArray(l)){let p=Object.getPrototypeOf(l),m=0;for(;p!==null;){if(Qe.isProxy(p))throw ce("proxy array prototype");if(m+=1,m>Xe.depth)throw ce("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(l.length>Xe.arrayLength)throw ce("array length limit exceeded");for(let b=0;b<l.length;b+=1){let E=Object.getOwnPropertyDescriptor(l,String(b));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw ce("array entries must be dense enumerable own data")}let g=0;for(let b in l){if(s+=1,s>Xe.fields)throw ce("enumeration limit exceeded");if(Object.hasOwn(l,b)&&(g+=1,g>l.length))throw ce("named array fields are unsupported")}if(g!==l.length)throw ce("array entries must be dense enumerable own data");a("[");for(let b=0;b<l.length;b+=1)b&&a(","),d(Object.getOwnPropertyDescriptor(l,String(b)).value,f+1);a("]");return}let u=Object.getPrototypeOf(l);if(u!==Object.prototype&&u!==null)throw ce("non-plain object");let h=[];for(let p in l){if(s+=1,s>Xe.fields)throw ce("enumeration limit exceeded");if(!Object.hasOwn(l,p))continue;if(o+=1,o>Xe.fields)throw ce("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,p);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw ce("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 Zi(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(Qe.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 Xi(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Qi(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 ea(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var dr=new Map,wo=new WeakMap,Io=1;function yn(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=wo.get(e);return t||(t=Io,Io+=1,wo.set(e,t)),`reference:${t}`}var ta=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),na=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Ao(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?ta.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 So(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(Ao);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Ao(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&na.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function ra(e,t,n,r={},o=null){let s=Fi("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(`
2
- `)};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 oa(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,bo):Math.min(250*2**e,bo)+Math.floor(Math.random()*100)}var sa=e=>new Promise(t=>setTimeout(t,e));function ht(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function ur(e,t,n){return ht(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Nt(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function ia(e){return e?e.byteLength??e.length??0:0}async function aa(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&&(Nt(e),!r))throw ur(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 ur(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+=ia(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 ur(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function ca(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function la(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=bn}){let g=null,b=t,E=i?{lookupFn:i}:{};if(c&&!a&&!lr(b))throw ht(`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 T=new AbortController,M=setTimeout(()=>T.abort(),s),L=h?Oo?Oo([h,T.signal]):h:T.signal,U=async(j,{status:P=null}={})=>{let z=await ir(j,E);if(!z.ok)throw ht(P==null?`HTTP refused ${j}: ${z.error}`:`HTTP redirect to ${j} ${z.error}`,P==null?{}:{status:P});let Q=new URL(j).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await ar({requireUndici:!0,...f?{importUndici:f}:{}})}catch(k){throw ht(P==null?`HTTP refused ${j}: ${k?.message||k}`:`HTTP redirect to ${j} refused: ${k?.message||k}`,P==null?{}:{status:P})}g.pin(Q,z.addresses),b=g.fetch}else go(b,Q,z.addresses);return z};try{let j=String(e),P=Object.assign(Object.create(null),r||{});c&&await U(j);for(let z=0;z<=m;z+=1){let Q=Object.assign(Object.create(null),{method:n,headers:P,body:o,signal:L,redirect:"manual",dispatcher:void 0}),k=await b(j,Q);if((p==="error"||m===0)&&k.status>=300&&k.status<400)throw Nt(k),ht(`HTTP ${k.status} ${n} redirect refused`,{status:k.status,redirectRefused:!0});if(Yi.has(k.status)){let B=l===!0&&n==="POST"&&[307,308].includes(k.status)&&So(n,o);if(n!=="GET"&&n!=="HEAD"&&!B){Nt(k);let S=new Error(`HTTP ${k.status} ${n} ${j} redirected non-idempotent request`);throw S.status=k.status,S}if(z===m)throw Nt(k),ht(`HTTP ${k.status} ${n} redirect budget exhausted`,{status:k.status,redirectRefused:!0});let R=k.headers?.get?.("location"),x;try{x=Qi(R,j)}catch(S){throw Nt(k),S}let w=!ea(x,j);if(Nt(k),w&&n==="POST"){let S=new Error(`HTTP ${k.status} ${n} cross-origin redirect refused`);throw S.status=k.status,S}if(w&&l){let S=new Error(`HTTP ${k.status} ${n} cross-origin redirect refused`);throw S.status=k.status,S.retryable=!1,S}if(w&&(P=Xi(P)),c)await U(x,{status:k.status});else if(w){let S=await ir(x,E);if(!S.ok){let C=new Error(`HTTP redirect from ${j} ${S.error}`);throw C.status=k.status,C.retryable=!1,C}a&&S.addresses?.length&&(g||(g=await ar(f?{importUndici:f}:{})),g&&(g.pin(new URL(x).hostname,S.addresses),b=g.fetch))}j=x;continue}if(typeof u=="function")try{await u(k,{url:j})}catch(B){throw Nt(k),ht(B?.message||String(B))}let Y=await aa(k,d,{url:j,onOversize:()=>T.abort()}),Ae=ca(Y);if(!k.ok){let B=new Error(`HTTP ${k.status} ${n} ${j}`);throw B.status=k.status,B.retryAfter=k.headers?.get?.("retry-after")??null,B.body=Ae??Y.slice(0,300),B}return Ae??Y}throw new Error(`HTTP redirect loop for ${e}`)}catch(j){if(T.signal.aborted&&!Jt(h)){let P=j&&(typeof j=="object"||typeof j=="function")&&!Qe.isProxy(j)?j:null,z=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(z&&Object.hasOwn(z,"value")&&z.value===!0))try{if(!P)throw new TypeError("unsafe rejection");Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let k=new Error("HTTP request timed out");throw Object.defineProperties(k,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),k}}throw j}finally{clearTimeout(M),g&&await g.close()}}async function le(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Qe.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 C of Object.getOwnPropertyNames(t)){let $=Object.getOwnPropertyDescriptor(t,C);if(!(C==="toJSON"&&$&&Object.hasOwn($,"value")&&$.value===void 0)){if(!n.has(C))throw new TypeError("HTTP options contain unknown fields");if(!$||!$.enumerable||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=C=>{if(t==null||!Object.hasOwn(t,C))return;let $=Object.getOwnPropertyDescriptor(t,C);if(!$||!Object.hasOwn($,"value"))throw new TypeError("HTTP options must contain own data properties");return $.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>bn))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${bn}`);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??bn;for(let C of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let $=r(C);if($!==void 0&&typeof $!="boolean")throw new TypeError(`HTTP ${C} 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(Qe.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 C of["importUndici","lookupFn","validateResponse"]){let $=r(C);if($!==void 0&&typeof $!="function")throw new TypeError(`HTTP ${C} 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(),b=r("headers"),E=Zi(b),T=Object.assign(Object.create(null),E);Object.keys(T).some(C=>C.toLowerCase()==="accept")||(T.Accept="application/json");let M=r("body");M!=null&&typeof M!="string"&&(Object.keys(T).find($=>$.toLowerCase()==="content-type")||(T["Content-Type"]="application/json"),M=Ji(M));let L=i??zi,U=r("lookupFn"),j=!h,P=r("untrustedUrl")===!0,z=r("sameOriginRedirectsOnly")===!0,Q=r("importUndici"),k=r("validateResponse"),Y=u,Ae=f??null,B=async()=>{let C;for(let $=0;$<=L;$++){Y&&qi.call(Y);try{return await la(e,{fetchImpl:p,method:g,headers:T,body:M,timeoutMs:m,lookupFn:U,realFetch:j,untrustedUrl:P,maxResponseBytes:Ae,sameOriginRedirectsOnly:z,importUndici:Q,validateResponse:k,signal:Y,redirectPolicy:d,maxRedirects:l})}catch(oe){C=oe;let Se=_=>{if(!oe||typeof oe!="object"&&typeof oe!="function"||Qe.isProxy(oe))return;let D=Object.getOwnPropertyDescriptor(oe,_);return D&&Object.hasOwn(D,"value")?D.value:void 0},xe=Se("status"),Ve=Se("oracleTimeout")===!0||Se("name")==="AbortError"||Se("name")==="TimeoutError"||Jt(Y),St=new Set([408,425,429]),A=Se("retryable")===!1?!1:xe!=null?St.has(xe)||Vi.has(xe)&&yo.has(g):!Ve&&yo.has(g);if($===L||!A)throw oe;let y=oa($,Se("retryAfter"));Y?await new Promise((_,D)=>{let F,G=()=>{clearTimeout(F),Eo.call(Y,"abort",G),D(Wi(Y)||new DOMException("Aborted","AbortError"))};if(Jt(Y)){G();return}F=setTimeout(()=>{Eo.call(Y,"abort",G),_()},y),Gi.call(Y,"abort",G,{once:!0}),Jt(Y)&&G()}):await sa(y)}}throw C};if(!(r("dedupe")!==!1&&!Y&&So(g,M)))return B();let x=ra(g,e,T,{untrustedUrl:P,maxResponseBytes:Ae,sameOriginRedirectsOnly:z,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:L,fetchImpl:yn(p),realFetch:j,lookupFn:yn(U),importUndici:yn(Q),validateResponse:yn(k)},M),w=dr.get(x);if(w)return w;let S=B().finally(()=>dr.delete(x));return dr.set(x,S),S}import{types as Pt}from"node:util";function Ce(e){if(!e||typeof e!="object"||Pt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Le(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Pt.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 et(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"||Pt.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`);et(a.value,t,n,s,o+1)}return e}if(!Ce(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`);et(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function de(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(Pt.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]=de(i.value,t,n+1)}return o}if(!Ce(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]=de(s.value,t,n+1)}return r}var vo=Symbol("oracle.provider-failure-metadata"),da=new Set(["provider-response-too-large","provider-timeout"]);function Ct(e,t){let n=t&&typeof t=="object"&&!Pt.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,vo,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function No(e){if(!e||typeof e!="object"||Pt.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,vo);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=da.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var fr="https://blockstream.info/liquid/api";function ua(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||fr).replace(/\/$/,"")}var fa="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function pa(e){let t=0n;for(let s of e){let i=fa.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 ma(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return To("sha256").update(To("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var ha="qpzry9x8gf2tvdw0s3jn54khce6mua7l",_o=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function ga(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<_o.length;o+=1)r>>BigInt(o)&1n&&(t^=_o[o])}return t}function ya(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=ha.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||ga(i)!==c)return!1;let d=ya(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 Zt(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=pa(t);return!!(n&&n.length===59&&ma(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function ba(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)||Zt(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 Ea(e,t={}){return de(await le(`${ua(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function xo(e={},t={}){let n=ba(e.address||e.addr,"address"),r=await Ea(`/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:Zt(n),note:f?void 0:Zt(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 jo}from"node:util";import{base58 as Ro}from"@scure/base";function Lo(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)||pt(e))return!1;try{let s=Ro.decode(e);return s.length===r&&(!o||!mt(s))&&Ro.encode(s)===e}catch{return!1}}function On(e){return Lo(e,32,44,32)}function wn(e){return Lo(e,64,88,64,!0)}var pr="oracle.investigator-cursor/1",Oa=2*1024,wa=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),Po=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),Ia=Object.freeze(["block_number","index"]),mr=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Aa(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function Do(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")&&Do(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function K(e){throw new mr(e)}function $o(e,t){return(!e||typeof e!="object"||jo.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&K(`${t} must be a plain object`),e}function In(e,t,n){$o(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&K(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return Aa(a)||K(`${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)&&K(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&K(`${n} fields must be enumerable own data`)}}function ve(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&K(`${n} fields must be own data`),r.value}function tt(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&K(`${t} is invalid`),e}function Co(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=tt(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||ae(t))&&K("chain is invalid"),t}function Sa(e){return e===e.toLowerCase()||e===e.toUpperCase()}function va(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 Na(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||va(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ko(e,t,n){let r=tt(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&K("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!On(r))&&K("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Sa(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)&&K("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Na(r):null;return o||K("address is invalid for the cursor family"),o}K("family does not support cursors")}function Ta(e){In(e,Ia,"EVM payload");let t=ve(e,"block_number","cursor"),n=ve(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&K("EVM payload values are invalid"),{block_number:t,index:n}}function _a(e){In(e,["lt","hash"],"TON payload");let t=tt(ve(e,"lt","cursor"),"TON payload.lt",40),n=tt(ve(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||pt(n))&&K("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||mt(r))&&K("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function xa(e,t){if(e==="evm")return Ta(t);if(e==="ton")return _a(t);let n=tt(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&K("Bitcoin payload must be a transaction id"),e==="solana"&&!wn(n)&&K("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||K(`${e} does not support cursors`),n}function Ra(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"||jo.isProxy(r))&&K("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"))&&K("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(ve(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Oa&&K("envelope exceeds the byte limit")}function kt(e,t={}){if(e==null)return null;In(e,wa,"envelope"),ve(e,"schemaVersion","cursor")!==pr&&K("schemaVersion is unsupported");let n=tt(ve(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(Po,n)||/^[0-9a-f]{64}$/iu.test(n)||ae(n))&&K("family is invalid");let r=Co(ve(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&K("chain is invalid for the cursor family");let o=ko(n,r,ve(e,"address","cursor")),s=tt(ve(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==Po[n]||ae(s))&&K("provider is invalid"),$o(t,"expected binding");let i=h=>Object.hasOwn(t,h)?ve(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:tt(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:Co(i("chain")),d=i("address")===void 0?void 0:ko(n,r,i("address")),l=i("provider")===void 0?void 0:tt(i("provider"),"expected provider",64);a!==void 0&&n!==a&&K("family binding does not match the request"),c!==void 0&&r!==c&&K("chain binding does not match the request"),d!==void 0&&o!==d&&K("address binding does not match the request"),l!==void 0&&s!==l&&K("provider binding does not match the request");let f=xa(n,ve(e,"payload","cursor")),u={schemaVersion:pr,family:n,chain:r,address:o,provider:s,payload:f};return Ra(u),Do(u)}function Mo(e,t){return In(e,["family","chain","address","provider"],"binding"),kt({schemaVersion:pr,family:ve(e,"family","binding"),chain:ve(e,"chain","binding"),address:ve(e,"address","binding"),provider:ve(e,"provider","binding"),payload:t},e)}function Tt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Tt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var Dt="oracle.onchain-investigator/1",Tn="oracle.investigator-collection/1",zo=Tt(["wallet","token","tx","launch"]),gt=Tt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),Bo=Tt(["COMPLETE","PARTIAL","UNKNOWN"]),Oe=Tt({maxDepth:3,maxNodes:250,maxEdges:1e3}),hr=Tt({depth:2,nodes:100,edges:400}),rt="READ_ONLY",Z=Tt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),La=new Set(zo),Pa=new Set(gt),Ca=new Set(Bo),ka=/^[a-z][a-z0-9._:-]{0,63}$/,ja=/^[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})$/,Da=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),$a=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,Ma=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,Ua=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),Fa=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),Va=new Set(["auth","key","token","xapikey"]),za=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),Ba=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),_n=32,Uo=64,Ha=5,qa=512,Ga=262144,br=262144,qo=524288,Sn=524288,nt=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function N(e,t){throw new nt(e,t)}function vn(e,t){return(!e||typeof e!="object"||en.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&N(`${t} must be a plain object`,"invalid-object"),e}function pe(e,t,n){vn(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&N(`${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)))&&N(`${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"))&&N(`${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!ae(t)}function Wa(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 tn(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])||Wa(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function Ya(e){return tn(e)!==null}var Ka="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Ja(e){let t=0n;for(let o of e){let s=Ka.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 Za(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=Ja(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 yr("sha256").update(yr("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function Xa(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)||Za(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)||Ya(e)}function Qa(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?Xa(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):Ho.test(e)}function Er(e,t,n){if(n>12&&N("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>qo&&N("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||en.isProxy(e))&&N("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&N("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&N("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)||N("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>Sn&&N("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"))&&N("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Er(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&&N("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"))&&N(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>Sn&&N("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"))&&N(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Er(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 se(e){return Er(e,{nodes:0,fields:0,active:new Set},0)}function H(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&N(`${t} must be an own data field`,"invalid-component"),n.value}function Qt(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&N(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function Xt(e,t,{max:n=qa,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&N(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&Ma.test(e)||r&&(Ho.test(e)||Go(e))||o&&Qa(e,o))&&!$a.test(e);return ae(e)&&!i&&N(`${t} contains secret-shaped material`,"secret-material"),e}function ec(e,t){(!ja.test(e)||/^[0-9a-f]{64}$/iu.test(e)||ae(e))&&N(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!za.has(n);return(Va.has(n)||r||Ba.some(o=>n.includes(o)))&&N(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function xn(e,t,n,r="data-limit"){en.isProxy(e)&&N(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||N(`${t} must be an array`,"invalid-component"),e.length>n&&N(`${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)||N(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&N(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function Or(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 tc(e){let t=Or(e,1);return typeof t=="string"&&Da.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 nc(e){let t=Or(e,1);return typeof t=="string"&&Ua.has(t)?!0:Number.isInteger(t)&&Fa.has(Or(e,2))}function jt(e,t,n,r,o){if(n>Ha&&N(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>Ga&&N(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return Xt(e,t,{publicIdentifierField:tc(o),allowDeterministicRecordId:nc(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||en.isProxy(e))&&N(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&N(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&N(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>Uo&&N(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>br&&N(`${t} exceeds the cumulative field limit`,"data-limit"),xn(e,t,Uo).map((a,c)=>jt(a,`${t}[${c}]`,n+1,r,[...o,c]));vn(e,t);let s=Object.keys(e);s.length>_n&&N(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>br&&N(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){ec(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&N(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,jt(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function Be(e={},t="data"){return(typeof t!="string"||t.length===0||t.length>256)&&N("data label must be a bounded string","invalid-component"),jt(e,t,0,{nodes:0,fields:0,active:new Set},[])}function Nn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&N("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>qo&&N("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&en.isProxy(e)&&N("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&N("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&N("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=xn(e,"canonical value",Z.evidence,"invalid-json");return r.fields+=c.length,r.fields>Sn&&N("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Nn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&N("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>_n&&N("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>Sn&&N("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"))&&N("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Nn(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))&&N("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&N("value is not canonical JSON","invalid-json"),o}function Xu(e){return Nn(e)}function ie(e){return`sha256:${yr("sha256").update(Nn(e)).digest("hex")}`}function Pe(e,t){let n=Xt(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||N("id kind must be a lowercase slug","invalid-id"),`${n}_${ie(t).slice(7)}`}function Rn(e,t="status"){return Pa.has(e)||N(`${t} must be one of ${gt.join(", ")}`,"invalid-status"),e}function wr(e){pe(e,["type","chainFamily","network","identifier"],"target"),Qt(e,["type","chainFamily","identifier"],"target");let t=H(e,"type");La.has(t)||N(`target.type must be one of ${zo.join(", ")}`,"invalid-target");let n=Xt(H(e,"chainFamily"),"target.chainFamily",{max:64}).toLowerCase();ka.test(n)||N("target.chainFamily must be a lowercase chain-family slug","invalid-target");let r=H(e,"network"),o=r==null?null:Xt(r,"target.network",{max:96}),s=Xt(H(e,"identifier"),"target.identifier",{max:256,allowPublicIdentifier:!0});return{type:t,chainFamily:n,network:o,identifier:s}}function Ir(e={}){pe(e,["depth","nodes","edges"],"limits");let t=H(e,"depth")??hr.depth,n=H(e,"nodes")??hr.nodes,r=H(e,"edges")??hr.edges;return(!Number.isInteger(t)||t<0||t>Oe.maxDepth)&&N("limits.depth must be an integer from 0 through 3","invalid-limit"),(!Number.isInteger(n)||n<1||n>Oe.maxNodes)&&N("limits.nodes must be an integer from 1 through 250","invalid-limit"),(!Number.isInteger(r)||r<0||r>Oe.maxEdges)&&N("limits.edges must be an integer from 0 through 1000","invalid-limit"),{depth:t,nodes:n,edges:r}}function Ar(e){pe(e,["target","limits"],"request"),Qt(e,["target"],"request");let t=wr(H(e,"target")),n=Ir(H(e,"limits")??{}),r={schemaVersion:Dt,requestId:Pe("request",{target:t,limits:n}),posture:rt,target:t,limits:n};return se(r)}function An(e,t,n,r){let o=xn(e,t,n,"component-limit");return r.fields+=o.length,r.fields>br&&N(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>jt(s,`${t}[${i}]`,0,r,[t,i]))}function Ln(e){let t=["subject","entities","events","evidence","coverage","gaps"];pe(e,t,"components"),Qt(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=jt(H(e,"subject"),"subject",0,n,["subject"]),o=An(H(e,"entities"),"entities",Oe.maxNodes,n),s=An(H(e,"events"),"events",Oe.maxEdges,n),i=An(H(e,"evidence"),"evidence",Z.evidence,n),a=jt(H(e,"coverage"),"coverage",0,n,["coverage"]),c=An(H(e,"gaps"),"gaps",Oe.maxNodes,n);return se({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}function Qu(e){return Ca.has(e)||N(`coverage status must be one of ${Bo.join(", ")}`,"invalid-status"),e}var Fo=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),rc=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function oc(e,t,n){if(e===null)return null;if(pe(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&N("collector output.cursor fields are invalid","invalid-cursor"),H(e,"requested")===null&&H(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&N("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:kt(H(e,"requested"),r),next:kt(H(e,"next"),r)}}catch{N("collector cursor binding or payload is invalid","invalid-cursor")}}function gr(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)&&N(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&N(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function sc(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)&&N("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)&&N("collector coverage source is invalid","invalid-reference");let o=gr(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)||N("collector subject entity reference is missing","invalid-reference"),gr(e.events,"event");let s=gr(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])))&&N(`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)&&N("collector event evidence references are invalid","invalid-reference")}}function Vo(e,t,n=_n){let r=Object.keys(e);r.length>n&&N(`${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"))&&N(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function ef(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];pe(e,t,"collector output"),Qt(e,t,"collector output"),H(e,"schemaVersion")!==Tn&&N("collector output.schemaVersion is unsupported","invalid-schema-version"),H(e,"execution")!=="read-only"&&H(e,"execution")!=="READ_ONLY"&&N("collector output must be read-only","invalid-posture"),rc.has(H(e,"status"))||N("collector output.status is invalid","invalid-status"),Array.isArray(H(e,"evidence"))||N("collector output.evidence must be an array","invalid-component"),vn(H(e,"coverage"),"collector output.coverage");let n=Ln({subject:H(e,"subject"),entities:H(e,"entities"),events:H(e,"events"),evidence:xn(H(e,"evidence"),"collector output.evidence",Oe.maxEdges,"component-limit").map(o=>{vn(o,"collector evidence"),Qt(o,["status"],"collector evidence");let s=H(o,"status"),i=typeof s=="string"&&Object.hasOwn(Fo,s)?Fo[s]:null;return i||N("collector evidence status is invalid","invalid-status"),{...Vo(o,"collector evidence"),status:i}}),coverage:{...Vo(H(e,"coverage"),"collector coverage",_n-1),collectorStatus:H(e,"status")},gaps:H(e,"gaps")});sc(n);let r=oc(H(e,"cursor"),n.subject,n.coverage.source);return se({...n,cursor:r})}var tf=Ln;import{AsyncLocalStorage as ic}from"node:async_hooks";import{types as rn}from"node:util";var nn=Symbol("oracle.evidence-graph.internal-transaction"),Sr=new WeakMap;function Wo(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||typeof t!="function"||Sr.has(e))throw new TypeError("invalid evidence graph transaction registration");Sr.set(e,t)}function vr(e,t){let n=Sr.get(e);if(typeof n!="function")throw new TypeError("evidence graph has no internal transaction runner");return n(t)}var ac=/^[a-z][a-z0-9-]*_[0-9a-f]{64}$/,cc=/^[a-z][a-z0-9._:-]{0,63}$/,Nr=(e,t)=>e<t?-1:e>t?1:0,Yo=se({observation:"Cited public evidence records an on-chain observation.","relationship-observation":"Cited public evidence records an on-chain relationship.","activity-pattern-observation":"Cited public evidence records an on-chain activity pattern."});function V(e,t="invalid-evidence-graph"){throw new nt(e,t)}function v(e,t){if(!e||typeof e!="object"||rn.isProxy(e))return;let n=Object.getOwnPropertyDescriptor(e,t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function yt(e,t,n=512,{publicIdentifier:r=!1}={}){let o=r?Be({transactionId:e},t).transactionId:Be(e,t);return(typeof o!="string"||o.length>n)&&V(`${t} must be a string no longer than ${n}`,"invalid-string"),o}function Pn(e,t){let n=yt(e,t,64).toLowerCase();return cc.test(n)||V(`${t} must be a lowercase slug`,"invalid-kind"),n}function lc(e,t){if(e===void 0)return null;let n=yt(e,t,64),r=Date.parse(n);return(!Number.isFinite(r)||new Date(r).toISOString()!==n)&&V(`${t} must be an exact ISO instant`,"invalid-time"),n}function on(e,t){return(typeof e!="string"||!ac.test(e))&&V(`${t} is not a deterministic investigator ID`,"invalid-id"),e}function Jo(e,t){return e===void 0?null:on(e,t)}function Cn(e,t,n){return e!==void 0&&e!==t&&(Jo(e,n),V(`${n} does not match the normalized record`,"record-id-mismatch")),t}function Mt(e,t,n){(rn.isProxy(e)||!Array.isArray(e)||e.length>n)&&V(`${t} must be a bounded array`,"invalid-reference");let r=new Array(e.length);for(let o=0;o<e.length;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));(!s||!Object.hasOwn(s,"value"))&&V(`${t} must contain dense own data`,"invalid-reference"),r[o]=s.value}return r}function Zo(e,t,{required:n=!1}={}){if(e===void 0)return n&&V(`${t} is required`,"missing-reference"),[];let r=Mt(e,t,64);n&&r.length===0&&V(`${t} must be a bounded non-empty array`,"missing-evidence");for(let o of r)on(o,t);return new Set(r).size!==r.length&&V(`${t} must contain unique ids`,"invalid-reference"),[...r].sort(Nr)}function Ko(e,t,n,{required:r=!1,allowMissing:o=!1}={}){let s=Zo(e,n,{required:r});if(!o)for(let i of s)t.has(i)||V(`${n} contains unknown reference ${i}`,"unknown-reference");return s}function dc(e){return["evm","ethereum","eth","eip155"].includes(e)?"eip155":e}function uc(e,t){if(typeof t!="string")return t;let n=t.toLowerCase();if(e==="eip155"){let r=n.match(/^(?:eip155:)?(\d+)$/u)?.[1];if(r)return BigInt(r).toString()}return n}function fc(e,t){return["eip155","hyperliquid"].includes(e)&&/^0x[0-9a-f]{1,40}$/iu.test(t)?`0x${t.slice(2).toLowerCase().padStart(40,"0")}`:["aptos","sui"].includes(e)&&/^0x[0-9a-f]{1,64}$/iu.test(t)?`0x${t.slice(2).toLowerCase().padStart(64,"0")}`:e==="ton"?tn(t)??t:e==="cosmos"?t.toLowerCase():t}function jn(e){return v(e,"status")==="LIVE"||v(e,"status")==="INDEXED"}function kn(e,t,n,{usableOnly:r=!1}={}){let o=["evidenceIds","evidenceRefs"].filter(a=>v(e,a)!==void 0);o.length>1&&V(`${n} has ambiguous evidence citation fields`,"ambiguous-evidence");let s=o.length===1?v(e,o[0]):void 0,i=Zo(s,n,{required:!0});for(let a of i){let c=t.get(a);c||V(`${n} cites unknown evidence ${a}`,"unknown-evidence"),r&&!jn(c)&&V(`${n} cites evidence that cannot support a finding`,"unusable-evidence")}return i}function $t(e,t){let n=e.get(v(t,"id"));return n&&ie(n)!==ie(t)&&V(`deterministic ID collision for ${v(t,"id")}`,"id-collision"),n||e.set(v(t,"id"),t),v(t,"id")}function pc(e){return{id:v(e,"id"),status:v(e,"status"),source:v(e,"source"),...v(e,"observedAt")?{observedAt:v(e,"observedAt")}:{},subject:v(e,"subject"),...v(e,"locator")!==void 0?{locator:v(e,"locator")}:{},data:v(e,"data"),...v(e,"raw")!==void 0?{raw:v(e,"raw")}:{},digest:v(e,"digest")}}function mc(e){if(e===null||typeof e!="object"&&typeof e!="function")return!1;if(rn.isProxy(e)||rn.isPromise(e))return!0;let t=e;for(let n=0;t!==null&&n<=Oe.maxDepth;n+=1){if(rn.isProxy(t))return!0;let r;try{r=Object.getOwnPropertyDescriptor(t,"then")}catch{return!0}if(r)return Object.hasOwn(r,"value")?typeof r.value=="function":!0;try{t=Object.getPrototypeOf(t)}catch{return!0}}return t!==null}function Dn(e={},t=null){t!==null&&t!==nn&&V("graph internal capability is invalid","invalid-object"),pe(e,["target","limits"],"graph options");let n=Object.getOwnPropertyDescriptor(e,"target");(!n||!Object.hasOwn(n,"value"))&&V("graph target is required","invalid-report");let r=Object.getOwnPropertyDescriptor(e,"limits"),o=wr(n.value),s=Ir(r&&Object.hasOwn(r,"value")?r.value:{}),i=new Map,a=new Map,c=new Map,d=new Map,l=new Map,f=new Map,u=new Map,h=new ic,p=!1,m=null,g=!1,b=!1,E=!1;function T(){E&&V("graph is poisoned by an asynchronous transaction","invalid-transaction")}function M(){h.getStore()?.closed===!0&&V("graph transaction is closed","invalid-transaction")}function L(){T(),M(),g&&V("graph is already finalized","graph-finalized")}function U(A,y,_){if(A===void 0)return!1;pe(A,[y],_);let D=v(A,y);return D!==void 0&&typeof D!="boolean"&&V(`${_}.${y} must be boolean`,"invalid-reference"),D===!0}function j(A){pe(A,["key","id","status","source","subject","observedAt","locator","data","raw"],"evidence");let y={status:Rn(v(A,"status")),source:yt(v(A,"source"),"evidence.source"),subject:yt(v(A,"subject"),"evidence.subject",512,{publicIdentifier:!0}),observedAt:lc(v(A,"observedAt"),"evidence.observedAt"),...v(A,"locator")!==void 0?{locator:Be({locator:v(A,"locator")},"evidence").locator}:{},data:Be(v(A,"data")??{},"evidence.data"),...v(A,"raw")!==void 0?{raw:Be(v(A,"raw"),"evidence.raw")}:{}};return{id:Cn(v(A,"id"),Pe("evidence",y),"evidence.id"),...y,digest:ie(y)}}function P(A){pe(A,["key","id","kind","chainFamily","network","reference","evidenceIds","evidenceRefs","data","depth"],"node");let y={kind:Pn(v(A,"kind"),"node.kind"),chainFamily:dc(Pn(v(A,"chainFamily"),"node.chainFamily")),network:v(A,"network")===void 0||v(A,"network")===null?null:yt(v(A,"network"),"node.network",96),reference:yt(v(A,"reference"),"node.reference",256,{publicIdentifier:!0}),evidenceIds:kn(A,i,"node.evidenceIds"),data:Be(v(A,"data")??{},"node.data"),depth:v(A,"depth")??0};(!Number.isInteger(y.depth)||y.depth<0||y.depth>s.depth)&&V("node.depth exceeds the traversal bound","depth-limit"),y.network=uc(y.chainFamily,y.network),y.reference=fc(y.chainFamily,y.reference);let _={kind:y.kind,chainFamily:y.chainFamily,network:y.network,reference:y.reference},D=Pe("entity",_);return v(A,"id")!==void 0&&v(A,"id")!==D&&(Jo(v(A,"id"),"node.id"),V("node.id does not match its normalized node identity","node-id-mismatch")),{id:D,...y}}function z(A,y){let _=U(y,"allowMissingNodes","edge validation options");pe(A,["id","from","to","relation","evidenceIds","evidenceRefs","data"],"edge");let D={from:on(v(A,"from"),"edge.from"),to:on(v(A,"to"),"edge.to"),relation:Pn(v(A,"relation"),"edge.relation"),evidenceIds:kn(A,i,"edge.evidenceIds"),data:Be(v(A,"data")??{},"edge.data")};return!_&&(!a.has(D.from)||!a.has(D.to))&&V("edge references a missing node","unknown-reference"),{id:Cn(v(A,"id"),Pe("event",D),"edge.id"),...D}}function Q(A,y){let _=U(y,"allowMissingReferences","finding validation options");pe(A,["id","kind","summary","status","evidenceIds","evidenceRefs","nodeIds","edgeIds","data"],"finding");let D=Pn(v(A,"kind"),"finding.kind"),F=Object.hasOwn(Yo,D)?Yo[D]:null;F||V("finding.kind is not an allowed evidence-only finding kind","invalid-finding-kind"),v(A,"summary")!==void 0&&v(A,"summary")!==F&&V("finding.summary must be omitted or exactly match the fixed evidence-only template","invalid-finding-summary");let G=Rn(v(A,"status")??"DERIVED","finding.status");G!=="DERIVED"&&V("finding.status must be DERIVED","invalid-finding-status");let ee=Be(v(A,"data")??{},"finding.data");(!ee||typeof ee!="object"||Array.isArray(ee)||Object.keys(ee).length!==0)&&V("finding.data must be empty because caller-authored finding claims are not allowed","invalid-finding-data");let Re={kind:D,summary:F,status:G,evidenceIds:kn(A,i,"finding.evidenceIds",{usableOnly:!0}),nodeIds:Ko(v(A,"nodeIds"),a,"finding.nodeIds",{allowMissing:_}),edgeIds:Ko(v(A,"edgeIds"),d,"finding.edgeIds",{allowMissing:_}),data:ee};return{id:Cn(v(A,"id"),Pe("finding",Re),"finding.id"),...Re}}function k(A,y){let _=U(y,"allowMissingNode","gap validation options");pe(A,["id","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"],"gap");let D=Rn(v(A,"status"),"gap.status");D!=="UNKNOWN"&&D!=="UNAVAILABLE"&&V("gap.status must be UNKNOWN or UNAVAILABLE","invalid-gap");let F=v(A,"nodeId")===void 0?null:on(v(A,"nodeId"),"gap.nodeId");!_&&F!==null&&!a.has(F)&&V("gap.nodeId references a missing node","unknown-reference");let G=v(A,"depth")??0;(!Number.isInteger(G)||G<0||G>s.depth)&&V("gap.depth exceeds the traversal bound","depth-limit");let ee={reason:yt(v(A,"reason"),"gap.reason"),status:D,evidenceIds:kn(A,i,"gap.evidenceIds"),nodeId:F,depth:G,data:Be(v(A,"data")??{},"gap.data")};return{id:Cn(v(A,"id"),Pe("gap",ee),"gap.id"),...ee}}function Y(A){return T(),se(j(A))}function Ae(A){return T(),se(P(A))}function B(A,y){return T(),se(z(A,y))}function R(A,y){return T(),se(Q(A,y))}function x(A,y){return T(),se(k(A,y))}function w(A){L();let y=j(A);return i.size>=Z.evidence&&!i.has(v(y,"id"))&&V("evidence limit reached","evidence-limit"),$t(i,y)}function S(A){L();let y=P(A),_=ie({chainFamily:y.chainFamily,network:y.network,reference:y.reference}),D=c.get(_);D&&D!==v(y,"id")&&V("canonical node identity has multiple ids","id-collision"),a.size>=s.nodes&&!a.has(v(y,"id"))&&V("node limit reached","node-limit");let F=$t(a,y);return c.set(_,F),F}function C(A){L();let y=z(A),_=ie({from:y.from,to:y.to,relation:y.relation,data:y.data}),D=l.get(_);D&&D!==v(y,"id")&&V("duplicate edge facts have multiple ids","id-collision"),d.size>=s.edges&&!d.has(v(y,"id"))&&V("edge limit reached","edge-limit");let F=$t(d,y);return l.set(_,F),F}function $(A){L();let y=Q(A);return f.size>=Z.findings&&!f.has(v(y,"id"))&&V("finding limit reached","finding-limit"),$t(f,y)}function oe(A){L();let y=k(A);return u.size>=Z.gaps&&!u.has(v(y,"id"))&&V("gap limit reached","gap-limit"),$t(u,y)}function Se(A="configured traversal limit reached"){L();let y=yt(A,"truncation reason");p||(m=y),p=!0}function xe(A){L(),(b||typeof A!="function")&&V("graph transaction is invalid","invalid-transaction");let y=[i,a,c,d,l,f,u],_=y.map(ee=>new Map(ee)),D=p,F=m,G={closed:!1};b=!0;try{let ee=h.run(G,()=>{try{return A()}finally{G.closed=!0}});return mc(ee)&&(E=!0,V("graph transactions must be synchronous","invalid-transaction")),ee}catch(ee){throw y.forEach((Re,Je)=>{Re.clear();for(let[fe,Ze]of _[Je])Re.set(fe,Ze)}),p=D,m=F,ee}finally{G.closed=!0,b=!1}}function Ve(){T(),M(),b&&V("cannot finalize an active graph transaction","invalid-transaction");let A=new Set([...u.values()].flatMap(X=>X.evidenceIds));for(let X of["UNKNOWN","UNAVAILABLE"]){let ft=[...i.values()].filter(ze=>ze.status===X&&!A.has(v(ze,"id"))).map(ze=>v(ze,"id")).sort(Nr);for(let ze=0;ze<ft.length;ze+=64){if(u.size>=Z.gaps){p=!0,m===null&&(m="gap limit reached while explaining unknown evidence");break}let Ni=k({reason:`${X} evidence did not provide complete public facts`,status:X,evidenceIds:ft.slice(ze,ze+64),depth:0,data:{generated:!0}});$t(u,Ni)}}let y=X=>[...X.values()].sort((ft,ze)=>Nr(ft.id,ze.id)),_=y(i),D=y(a),F=y(d),G=y(f),ee=y(u),Re=ee.length>0||p,Je=new Set([...D.flatMap(X=>X.evidenceIds),...F.flatMap(X=>X.evidenceIds),...G.flatMap(X=>X.evidenceIds)]),fe=_.some(X=>Je.has(X.id)&&jn(X)),Ze=X=>X.evidenceIds.some(ft=>jn(i.get(ft))),Ii=[...D,...F,...G].some(X=>!Ze(X)),Ai=_.some(X=>X.status==="UNKNOWN"||X.status==="UNAVAILABLE"),Si={status:Re||Ai||Ii||!fe?fe?"PARTIAL":"UNKNOWN":"COMPLETE",truncated:p,truncationReason:m,limits:s,counts:{evidence:_.length,nodes:D.length,edges:F.length,findings:G.length,gaps:ee.length},evidenceStatuses:Object.fromEntries(gt.map(X=>[X,_.filter(ft=>ft.status===X).length]))},rr={schemaVersion:Dt,posture:rt,reportOnly:!0,target:o,limits:s,evidence:_.map(pc),nodes:D,edges:F,findings:G,gaps:ee,coverage:Si};Xo(rr);let vi={...rr,reportHash:ie(rr)};return g=!0,se(vi)}let St=Object.freeze({addEvidence:w,addNode:S,addEdge:C,addFinding:$,addGap:oe,markTruncated:Se,validateEvidence:Y,validateNode:Ae,validateEdge:B,validateFinding:R,validateGap:x,hasNode:A=>a.has(A),hasEdge:A=>d.has(A),isUsableEvidence:A=>jn(i.get(A)),finalize:Ve});return t===nn&&Wo(St,xe),St}function hc(e){pe(e,["schemaVersion","posture","reportOnly","target","limits","evidence","nodes","edges","findings","gaps","coverage","reportHash"],"report"),(v(e,"schemaVersion")!==Dt||v(e,"posture")!==rt||v(e,"reportOnly")!==!0)&&V("report envelope is invalid","invalid-report");let t={evidence:Mt(v(e,"evidence"),"report.evidence",Z.evidence),nodes:Mt(v(e,"nodes"),"report.nodes",Oe.maxNodes),edges:Mt(v(e,"edges"),"report.edges",Oe.maxEdges),findings:Mt(v(e,"findings"),"report.findings",Z.findings),gaps:Mt(v(e,"gaps"),"report.gaps",Z.gaps)};ie(e);let n=Be(v(e,"coverage"),"report.coverage");(!n||typeof n!="object"||Array.isArray(n))&&V("report.coverage is invalid","invalid-report");let r=Dn({target:v(e,"target"),limits:v(e,"limits")});for(let s of t.evidence){pe(s,["id","status","source","observedAt","subject","locator","data","raw","digest"],"report evidence");let i=v(s,"digest"),a=Object.fromEntries(Object.keys(s).filter(l=>l!=="digest").map(l=>[l,v(s,l)])),c=r.addEvidence(a),d=r.validateEvidence(a);(c!==v(s,"id")||v(d,"digest")!==i)&&V("report evidence digest is invalid","invalid-report-digest")}for(let s of t.nodes)r.addNode(s);for(let s of t.edges)r.addEdge(s);for(let s of t.findings)r.addFinding(s);for(let s of t.gaps)pe(s,["id","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"],"report gap"),r.addGap({...s,...v(s,"nodeId")===null?{nodeId:void 0}:{}});v(n,"truncated")===!0&&r.markTruncated(v(n,"truncationReason"));let o=r.finalize();return ie(o)!==ie(e)&&V("report hash or normalized records are invalid","invalid-report-hash"),o}function Xo(e){e.evidence.length>Z.evidence&&V("report evidence exceeds the component handoff limit","component-limit");let t=e.nodes.map(r=>({id:r.id,family:r.chainFamily,chain:r.network,address:r.reference,kind:r.kind,evidenceRefs:r.evidenceIds,data:r.data})),n=e.edges.map(r=>({id:r.id,type:r.relation,fromEntityId:r.from,toEntityId:r.to,evidenceRefs:r.evidenceIds,data:r.data}));return Ln({subject:e.target,entities:t,events:n,evidence:e.evidence.map(r=>({id:v(r,"id"),status:r.status,source:r.source,subject:r.subject,...r.observedAt?{observedAt:r.observedAt}:{},...r.locator!==void 0?{locator:r.locator}:{},data:r.data,...r.raw!==void 0?{raw:r.raw}:{},digest:r.digest})),coverage:e.coverage,gaps:e.gaps.map(r=>({id:r.id,status:r.status,reason:r.reason,evidenceRefs:r.evidenceIds,...r.nodeId?{nodeId:r.nodeId}:{},depth:r.depth,data:r.data}))})}function gc(e){return Xo(hc(e))}var lf=Dn,df=gc;import{types as Mn}from"node:util";var yc=/^[A-Za-z][A-Za-z0-9._:-]{0,127}$/,bc=/^[a-z][a-z0-9-]*_[0-9a-f]{64}$/,es=(e,t)=>e<t?-1:e>t?1:0;function Ne(e,t="invalid-spider-adapter"){throw new nt(e,t)}function ot(e,t,n){pe(e,t,n);let r={};for(let o of t){let s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(r,o,{value:s?s.value:void 0,enumerable:!0,writable:!1,configurable:!1})}return r}function Ec(e){e&&(typeof e=="object"||typeof e=="function")&&Mn.isProxy(e)&&Ne("request must not be a proxy","invalid-request");let t=e&&(typeof e=="object"||typeof e=="function")?Object.getOwnPropertyDescriptor(e,"schemaVersion"):null;if(t&&!Object.hasOwn(t,"value")&&Ne("request.schemaVersion must be own data","invalid-request"),t?.value!==void 0){let n=ot(e,["schemaVersion","requestId","posture","target","limits"],"request"),r=Ar({target:n.target,limits:n.limits});return(n.schemaVersion!==Dt||n.posture!==rt||n.requestId!==r.requestId)&&Ne("request envelope does not match its normalized read-only request","invalid-request"),r}return Ar(e)}function xr(e,t,n=1e3){(Mn.isProxy(e)||!Array.isArray(e)||e.length>n)&&Ne(`${t} must be a bounded array`,"adapter-limit");let r=new Array(e.length);for(let o=0;o<e.length;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));(!s||!Object.hasOwn(s,"value"))&&Ne(`${t} must contain dense own data`,"invalid-spider-adapter"),r[o]=s.value}return r}function Oc(e){if(e==null)return{evidence:[],nodes:[],edges:[],findings:[],gaps:[]};let t=ot(e,["evidence","nodes","edges","findings","gaps"],"adapter result"),n=Object.create(null);for(let r of["evidence","nodes","edges","findings","gaps"])n[r]=xr(t[r]??[],`adapter result.${r}`);return n}function sn(e){return[...e].sort((t,n)=>es(ie(t),ie(n)))}function Qo(e,t){return(typeof e!="string"||!yc.test(e)||e==="$self"||bc.test(e))&&Ne(`${t} must be a unique, non-reserved adapter key`,"invalid-adapter-key"),e}function $n(e,t){let n=["evidenceKeys","evidenceIds","evidenceRefs"].filter(o=>e[o]!==void 0);if(n.length>1&&Ne("adapter record has ambiguous evidence citation fields","ambiguous-evidence"),n.length===0)return;let r=e[n[0]];return Array.isArray(r)?xr(r,"adapter evidence references",64).map(o=>t.get(o)??o):r}function wc(e,t){return Array.isArray(e)?xr(e,"adapter local references",64).map(n=>t.get(n)??n):e}function _r(e,t,n,r,o){let s=e.addEvidence({status:n,source:o,subject:t.reference,data:{outcome:n.toLowerCase()}});e.addGap({reason:r,status:n,evidenceIds:[s],nodeId:t.id,depth:t.depth,data:{}})}function Tr(e,t,n,r,o){try{vr(e,()=>_r(e,t,n,r,o))}catch{e.markTruncated("record limit reached while recording an investigation gap")}}async function ts(e={}){let t=ot(e,["request","inspect"],"spider options"),n=t.request,r=t.inspect,o=Ec(n);r!==void 0&&(typeof r!="function"||Mn.isProxy(r))&&Ne("inspect must be a non-Proxy function","invalid-adapter");let s=Dn({target:o.target,limits:o.limits},nn),i=s.addEvidence({status:"DERIVED",source:"investigation-request",subject:o.target.identifier,data:{requestId:o.requestId,posture:rt}}),a=s.addNode({kind:o.target.type,chainFamily:o.target.chainFamily,network:o.target.network,reference:o.target.identifier,evidenceIds:[i],data:{role:"subject"},depth:0}),c=se({id:a,kind:o.target.type,chainFamily:o.target.chainFamily,network:o.target.network,reference:o.target.identifier,depth:0}),d=[c],l=new Set([a]),f=0;if(!r)return Tr(s,c,"UNAVAILABLE","no read-only inspector is available for this target","inspector"),s.finalize();for(;d.length;){let u=d.shift(),h;try{let m=se({posture:rt,reportOnly:!0,depth:u.depth,maxDepth:o.limits.depth,remainingNodes:o.limits.nodes-l.size,remainingEdges:o.limits.edges-f,requestId:o.requestId});h=Oc(await r(u,m))}catch{Tr(s,u,"UNKNOWN","the read-only inspector did not return usable data","inspector");continue}let p;try{p=vr(s,()=>{let m=new Map,g=new Set;for(let B of sn(h.evidence)){let R=ot(B,["key","id","status","source","subject","observedAt","locator","data","raw"],"adapter evidence"),x=R.key===void 0?null:Qo(R.key,"adapter evidence.key");x!==null&&g.has(x)&&Ne("adapter evidence keys must be unique","duplicate-adapter-key");let w=s.addEvidence(R);x!==null&&(m.has(x)&&m.get(x)!==w&&Ne("adapter evidence key collides with an evidence ID","duplicate-adapter-key"),g.add(x),m.set(x,w)),m.has(w)&&m.get(w)!==w&&Ne("adapter evidence ID collides with a key","duplicate-adapter-key"),m.set(w,w)}let b=new Map([["$self",u.id],[u.id,u.id]]),E=new Map,T=new Set,M=new Map,L=new Set(l),U=[],j=f,P=!1,z=!1,Q=!1,k=null,Y=B=>{s.markTruncated(B),Q=!0,k===null&&(k=B)};for(let B of sn(h.nodes)){let R=ot(B,["key","id","kind","chainFamily","network","reference","evidenceKeys","evidenceIds","evidenceRefs","data"],"adapter node"),x=R.key===void 0?null:Qo(R.key,"adapter node.key");x!==null&&(T.has(x)||b.has(x)||E.has(x))&&Ne("adapter node keys must be unique and must not shadow node IDs","duplicate-adapter-key");let w=u.depth+1,S=s.validateNode({id:R.id,kind:R.kind,chainFamily:R.chainFamily,network:R.network,reference:R.reference,evidenceIds:$n(R,m),data:R.data??{},depth:Math.min(w,o.limits.depth)});(T.has(S.id)||x===S.id)&&Ne("adapter node key collides with a normalized node ID","duplicate-adapter-key");let C=ie({id:S.id,kind:S.kind,chainFamily:S.chainFamily,network:S.network,reference:S.reference,evidenceIds:S.evidenceIds,data:S.data}),$=M.get(S.id);if($&&$!==C&&Ne("adapter returned conflicting duplicate node identities","conflicting-duplicate"),M.set(S.id,C),x!==null&&T.add(x),L.has(S.id)){s.addNode(S),x!==null&&b.set(x,S.id),b.set(S.id,S.id);continue}if(w>o.limits.depth){Y("depth limit reached before all discovered nodes were visited"),E.set(S.id,S.id),x!==null&&E.set(x,S.id);continue}if(L.size>=o.limits.nodes){Y("node limit reached before all discovered nodes were added"),E.set(S.id,S.id),x!==null&&E.set(x,S.id);continue}let oe=s.addNode(S),Se=se({id:oe,kind:S.kind,chainFamily:S.chainFamily,network:S.network,reference:S.reference,depth:w});L.add(oe),U.push(Se),b.set(oe,oe),x!==null&&b.set(x,oe),S.evidenceIds.some(xe=>s.isUsableEvidence(xe))&&(P=!0)}U.sort((B,R)=>es(B.id,R.id));let Ae=new Set;for(let B of sn(h.edges)){let R=ot(B,["id","from","to","relation","evidenceKeys","evidenceIds","evidenceRefs","data"],"adapter edge"),x=$=>b.has($)?{id:b.get($),omitted:!1}:E.has($)?{id:E.get($),omitted:!0}:{id:$,omitted:!1},w=x(R.from),S=x(R.to),C=s.validateEdge({id:R.id,from:w.id,to:S.id,relation:R.relation,evidenceIds:$n(R,m),data:R.data??{}},{allowMissingNodes:!0});if(w.omitted||S.omitted){Y("an edge was omitted because its discovered node was outside the configured bounds"),Ae.add(C.id);continue}if((!L.has(C.from)||!L.has(C.to))&&Ne("adapter edge references an unknown node","unknown-reference"),s.hasEdge(C.id)){s.addEdge(C);continue}if(j>=o.limits.edges){Y("edge limit reached before all discovered edges were added"),Ae.add(C.id);continue}s.addEdge(C),j+=1,C.evidenceIds.some($=>s.isUsableEvidence($))&&(P=!0)}for(let B of sn(h.findings)){let R=ot(B,["id","kind","summary","status","evidenceKeys","evidenceIds","evidenceRefs","nodeIds","edgeIds","data"],"adapter finding"),x=s.validateFinding({id:R.id,kind:R.kind,summary:R.summary,status:R.status,evidenceIds:$n(R,m),nodeIds:wc(R.nodeIds,new Map([...E,...b])),edgeIds:R.edgeIds,data:R.data},{allowMissingReferences:!0});if(x.nodeIds.some(S=>E.has(S))||x.edgeIds.some(S=>Ae.has(S))){Y("a finding was omitted because a cited graph record was outside the configured bounds");continue}s.addFinding(x),P=!0}for(let B of sn(h.gaps)){let R=ot(B,["id","reason","status","evidenceKeys","evidenceIds","evidenceRefs","nodeId","depth","data"],"adapter gap"),x=$n(R,m);(x===void 0||Array.isArray(x)&&x.length===0)&&(x=[s.addEvidence({status:R.status,source:"inspector",subject:u.reference,data:{outcome:"gap"}})]);let w=R.nodeId!==void 0&&E.has(R.nodeId),S=R.nodeId===void 0?u.id:b.get(R.nodeId)??E.get(R.nodeId)??R.nodeId,C=s.validateGap({id:R.id,reason:R.reason,status:R.status,evidenceIds:x,nodeId:S,depth:R.depth??u.depth,data:R.data},{allowMissingNode:!0});if(w){Y("a gap was reattached because its discovered node was outside the configured bounds");continue}s.addGap(C),z=!0}return Q?(_r(s,u,"UNKNOWN",k,"inspector-bounds"),z=!0):!P&&!z&&_r(s,u,"UNKNOWN","the read-only inspector returned no usable evidence for this node","inspector-empty"),{added:U,edgeCount:j}})}catch{Tr(s,u,"UNKNOWN","the read-only inspector returned data outside the investigator contract","inspector-contract");continue}for(let m of p.added)l.add(m.id);d.push(...p.added),f=p.edgeCount}return s.finalize()}function Ic(e={}){let n=ot(e,["inspect"],"spider factory options").inspect;return n!==void 0&&(typeof n!="function"||Mn.isProxy(n))&&Ne("inspect must be a non-Proxy function","invalid-adapter"),Object.freeze({posture:rt,investigate(r){return ts({request:r,inspect:n})}})}var gf=ts,yf=Ic;import{types as Hr}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"}),Rr=Object.freeze(["block_number","index"]),ns=new Set([...Rr,"items_count","value","hash","inserted_at","fee"]);function an(e){return Number.isSafeInteger(e)&&e>=0}function bt(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 Ac(e){if(!Ce(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==Rr.length||t.some(o=>!Rr.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=bt(e,"block_number","blockscout transaction",!0),r=bt(e,"index","blockscout transaction",!0);if(!an(n)||!an(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function Sc(e){if(!Ce(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>ns.size||t.some(a=>!ns.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=bt(e,"block_number","blockscout provider",!0),r=bt(e,"index","blockscout provider",!0);if(!an(n)||!an(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=bt(e,"items_count","blockscout provider");if(o!==void 0&&!an(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=bt(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=bt(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=bt(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 vc(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 rs(e){return!!Un[Number(e)]}async function os(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=Ac(s);for(let[p,m]of Object.entries(h))m!=null&&o.set(p,String(m))}let i=`${vc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=de(await le(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=Le(a,"items");if(!Ce(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,f=Le(a,"next_page_params");if(f!=null){if(!Ce(f))throw new Error("blockscout transactions returned an invalid next cursor");l=Sc(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 Nc="mainnet-beta",Lr="https://api.mainnet-beta.solana.com";function Tc(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||Lr).trim()}function _c(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 xc(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=de(await le(Tc(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(!Ce(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=Le(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${Le(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return Le(o,"result")}async function ss(e={},t={}){let n=_c(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 xc("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:Nc,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 Rc="mainnet",Pr="https://mempool.space/api",Cr="https://mempool.space/testnet/api";function is(e={}){return String(e.network||process.env.BTC_NETWORK||Rc).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Lc(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):is(e)==="testnet"?Cr:Pr}function Pc(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 Cc(e,t={}){let n=`${Lc(t)}${e.startsWith("/")?e:`/${e}`}`;return de(await le(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function as(e={},t={}){let n=Pc(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 Cc(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:is(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 kr="https://api.hyperliquid.xyz/info",jr="https://api.hyperliquid-testnet.xyz/info";function kc({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"?jr:kr}async function jc(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=kc(t);return de(await le(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function cs(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return jc({type:"userFills",user:e},t)}var ls="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ut({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:ds(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([ds(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[ls]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${ls}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function ds(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function We(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function Ft(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 Dr="https://api.trongrid.io",Dc=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],$c="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function Mc(e={}){return Ut({provider:"tron-public",defaultUrl:Dr,hosts:Dc,url:e.baseUrl||process.env.TRON_API_URL||""})}function Uc(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return We(t)}function Fc(e,t){return Ft({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Vc(e,t={}){let n=Mc(t),r=Uc(t),o=de(await le(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Fc(n.trusted,r)}),"tron-public response");return et(o,n.trusted?r:"","tron-public response")}function us(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 zc(e){return Ct({error:"tron-public request failed"},e)}function Bc(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 fs(e={},t={}){try{let n=us(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?$c:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",us(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 Vc(`/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:Bc(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 zc(n)}}var Ur="https://toncenter.com/api",Hc=["toncenter.com","testnet.toncenter.com"];function qc(e={}){return Ut({provider:"ton-public",defaultUrl:Ur,hosts:Hc,url:e.baseUrl||process.env.TON_API_URL||""})}function Gc(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return We(t)}function Wc(e,t){return Ft({Accept:"application/json"},{"X-API-Key":t},e)}async function Yc(e,t={}){let n=qc(t),r=Gc(t),o=de(await le(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Wc(n.trusted,r)}),"ton-public response");return et(o,n.trusted?r:"","ton-public response")}function Kc(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 Jc(e){return Ct({error:"ton-public request failed"},e)}function Zc(e,t){if(!Ce(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(Le(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 Le(e,"result")}function $r(e){let t=String(e??"").trim();if(pt(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||mt(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function Mr(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 ps(e={},t={}){try{let n=Kc(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:$r(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=Zc(await Yc(`/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:$r(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=$r(m.transaction_id.hash),b=String(m.transaction_id.lt??"");if(b.length>100||!/^\d+$/u.test(b))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),T=m.out_msgs??[];if(T.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let M=0n;for(let U of T){if(!U||typeof U!="object"||Array.isArray(U))throw new Error("ton-public: malformed outbound message");M+=BigInt(Mr(U.value??"0","outbound message value",{nullable:!1}))}let L=E?String(M):null;if(L!=null&&L.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:b,utime:m.utime??null,feeNano:Mr(m.fee,"transaction fee"),inMessageValueNano:Mr(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:T.length,outMessageValueNano:L}}),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 Jc(n)}}var st=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"})}),ms="cosmoshub";function Xc(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function Qc(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||ms).trim().toLowerCase(),o=Object.hasOwn(st,r)?st[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=Xc(r)||r===ms&&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(st).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 el(e,t,n={}){return de(await le(`${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 tl(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 nl(e){return{error:String(e?.message||e).slice(0,200)}}function rl(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 ol(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function sl(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:ol(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?rl(r,t.decimals):null}}async function hs(e={},t={}){try{let n=Qc(e,t),r=tl(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 el(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=>sl(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 nl(n)}}var Vr="https://fullnode.mainnet.aptoslabs.com",Fr="0x1::aptos_coin::AptosCoin",Fn=8;function bs(e={}){return Ut({provider:"aptos-public",defaultUrl:Vr,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function Es(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return We(t)}function Os(e,t){return Ft({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function gs(e,t={}){let n=bs(t),r=Es(t),o=de(await le(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Os(n.trusted,r)}),"aptos-public response");return et(o,n.trusted?r:"","aptos-public response")}function il(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 al(e){return Ct({error:"aptos-public request failed"},e)}function ys(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 cl(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function ws(e={},t={}){try{let n=il(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=bs(t),m=Es(t),g=et(de(await le(`${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:Os(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 gs(`/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===Fr;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?ys(f??"0",Fn):null}]}}let s=Math.min(201,o+1),i=await gs(`/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=cl(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===Fr;c.push({coinType:u,raw:h,decimals:p?Fn:null,symbol:p?"APT":null,amount:p?ys(h,Fn):null,frozen:f?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(f=>f.coinType===Fr)||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 al(n)}}var qr="oracle.investigator-fact-projection/1",_s=4*1024*1024;function je(e){return se(e)}var Et=se({evm:je({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:je({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:je({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:je({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:je({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:je({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:je({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(st)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:je({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:je({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:je({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:je({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":je({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:je({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})}),ll=Et,dl=Et,Is=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"}),As=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"}),Ss=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"}),ul=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),Hn=Symbol("missing-public-fact"),Vn=8;function fl(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Is,t)?Is[t]:t)||"unsupported"}function Wn(e){return Ce(e)&&Object.getPrototypeOf(e)===Object.prototype}function J(e,t){return Le(e,t)}function ct(e){return Ce(e)}function Br(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(Hr.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]=Br(i.value,t+1)}return o}if(!ct(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]=Br(s.value,t+1)}return r}function pl(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 ml(e){if(!ct(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=J(e,"fetchImpl"),o=J(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 hl(e){let t=J(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 gl(e,t,n){let r=Object.hasOwn(As,t)?As[t]:void 0,o=Object.hasOwn(Ss,e)?Ss[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)||ae(s))throw new Error("investigator collector: chainId is invalid");return s}function zn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function yl(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 xs(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 yl(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))&&Zt(e)}function De(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return On(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&zn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&zn(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 xs(n)!==null;if(e==="cosmos"){if(!zn(n))return!1;let r=Object.hasOwn(st,t)?st[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)&&zn(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 He(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"?xs(t)??t:t}function bl(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)||!De(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&De(e,t,r)||e==="liquid"&&Gr(r);if(ae(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return He(e,r)}function El(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 Ol(e,t,n){if(t===Et.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 Rs(e={}){pl(e);let t=J(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)||ae(n))throw new Error("investigator collector: family is invalid");let r=fl(n),o=Object.hasOwn(Et,r)?Et[r]:Et.unsupported,s=gl(r,n,J(e,"chainId"));Ol(r,o,s);let i=bl(r,s,J(e,"address")),a=El(J(e,"limit"),o),c=J(e,"cursor"),d=c===void 0?null:kt(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 ln(e,t){return`${e}_${ie(t).slice(7,55)}`}function Ls(e,t,n){return ln("entity",{family:e,chain:t,address:n,kind:"address"})}function wl(e){return{id:Ls(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function Yn(e,t,n,r=[]){return{schemaVersion:Tn,execution:"read-only",status:t,subject:e,entities:[wl(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function at(e,t){return{code:e,message:t}}var qn=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 cn(e,t="provider-unavailable"){let n=i=>Le(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(qn,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:qn[s]})}function Il(e){return cn(e).message}function Ps(e,t,n,r,o,s=!1){return{id:ln("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:qr,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:s,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function zr(e,t,n,r,o,s){let i=t?.source||null,a=Le(r,"code"),c=a&&Object.hasOwn(qn,a)?Object.freeze({code:a,httpStatus:Le(r,"httpStatus")??null,message:qn[a]}):cn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=Yn(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(Ps("ERROR",i,o,e,d,!0)),l.cursor=t?.cursor?{requested:s,next:null}:null,l}function Bn(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=Yn(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[at("unavailable",r)]);return o.evidence.push(Ps("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function Al(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=We(process.env[n]);if(r)return r}return null}function it(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof J(n,"fetchImpl")=="function"?J(n,"fetchImpl"):void 0,timeoutMs:J(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:_s,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:Un[Number(t.chainId)]}):e==="solana"?s({rpcUrl:Lr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?Cr:Pr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?jr:kr}):e==="tron"?s({baseUrl:Dr}):e==="ton"?s({baseUrl:Ur}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(st,t.chainId)?st[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:Vr}):e==="liquid"?s({baseUrl:fr}):o}var vs=Object.freeze({evm:(e,t,n)=>os(e,it("evm",e,t,n)),solana:(e,t,n)=>ss(e,it("solana",e,t,n)),bitcoin:(e,t,n)=>as(e,it("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>cs(e.address,it("hyperliquid",e,t,n)),tron:(e,t,n)=>fs(e,it("tron",e,t,n)),ton:(e,t,n)=>ps(e,it("ton",e,t,n)),cosmos:(e,t,n)=>hs(Object.assign(Object.create(null),e,{chain:e.chainId}),it("cosmos",e,t,n)),aptos:(e,t,n)=>ws(e,it("aptos",e,t,n)),liquid:(e,t,n)=>xo(e,it("liquid",e,t,n))});function Sl(e,t,n,r){let o=J(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(vs,e)?vs[e]:null;return c?d=>c(d,n,r):void 0}function be(e){return typeof e=="string"?e||null:J(e,"hash")||J(e,"address")||null}function Cs(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 Hn;let r=ul.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)&&!ae(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 ae(e)&&!a?Hn:e}function q(e,t,n,r,o){let s=Cs(r,n,o);return s===Hn||r===void 0?!1:(e[n]=s,t.push(n),!0)}function Wr(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=ct(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:qr,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||d,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...s}}function vl(e,t){let n={},r=[];q(n,r,"transactionHash",e.hash),q(n,r,"blockNumber",e.block_number),q(n,r,"timestamp",e.timestamp),q(n,r,"fromAddress",be(e.from)),q(n,r,"toAddress",be(e.to)),q(n,r,"createdContractAddress",zt("evm",t,be(e.created_contract))?be(e.created_contract):void 0),q(n,r,"value",e.value),q(n,r,"status",e.status),q(n,r,"fee",ct(e.fee)?e.fee.value:e.fee),q(n,r,"gasUsed",e.gas_used),q(n,r,"gasLimit",e.gas_limit),q(n,r,"nonce",e.nonce);let o=be(e.token);return q(n,r,"tokenAddress",typeof o=="string"&&De("evm",t,o)?o:void 0),q(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:Wr("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function Nl(e,t){if(!ct(e))return null;let n={},r=[];return q(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),q(n,r,"outputIndex",e.vout),q(n,r,"coinbase",e.is_coinbase),q(n,r,"sequence",e.sequence),q(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&De("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),q(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function Tl(e,t,n){if(!ct(e))return null;let r={index:t},o=[];return q(r,o,"address",typeof e.scriptpubkey_address=="string"&&De("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),q(r,o,"value",e.value),q(r,o,"scriptType",e.scriptpubkey_type,64),r}function _l(e,t){let n={},r=[];q(n,r,"transactionId",e.txid),q(n,r,"version",e.version),q(n,r,"locktime",e.locktime),q(n,r,"size",e.size),q(n,r,"weight",e.weight),q(n,r,"fee",e.fee);let o={},s=[];q(o,s,"confirmed",e.status?.confirmed),q(o,s,"blockHeight",e.status?.block_height),q(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),q(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,Vn).map(l=>Nl(l,t)).filter(Boolean),d=a.slice(0,Vn).map((l,f)=>Tl(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:Wr("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:i.length,inputSelected:c.length,inputsTruncated:i.length>Vn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>Vn})}}function _t(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):J(t,a);q(r,o,i,l,c),typeof a=="string"?s.push(a):typeof d=="string"&&s.push(d)}return{facts:r,projection:Wr(e,t,o,{sourceFields:s})}}function Gn(e,t,n){return e==="evm"?vl(n,t):e==="bitcoin"?_l(n,t):e==="solana"?_t(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>J(r,"err")!==null&&J(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?_t(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"?_t(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"?_t(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?_t(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?_t(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):_t(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function Bt(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"||Hr.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");Bt(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");Bt(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function ks(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!ae(e)}function Ye(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)&&!ae(e)}function xl(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)&&!ae(e)}function Vt(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:ks(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Rl(e){if(typeof e!="string"||pt(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&&!mt(t)}catch{return!1}}function zt(e,t,n){return n==null||typeof n=="string"&&De(e,t,n)}function js(e,t,n){return`${e}:${String(t)}:${n}`}function Ns(e,t,n){let r=be(n);return typeof r=="string"&&De(e,t,r)?js(e,t,He(e,r)):null}function Ht(e,t,n){return typeof t=="string"&&typeof n=="string"&&He(e,t)===He(e,n)}function Ll(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"&&De("bitcoin",t,i)&&Ht("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&De("bitcoin",t,i)&&Ht("bitcoin",i,n)})}function Pl(e,t,n,r){if(!ct(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&zt("evm",t,be(r.from))&&zt("evm",t,be(r.to))&&zt("evm",t,be(r.created_contract))&&[be(r.from),be(r.to),be(r.created_contract)].some(o=>Ht("evm",o,n))&&Ye(r.block_number,32)&&Ye(r.value,100)&&Vt(r.timestamp,{iso:!0});if(e==="solana")return wn(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&Vt(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&ct(r.status)&&Ll(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&Ye(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&Vt(r.status.block_time);if(e==="hyperliquid"){let o=ks(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||Ye(r.tid,32,{nullable:!1});return o&&s&&i&&(r.hash!=null||r.tid!=null)&&xl(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&Vt(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&De("tron",t,r.from)&&typeof r.to=="string"&&De("tron",t,r.to)&&[r.from,r.to].some(o=>Ht("tron",o,n))&&typeof r.tokenAddress=="string"&&De("tron",t,r.tokenAddress)&&Ye(r.raw,100,{nullable:!1})&&Vt(r.blockTimestamp):e==="ton"?Rl(r.hash)&&Ye(r.lt,40,{nullable:!1})&&zt("ton",t,r.inMessageSource)&&zt("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>Ht("ton",o,n))&&Ye(r.inMessageValueNano,100)&&Vt(r.utime):!1}function Cl(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:Wn(t)?e==="evm"||e==="bitcoin"||e==="ton"?J(t,"transactions")??null:e==="solana"?J(t,"signatures")??null:e==="tron"?J(t,"transfers")??null:null:null}function Ts(e,t,n){if(e==="evm")return{type:"transaction",from:be(n.from)?He("evm",be(n.from)):null,to:be(n.to)??be(n.created_contract)?He("evm",be(n.to)??be(n.created_contract)):null,asset:Ns("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=Cs(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===Hn?null:js("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?He("tron",n.from):null,to:n.to?He("tron",n.to):null,asset:Ns("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?He("ton",n.inMessageSource):null,to:n.inMessageDestination?He("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 kl(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=He(e.subject.family,s),a=n.get(i);a||(a=Ls(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 Ds(e,t){if(Hr.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]=Br(s.value)}return r}function jl(e,t,n,r,o,s,i,a){let c=Ds(o,n.applied+1);if(c.some(j=>!Pl(e.family,e.chain,e.address,j)))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)&&J(r,"truncated")),u=Array.isArray(r)?null:J(r,"nextCursor")??null;for(let j of l)Bt(Gn(e.family,e.chain,j).facts,a),Bt(Ts(e.family,e.chain,j),a);Bt(u,a);let h=!!(!Array.isArray(r)&&J(r,"continuationUnknown")),p=!Array.isArray(r)&&J(r,"pageComplete")===!0,m=u!=null&&!t.cursor,g=l.length===n.applied&&u==null&&!p,b=[];(f||d)&&b.push(at("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&b.push(at("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&b.push(at("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=f||d||h||m||g||e.family==="tron",T=null;if(t.cursor&&u!=null&&!d)try{T=Mo({family:e.family,chain:e.chain,address:e.address,provider:t.source},u)}catch{b.push(at("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let M=Yn(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:l.length,historyAvailable:!0,cursorSupported:t.cursor},b),L=new Set,U=new Set;return l.forEach(j=>{let P=Ts(e.family,e.chain,j),z=Gn(e.family,e.chain,j),Q=ln("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:P.locator,publicFacts:z.facts}),k=ln("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:P.type,locator:P.locator,from:P.from,to:P.to,asset:P.asset,amount:P.amount,transactionId:P.transactionId,blockHeight:P.blockHeight,timestamp:P.timestamp});if(L.has(k))throw new Error(`${t.source} returned duplicate event identity`);if(U.has(Q))throw new Error(`${t.source} returned duplicate evidence identity`);L.add(k),U.add(Q),M.evidence.push({id:Q,status:"OBSERVED",source:t.source,observedAt:s,locator:P.locator,publicFacts:z.facts,projection:z.projection}),M.events.push({id:k,type:P.type,from:P.from,to:P.to,asset:P.asset,amount:P.amount,transactionId:P.transactionId,blockHeight:P.blockHeight,timestamp:P.timestamp,evidenceRefs:[Q]})}),kl(M),t.cursor&&(M.cursor={requested:i,next:T}),M}function Dl(e,t){return Wn(t)?e==="liquid"?J(t,"provider")==="liquid-esplora"&&Number.isFinite(J(t,"txCount"))?[t]:null:J(t,"balances")??null:null}function $l(e,t,n,r){if(!ct(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)&&(!ae(r.denom)||o)&&Ye(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&&!ae(i)&&Ye(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&De("liquid",t,r.address)&&Ht("liquid",r.address,n)&&r.confidential===Gr(r.address)&&(r.balanceSats===null||Ye(r.balanceSats,100,{nullable:!1})):!1}function Ml(e,t,n,r,o,s,i){let a=Ds(o,n.applied+1);if(a.some(h=>!$l(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)Bt(Gn(e.family,e.chain,h).facts,i);let d=!!J(r,"truncated")||a.length>n.applied,l=[at("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(at("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(at("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(at("response-truncated","provider evidence exceeded the safe record bound"));let f=Yn(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=Gn(e.family,e.chain,h),m=ln("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 $s(e={},t={}){ml(t);let n=Rs(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=hl(t);if(c.status==="UNAVAILABLE"||c===Et.unsupported)return Bn(d,c,l);if(!c.chainIds.some(g=>String(g)===String(o)))return Bn(d,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},l);if(r==="evm"&&!rs(o))return Bn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let f=Al(r),u=Sl(r,c,t,f);if(typeof u!="function")return Bn(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 zr(d,c,i,cn(g),l,a)}if(J(m,"error")){let g=No(m),b=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 zr(d,c,i,cn(b,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let b=Dl(r,m);if(!Array.isArray(b))throw new Error("invalid evidence-only response");return Ml(d,c,i,m,b,l,f)}let g=Cl(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return jl(d,c,i,m,g,l,a,f)}catch{return zr(d,c,i,cn(null,"provider-invalid-response"),l,a)}}var Ul=Object.freeze(Object.create(null));async function gp(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return $s(e,Ul)}import{createHash as Fl}from"node:crypto";import{types as ke}from"node:util";var Vl="oracle.coordination/1",Ip=se({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Ap=se({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),zl=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}),qe=Object.freeze({maxEntities:Oe.maxNodes,maxEvents:Oe.maxEdges,maxEvidence:Z.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),un=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),fn=new Set(["FUND","FUNDING"]),Gs=new Set([...un,...fn,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),Bl=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),Hl=new Set(["CREATOR","DEPLOYER"]),Ms=new Set(gt),Us=new Set(["LIVE","INDEXED"]);var Fs=250,ql=32,Gl=32,he=(e,t)=>e<t?-1:e>t?1:0,ge=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},$e=e=>(ge(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",Te=e=>ge(typeof e=="object"&&e!==null?I(e,"id"):e),Ee=e=>[...new Set(e.filter(Boolean))].sort(he),Wl=(e,t)=>he(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))},Yl=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,eo=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=ge(e);if(!t)return null;let n=Yl.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[M,L]=l.slice(1).split(":").map(Number);if(M>23||L>59)return null}let b=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(f,u-1,h),E.setUTCHours(p,m,g,b),E.getUTCFullYear()!==f||E.getUTCMonth()!==u-1||E.getUTCDate()!==h||E.getUTCHours()!==p||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let T=Date.parse(t);return Number.isFinite(T)?T:null},Ws=e=>Array.isArray(e)?e:[],I=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&ke.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},ne=(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(ke.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},lt=(e,t={})=>Object.assign(Object.create(null),e,t),Jn=(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},Yr=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),Kl=Object.freeze(["id","status"]),Kr=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"]),Jl=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),Zl=Object.freeze(["numerator","denominator","bps"]),Xl=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),Ql=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function Ys(e){return Ee([$e(I(e,"kind")),...ne(I(e,"roles")).map($e),...ne(I(e,"tags")).map(t=>$e(!t||typeof t!="object"?t:I(t,"name")??I(t,"value")))])}function to(e){return e?I(e,"isService")===!0?!0:Ys(e).some(t=>Bl.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function Ks(e){return Hl.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function Kn(e){return Ys(e).some(Ks)}function ed(e){if(!Kn(e)||to(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(I(e,r)!==void 0)return!1;let t=ne(I(e,"roles")).map($e),n=ne(I(e,"tags")).map(r=>$e(r&&typeof r=="object"?I(r,"name")??I(r,"value"):r));return[...t,...n].every(Ks)}function Me(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"||ke.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 Gt(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function Js(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=Gt(e,n),o=Gt(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function td(e,t){let n=Js(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function nd(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=Gt(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=Gt(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function Zs(e){if(e&&typeof e=="object"){if(ke.isProxy(e)||Array.isArray(e)||!Yt(e,Zl)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=I(e,"numerator"),c=I(e,"denominator"),d=I(e,"bps"),l=a!=null||c!=null,f=null;if(l&&(a==null||c==null||(f=Js(Me(a),Me(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=ge(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 rd(e){if(!Array.isArray(e)||e.length>Oe.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 od(e){let t=Zs(e);return t?Number(t.numerator*10000n/t.denominator):null}var qt=Symbol("alias-conflict");function Ue(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 qt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return qt;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 qt;r=l,o=d}return r}function no(e,t=64){if(e===void 0)return[];if(Ot(e,t))return null;let n=ne(e,t).map(Te);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(he)}function Xs(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 Qr(e,t){return Ue(e,t,n=>{let r=Me(n);return r?{identity:Xs(r),value:n}:null})}function Jr(e,t){return Ue(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 Yt(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")||!Wt(a.value,s,0))return!1}return!0}function Wt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>Z.dataNodes||n>Z.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<=Z.string;if(!e||typeof e!="object"||ke.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>Z.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>Z.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")||!Wt(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>Z.dataFields||(r.fields+=i.length,r.fields>Z.dataTotalFields)?!1:i.every(([,a])=>Wt(a,r,n+1))}finally{r.active.delete(e)}}function Qs(e,t){let n=I(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||ke.isProxy(n)||Array.isArray(n)||!Wt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>Z.dataFields)return null;let o=Jn(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 sd(e){if(!e||typeof e!="object"||ke.isProxy(e)||Array.isArray(e)||!Yt(e,Jl))return null;let t=Ue(e,["entityId","entity","holder"],Te),n=Qr(e,["balance","amount"]),r=no(I(e,"evidenceRefs"));return!t||t===qt||n===qt||n===null||r===null?null:lt({},{entityId:t,balance:n,evidenceRefs:r})}function id(e){if(!e||typeof e!="object"||ke.isProxy(e)||Array.isArray(e)||!Yt(e,Yr))return null;let t=Qs(e,Yr);if(!t||Object.hasOwn(t,"isService")&&typeof I(t,"isService")!="boolean")return null;let n=Te(I(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=I(t,d);if(l!=null&&eo(l)===null)return null}let r=I(t,"roles"),o=I(t,"tags"),s=I(t,"evidenceRefs");if([r,o,s].some(d=>Ot(d)))return null;let i=I(t,"supplyShare");if(i!==void 0&&od(i)===null)return null;let a=Jn(t,Yr);a.roles=ne(r),a.tags=ne(o);let c=no(s);return c===null?null:(a.evidenceRefs=c,lt(a,{id:n}))}function ad(e){if(!e||typeof e!="object"||ke.isProxy(e)||Array.isArray(e)||!Yt(e,Xl))return null;let t=Te(I(e,"id"));if(!t)return null;let n=I(e,"status"),r=typeof n=="string"?n:"MISSING";return lt(Jn(e,Kl),{id:t,status:r})}function cd(e){if(!e||typeof e!="object"||ke.isProxy(e)||Array.isArray(e)||!Yt(e,Kr))return null;let t=Qs(e,Kr);if(!t)return null;let n=Te(I(t,"id"));if(!n||Ot(I(t,"holders"))||Ot(I(t,"evidenceRefs")))return null;let r=Ue(t,["from","fromEntityId","funderId"],Te),o=Ue(t,["to","toEntityId","recipientId"],Te),s=Ue(t,["actor","actorEntityId","buyerId"],Te),i=Ue(t,["asset","assetId","tokenId"],Te),a=Ue(t,["pool","poolId"],Te),c=Ue(t,["sourceChain","fromChain"],ge),d=Ue(t,["destinationChain","toChain"],ge),l=Ue(t,["transactionId","transactionHash","txId","txid","hash"],Te),f=Ue(t,["bridgeTransferId"],Te),u=Jr(t,["blockHeight","blockNumber"]),h=Jr(t,["transactionIndex"]),p=Jr(t,["eventIndex","logIndex","index"]),m=Qr(t,["amount","value","quantity"]),g=Qr(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,f,u,h,p,m,g].includes(qt))return null;let b=no(I(t,"evidenceRefs"));if(b===null)return null;let E=I(t,"timestamp"),T=eo(E);if(E!=null&&T===null)return null;let L=ne(I(t,"holders")).map(sd);if(L.some(P=>P===null))return null;let U=L.map(P=>P.entityId);if(new Set(U).size!==U.length)return null;let j=Jn(t,Kr);return j.holders=L,lt(j,{id:n,type:$e(I(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:T,evidenceRefs:b})}function Zr(e,t,n,r,o,s){if(ke.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(Wl),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function dn(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function ld(e){let t=ge(I(e,"family")),n=ge(I(e,"address")),r=I(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):ge(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=tn(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 dd(e){let t=new Map;for(let n of e){let r=ld(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function Vs(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Xr(e){let t=Me(e);return t?Xs(t):"-"}function ud(e){let t=ne(I(e,"holders")).map(n=>`${Vs(I(n,"entityId"))}:${Xr(I(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,Xr(I(e,"amount")),Xr(I(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(Vs).join("|")}function fd(e){let t=new Set;for(let n of e){let r=ud(n);if(t.has(r))return!0;t.add(r)}return!1}function dt(e,t,n,r,o,s,i=[]){let a=Fl("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:Ee(n),reasons:o,caveats:Ee(i),evidenceRefs:Ee(r),score:zl[e]}}function pd(e,t,n){let r=[...e].sort((l,f)=>l.timestampMs-f.timestampMs||he(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 te(e,t){let n=ne(I(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function zs(e,t){let n=ne(I(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function me(e,t){return typeof e=="string"&&t.has(e)}function Bs(e){let t=I(e,"type");if(!Gs.has(t))return!1;let n=I(e,"from"),r=I(e,"to"),o=I(e,"actor")??n,s=I(e,"asset"),i=I(e,"timestampMs");if(fn.has(t))return!!(n&&r);if(un.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(ge(I(e,"sourceChain"))&&ge(I(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=ne(I(e,"holders")).some(c=>Te(I(c,"entityId"))&&Me(I(c,"balance")));return!!(s&&Me(I(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Me(I(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function pn(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 md(e,t,n,r,o){let s=e.filter(d=>fn.has(d.type)&&me(d.from,t)&&me(d.to,t)&&te(d,n).length),i=pn(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([f],[u])=>he(f,u))){let f=t.get(d);if(to(f))continue;let u=Ee(l.map(g=>g.to).filter(g=>g!==d));if(u.length<r.minCommonRecipients)continue;let h=te(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(dt("COMMON_NON_SERVICE_FUNDER",d,[d,...u],[...h,...m.flatMap(g=>te(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:u.length,eventIds:Ee(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 hd(e,t,n,r){let o=e.filter(a=>un.has(a.type)&&me(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&te(a,n).length).map(a=>lt(a,{actor:a.actor??a.from})),s=pn(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>he(d,l)))for(let d of pd(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=Ee(d.map(h=>h.actor)),[f,u]=a.split("\0");i.push(dt("SYNCHRONIZED_ACTIVITY",`${f.toLowerCase()}:${u}:${d[0].id}`,l,d.flatMap(h=>te(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 gd(e,t,n){if(!e)return null;if(I(e,"fresh")===!0)return"fresh";let r=I(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=I(e,"firstSeenAt"),s=I(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=eo(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function yd(e,t,n,r,o){let s=e.filter(l=>un.has(l.type)&&me(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&te(l,n).length).map(l=>lt(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let f=t.get(l.actor),u=gd(f,l.timestampMs,r);if(!u)continue;let h=te(f,n);if(h.length===0){a.add(l.actor);continue}i.push(lt(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=pn(i,l=>l.asset),d=[];for(let[l,f]of[...c].sort(([u],[h])=>he(u,h))){let u=Ee(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:Ee(m.map(g=>g.freshnessBasis)),evidenceRefs:Ee(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(dt("FRESH_WALLET_CLUSTER",l,u,[...f.flatMap(p=>te(p,n)),...h.flatMap(p=>p.evidenceRefs)],[{asset:l,walletCount:u.length,eventIds:Ee(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 bd(e,t,n,r,o){let s=new Map,i=new Set,a=(p,m)=>{if(!(!me(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(!Kn(p))continue;let m=te(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,te(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=>fn.has(p.type)&&s.has(p.from)&&me(p.to,t)&&te(p,n).length),l=pn(d,p=>p.to),f=e.filter(p=>p.type==="BUY"&&me(p.actor??p.from,t)&&p.asset&&te(p,n).length).map(p=>lt(p,{actor:p.actor??p.from})),u=new Map;for(let p of f){let m=Ee(Ws(l.get(p.actor)).map(g=>g.from));if(m.length>Gl)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let g of m){let b=`${g}\0${p.asset}`;u.has(b)||u.set(b,[]),u.get(b).push(p)}}let h=[];for(let[p,m]of[...u].sort(([g],[b])=>he(g,b))){let g=Ee(m.map(U=>U.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[b,E]=p.split("\0"),T=new Set(g),M=d.filter(U=>U.from===b&&T.has(U.to)),L=Ee([...s.get(b)??[]]);h.push(dt("DEPLOYER_LINKED_BUYERS",`${b}:${E}`,[b,...g],[...L,...M.flatMap(U=>te(U,n)),...m.flatMap(U=>te(U,n))],[{deployer:b,asset:E,buyerCount:g.length,deployerEvidenceRefs:L,fundingEventIds:Ee(M.map(U=>U.id)),buyEventIds:Ee(m.map(U=>U.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function Ed(e,t,n,r,o,s){let i=[],a=e.filter(f=>f.type==="SUPPLY_SNAPSHOT"&&f.asset&&te(f,r).length),c=0;for(let f of a){let u=Me(I(f,"totalSupply")??I(f,"supply")),h=ne(I(f,"holders")),p=h.map(b=>{if(!b||typeof b!="object"||Array.isArray(b)||Ot(I(b,"evidenceRefs")))return null;let E=ne(I(b,"evidenceRefs")).map(Te);return E.length===0||E.some(T=>!r.has(T))?null:{entityId:Te(I(b,"entityId")),balance:Me(I(b,"balance")),evidenceRefs:Ee(E)}}).filter(b=>b?.entityId&&n.has(b.entityId)&&b.balance);if(p.length!==h.length||!nd(u,p)){c+=1;continue}let g=p.map(b=>({...b,shareBps:td(b.balance,u)})).filter(b=>b.shareBps!==null).sort((b,E)=>E.shareBps-b.shareBps||he(b.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(dt("SUPPLY_CONCENTRATION",`${f.asset}:${f.id}`,[g.entityId],[...te(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=Zs(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||he(f.entity.id,u.entity.id));if(!rd(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=ne(I(l.entity,"evidenceRefs")).map(Te),u=f.length>0&&f.every(h=>r.has(h))?Ee(f):[];u.length&&i.push(dt("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 Od(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&te(r,n).length).filter(r=>me(r.actor??r.from??r.to,t)).map(r=>dt("LP_REMOVAL",r.id,[r.actor??r.from??r.to],te(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Me(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function wd(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 Id(e,t,n,r,o){let s=e.filter(u=>u.type==="TRANSFER"&&me(u.from,t)&&me(u.to,t)&&u.from!==u.to&&ge(u.asset)&&u.timestampMs!==null&&Me(u.amount)&&te(u,n).length).map(u=>lt(u,{parsedAmount:Me(u.amount)})).sort((u,h)=>u.timestampMs-h.timestampMs||he(u.id,h.id)),i=pn(s,u=>`${u.from}\0${u.asset}`),a=[],c=new Set,d=!1;function l(u,h,p,m){let g=Ws(i.get(`${u.to}\0${u.asset}`)),b=wd(g,u.timestampMs),E=[],T=0,M=b;for(;M<g.length&&T<ql;M+=1){let L=g[M];if(L.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(T+=1,c.has(L.id)||p.has(L.id)||m.has(L.to)||L.from!==u.to||L.asset!==u.asset)continue;let U=Math.max(u.parsedAmount.decimals,L.parsedAmount.decimals),j=Gt(u.parsedAmount,U),P=Gt(L.parsedAmount,U);j!==null&&P!==null&&P>0n&&P<j&&E.push(L)}return M<g.length&&g[M].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)]),[b]=l(p[p.length-1],p[0],m,g);if(!b)break;p.push(b)}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=>dt("PEEL_CHAIN",u[0].id,[u[0].from,...u.map(h=>h.to)],u.flatMap(h=>te(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 Ad(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&ge(r.sourceChain)&&ge(r.destinationChain)&&te(r,n).length).filter(r=>me(r.actor??r.from??r.to,t)).map(r=>dt("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],te(r,n),[{eventId:r.id,sourceChain:ge(r.sourceChain),destinationChain:ge(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Me(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function Sd(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])=>he(n,r)))}function Hs(e,t){return ne(I(e,"holders")).some(n=>!me(I(n,"entityId"),t))?!1:fn.has(e.type)||e.type==="TRANSFER"?me(e.from,t)&&me(e.to,t):un.has(e.type)?me(e.actor??e.from,t):e.type==="DEPLOY"?me(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?me(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?ne(I(e,"holders")).every(n=>me(I(n,"entityId"),t)):!0}function vd(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||ke.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])=>he(a,c))){let a=i;if(i&&typeof i=="object"&&!Wt(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=$e(a),d=$e(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var Nd=Object.freeze(Object.keys(qe)),Td=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function qs(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||ke.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 Sp(e,t={}){let n=qs(t,Nd,{numeric:!0}),r=n?t:{},o={maxEntities:Ke(I(r,"maxEntities"),qe.maxEntities,1,Oe.maxNodes),maxEvents:Ke(I(r,"maxEvents"),qe.maxEvents,1,Oe.maxEdges),maxEvidence:Ke(I(r,"maxEvidence"),qe.maxEvidence,1,Z.evidence),minClusterSize:Ke(I(r,"minClusterSize"),qe.minClusterSize,2,10),minCommonRecipients:Ke(I(r,"minCommonRecipients"),qe.minCommonRecipients,2,10),syncWindowSeconds:Ke(I(r,"syncWindowSeconds"),qe.syncWindowSeconds,1,3600),freshWalletSeconds:Ke(I(r,"freshWalletSeconds"),qe.freshWalletSeconds,60,2592e3),peelWindowSeconds:Ke(I(r,"peelWindowSeconds"),qe.peelWindowSeconds,60,604800),maxPeelDepth:Ke(I(r,"maxPeelDepth"),qe.maxPeelDepth,3,8),concentrationThresholdBps:Ke(I(r,"concentrationThresholdBps"),qe.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,S,{fatal:C=!1}={})=>{C&&(i=!0);let $=$e(w||"UNSPECIFIED_GAP"),oe=ge(S)??"Input is incomplete.",Se=s.get($);if(Se){he(oe,Se.message)<0&&s.set($,{code:$,status:"UNKNOWN",message:oe});return}if(s.size>=Fs-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 ${Fs}.`});return}s.set($,{code:$,status:"UNKNOWN",message:oe})},c=({entities:w=[],events:S=[],evidenceById:C=new Map,eventWithEvidence:$=[],analyzableEvents:oe=[],findings:Se=[]}={})=>{let xe=i?[]:Se;xe.length>Z.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${Z.findings}.`,{fatal:!0}),xe=[]);let Ve=[...s.values()].sort((D,F)=>he(D.code,F.code)),A=i||Ve.some(D=>D.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(D.code))?"UNKNOWN":Ve.length?"PARTIAL":"OK",y=Math.min(100,xe.reduce((D,F)=>D+F.score,0)),_=y>=60?"HIGH":y>=25?"MEDIUM":A==="OK"?"LOW":"UNKNOWN";return se({schemaVersion:Vl,execution:"read-only",reportOnly:!0,status:A,risk:{score:y,level:_},metrics:{entityCount:w.length,eventCount:S.length,evidenceCount:C.size,evidencedEventCount:$.length,eligibleEventCount:oe.length,findingCounts:Sd(xe),bounds:o},findings:xe,gaps:Ve})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!qs(e,Td))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 S=I(e,w);if(S!==void 0&&!Wt(S))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=Zr(I(e,"entities"),id,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=Zr(I(e,"events"),cd,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),f=Zr(I(e,"evidence"),ad,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(I(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(I(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(I(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),dn(u)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),dn(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),dn(p)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),fd(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),dd(u)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=dn(u)?new Map:new Map(u.map(w=>[w.id,w])),g=p.filter(w=>!Ms.has(w.status)),b=p.filter(w=>Ms.has(w.status)&&!Us.has(w.status));g.length>0&&a("EVIDENCE_STATUS_INVALID",`${g.length} evidence record(s) had a missing or invalid status and were excluded.`),b.length>0&&a("EVIDENCE_STATUS_UNUSABLE",`${b.length} evidence record(s) did not have LIVE or INDEXED status and were excluded.`);let E=dn(p)?new Map:new Map(p.filter(w=>Us.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let T=u.filter(w=>{let S=ne(I(w,"evidenceRefs"));return S.length>0&&S.some(C=>!E.has(C))});T.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${T.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let M=new Set(h.filter(w=>w.type==="DEPLOY"&&me(w.from??w.actor,m)&&te(w,E).length>0).map(w=>w.from??w.actor)),L=u.filter(w=>{let S=ne(I(w,"roles")).length>0||ne(I(w,"tags")).length>0||to(w)||Kn(w)||I(w,"isService")!==void 0||I(w,"fresh")!==void 0||I(w,"txCount")!==void 0||I(w,"firstSeenAt")!==void 0||I(w,"createdAt")!==void 0||I(w,"supplyShare")!==void 0,C=zs(w,E)||ed(w)&&M.has(w.id);return S&&!C}),U=L.filter(w=>I(w,"fresh")!==void 0||I(w,"txCount")!==void 0||I(w,"firstSeenAt")!==void 0||I(w,"createdAt")!==void 0);U.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${U.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let j=u.filter(w=>Kn(w)&&!zs(w,E)&&!M.has(w.id));j.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${j.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),L.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${L.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let P=h.filter(w=>ne(I(w,"holders")).some(S=>{let C=ne(I(S,"evidenceRefs"));return C.length===0||C.some($=>!E.has($))}));P.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${P.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),vd(I(e,"coverage"),a);let z=I(e,"gaps");if(Ot(z,Z.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${Z.gaps}.`,{fatal:!0});else{let w=[];for(let S of ne(z,Z.gaps)){if(!S||typeof S!="object"||ke.isProxy(S)||Array.isArray(S)||!Yt(S,Ql)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let C=I(S,"code"),$=I(S,"message");if(C!==void 0&&ge(C)===null||$!==void 0&&ge($)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:C??"UPSTREAM_GAP",message:$??"An upstream normalization gap was reported."})}w.sort((S,C)=>he($e(S.code),$e(C.code))||he(S.message,C.message));for(let S of w)a(S.code,S.message)}let Q=h.filter(w=>te(w,E).length>0),k=h.filter(w=>te(w,E).length===0);k.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${k.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let Y=Q.filter(w=>!Gs.has(w.type)||!Bs(w));Y.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${Y.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Ae=Q.filter(Bs),B=Ae.filter(w=>!Hs(w,m));B.length&&a("EVENT_ENTITY_UNRESOLVED",`${B.length} event(s) contained unresolved entity references.`,{fatal:!0});let R=Ae.filter(w=>Hs(w,m));R.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 x=[];return i||(x=[...md(R,m,E,o,a),...bd(R,m,E,o,a),...yd(R,m,E,o,a),...Ed(R,u,m,E,o,a),...hd(R,m,E,o),...Od(R,m,E),...Id(R,m,E,o,a),...Ad(R,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,S)=>he(w.kind,S.kind)||he(w.id,S.id)),new Set(x.map(w=>w.id)).size!==x.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),x=[])),c({entities:u,events:h,evidenceById:E,eventWithEvidence:Q,analyzableEvents:R,findings:x})}import{types as si}from"node:util";var ii="oracle.opensea-wallet-enrichment/1",_d="oracle.nft-overlap-input/1",xd="oracle.nft-overlap/1",ut="REQUEST_PATH_PLUS_MATCHED_PROFILE",Rd=Ie(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),xp=Ie(["COMPLETE","PARTIAL","UNKNOWN"]),oo="OBSERVED",ei="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",Zn="UNKNOWN",we=Ie({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Qn=Ie({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"}),Kt=Ie(["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."]),Ld=Ie(["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."]),wt=Ie({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."}),Pd=Ie({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."}),ai=new Set(Rd),Cd=new Set(gt),so=new Set(["LIVE","INDEXED"]),ye=(e,t)=>e<t?-1:e>t?1:0,kd=/^0x[0-9a-fA-F]{40}$/u,jd=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,Dd=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,$d=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,ci=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,li=/[\u0000-\u001f\u007f-\u009f]/u,Md=(1n<<256n)-1n;function O(e,t="invalid-nft-overlap"){throw new nt(`nft-overlap: ${e}`,t)}function di(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function ui(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 re(){return ui([])}function W(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function Ie(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&ui(e);let n;try{n=Reflect.ownKeys(e)}catch{O("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{O("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&Ie(o.value,t)}return Object.freeze(e),e}function ue(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||si.isProxy(e))&&O(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{O(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&O(`${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{O(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&di(c)||((typeof a!="string"||!s.has(a))&&O(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&O(`${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 Fe(e,t,n,r=0){(!Array.isArray(e)||si.isProxy(e))&&O(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{O(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&O(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{O(`${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=re();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{O(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&di(l)||(typeof d!="string"||!a.has(d))&&O(`${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{O(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&O(`${t} must be dense and contain only own data items`,"invalid-array"),W(c,l.value)}return c}function Ud(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||li.test(e)||ci.test(e))&&O(`${t} is not safe bounded text`,"invalid-string"),e}function xt(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&O(`${n} is not a deterministic ID`,"invalid-id"),e}function fi(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&O(`${t} is not a canonical digest`,"invalid-digest"),e}function io(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&O(`${t} must be a positive safe integer`,"invalid-chain"),e}function Rt(e){return(typeof e!="string"||!kd.test(e))&&O("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function Fd(e){(typeof e!="string"||e.length===0||e.length>78||!jd.test(e))&&O("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{O("tokenId must be uint256","invalid-token-id")}return(t<0n||t>Md)&&O("tokenId must be uint256","invalid-token-id"),t.toString(10)}function Vd(e){return(typeof e!="string"||!Dd.test(e))&&O("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function ao(e={}){let t=ue(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||O("canonical NFT input is missing a field","missing-field");let n={chainId:io(t.get("chainId"),"nft.chainId"),contract:Rt(t.get("contract")),tokenId:Fd(t.get("tokenId"))};return Ie({id:Pe("nft",n),...n})}function co(e={}){let t=ue(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||O("canonical collection input is missing a field","missing-field");let n={chainId:io(t.get("chainId"),"collection.chainId"),slug:Vd(t.get("slug"))};return Ie({id:Pe("collection",n),...n})}function er(e={}){let t=ue(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=Ud(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||O("wallet.family is invalid","invalid-family");let i=r===null?null:io(r,"wallet.chainId");if(o===null)return Ie({id:null,family:s,chainId:i,address:null});s!=="evm"&&O("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=Rt(o);return Ie({id:Pe("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function lo(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!$d.test(e)||li.test(e)||ci.test(e)||ae(e)?null:e}function zd(e,t="snapshot.wallet"){let n=ue(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||O(`${t} is missing a required field`,"missing-field");let r=er({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&O(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function ti(e,t){let n=ue(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&O(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return ai.has(r)||O(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&O(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function Bd(e){let t=ue(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||O("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");ai.has(n)||O("snapshot.coverage.status is invalid","invalid-status");let r=ti(t.get("profile"),"snapshot.coverage.profile"),o=ti(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&O("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)||O("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function Hd(e){let t=Fe(e,"snapshot.gaps",Object.keys(wt).length),n=re();for(let s=0;s<t.length;s+=1){let i=ue(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&O("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(wt,a)||i.get("message")!==wt[a])&&O("snapshot gap is not a fixed allowlisted gap","invalid-gap"),W(n,a)}let r=re(),o=new Set;for(let s of n)o.has(s)||(o.add(s),W(r,s));return r.sort(ye),r}function qd(e){return Object.hasOwn(wt,e)||O("OpenSea gap code is invalid","invalid-gap"),Ie({code:e,message:wt[e]})}function Gd(e){let t=ue(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||O("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(Cd.has(n)||O("OpenSea evidence status is invalid","invalid-status"),xt(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||O("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&O("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&O("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:Rt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&O("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||O("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&O("holding evidence source is invalid","invalid-source");let i=xt(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:xt(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==ut&&O("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:ut}}O("OpenSea evidence kind is invalid","invalid-kind")}function mn(e={}){let t=Gd(e);return Ie({id:Pe("evidence",t),digest:ie(t),...t})}function Wd(e,t){let n=ue(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))||O("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=mn(o);return xt(n.get("id"),"evidence","evidence.id"),fi(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&O("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function Yd(e,t){if(e===null)return null;let n=ue(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&O("snapshot.profile is missing a required field","missing-field");let r=Rt(n.get("address"));(!t.address||r!==t.address)&&O("profile address does not match snapshot wallet","profile-mismatch");let o=xt(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=lo(n.get("username"));return(s===null||s!==n.get("username"))&&O("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function Kd(e,t,n){let r=ue(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||O("snapshot holding is missing a required field","missing-field");let s=ao({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&O("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&O("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=ue(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||O("holding collection is missing a required field","missing-field"),i=co({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&O("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==ut&&O("holding owner binding is invalid","invalid-owner-binding");let a=Fe(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,we.citationsPerFinding,1).map(d=>xt(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(ye);return c.length!==a.length&&O("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:ut,evidenceRefs:c}}function Jd(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 Zd(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&O("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&O("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&O("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(Qn,n.chainId))&&O("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)&&O(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&O(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&O("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&O("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&O("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let b of i)d.has(b.id)&&O("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(b.id,b),n.id&&b.walletId!==n.id&&O("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let b=d.get(o.evidenceRef);(!b||b.kind!=="PROFILE"||b.address!==o.address)&&O("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,f=0;for(let b of s){l.has(b.id)&&O("snapshot holdings must be unique","duplicate-holding"),l.add(b.id),b.collection===null&&(f+=1);for(let E of b.evidenceRefs)d.has(E)||O("holding cites unknown evidence","invalid-reference")}let u=new Set,h=re(),p=re();for(let b of a)u.add(b.code),b.code.startsWith("PROFILE_")&&W(h,b.code),b.code.startsWith("INVENTORY_")&&W(p,b.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"))&&O("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&O("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(u.has("NOT_REQUESTED")||[...m].some(b=>u.has(b)))&&O("attempted coverage cannot contain an availability reason","invalid-coverage"),f>0&&!u.has("INVENTORY_COLLECTION_REJECTED")&&!u.has("INVENTORY_CONFLICTING_HOLDING")&&O("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&O("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&O("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&O("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&O("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(h.length===0||h.some(b=>b==="PROFILE_USERNAME_REJECTED"))&&O("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&O("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&&O("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(p.length===0||p.some(b=>!g.has(b)))&&O("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(p.length===0||p.some(b=>g.has(b)))&&O("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&p.length>0&&O("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&O("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&O("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&O("incomplete snapshot must contain a fixed gap","invalid-coverage")}function uo(e={}){let t=ue(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||O("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&O("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=ue(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?zd(r,"snapshot.wallet"):er(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=Bd(t.get("coverage")),c=Fe(t.get("evidence"),"snapshot.evidence",we.evidencePerSnapshot).map((E,T)=>{try{let M=ue(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${T}]`);return M.has("id")||M.has("digest")?Wd(E,T):mn(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(L=>M.has(L)).map(L=>[L,M.get(L)])))}catch(M){throw M}}).sort((E,T)=>ye(E.id,T.id)),d=t.get("profile"),l=null;if(d!==null){let E=ue(d,["address","evidenceRef","username"],"snapshot.profile");l=Yd(Object.fromEntries(["address","evidenceRef","username"].filter(T=>E.has(T)).map(T=>[T,E.get(T)])),s)}let u=Fe(t.get("holdings"),"snapshot.holdings",we.holdingsPerSnapshot).map((E,T)=>Kd(E,T,s)).sort((E,T)=>ye(E.id,T.id)),h=Fe(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(wt).length).map(E=>(Object.hasOwn(wt,E)||O("snapshot gap code is invalid","invalid-gap"),E)),p=[...new Set(h)].sort(ye).map(qd),m={schemaVersion:ii,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:u,evidence:c,gaps:p,caveats:[...Kt]};Zd(m);let g=Pe("opensea-snapshot",Jd(m)),b=ie(m);return Ie({...m,snapshotId:g,digest:b})}function Xd(e){let t=ue(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))||O("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==ii||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&O("OpenSea snapshot envelope is invalid","invalid-envelope"),Fe(t.get("caveats"),"snapshot.caveats",Kt.length,Kt.length).some((i,a)=>i!==Kt[a])&&O("snapshot caveats are invalid","invalid-caveat");let o=Hd(t.get("gaps")),s=uo({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 xt(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),fi(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&O("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function Qd(e){return{code:e,message:Pd[e]}}function eu(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"||!so.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"||!so.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==ut||r.has(d.id)||(!a||ye(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:ut,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function ni(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||ye(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function tu(e,t,n){(!Array.isArray(n)||n.length<2||n.length>we.snapshots||n.length*2>we.citationsPerFinding)&&O("finding citations exceeded the fixed limit","citation-limit");let r=re();for(let l=0;l<n.length;l+=1)W(r,n[l]);r.sort((l,f)=>ye(l.walletId,f.walletId)||ye(l.snapshotId,f.snapshotId)||ye(l.holdingEvidence.id,f.holdingEvidence.id));let o=re(),s=re(),i=new Set;for(let l of r)W(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>we.citationsPerFinding&&O("finding citations exceeded the fixed limit","citation-limit"),W(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=re();for(let l of i)W(a,l);a.sort(ye);let c={kind:e,status:oo,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:Pe(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:ie(c),...c}}function ro(e,t){return`${e}:${t.canonical.id}`}function ri(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||ye(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function nu(e,t,n){if(n<=0)return;if(e.length<n){W(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)ye(e[o].key,e[r].key)>0&&(r=o);ye(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function ru(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=re(),i=new Set,a=ri(e),c=ri(t);if(a){let m={section:"exact",group:a,key:ro("exact",a)};W(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:ro("collection",c)};W(s,m),i.add(m.key)}let d=re(),l=we.findings-s.length,f=(m,g)=>{for(let b of g.values()){if(b.byWallet.size<2)continue;let E=ro(m,b);i.has(E)||nu(d,{section:m,group:b,key:E},l)}};f("exact",e),f("collection",t);let u=re();for(let m of s)W(u,m);for(let m of d)W(u,m);u.length>we.findings&&O("finding selection exceeded the fixed limit","finding-limit"),u.sort((m,g)=>ye(m.key,g.key));let h=re(),p=re();for(let m of u)W(m.section==="exact"?h:p,m.group);return{exact:h,collections:p,exactCount:n,collectionCount:r,truncated:o>we.findings}}function Xn(e){return e.coverage.inventory.status==="COMPLETE"}function ou(e){e.byWallet.size>we.snapshots&&O("finding wallet citations exceeded the snapshot limit","citation-limit");let t=re();for(let n of e.byWallet.values())W(t,n);return t.length*2>we.citationsPerFinding&&O("finding citations exceeded the fixed limit","citation-limit"),t}function oi(e,t){let n=re();for(let r of t)W(n,tu(e,r.canonical,ou(r)));return n.sort((r,o)=>ye(r.id,o.id)),n}function Rp(e){arguments.length!==1&&O("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=ue(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&O("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==_d&&O("NFT overlap input schema is invalid","invalid-schema");let n=Fe(t.get("snapshots"),"NFT overlap snapshots",we.snapshots,2),r=0;for(let y=0;y<n.length;y+=1){let _=ue(n[y],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${y}]`);for(let F of["holdings","evidence","gaps","caveats"])_.has(F)||O(`snapshot ${F} is required`,"missing-field");let D=Fe(_.get("holdings"),`NFT overlap snapshots[${y}].holdings`,we.holdingsPerSnapshot);Fe(_.get("evidence"),`NFT overlap snapshots[${y}].evidence`,we.evidencePerSnapshot),Fe(_.get("gaps"),`NFT overlap snapshots[${y}].gaps`,Object.keys(wt).length),Fe(_.get("caveats"),`NFT overlap snapshots[${y}].caveats`,Kt.length,Kt.length),r+=D.length,r>we.totalHoldings&&O("total holdings exceed the fixed limit","holding-limit");for(let F=0;F<D.length;F+=1){let G=ue(D[F],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${y}].holdings[${F}]`);G.has("evidenceRefs")||O("holding evidenceRefs are required","missing-field"),Fe(G.get("evidenceRefs"),`NFT overlap snapshots[${y}].holdings[${F}].evidenceRefs`,we.citationsPerFinding,1)}}let o=re();for(let y of n)W(o,Xd(y));let s=new Map;for(let y of o){let _=y.wallet.id&&y.wallet.chainId?`${y.wallet.id}:${y.wallet.chainId}`:`noncanonical:${y.snapshotId}`;s.has(_)||s.set(_,re()),W(s.get(_),y)}let i=re(),a=0,c=0,d=re();for(let y of s.keys())W(d,y);d.sort(ye);for(let y of d){let _=s.get(y),D=new Set;for(let F of _)D.add(F.digest);if(D.size>1&&!y.startsWith("noncanonical:")){c+=1;continue}_.sort((F,G)=>ye(F.snapshotId,G.snapshotId)),W(i,_[0]),a+=_.length-1}let l=new Map;for(let y of i)for(let _ of y.evidence)l.has(_.id)||l.set(_.id,new Set),y.wallet.id&&l.get(_.id).add(y.wallet.id);let f=new Set;for(let[y,_]of l)_.size>1&&f.add(y);let u=new Map,h=new Map,p=new Set,m=new Map,g=new Map,b=0,E=0,T=!1,M=c>0,L=c>0;for(let y of i){let _=y.wallet.id;_&&p.add(_),y.coverage.profile.status==="PARTIAL"&&(T=!0);let D=new Map;for(let fe of y.evidence)D.set(fe.id,fe);let F=y.profile?D.get(y.profile.evidenceRef):null,G=!!(y.profile&&_&&F&&F.kind==="PROFILE"&&so.has(F.status)&&F.walletId===_&&F.address===y.wallet.address&&!f.has(F.id)),ee=G&&Xn(y),Re=G&&Xn(y);(Xn(y)||Xn(y))&&!G&&(b+=1);let Je=new Set;y.profile&&Je.add(y.profile.evidenceRef);for(let fe of y.holdings){let Ze=eu(y,fe,D,f);if(!Ze){E+=1,ee=!1,Re=!1;continue}Je.add(Ze.profileEvidence.id),Je.add(Ze.holdingEvidence.id),ni(u,fe.id,{id:fe.id,chainId:fe.chainId,contract:fe.contract,tokenId:fe.tokenId},Ze),fe.collection?ni(h,fe.collection.id,fe.collection,Ze):Re=!1}for(let fe of y.evidence)Je.has(fe.id)||(E+=1,ee=!1,Re=!1);_?(m.set(_,(m.has(_)?m.get(_):!0)&&ee),g.set(_,(g.has(_)?g.get(_):!0)&&Re)):(ee=!1,Re=!1),ee||(M=!0),Re||(L=!0)}let U=new Set,j=new Set;for(let[y,_]of m)_&&U.add(y);for(let[y,_]of g)_&&j.add(y);let P=new Set;for(let y of U)j.has(y)&&P.add(y);let z=ru(u,h),Q=oi("EXACT_NFT_OVERLAP",z.exact),k=oi("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",z.collections),Y=!M&&p.size>=2&&U.size>=2,Ae=!L&&p.size>=2&&j.size>=2,B=z.exactCount>0?oo:Y?ei:Zn,R=z.collectionCount>0?oo:Ae?ei:Zn,x=re();c>0&&W(x,"CONFLICTING_DUPLICATE_SNAPSHOT"),(M||L)&&W(x,"INPUT_COVERAGE_INCOMPLETE"),M&&W(x,"EXACT_NFT_COVERAGE_INCOMPLETE"),L&&W(x,"COLLECTION_COVERAGE_INCOMPLETE"),T&&W(x,"PROFILE_METADATA_INCOMPLETE"),(b>0||E>0||f.size>0)&&W(x,"INELIGIBLE_HOLDING_EVIDENCE"),p.size<2&&z.exactCount===0&&z.collectionCount===0&&W(x,"INSUFFICIENT_DISTINCT_WALLETS"),z.truncated&&W(x,"FINDINGS_TRUNCATED");let w=re(),S=new Set;for(let y of x)S.has(y)||(S.add(y),W(w,y));w.sort(ye);let C=re();for(let y of w)W(C,Qd(y));let $=0;for(let y of u.values())$+=y.byWallet.size;let xe=!M&&!L&&!T&&!z.truncated&&p.size>=2?"COMPLETE":B!==Zn||R!==Zn?"PARTIAL":"UNKNOWN",Ve={schemaVersion:xd,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:xe,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:p.size,completeDistinctWallets:P.size,completeExactNftWallets:U.size,completeCollectionWallets:j.size,qualifyingHoldings:$},exactNft:{state:B,findings:Q},collection:{state:R,findings:k},gaps:C,caveats:[...Ld],limits:we},St=Pe("nft-overlap-report",Ve),A=ie(Ve);return Ie({...Ve,reportId:St,digest:A})}import{types as Lt}from"node:util";var gi=128*1024,yi=1024*1024,bi=8e3,su=20,iu=512,au=1024,Ei=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),pi=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}),tr=/[\u0000-\u001f\u007f-\u009f]/u,cu=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,lu=Object.freeze(["family","chainId","address","includeOpenSea"]),du=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),nr=(e,t)=>e<t?-1:e>t?1:0;function fo(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function Ge(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function _e(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function uu(e){(!e||typeof e!="object"||Array.isArray(e)||Lt.isProxy(e))&&_e("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{_e("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&_e("args must be a plain object","invalid-object");let r=new Set(lu),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";du.some(c=>a.includes(c))&&_e("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),_e("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{_e(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&_e(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function fu(e){let t=uu(e);for(let d of["family","address"])t.has(d)||_e(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||tr.test(n))&&_e("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||_e("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||tr.test(o))&&_e("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&_e("args.address must not be a URL","invalid-address");let i=Ei.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(pi,r)?pi[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&_e("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!tr.test(a)||Number.isSafeInteger(a)&&a>0)&&_e("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&_e("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function pu(e){let t=Ei.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=Rt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:er({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 uo({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 mu(){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 Oi(e){let t=We(e);return t&&t.length<=au?t:null}function po(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Lt.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 hu(e,t){if(!Array.isArray(e)||Lt.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=fo();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}Ge(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function hn(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function gu(e,t,n){let r=po(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=Rt(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=hn(a,n)?null:lo(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function yu(e,t,n,r){let o=po(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>iu||tr.test(s)||cu.test(s)||hn(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=hu(o.get("nfts"),su),c=fo();a&&Ge(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&Ge(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=po(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(hn(p.get("identifier"),r)||hn(p.get("contract"),r))throw new Error("invalid-row");m=ao({chainId:t.chainId,contract:p.get("contract"),tokenId:p.get("identifier")})}catch{Ge(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(p.has("collection")&&typeof p.get("collection")=="string"&&!hn(p.get("collection"),r))try{g=co({chainId:t.chainId,slug:p.get("collection")})}catch{g=null}if(g===null&&Ge(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){Ge(c,"INVENTORY_CONFLICTING_HOLDING");continue}let b=d.get(m.id);if(b){let E=b.collection?.id??null,T=g?.id??null;E===null&&T!==null?(d.set(m.id,{nft:m,collection:g}),Ge(c,"INVENTORY_DUPLICATE_HOLDING")):T===null||E===T?Ge(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),Ge(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let f=fo(),u=[n];for(let{nft:h,collection:p}of[...d.values()].sort((m,g)=>nr(m.nft.id,g.nft.id))){let m=mn({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:p?.id??null,ownerBinding:ut});Ge(u,m),Ge(f,{...h,collection:p,ownerBinding:ut,evidenceRefs:[n.id,m.id].sort(nr)})}return{holdings:f,evidence:u,gaps:[...new Set(c)].sort(nr)}}function At(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||Lt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function mi(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 mo(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 bu(e){if(!e||typeof e!="object"||Array.isArray(e)||Lt.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"||Oi(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return mo([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function Eu(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"||Lt.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"?bu(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 hi(e,t){let n=mo([["x-api-key",e]]);return mo([["method","GET"],["headers",n],["fetchImpl",Eu],["timeoutMs",bi],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function Ou(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||Lt.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 wi(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=Ou(e),n=t.has("requestJson")?t.get("requestJson"):le,r=t.has("readApiKey")?t.get("readApiKey"):mu;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&_e("exactly one args object is required","second-options-forbidden");let i=fu(s),a=pu(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(Qn,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=Oi(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,hi(c,gi));l=gu(E,a.address,c)}catch(E){return It({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[mi(E,"profile")]})}let f=mn({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/${Qn[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,hi(c,yi));g=yu(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,mi(E,"inventory")]})}let b=[...new Set([...h,...g.gaps])].sort(nr);return It({requested:!0,target:a,status:b.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:b})}return Object.freeze({enrich:o})}var Dp=Object.freeze({profileMaxBytes:gi,inventoryMaxBytes:yi,timeoutMs:bi,retries:0,redirects:0,dedupe:!1});var wu=wi();async function Iu(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 wu.enrich(e)}export{Ap as COORDINATION_CONFIDENCE,Ip as COORDINATION_RISK_LEVELS,Vl as COORDINATION_SCHEMA_VERSION,hr as DEFAULT_INVESTIGATION_LIMITS,gt as EVIDENCE_STATUSES,Bo as INVESTIGATION_COVERAGE_STATUSES,Oe as INVESTIGATION_LIMITS,rt as INVESTIGATION_POSTURE,Z as INVESTIGATION_RECORD_LIMITS,zo as INVESTIGATION_TARGET_TYPES,Tn as INVESTIGATOR_COLLECTION_SCHEMA_VERSION,Oa as INVESTIGATOR_CURSOR_MAX_BYTES,pr as INVESTIGATOR_CURSOR_SCHEMA_VERSION,qr as INVESTIGATOR_FACT_PROJECTION_SCHEMA_VERSION,Yo as INVESTIGATOR_FINDING_TEMPLATES,_s as INVESTIGATOR_PROVIDER_MAX_RESPONSE_BYTES,Dt as INVESTIGATOR_SCHEMA_VERSION,mr as InvestigatorCursorError,nt as InvestigatorError,Ld as NFT_OVERLAP_CAVEATS,_d as NFT_OVERLAP_INPUT_SCHEMA_VERSION,we as NFT_OVERLAP_LIMITS,ei as NFT_OVERLAP_NOT_OBSERVED,oo as NFT_OVERLAP_OBSERVED,xd as NFT_OVERLAP_SCHEMA_VERSION,xp as NFT_OVERLAP_STATUSES,Zn as NFT_OVERLAP_UNKNOWN,Qn as OPENSEA_CHAIN_SLUGS,Rd as OPENSEA_COVERAGE_STATUSES,ut as OPENSEA_OWNER_BINDING,Kt as OPENSEA_SNAPSHOT_CAVEATS,ii as OPENSEA_WALLET_ENRICHMENT_SCHEMA_VERSION,dl as WALLET_EVIDENCE_CAPABILITIES,Et as WALLET_EVIDENCE_CAPABILITY_MATRIX,Sp as analyzeCoordination,Rp as analyzeNftOverlap,pe as assertExactFields,ie as canonicalHash,Xu as canonicalJson,tn as canonicalTonAddress,Rt as canonicalizeEvmAddress,Vd as canonicalizeOpenSeaCollectionSlug,Fd as canonicalizeUint256TokenId,gp as collectWalletEvidence,gf as crawlEvidenceGraph,ao as createCanonicalNft,co as createCanonicalOpenSeaCollection,er as createCanonicalWallet,Dn as createEvidenceGraph,Ar as createInvestigationRequest,Mo as createInvestigatorCursor,lf as createInvestigatorEvidenceGraph,yf as createInvestigatorSpider,Ic as createOnchainInvestigator,mn as createOpenSeaEvidence,qd as createOpenSeaGap,uo as createOpenSeaSnapshot,se as deepFreeze,Pe as deterministicId,Iu as enrichOpenSeaWallet,gc as graphToInvestigationComponents,ts as investigateOnchain,ef as normalizeCollectorOutput,Qu as normalizeCoverageStatus,Be as normalizeData,Rn as normalizeEvidenceStatus,Ln as normalizeInvestigationComponents,kt as normalizeInvestigatorCursor,Ir as normalizeLimits,Xd as normalizeOpenSeaSnapshot,tf as normalizeReportComponents,wr as normalizeTarget,Rs as normalizeWalletEvidenceRequest,Il as sanitizeInvestigatorProviderError,lo as sanitizeOpenSeaUsername,df as toInvestigationComponents,ll as walletEvidenceCapabilityMatrix};
1
+ import{createHash as br}from"node:crypto";import{types as en}from"node:util";var _i=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])/]),xi=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Ri=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Li(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Pi(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=Li(n);if(xi.has(r)||Ri.some(o=>r.includes(o)))return!0}return!1}function go(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Ci=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function ki(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function ji(e){let t=e.match(Ci)||[];for(let n of t){let r=ki(n),o=go(r),s=o?go(o):null;for(let i of[r,o,s])if(i&&Pi(i))return!0}return!1}var Di=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 pt(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function mt(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of Di){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 ie(e){return typeof e!="string"||e.length===0?!1:_i.some(t=>t.test(e))?!0:ji(e)}import{createHash as _o}from"node:crypto";import{createHash as Gi}from"node:crypto";import{types as Qe}from"node:util";import{AsyncLocalStorage as $i}from"node:async_hooks";var Mi=new $i,Ui=["http","retry","shared"],Fi=512;function gn(e){let t=Mi.getStore();if(!t||t.closed||!Ui.includes(e))return null;if(t.spans.length>=Fi)return t.droppedSpans++,null;let n={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(n),(r,o=null)=>{t.closed||n.durationMs!==null||(n.durationMs=Math.max(0,t.now()-t.start-n.startMs),n.outcome=r==="succeeded"?"succeeded":"failed",n.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}import vt from"node:net";import Vi from"node:dns";var zi=new Set(["localhost","metadata.google.internal","metadata.goog"]);function yn(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=l=>{if(!l)return[];let p=l.split(":"),u=p.at(-1);if(u?.includes(".")){let h=u.split(".").map(Number);if(h.length!==4||h.some(f=>!Number.isInteger(f)||f<0||f>255))return null;p.splice(p.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return p.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:p.map(h=>Number.parseInt(h,16))},[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 sr(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 ir(e){if(vt.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(vt.isIPv6(e)){let t=yn(e);if(!t)return!1;let n=yn("::ffff:0:0");return sr(t,n,96)?ir([...t.slice(12)].join(".")):sr(t,yn("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>sr(t,yn(o),s)):!1}return!1}function Bi(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(zi.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=vt.isIP(n);return r!==0&&!ir(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function ar(e,{lookupFn:t=Vi.promises.lookup}={}){let n=Bi(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:vt.isIPv6(n.host)?6:4}]};let r;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:n.url,addresses:[]};try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!ir(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function Hi(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let n;try{n=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(n.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(n.hostname)||!n.port||n.username||n.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let r=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(r))throw new Error("egress-guard: egress proxy token is missing");return{uri:n.origin,token:r}}async function cr({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(h){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${h?.message||h}`);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 s=h=>String(h).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=h=>(Array.isArray(h)?h:[h]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(vt.isIPv6(f.address)?6:4)})),c=(h,f,m)=>{i.set(s(h),a(typeof f=="string"?[{address:f,family:m}]:f))},d=h=>{let f=s(h);if(vt.isIP(f))return[{address:f,family:vt.isIPv6(f)?6:4}];let m=i.get(f);if(!m||!m.length)throw new Error(`refused: unpinned host ${h} during pinned fetch`);return m},l=Hi(),p=l&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:l.uri,token:`Bearer ${l.token}`,connectTimeout:1e4}):new n({connect:{lookup(h,f,m){let g;try{g=d(h)}catch(y){return m(y)}return f?.all?m(null,g):m(null,g[0].address,g[0].family)}}}),u=qi((h,f={})=>r(h,{...f,dispatcher:p}),c);return{dispatcher:p,fetch:u,pin:c,resolve:d,async close(){try{await p.destroy()}catch{}}}}var lr=Symbol.for("oracle.egressGuard.pinCapableFetch");function qi(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[lr]=Object.freeze({pin:t}),e}function dr(e){return typeof e=="function"&&typeof e[lr]?.pin=="function"}function yo(e,t,n){if(!dr(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[lr].pin(t,n)}var Wi=new Set([408,425,429,500,502,503,504]),bo=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Yi=2,Eo=4e3,Ki=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Ji=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Zi=AbortSignal.prototype.throwIfAborted,Xi=EventTarget.prototype.addEventListener,Oo=EventTarget.prototype.removeEventListener,wo=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Jt=e=>e?Ki.call(e):!1,Qi=e=>e?Ji.call(e):void 0,ea=new Set([301,302,303,307,308]),En=3,Vu=64*1024,Xe=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function ae(e){return ht(`HTTP JSON body refused: ${e}`)}function ta(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 Qe[t]=="function"&&Qe[t](e))}function na(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>Xe.bytes)throw ae("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>Xe.bytes)throw ae("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,p)=>{if(r+=1,r>Xe.nodes)throw ae("node limit exceeded");if(p>Xe.depth)throw ae("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 ae("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw ae("unsupported non-JSON value");if(Qe.isProxy(l))throw ae("proxy value");if(ta(l))throw ae("unsupported exotic object");if(i.has(l))throw ae("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw ae("symbol-keyed fields are unsupported");if(Array.isArray(l)){let f=Object.getPrototypeOf(l),m=0;for(;f!==null;){if(Qe.isProxy(f))throw ae("proxy array prototype");if(m+=1,m>Xe.depth)throw ae("array prototype depth limit exceeded");f=Object.getPrototypeOf(f)}if(l.length>Xe.arrayLength)throw ae("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 ae("array entries must be dense enumerable own data")}let g=0;for(let y in l){if(s+=1,s>Xe.fields)throw ae("enumeration limit exceeded");if(Object.hasOwn(l,y)&&(g+=1,g>l.length))throw ae("named array fields are unsupported")}if(g!==l.length)throw ae("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,p+1);a("]");return}let u=Object.getPrototypeOf(l);if(u!==Object.prototype&&u!==null)throw ae("non-plain object");let h=[];for(let f in l){if(s+=1,s>Xe.fields)throw ae("enumeration limit exceeded");if(!Object.hasOwn(l,f))continue;if(o+=1,o>Xe.fields)throw ae("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,f);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw ae("object fields must be enumerable own data");h.push([f,m.value])}a("{");for(let f=0;f<h.length;f+=1)f&&a(","),a(c(h[f][0])),a(":"),d(h[f][1],p+1);a("}")}finally{i.delete(l)}};return d(e,0),t.join("")}function ra(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(Qe.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 oa(){return Object.assign(Object.create(null),{Accept:"application/json"})}function sa(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 ia(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var ur=new Map,Io=new WeakMap,Ao=1;function bn(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Io.get(e);return t||(t=Ao,Ao+=1,Io.set(e,t)),`reference:${t}`}var aa=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),ca=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function So(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?aa.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 vo(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(So);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return So(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&ca.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function la(e,t,n,r={},o=null){let s=Gi("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(`
2
+ `)};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 da(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Eo):Math.min(250*2**e,Eo)+Math.floor(Math.random()*100)}var ua=e=>new Promise(t=>setTimeout(t,e));function ht(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function fr(e,t,n){return ht(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Nt(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function fa(e){return e?e.byteLength??e.length??0:0}async function pa(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&&(Nt(e),!r))throw fr(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let p=await e.text(),u=Buffer.byteLength(p,"utf8");if(u>t){if(!r)throw fr(n,`body ${u} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let a=[],c=0,d=!1;try{for(;;){let{value:p,done:u}=await i.read();if(u)break;if(p&&(a.push(Buffer.from(p)),c+=fa(p),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 fr(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function ma(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function ha(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:p,validateResponse:u,signal:h,redirectPolicy:f="follow",maxRedirects:m=En}){let g=null,y=t,E=i?{lookupFn:i}:{};if(c&&!a&&!dr(y))throw ht(`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 T=new AbortController,$=setTimeout(()=>T.abort(),s),P=h?wo?wo([h,T.signal]):h:T.signal,U=async(D,{status:C=null}={})=>{let z=await ar(D,E);if(!z.ok)throw ht(C==null?`HTTP refused ${D}: ${z.error}`:`HTTP redirect to ${D} ${z.error}`,C==null?{}:{status:C});let ee=new URL(D).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await cr({requireUndici:!0,...p?{importUndici:p}:{}})}catch(j){throw ht(C==null?`HTTP refused ${D}: ${j?.message||j}`:`HTTP redirect to ${D} refused: ${j?.message||j}`,C==null?{}:{status:C})}g.pin(ee,z.addresses),y=g.fetch}else yo(y,ee,z.addresses);return z};try{let D=String(e),C=Object.assign(Object.create(null),r||{});c&&await U(D);for(let z=0;z<=m;z+=1){let ee=Object.assign(Object.create(null),{method:n,headers:C,body:o,signal:P,redirect:"manual",dispatcher:void 0}),j=await y(D,ee);if((f==="error"||m===0)&&j.status>=300&&j.status<400)throw Nt(j),ht(`HTTP ${j.status} ${n} redirect refused`,{status:j.status,redirectRefused:!0});if(ea.has(j.status)){let B=l===!0&&n==="POST"&&[307,308].includes(j.status)&&vo(n,o);if(n!=="GET"&&n!=="HEAD"&&!B){Nt(j);let S=new Error(`HTTP ${j.status} ${n} ${D} redirected non-idempotent request`);throw S.status=j.status,S}if(z===m)throw Nt(j),ht(`HTTP ${j.status} ${n} redirect budget exhausted`,{status:j.status,redirectRefused:!0});let R=j.headers?.get?.("location"),x;try{x=sa(R,D)}catch(S){throw Nt(j),S}let w=!ia(x,D);if(Nt(j),w&&n==="POST"){let S=new Error(`HTTP ${j.status} ${n} cross-origin redirect refused`);throw S.status=j.status,S}if(w&&l){let S=new Error(`HTTP ${j.status} ${n} cross-origin redirect refused`);throw S.status=j.status,S.retryable=!1,S}if(w&&(C=oa(C)),c)await U(x,{status:j.status});else if(w){let S=await ar(x,E);if(!S.ok){let L=new Error(`HTTP redirect from ${D} ${S.error}`);throw L.status=j.status,L.retryable=!1,L}a&&S.addresses?.length&&(g||(g=await cr(p?{importUndici:p}:{})),g&&(g.pin(new URL(x).hostname,S.addresses),y=g.fetch))}D=x;continue}if(typeof u=="function")try{await u(j,{url:D})}catch(B){throw Nt(j),ht(B?.message||String(B))}let Y=await pa(j,d,{url:D,onOversize:()=>T.abort()}),Ne=ma(Y);if(!j.ok){let B=new Error(`HTTP ${j.status} ${n} ${D}`);throw B.status=j.status,B.retryAfter=j.headers?.get?.("retry-after")??null,B.body=Ne??Y.slice(0,300),B}return Ne??Y}throw new Error(`HTTP redirect loop for ${e}`)}catch(D){if(T.signal.aborted&&!Jt(h)){let C=D&&(typeof D=="object"||typeof D=="function")&&!Qe.isProxy(D)?D:null,z=C?Object.getOwnPropertyDescriptor(C,"oversize"):null;if(!(z&&Object.hasOwn(z,"value")&&z.value===!0))try{if(!C)throw new TypeError("unsafe rejection");Object.defineProperties(C,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let j=new Error("HTTP request timed out");throw Object.defineProperties(j,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),j}}throw D}finally{clearTimeout($),g&&await g.close()}}async function ce(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Qe.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 k=Object.getOwnPropertyDescriptor(t,L);if(!(L==="toJSON"&&k&&Object.hasOwn(k,"value")&&k.value===void 0)){if(!n.has(L))throw new TypeError("HTTP options contain unknown fields");if(!k||!k.enumerable||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=L=>{if(t==null||!Object.hasOwn(t,L))return;let k=Object.getOwnPropertyDescriptor(t,L);if(!k||!Object.hasOwn(k,"value"))throw new TypeError("HTTP options must contain own data properties");return k.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 k=r(L);if(k!==void 0&&typeof k!="boolean")throw new TypeError(`HTTP ${L} must be boolean`)}let p=r("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=r("signal");if(u!==void 0){if(Qe.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 k=r(L);if(k!==void 0&&typeof k!="function")throw new TypeError(`HTTP ${L} must be a function`)}let h=r("fetchImpl"),f=h||globalThis.fetch;if(typeof f!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=s??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),E=ra(y),T=Object.assign(Object.create(null),E);Object.keys(T).some(L=>L.toLowerCase()==="accept")||(T.Accept="application/json");let $=r("body");$!=null&&typeof $!="string"&&(Object.keys(T).find(k=>k.toLowerCase()==="content-type")||(T["Content-Type"]="application/json"),$=na($));let P=i??Yi,U=r("lookupFn"),D=!h,C=r("untrustedUrl")===!0,z=r("sameOriginRedirectsOnly")===!0,ee=r("importUndici"),j=r("validateResponse"),Y=u,Ne=p??null,B=async()=>{let L;for(let k=0;k<=P;k++){Y&&Zi.call(Y);let Ie=gn("http");try{let ue=await ha(e,{fetchImpl:f,method:g,headers:T,body:$,timeoutMs:m,lookupFn:U,realFetch:D,untrustedUrl:C,maxResponseBytes:Ne,sameOriginRedirectsOnly:z,importUndici:ee,validateResponse:j,signal:Y,redirectPolicy:d,maxRedirects:l});return Ie?.("succeeded"),ue}catch(ue){L=ue;let be=J=>{if(!ue||typeof ue!="object"&&typeof ue!="function"||Qe.isProxy(ue))return;let G=Object.getOwnPropertyDescriptor(ue,J);return G&&Object.hasOwn(G,"value")?G.value:void 0},ke=be("status");Ie?.("failed",ke);let St=be("oracleTimeout")===!0||be("name")==="AbortError"||be("name")==="TimeoutError"||Jt(Y),A=new Set([408,425,429]),b=be("retryable")===!1?!1:ke!=null?A.has(ke)||Wi.has(ke)&&bo.has(g):!St&&bo.has(g);if(k===P||!b)throw ue;let _=da(k,be("retryAfter")),M=gn("retry"),F=!1;try{Y?await new Promise((J,G)=>{let Ee,Le=()=>{clearTimeout(Ee),Oo.call(Y,"abort",Le),G(Qi(Y)||new DOMException("Aborted","AbortError"))};if(Jt(Y)){Le();return}Ee=setTimeout(()=>{Oo.call(Y,"abort",Le),J()},_),Xi.call(Y,"abort",Le,{once:!0}),Jt(Y)&&Le()}):await ua(_),F=!0}finally{M?.(F?"succeeded":"failed")}}}throw L};if(!(r("dedupe")!==!1&&!Y&&vo(g,$)))return B();let x=la(g,e,T,{untrustedUrl:C,maxResponseBytes:Ne,sameOriginRedirectsOnly:z,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:P,fetchImpl:bn(f),realFetch:D,lookupFn:bn(U),importUndici:bn(ee),validateResponse:bn(j)},$),w=ur.get(x);if(w){let L=gn("shared");try{let k=await w;return L?.("succeeded"),k}catch(k){throw L?.("failed"),k}}let S=B().finally(()=>ur.delete(x));return ur.set(x,S),S}import{types as Pt}from"node:util";function je(e){if(!e||typeof e!="object"||Pt.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Pe(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Pt.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 et(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"||Pt.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`);et(a.value,t,n,s,o+1)}return e}if(!je(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`);et(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function le(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(Pt.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]=le(i.value,t,n+1)}return o}if(!je(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]=le(s.value,t,n+1)}return r}var No=Symbol("oracle.provider-failure-metadata"),ga=new Set(["provider-response-too-large","provider-timeout"]);function Ct(e,t){let n=t&&typeof t=="object"&&!Pt.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,No,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function To(e){if(!e||typeof e!="object"||Pt.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,No);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=ga.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var pr="https://blockstream.info/liquid/api";function ya(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||pr).replace(/\/$/,"")}var ba="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Ea(e){let t=0n;for(let s of e){let i=ba.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 Oa(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return _o("sha256").update(_o("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var wa="qpzry9x8gf2tvdw0s3jn54khce6mua7l",xo=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function Ia(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<xo.length;o+=1)r>>BigInt(o)&1n&&(t^=xo[o])}return t}function Aa(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 On(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 p of n.slice(r+1)){let u=wa.indexOf(p);if(u<0)return!1;s.push(u)}let i=[...o].map(p=>p.charCodeAt(0)>>5).concat([0],[...o].map(p=>p.charCodeAt(0)&31),s),a=s[0],c=a===0?1n:0x455972a3350f7a1n;if(a>16||Ia(i)!==c)return!1;let d=Aa(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 Zt(e){let t=String(e??"").trim();if(On(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=Ea(t);return!!(n&&n.length===59&&Oa(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function Sa(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)||On(n),s=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||Zt(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 va(e,t={}){return le(await ce(`${ya(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function Ro(e={},t={}){let n=Sa(e.address||e.addr,"address"),r=await va(`/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],p=l.some(m=>m!=null),u=p?l.map(i):[];if(p&&u.some(m=>m==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let h=p?u[0]+u[2]:null,f=p?u[1]+u[3]:null;if(p&&(!Number.isSafeInteger(h)||!Number.isSafeInteger(f)||f>h))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:d,balanceSats:p?String(h-f):null,confidential:Zt(n),note:p?void 0:Zt(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 Do}from"node:util";import{base58 as Lo}from"@scure/base";function Po(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)||pt(e))return!1;try{let s=Lo.decode(e);return s.length===r&&(!o||!mt(s))&&Lo.encode(s)===e}catch{return!1}}function wn(e){return Po(e,32,44,32)}function In(e){return Po(e,64,88,64,!0)}var mr="oracle.investigator-cursor/1",Na=2*1024,Ta=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),Co=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),_a=Object.freeze(["block_number","index"]),hr=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function xa(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function $o(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")&&$o(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function K(e){throw new hr(e)}function Mo(e,t){return(!e||typeof e!="object"||Do.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&K(`${t} must be a plain object`),e}function An(e,t,n){Mo(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&K(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return xa(a)||K(`${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)&&K(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&K(`${n} fields must be enumerable own data`)}}function Te(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&K(`${n} fields must be own data`),r.value}function tt(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&K(`${t} is invalid`),e}function ko(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=tt(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||ie(t))&&K("chain is invalid"),t}function Ra(e){return e===e.toLowerCase()||e===e.toUpperCase()}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 Pa(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||La(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function jo(e,t,n){let r=tt(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&K("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!wn(r))&&K("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Ra(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)&&K("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Pa(r):null;return o||K("address is invalid for the cursor family"),o}K("family does not support cursors")}function Ca(e){An(e,_a,"EVM payload");let t=Te(e,"block_number","cursor"),n=Te(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&K("EVM payload values are invalid"),{block_number:t,index:n}}function ka(e){An(e,["lt","hash"],"TON payload");let t=tt(Te(e,"lt","cursor"),"TON payload.lt",40),n=tt(Te(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||pt(n))&&K("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||mt(r))&&K("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function ja(e,t){if(e==="evm")return Ca(t);if(e==="ton")return ka(t);let n=tt(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&K("Bitcoin payload must be a transaction id"),e==="solana"&&!In(n)&&K("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||K(`${e} does not support cursors`),n}function Da(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"||Do.isProxy(r))&&K("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"))&&K("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(Te(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Na&&K("envelope exceeds the byte limit")}function kt(e,t={}){if(e==null)return null;An(e,Ta,"envelope"),Te(e,"schemaVersion","cursor")!==mr&&K("schemaVersion is unsupported");let n=tt(Te(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(Co,n)||/^[0-9a-f]{64}$/iu.test(n)||ie(n))&&K("family is invalid");let r=ko(Te(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&K("chain is invalid for the cursor family");let o=jo(n,r,Te(e,"address","cursor")),s=tt(Te(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==Co[n]||ie(s))&&K("provider is invalid"),Mo(t,"expected binding");let i=h=>Object.hasOwn(t,h)?Te(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:tt(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:ko(i("chain")),d=i("address")===void 0?void 0:jo(n,r,i("address")),l=i("provider")===void 0?void 0:tt(i("provider"),"expected provider",64);a!==void 0&&n!==a&&K("family binding does not match the request"),c!==void 0&&r!==c&&K("chain binding does not match the request"),d!==void 0&&o!==d&&K("address binding does not match the request"),l!==void 0&&s!==l&&K("provider binding does not match the request");let p=ja(n,Te(e,"payload","cursor")),u={schemaVersion:mr,family:n,chain:r,address:o,provider:s,payload:p};return Da(u),$o(u)}function Uo(e,t){return An(e,["family","chain","address","provider"],"binding"),kt({schemaVersion:mr,family:Te(e,"family","binding"),chain:Te(e,"chain","binding"),address:Te(e,"address","binding"),provider:Te(e,"provider","binding"),payload:t},e)}function Tt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))Tt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var Dt="oracle.onchain-investigator/1",_n="oracle.investigator-collection/1",Bo=Tt(["wallet","token","tx","launch"]),gt=Tt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),Ho=Tt(["COMPLETE","PARTIAL","UNKNOWN"]),Ae=Tt({maxDepth:3,maxNodes:250,maxEdges:1e3}),gr=Tt({depth:2,nodes:100,edges:400}),rt="READ_ONLY",X=Tt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),$a=new Set(Bo),Ma=new Set(gt),Ua=new Set(Ho),Fa=/^[a-z][a-z0-9._:-]{0,63}$/,Va=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,qo=/^(?: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})$/,za=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),Ba=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,Ha=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,qa=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),Ga=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),Wa=new Set(["auth","key","token","xapikey"]),Ya=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),Ka=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),xn=32,Fo=64,Ja=5,Za=512,Xa=262144,Er=262144,Go=524288,vn=524288,nt=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function N(e,t){throw new nt(e,t)}function Nn(e,t){return(!e||typeof e!="object"||en.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&N(`${t} must be a plain object`,"invalid-object"),e}function pe(e,t,n){Nn(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&N(`${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)))&&N(`${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"))&&N(`${n}.${s} must be enumerable own data`,"invalid-component")}return e}function Wo(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!ie(t)}function Qa(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 tn(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])||Qa(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ec(e){return tn(e)!==null}var tc="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function nc(e){let t=0n;for(let o of e){let s=tc.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 rc(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=nc(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 br("sha256").update(br("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function oc(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||On(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||rc(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)||ec(e)}function sc(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?oc(e):t==="coinType"?Wo(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):qo.test(e)}function Or(e,t,n){if(n>12&&N("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>Go&&N("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||en.isProxy(e))&&N("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&N("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&N("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)||N("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>vn&&N("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"))&&N("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Or(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&&N("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"))&&N(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>vn&&N("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"))&&N(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Or(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 oe(e){return Or(e,{nodes:0,fields:0,active:new Set},0)}function H(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&N(`${t} must be an own data field`,"invalid-component"),n.value}function Qt(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&N(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function Xt(e,t,{max:n=Za,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&N(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&Ha.test(e)||r&&(qo.test(e)||Wo(e))||o&&sc(e,o))&&!Ba.test(e);return ie(e)&&!i&&N(`${t} contains secret-shaped material`,"secret-material"),e}function ic(e,t){(!Va.test(e)||/^[0-9a-f]{64}$/iu.test(e)||ie(e))&&N(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!Ya.has(n);return(Wa.has(n)||r||Ka.some(o=>n.includes(o)))&&N(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function Rn(e,t,n,r="data-limit"){en.isProxy(e)&&N(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||N(`${t} must be an array`,"invalid-component"),e.length>n&&N(`${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)||N(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&N(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function wr(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 ac(e){let t=wr(e,1);return typeof t=="string"&&za.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 cc(e){let t=wr(e,1);return typeof t=="string"&&qa.has(t)?!0:Number.isInteger(t)&&Ga.has(wr(e,2))}function jt(e,t,n,r,o){if(n>Ja&&N(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>Xa&&N(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return Xt(e,t,{publicIdentifierField:ac(o),allowDeterministicRecordId:cc(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||en.isProxy(e))&&N(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&N(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&N(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>Fo&&N(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>Er&&N(`${t} exceeds the cumulative field limit`,"data-limit"),Rn(e,t,Fo).map((a,c)=>jt(a,`${t}[${c}]`,n+1,r,[...o,c]));Nn(e,t);let s=Object.keys(e);s.length>xn&&N(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>Er&&N(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){ic(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&N(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,jt(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function He(e={},t="data"){return(typeof t!="string"||t.length===0||t.length>256)&&N("data label must be a bounded string","invalid-component"),jt(e,t,0,{nodes:0,fields:0,active:new Set},[])}function Tn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&N("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>Go&&N("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&en.isProxy(e)&&N("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&N("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&N("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=Rn(e,"canonical value",X.evidence,"invalid-json");return r.fields+=c.length,r.fields>vn&&N("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Tn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&N("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>xn&&N("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>vn&&N("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"))&&N("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Tn(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))&&N("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&N("value is not canonical JSON","invalid-json"),o}function cf(e){return Tn(e)}function se(e){return`sha256:${br("sha256").update(Tn(e)).digest("hex")}`}function Ce(e,t){let n=Xt(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||N("id kind must be a lowercase slug","invalid-id"),`${n}_${se(t).slice(7)}`}function Ln(e,t="status"){return Ma.has(e)||N(`${t} must be one of ${gt.join(", ")}`,"invalid-status"),e}function Ir(e){pe(e,["type","chainFamily","network","identifier"],"target"),Qt(e,["type","chainFamily","identifier"],"target");let t=H(e,"type");$a.has(t)||N(`target.type must be one of ${Bo.join(", ")}`,"invalid-target");let n=Xt(H(e,"chainFamily"),"target.chainFamily",{max:64}).toLowerCase();Fa.test(n)||N("target.chainFamily must be a lowercase chain-family slug","invalid-target");let r=H(e,"network"),o=r==null?null:Xt(r,"target.network",{max:96}),s=Xt(H(e,"identifier"),"target.identifier",{max:256,allowPublicIdentifier:!0});return{type:t,chainFamily:n,network:o,identifier:s}}function Ar(e={}){pe(e,["depth","nodes","edges"],"limits");let t=H(e,"depth")??gr.depth,n=H(e,"nodes")??gr.nodes,r=H(e,"edges")??gr.edges;return(!Number.isInteger(t)||t<0||t>Ae.maxDepth)&&N("limits.depth must be an integer from 0 through 3","invalid-limit"),(!Number.isInteger(n)||n<1||n>Ae.maxNodes)&&N("limits.nodes must be an integer from 1 through 250","invalid-limit"),(!Number.isInteger(r)||r<0||r>Ae.maxEdges)&&N("limits.edges must be an integer from 0 through 1000","invalid-limit"),{depth:t,nodes:n,edges:r}}function Sr(e){pe(e,["target","limits"],"request"),Qt(e,["target"],"request");let t=Ir(H(e,"target")),n=Ar(H(e,"limits")??{}),r={schemaVersion:Dt,requestId:Ce("request",{target:t,limits:n}),posture:rt,target:t,limits:n};return oe(r)}function Sn(e,t,n,r){let o=Rn(e,t,n,"component-limit");return r.fields+=o.length,r.fields>Er&&N(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>jt(s,`${t}[${i}]`,0,r,[t,i]))}function Pn(e){let t=["subject","entities","events","evidence","coverage","gaps"];pe(e,t,"components"),Qt(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=jt(H(e,"subject"),"subject",0,n,["subject"]),o=Sn(H(e,"entities"),"entities",Ae.maxNodes,n),s=Sn(H(e,"events"),"events",Ae.maxEdges,n),i=Sn(H(e,"evidence"),"evidence",X.evidence,n),a=jt(H(e,"coverage"),"coverage",0,n,["coverage"]),c=Sn(H(e,"gaps"),"gaps",Ae.maxNodes,n);return oe({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}function lf(e){return Ua.has(e)||N(`coverage status must be one of ${Ho.join(", ")}`,"invalid-status"),e}var Vo=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),lc=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function dc(e,t,n){if(e===null)return null;if(pe(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&N("collector output.cursor fields are invalid","invalid-cursor"),H(e,"requested")===null&&H(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&N("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:kt(H(e,"requested"),r),next:kt(H(e,"next"),r)}}catch{N("collector cursor binding or payload is invalid","invalid-cursor")}}function yr(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)&&N(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&N(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function uc(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)&&N("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)&&N("collector coverage source is invalid","invalid-reference");let o=yr(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)||N("collector subject entity reference is missing","invalid-reference"),yr(e.events,"event");let s=yr(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])))&&N(`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)&&N("collector event evidence references are invalid","invalid-reference")}}function zo(e,t,n=xn){let r=Object.keys(e);r.length>n&&N(`${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"))&&N(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function df(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];pe(e,t,"collector output"),Qt(e,t,"collector output"),H(e,"schemaVersion")!==_n&&N("collector output.schemaVersion is unsupported","invalid-schema-version"),H(e,"execution")!=="read-only"&&H(e,"execution")!=="READ_ONLY"&&N("collector output must be read-only","invalid-posture"),lc.has(H(e,"status"))||N("collector output.status is invalid","invalid-status"),Array.isArray(H(e,"evidence"))||N("collector output.evidence must be an array","invalid-component"),Nn(H(e,"coverage"),"collector output.coverage");let n=Pn({subject:H(e,"subject"),entities:H(e,"entities"),events:H(e,"events"),evidence:Rn(H(e,"evidence"),"collector output.evidence",Ae.maxEdges,"component-limit").map(o=>{Nn(o,"collector evidence"),Qt(o,["status"],"collector evidence");let s=H(o,"status"),i=typeof s=="string"&&Object.hasOwn(Vo,s)?Vo[s]:null;return i||N("collector evidence status is invalid","invalid-status"),{...zo(o,"collector evidence"),status:i}}),coverage:{...zo(H(e,"coverage"),"collector coverage",xn-1),collectorStatus:H(e,"status")},gaps:H(e,"gaps")});uc(n);let r=dc(H(e,"cursor"),n.subject,n.coverage.source);return oe({...n,cursor:r})}var uf=Pn;import{AsyncLocalStorage as fc}from"node:async_hooks";import{types as rn}from"node:util";var nn=Symbol("oracle.evidence-graph.internal-transaction"),vr=new WeakMap;function Yo(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||typeof t!="function"||vr.has(e))throw new TypeError("invalid evidence graph transaction registration");vr.set(e,t)}function Nr(e,t){let n=vr.get(e);if(typeof n!="function")throw new TypeError("evidence graph has no internal transaction runner");return n(t)}var pc=/^[a-z][a-z0-9-]*_[0-9a-f]{64}$/,mc=/^[a-z][a-z0-9._:-]{0,63}$/,Tr=(e,t)=>e<t?-1:e>t?1:0,Ko=oe({observation:"Cited public evidence records an on-chain observation.","relationship-observation":"Cited public evidence records an on-chain relationship.","activity-pattern-observation":"Cited public evidence records an on-chain activity pattern."});function V(e,t="invalid-evidence-graph"){throw new nt(e,t)}function v(e,t){if(!e||typeof e!="object"||rn.isProxy(e))return;let n=Object.getOwnPropertyDescriptor(e,t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function yt(e,t,n=512,{publicIdentifier:r=!1}={}){let o=r?He({transactionId:e},t).transactionId:He(e,t);return(typeof o!="string"||o.length>n)&&V(`${t} must be a string no longer than ${n}`,"invalid-string"),o}function Cn(e,t){let n=yt(e,t,64).toLowerCase();return mc.test(n)||V(`${t} must be a lowercase slug`,"invalid-kind"),n}function hc(e,t){if(e===void 0)return null;let n=yt(e,t,64),r=Date.parse(n);return(!Number.isFinite(r)||new Date(r).toISOString()!==n)&&V(`${t} must be an exact ISO instant`,"invalid-time"),n}function on(e,t){return(typeof e!="string"||!pc.test(e))&&V(`${t} is not a deterministic investigator ID`,"invalid-id"),e}function Zo(e,t){return e===void 0?null:on(e,t)}function kn(e,t,n){return e!==void 0&&e!==t&&(Zo(e,n),V(`${n} does not match the normalized record`,"record-id-mismatch")),t}function Mt(e,t,n){(rn.isProxy(e)||!Array.isArray(e)||e.length>n)&&V(`${t} must be a bounded array`,"invalid-reference");let r=new Array(e.length);for(let o=0;o<e.length;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));(!s||!Object.hasOwn(s,"value"))&&V(`${t} must contain dense own data`,"invalid-reference"),r[o]=s.value}return r}function Xo(e,t,{required:n=!1}={}){if(e===void 0)return n&&V(`${t} is required`,"missing-reference"),[];let r=Mt(e,t,64);n&&r.length===0&&V(`${t} must be a bounded non-empty array`,"missing-evidence");for(let o of r)on(o,t);return new Set(r).size!==r.length&&V(`${t} must contain unique ids`,"invalid-reference"),[...r].sort(Tr)}function Jo(e,t,n,{required:r=!1,allowMissing:o=!1}={}){let s=Xo(e,n,{required:r});if(!o)for(let i of s)t.has(i)||V(`${n} contains unknown reference ${i}`,"unknown-reference");return s}function gc(e){return["evm","ethereum","eth","eip155"].includes(e)?"eip155":e}function yc(e,t){if(typeof t!="string")return t;let n=t.toLowerCase();if(e==="eip155"){let r=n.match(/^(?:eip155:)?(\d+)$/u)?.[1];if(r)return BigInt(r).toString()}return n}function bc(e,t){return["eip155","hyperliquid"].includes(e)&&/^0x[0-9a-f]{1,40}$/iu.test(t)?`0x${t.slice(2).toLowerCase().padStart(40,"0")}`:["aptos","sui"].includes(e)&&/^0x[0-9a-f]{1,64}$/iu.test(t)?`0x${t.slice(2).toLowerCase().padStart(64,"0")}`:e==="ton"?tn(t)??t:e==="cosmos"?t.toLowerCase():t}function Dn(e){return v(e,"status")==="LIVE"||v(e,"status")==="INDEXED"}function jn(e,t,n,{usableOnly:r=!1}={}){let o=["evidenceIds","evidenceRefs"].filter(a=>v(e,a)!==void 0);o.length>1&&V(`${n} has ambiguous evidence citation fields`,"ambiguous-evidence");let s=o.length===1?v(e,o[0]):void 0,i=Xo(s,n,{required:!0});for(let a of i){let c=t.get(a);c||V(`${n} cites unknown evidence ${a}`,"unknown-evidence"),r&&!Dn(c)&&V(`${n} cites evidence that cannot support a finding`,"unusable-evidence")}return i}function $t(e,t){let n=e.get(v(t,"id"));return n&&se(n)!==se(t)&&V(`deterministic ID collision for ${v(t,"id")}`,"id-collision"),n||e.set(v(t,"id"),t),v(t,"id")}function Ec(e){return{id:v(e,"id"),status:v(e,"status"),source:v(e,"source"),...v(e,"observedAt")?{observedAt:v(e,"observedAt")}:{},subject:v(e,"subject"),...v(e,"locator")!==void 0?{locator:v(e,"locator")}:{},data:v(e,"data"),...v(e,"raw")!==void 0?{raw:v(e,"raw")}:{},digest:v(e,"digest")}}function Oc(e){if(e===null||typeof e!="object"&&typeof e!="function")return!1;if(rn.isProxy(e)||rn.isPromise(e))return!0;let t=e;for(let n=0;t!==null&&n<=Ae.maxDepth;n+=1){if(rn.isProxy(t))return!0;let r;try{r=Object.getOwnPropertyDescriptor(t,"then")}catch{return!0}if(r)return Object.hasOwn(r,"value")?typeof r.value=="function":!0;try{t=Object.getPrototypeOf(t)}catch{return!0}}return t!==null}function $n(e={},t=null){t!==null&&t!==nn&&V("graph internal capability is invalid","invalid-object"),pe(e,["target","limits"],"graph options");let n=Object.getOwnPropertyDescriptor(e,"target");(!n||!Object.hasOwn(n,"value"))&&V("graph target is required","invalid-report");let r=Object.getOwnPropertyDescriptor(e,"limits"),o=Ir(n.value),s=Ar(r&&Object.hasOwn(r,"value")?r.value:{}),i=new Map,a=new Map,c=new Map,d=new Map,l=new Map,p=new Map,u=new Map,h=new fc,f=!1,m=null,g=!1,y=!1,E=!1;function T(){E&&V("graph is poisoned by an asynchronous transaction","invalid-transaction")}function $(){h.getStore()?.closed===!0&&V("graph transaction is closed","invalid-transaction")}function P(){T(),$(),g&&V("graph is already finalized","graph-finalized")}function U(A,b,_){if(A===void 0)return!1;pe(A,[b],_);let M=v(A,b);return M!==void 0&&typeof M!="boolean"&&V(`${_}.${b} must be boolean`,"invalid-reference"),M===!0}function D(A){pe(A,["key","id","status","source","subject","observedAt","locator","data","raw"],"evidence");let b={status:Ln(v(A,"status")),source:yt(v(A,"source"),"evidence.source"),subject:yt(v(A,"subject"),"evidence.subject",512,{publicIdentifier:!0}),observedAt:hc(v(A,"observedAt"),"evidence.observedAt"),...v(A,"locator")!==void 0?{locator:He({locator:v(A,"locator")},"evidence").locator}:{},data:He(v(A,"data")??{},"evidence.data"),...v(A,"raw")!==void 0?{raw:He(v(A,"raw"),"evidence.raw")}:{}};return{id:kn(v(A,"id"),Ce("evidence",b),"evidence.id"),...b,digest:se(b)}}function C(A){pe(A,["key","id","kind","chainFamily","network","reference","evidenceIds","evidenceRefs","data","depth"],"node");let b={kind:Cn(v(A,"kind"),"node.kind"),chainFamily:gc(Cn(v(A,"chainFamily"),"node.chainFamily")),network:v(A,"network")===void 0||v(A,"network")===null?null:yt(v(A,"network"),"node.network",96),reference:yt(v(A,"reference"),"node.reference",256,{publicIdentifier:!0}),evidenceIds:jn(A,i,"node.evidenceIds"),data:He(v(A,"data")??{},"node.data"),depth:v(A,"depth")??0};(!Number.isInteger(b.depth)||b.depth<0||b.depth>s.depth)&&V("node.depth exceeds the traversal bound","depth-limit"),b.network=yc(b.chainFamily,b.network),b.reference=bc(b.chainFamily,b.reference);let _={kind:b.kind,chainFamily:b.chainFamily,network:b.network,reference:b.reference},M=Ce("entity",_);return v(A,"id")!==void 0&&v(A,"id")!==M&&(Zo(v(A,"id"),"node.id"),V("node.id does not match its normalized node identity","node-id-mismatch")),{id:M,...b}}function z(A,b){let _=U(b,"allowMissingNodes","edge validation options");pe(A,["id","from","to","relation","evidenceIds","evidenceRefs","data"],"edge");let M={from:on(v(A,"from"),"edge.from"),to:on(v(A,"to"),"edge.to"),relation:Cn(v(A,"relation"),"edge.relation"),evidenceIds:jn(A,i,"edge.evidenceIds"),data:He(v(A,"data")??{},"edge.data")};return!_&&(!a.has(M.from)||!a.has(M.to))&&V("edge references a missing node","unknown-reference"),{id:kn(v(A,"id"),Ce("event",M),"edge.id"),...M}}function ee(A,b){let _=U(b,"allowMissingReferences","finding validation options");pe(A,["id","kind","summary","status","evidenceIds","evidenceRefs","nodeIds","edgeIds","data"],"finding");let M=Cn(v(A,"kind"),"finding.kind"),F=Object.hasOwn(Ko,M)?Ko[M]:null;F||V("finding.kind is not an allowed evidence-only finding kind","invalid-finding-kind"),v(A,"summary")!==void 0&&v(A,"summary")!==F&&V("finding.summary must be omitted or exactly match the fixed evidence-only template","invalid-finding-summary");let J=Ln(v(A,"status")??"DERIVED","finding.status");J!=="DERIVED"&&V("finding.status must be DERIVED","invalid-finding-status");let G=He(v(A,"data")??{},"finding.data");(!G||typeof G!="object"||Array.isArray(G)||Object.keys(G).length!==0)&&V("finding.data must be empty because caller-authored finding claims are not allowed","invalid-finding-data");let Ee={kind:M,summary:F,status:J,evidenceIds:jn(A,i,"finding.evidenceIds",{usableOnly:!0}),nodeIds:Jo(v(A,"nodeIds"),a,"finding.nodeIds",{allowMissing:_}),edgeIds:Jo(v(A,"edgeIds"),d,"finding.edgeIds",{allowMissing:_}),data:G};return{id:kn(v(A,"id"),Ce("finding",Ee),"finding.id"),...Ee}}function j(A,b){let _=U(b,"allowMissingNode","gap validation options");pe(A,["id","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"],"gap");let M=Ln(v(A,"status"),"gap.status");M!=="UNKNOWN"&&M!=="UNAVAILABLE"&&V("gap.status must be UNKNOWN or UNAVAILABLE","invalid-gap");let F=v(A,"nodeId")===void 0?null:on(v(A,"nodeId"),"gap.nodeId");!_&&F!==null&&!a.has(F)&&V("gap.nodeId references a missing node","unknown-reference");let J=v(A,"depth")??0;(!Number.isInteger(J)||J<0||J>s.depth)&&V("gap.depth exceeds the traversal bound","depth-limit");let G={reason:yt(v(A,"reason"),"gap.reason"),status:M,evidenceIds:jn(A,i,"gap.evidenceIds"),nodeId:F,depth:J,data:He(v(A,"data")??{},"gap.data")};return{id:kn(v(A,"id"),Ce("gap",G),"gap.id"),...G}}function Y(A){return T(),oe(D(A))}function Ne(A){return T(),oe(C(A))}function B(A,b){return T(),oe(z(A,b))}function R(A,b){return T(),oe(ee(A,b))}function x(A,b){return T(),oe(j(A,b))}function w(A){P();let b=D(A);return i.size>=X.evidence&&!i.has(v(b,"id"))&&V("evidence limit reached","evidence-limit"),$t(i,b)}function S(A){P();let b=C(A),_=se({chainFamily:b.chainFamily,network:b.network,reference:b.reference}),M=c.get(_);M&&M!==v(b,"id")&&V("canonical node identity has multiple ids","id-collision"),a.size>=s.nodes&&!a.has(v(b,"id"))&&V("node limit reached","node-limit");let F=$t(a,b);return c.set(_,F),F}function L(A){P();let b=z(A),_=se({from:b.from,to:b.to,relation:b.relation,data:b.data}),M=l.get(_);M&&M!==v(b,"id")&&V("duplicate edge facts have multiple ids","id-collision"),d.size>=s.edges&&!d.has(v(b,"id"))&&V("edge limit reached","edge-limit");let F=$t(d,b);return l.set(_,F),F}function k(A){P();let b=ee(A);return p.size>=X.findings&&!p.has(v(b,"id"))&&V("finding limit reached","finding-limit"),$t(p,b)}function Ie(A){P();let b=j(A);return u.size>=X.gaps&&!u.has(v(b,"id"))&&V("gap limit reached","gap-limit"),$t(u,b)}function ue(A="configured traversal limit reached"){P();let b=yt(A,"truncation reason");f||(m=b),f=!0}function be(A){P(),(y||typeof A!="function")&&V("graph transaction is invalid","invalid-transaction");let b=[i,a,c,d,l,p,u],_=b.map(G=>new Map(G)),M=f,F=m,J={closed:!1};y=!0;try{let G=h.run(J,()=>{try{return A()}finally{J.closed=!0}});return Oc(G)&&(E=!0,V("graph transactions must be synchronous","invalid-transaction")),G}catch(G){throw b.forEach((Ee,Le)=>{Ee.clear();for(let[fe,Ze]of _[Le])Ee.set(fe,Ze)}),f=M,m=F,G}finally{J.closed=!0,y=!1}}function ke(){T(),$(),y&&V("cannot finalize an active graph transaction","invalid-transaction");let A=new Set([...u.values()].flatMap(Q=>Q.evidenceIds));for(let Q of["UNKNOWN","UNAVAILABLE"]){let ft=[...i.values()].filter(Be=>Be.status===Q&&!A.has(v(Be,"id"))).map(Be=>v(Be,"id")).sort(Tr);for(let Be=0;Be<ft.length;Be+=64){if(u.size>=X.gaps){f=!0,m===null&&(m="gap limit reached while explaining unknown evidence");break}let Ti=j({reason:`${Q} evidence did not provide complete public facts`,status:Q,evidenceIds:ft.slice(Be,Be+64),depth:0,data:{generated:!0}});$t(u,Ti)}}let b=Q=>[...Q.values()].sort((ft,Be)=>Tr(ft.id,Be.id)),_=b(i),M=b(a),F=b(d),J=b(p),G=b(u),Ee=G.length>0||f,Le=new Set([...M.flatMap(Q=>Q.evidenceIds),...F.flatMap(Q=>Q.evidenceIds),...J.flatMap(Q=>Q.evidenceIds)]),fe=_.some(Q=>Le.has(Q.id)&&Dn(Q)),Ze=Q=>Q.evidenceIds.some(ft=>Dn(i.get(ft))),Ai=[...M,...F,...J].some(Q=>!Ze(Q)),Si=_.some(Q=>Q.status==="UNKNOWN"||Q.status==="UNAVAILABLE"),vi={status:Ee||Si||Ai||!fe?fe?"PARTIAL":"UNKNOWN":"COMPLETE",truncated:f,truncationReason:m,limits:s,counts:{evidence:_.length,nodes:M.length,edges:F.length,findings:J.length,gaps:G.length},evidenceStatuses:Object.fromEntries(gt.map(Q=>[Q,_.filter(ft=>ft.status===Q).length]))},or={schemaVersion:Dt,posture:rt,reportOnly:!0,target:o,limits:s,evidence:_.map(Ec),nodes:M,edges:F,findings:J,gaps:G,coverage:vi};Qo(or);let Ni={...or,reportHash:se(or)};return g=!0,oe(Ni)}let St=Object.freeze({addEvidence:w,addNode:S,addEdge:L,addFinding:k,addGap:Ie,markTruncated:ue,validateEvidence:Y,validateNode:Ne,validateEdge:B,validateFinding:R,validateGap:x,hasNode:A=>a.has(A),hasEdge:A=>d.has(A),isUsableEvidence:A=>Dn(i.get(A)),finalize:ke});return t===nn&&Yo(St,be),St}function wc(e){pe(e,["schemaVersion","posture","reportOnly","target","limits","evidence","nodes","edges","findings","gaps","coverage","reportHash"],"report"),(v(e,"schemaVersion")!==Dt||v(e,"posture")!==rt||v(e,"reportOnly")!==!0)&&V("report envelope is invalid","invalid-report");let t={evidence:Mt(v(e,"evidence"),"report.evidence",X.evidence),nodes:Mt(v(e,"nodes"),"report.nodes",Ae.maxNodes),edges:Mt(v(e,"edges"),"report.edges",Ae.maxEdges),findings:Mt(v(e,"findings"),"report.findings",X.findings),gaps:Mt(v(e,"gaps"),"report.gaps",X.gaps)};se(e);let n=He(v(e,"coverage"),"report.coverage");(!n||typeof n!="object"||Array.isArray(n))&&V("report.coverage is invalid","invalid-report");let r=$n({target:v(e,"target"),limits:v(e,"limits")});for(let s of t.evidence){pe(s,["id","status","source","observedAt","subject","locator","data","raw","digest"],"report evidence");let i=v(s,"digest"),a=Object.fromEntries(Object.keys(s).filter(l=>l!=="digest").map(l=>[l,v(s,l)])),c=r.addEvidence(a),d=r.validateEvidence(a);(c!==v(s,"id")||v(d,"digest")!==i)&&V("report evidence digest is invalid","invalid-report-digest")}for(let s of t.nodes)r.addNode(s);for(let s of t.edges)r.addEdge(s);for(let s of t.findings)r.addFinding(s);for(let s of t.gaps)pe(s,["id","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"],"report gap"),r.addGap({...s,...v(s,"nodeId")===null?{nodeId:void 0}:{}});v(n,"truncated")===!0&&r.markTruncated(v(n,"truncationReason"));let o=r.finalize();return se(o)!==se(e)&&V("report hash or normalized records are invalid","invalid-report-hash"),o}function Qo(e){e.evidence.length>X.evidence&&V("report evidence exceeds the component handoff limit","component-limit");let t=e.nodes.map(r=>({id:r.id,family:r.chainFamily,chain:r.network,address:r.reference,kind:r.kind,evidenceRefs:r.evidenceIds,data:r.data})),n=e.edges.map(r=>({id:r.id,type:r.relation,fromEntityId:r.from,toEntityId:r.to,evidenceRefs:r.evidenceIds,data:r.data}));return Pn({subject:e.target,entities:t,events:n,evidence:e.evidence.map(r=>({id:v(r,"id"),status:r.status,source:r.source,subject:r.subject,...r.observedAt?{observedAt:r.observedAt}:{},...r.locator!==void 0?{locator:r.locator}:{},data:r.data,...r.raw!==void 0?{raw:r.raw}:{},digest:r.digest})),coverage:e.coverage,gaps:e.gaps.map(r=>({id:r.id,status:r.status,reason:r.reason,evidenceRefs:r.evidenceIds,...r.nodeId?{nodeId:r.nodeId}:{},depth:r.depth,data:r.data}))})}function Ic(e){return Qo(wc(e))}var bf=$n,Ef=Ic;import{types as Un}from"node:util";var Ac=/^[A-Za-z][A-Za-z0-9._:-]{0,127}$/,Sc=/^[a-z][a-z0-9-]*_[0-9a-f]{64}$/,ts=(e,t)=>e<t?-1:e>t?1:0;function _e(e,t="invalid-spider-adapter"){throw new nt(e,t)}function ot(e,t,n){pe(e,t,n);let r={};for(let o of t){let s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(r,o,{value:s?s.value:void 0,enumerable:!0,writable:!1,configurable:!1})}return r}function vc(e){e&&(typeof e=="object"||typeof e=="function")&&Un.isProxy(e)&&_e("request must not be a proxy","invalid-request");let t=e&&(typeof e=="object"||typeof e=="function")?Object.getOwnPropertyDescriptor(e,"schemaVersion"):null;if(t&&!Object.hasOwn(t,"value")&&_e("request.schemaVersion must be own data","invalid-request"),t?.value!==void 0){let n=ot(e,["schemaVersion","requestId","posture","target","limits"],"request"),r=Sr({target:n.target,limits:n.limits});return(n.schemaVersion!==Dt||n.posture!==rt||n.requestId!==r.requestId)&&_e("request envelope does not match its normalized read-only request","invalid-request"),r}return Sr(e)}function Rr(e,t,n=1e3){(Un.isProxy(e)||!Array.isArray(e)||e.length>n)&&_e(`${t} must be a bounded array`,"adapter-limit");let r=new Array(e.length);for(let o=0;o<e.length;o+=1){let s=Object.getOwnPropertyDescriptor(e,String(o));(!s||!Object.hasOwn(s,"value"))&&_e(`${t} must contain dense own data`,"invalid-spider-adapter"),r[o]=s.value}return r}function Nc(e){if(e==null)return{evidence:[],nodes:[],edges:[],findings:[],gaps:[]};let t=ot(e,["evidence","nodes","edges","findings","gaps"],"adapter result"),n=Object.create(null);for(let r of["evidence","nodes","edges","findings","gaps"])n[r]=Rr(t[r]??[],`adapter result.${r}`);return n}function sn(e){return[...e].sort((t,n)=>ts(se(t),se(n)))}function es(e,t){return(typeof e!="string"||!Ac.test(e)||e==="$self"||Sc.test(e))&&_e(`${t} must be a unique, non-reserved adapter key`,"invalid-adapter-key"),e}function Mn(e,t){let n=["evidenceKeys","evidenceIds","evidenceRefs"].filter(o=>e[o]!==void 0);if(n.length>1&&_e("adapter record has ambiguous evidence citation fields","ambiguous-evidence"),n.length===0)return;let r=e[n[0]];return Array.isArray(r)?Rr(r,"adapter evidence references",64).map(o=>t.get(o)??o):r}function Tc(e,t){return Array.isArray(e)?Rr(e,"adapter local references",64).map(n=>t.get(n)??n):e}function xr(e,t,n,r,o){let s=e.addEvidence({status:n,source:o,subject:t.reference,data:{outcome:n.toLowerCase()}});e.addGap({reason:r,status:n,evidenceIds:[s],nodeId:t.id,depth:t.depth,data:{}})}function _r(e,t,n,r,o){try{Nr(e,()=>xr(e,t,n,r,o))}catch{e.markTruncated("record limit reached while recording an investigation gap")}}async function ns(e={}){let t=ot(e,["request","inspect"],"spider options"),n=t.request,r=t.inspect,o=vc(n);r!==void 0&&(typeof r!="function"||Un.isProxy(r))&&_e("inspect must be a non-Proxy function","invalid-adapter");let s=$n({target:o.target,limits:o.limits},nn),i=s.addEvidence({status:"DERIVED",source:"investigation-request",subject:o.target.identifier,data:{requestId:o.requestId,posture:rt}}),a=s.addNode({kind:o.target.type,chainFamily:o.target.chainFamily,network:o.target.network,reference:o.target.identifier,evidenceIds:[i],data:{role:"subject"},depth:0}),c=oe({id:a,kind:o.target.type,chainFamily:o.target.chainFamily,network:o.target.network,reference:o.target.identifier,depth:0}),d=[c],l=new Set([a]),p=0;if(!r)return _r(s,c,"UNAVAILABLE","no read-only inspector is available for this target","inspector"),s.finalize();for(;d.length;){let u=d.shift(),h;try{let m=oe({posture:rt,reportOnly:!0,depth:u.depth,maxDepth:o.limits.depth,remainingNodes:o.limits.nodes-l.size,remainingEdges:o.limits.edges-p,requestId:o.requestId});h=Nc(await r(u,m))}catch{_r(s,u,"UNKNOWN","the read-only inspector did not return usable data","inspector");continue}let f;try{f=Nr(s,()=>{let m=new Map,g=new Set;for(let B of sn(h.evidence)){let R=ot(B,["key","id","status","source","subject","observedAt","locator","data","raw"],"adapter evidence"),x=R.key===void 0?null:es(R.key,"adapter evidence.key");x!==null&&g.has(x)&&_e("adapter evidence keys must be unique","duplicate-adapter-key");let w=s.addEvidence(R);x!==null&&(m.has(x)&&m.get(x)!==w&&_e("adapter evidence key collides with an evidence ID","duplicate-adapter-key"),g.add(x),m.set(x,w)),m.has(w)&&m.get(w)!==w&&_e("adapter evidence ID collides with a key","duplicate-adapter-key"),m.set(w,w)}let y=new Map([["$self",u.id],[u.id,u.id]]),E=new Map,T=new Set,$=new Map,P=new Set(l),U=[],D=p,C=!1,z=!1,ee=!1,j=null,Y=B=>{s.markTruncated(B),ee=!0,j===null&&(j=B)};for(let B of sn(h.nodes)){let R=ot(B,["key","id","kind","chainFamily","network","reference","evidenceKeys","evidenceIds","evidenceRefs","data"],"adapter node"),x=R.key===void 0?null:es(R.key,"adapter node.key");x!==null&&(T.has(x)||y.has(x)||E.has(x))&&_e("adapter node keys must be unique and must not shadow node IDs","duplicate-adapter-key");let w=u.depth+1,S=s.validateNode({id:R.id,kind:R.kind,chainFamily:R.chainFamily,network:R.network,reference:R.reference,evidenceIds:Mn(R,m),data:R.data??{},depth:Math.min(w,o.limits.depth)});(T.has(S.id)||x===S.id)&&_e("adapter node key collides with a normalized node ID","duplicate-adapter-key");let L=se({id:S.id,kind:S.kind,chainFamily:S.chainFamily,network:S.network,reference:S.reference,evidenceIds:S.evidenceIds,data:S.data}),k=$.get(S.id);if(k&&k!==L&&_e("adapter returned conflicting duplicate node identities","conflicting-duplicate"),$.set(S.id,L),x!==null&&T.add(x),P.has(S.id)){s.addNode(S),x!==null&&y.set(x,S.id),y.set(S.id,S.id);continue}if(w>o.limits.depth){Y("depth limit reached before all discovered nodes were visited"),E.set(S.id,S.id),x!==null&&E.set(x,S.id);continue}if(P.size>=o.limits.nodes){Y("node limit reached before all discovered nodes were added"),E.set(S.id,S.id),x!==null&&E.set(x,S.id);continue}let Ie=s.addNode(S),ue=oe({id:Ie,kind:S.kind,chainFamily:S.chainFamily,network:S.network,reference:S.reference,depth:w});P.add(Ie),U.push(ue),y.set(Ie,Ie),x!==null&&y.set(x,Ie),S.evidenceIds.some(be=>s.isUsableEvidence(be))&&(C=!0)}U.sort((B,R)=>ts(B.id,R.id));let Ne=new Set;for(let B of sn(h.edges)){let R=ot(B,["id","from","to","relation","evidenceKeys","evidenceIds","evidenceRefs","data"],"adapter edge"),x=k=>y.has(k)?{id:y.get(k),omitted:!1}:E.has(k)?{id:E.get(k),omitted:!0}:{id:k,omitted:!1},w=x(R.from),S=x(R.to),L=s.validateEdge({id:R.id,from:w.id,to:S.id,relation:R.relation,evidenceIds:Mn(R,m),data:R.data??{}},{allowMissingNodes:!0});if(w.omitted||S.omitted){Y("an edge was omitted because its discovered node was outside the configured bounds"),Ne.add(L.id);continue}if((!P.has(L.from)||!P.has(L.to))&&_e("adapter edge references an unknown node","unknown-reference"),s.hasEdge(L.id)){s.addEdge(L);continue}if(D>=o.limits.edges){Y("edge limit reached before all discovered edges were added"),Ne.add(L.id);continue}s.addEdge(L),D+=1,L.evidenceIds.some(k=>s.isUsableEvidence(k))&&(C=!0)}for(let B of sn(h.findings)){let R=ot(B,["id","kind","summary","status","evidenceKeys","evidenceIds","evidenceRefs","nodeIds","edgeIds","data"],"adapter finding"),x=s.validateFinding({id:R.id,kind:R.kind,summary:R.summary,status:R.status,evidenceIds:Mn(R,m),nodeIds:Tc(R.nodeIds,new Map([...E,...y])),edgeIds:R.edgeIds,data:R.data},{allowMissingReferences:!0});if(x.nodeIds.some(S=>E.has(S))||x.edgeIds.some(S=>Ne.has(S))){Y("a finding was omitted because a cited graph record was outside the configured bounds");continue}s.addFinding(x),C=!0}for(let B of sn(h.gaps)){let R=ot(B,["id","reason","status","evidenceKeys","evidenceIds","evidenceRefs","nodeId","depth","data"],"adapter gap"),x=Mn(R,m);(x===void 0||Array.isArray(x)&&x.length===0)&&(x=[s.addEvidence({status:R.status,source:"inspector",subject:u.reference,data:{outcome:"gap"}})]);let w=R.nodeId!==void 0&&E.has(R.nodeId),S=R.nodeId===void 0?u.id:y.get(R.nodeId)??E.get(R.nodeId)??R.nodeId,L=s.validateGap({id:R.id,reason:R.reason,status:R.status,evidenceIds:x,nodeId:S,depth:R.depth??u.depth,data:R.data},{allowMissingNode:!0});if(w){Y("a gap was reattached because its discovered node was outside the configured bounds");continue}s.addGap(L),z=!0}return ee?(xr(s,u,"UNKNOWN",j,"inspector-bounds"),z=!0):!C&&!z&&xr(s,u,"UNKNOWN","the read-only inspector returned no usable evidence for this node","inspector-empty"),{added:U,edgeCount:D}})}catch{_r(s,u,"UNKNOWN","the read-only inspector returned data outside the investigator contract","inspector-contract");continue}for(let m of f.added)l.add(m.id);d.push(...f.added),p=f.edgeCount}return s.finalize()}function _c(e={}){let n=ot(e,["inspect"],"spider factory options").inspect;return n!==void 0&&(typeof n!="function"||Un.isProxy(n))&&_e("inspect must be a non-Proxy function","invalid-adapter"),Object.freeze({posture:rt,investigate(r){return ns({request:r,inspect:n})}})}var vf=ns,Nf=_c;import{types as qr}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"}),Lr=Object.freeze(["block_number","index"]),rs=new Set([...Lr,"items_count","value","hash","inserted_at","fee"]);function an(e){return Number.isSafeInteger(e)&&e>=0}function bt(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 xc(e){if(!je(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==Lr.length||t.some(o=>!Lr.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=bt(e,"block_number","blockscout transaction",!0),r=bt(e,"index","blockscout transaction",!0);if(!an(n)||!an(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function Rc(e){if(!je(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>rs.size||t.some(a=>!rs.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=bt(e,"block_number","blockscout provider",!0),r=bt(e,"index","blockscout provider",!0);if(!an(n)||!an(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=bt(e,"items_count","blockscout provider");if(o!==void 0&&!an(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=bt(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=bt(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=bt(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 Lc(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 os(e){return!!Fn[Number(e)]}async function ss(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=xc(s);for(let[f,m]of Object.entries(h))m!=null&&o.set(f,String(m))}let i=`${Lc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=le(await ce(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=Pe(a,"items");if(!je(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,p=Pe(a,"next_page_params");if(p!=null){if(!je(p))throw new Error("blockscout transactions returned an invalid next cursor");l=Rc(p)}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 Pc="mainnet-beta",Pr="https://api.mainnet-beta.solana.com";function Cc(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||Pr).trim()}function kc(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 jc(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=le(await ce(Cc(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(!je(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=Pe(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${Pe(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return Pe(o,"result")}async function is(e={},t={}){let n=kc(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 jc("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:Pc,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 Dc="mainnet",Cr="https://mempool.space/api",kr="https://mempool.space/testnet/api";function as(e={}){return String(e.network||process.env.BTC_NETWORK||Dc).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function $c(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):as(e)==="testnet"?kr:Cr}function Mc(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 Uc(e,t={}){let n=`${$c(t)}${e.startsWith("/")?e:`/${e}`}`;return le(await ce(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function cs(e={},t={}){let n=Mc(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 Uc(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:as(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 jr="https://api.hyperliquid.xyz/info",Dr="https://api.hyperliquid-testnet.xyz/info";function Fc({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"?Dr:jr}async function Vc(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Fc(t);return le(await ce(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function ls(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Vc({type:"userFills",user:e},t)}var ds="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ut({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:us(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([us(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[ds]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${ds}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function us(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ye(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function Ft(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 $r="https://api.trongrid.io",zc=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],Bc="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function Hc(e={}){return Ut({provider:"tron-public",defaultUrl:$r,hosts:zc,url:e.baseUrl||process.env.TRON_API_URL||""})}function qc(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return Ye(t)}function Gc(e,t){return Ft({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Wc(e,t={}){let n=Hc(t),r=qc(t),o=le(await ce(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Gc(n.trusted,r)}),"tron-public response");return et(o,n.trusted?r:"","tron-public response")}function fs(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 Yc(e){return Ct({error:"tron-public request failed"},e)}function Kc(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 ps(e={},t={}){try{let n=fs(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?Bc:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",fs(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 Wc(`/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:Kc(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 Yc(n)}}var Fr="https://toncenter.com/api",Jc=["toncenter.com","testnet.toncenter.com"];function Zc(e={}){return Ut({provider:"ton-public",defaultUrl:Fr,hosts:Jc,url:e.baseUrl||process.env.TON_API_URL||""})}function Xc(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return Ye(t)}function Qc(e,t){return Ft({Accept:"application/json"},{"X-API-Key":t},e)}async function el(e,t={}){let n=Zc(t),r=Xc(t),o=le(await ce(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Qc(n.trusted,r)}),"ton-public response");return et(o,n.trusted?r:"","ton-public response")}function tl(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 nl(e){return Ct({error:"ton-public request failed"},e)}function rl(e,t){if(!je(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(Pe(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 Pe(e,"result")}function Mr(e){let t=String(e??"").trim();if(pt(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||mt(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function Ur(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 ms(e={},t={}){try{let n=tl(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:Mr(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=rl(await el(`/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:Mr(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 p=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=Mr(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),T=m.out_msgs??[];if(T.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let $=0n;for(let U of T){if(!U||typeof U!="object"||Array.isArray(U))throw new Error("ton-public: malformed outbound message");$+=BigInt(Ur(U.value??"0","outbound message value",{nullable:!1}))}let P=E?String($):null;if(P!=null&&P.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:m.utime??null,feeNano:Ur(m.fee,"transaction fee"),inMessageValueNano:Ur(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:T.length,outMessageValueNano:P}}),u=c.length>=i,h=p.length>0?p[p.length-1]:null,f=u&&h?{lt:h.lt,hash:h.hash}:null;return{provider:"ton-public",address:n,limit:r,count:p.length,cursor:s,nextCursor:f,pageComplete:!u,continuationUnknown:u&&!f,transactions:p}}catch(n){return nl(n)}}var st=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"})}),hs="cosmoshub";function ol(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function sl(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||hs).trim().toLowerCase(),o=Object.hasOwn(st,r)?st[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=ol(r)||r===hs&&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(st).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 il(e,t,n={}){return le(await ce(`${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 al(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 cl(e){return{error:String(e?.message||e).slice(0,200)}}function ll(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 dl(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function ul(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:dl(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?ll(r,t.decimals):null}}async function gs(e={},t={}){try{let n=sl(e,t),r=al(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 il(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(p=>ul(p,n)),l=d.find(p=>p.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(p=>p.ibcHash).length,balances:d,nextKey:i?.pagination?.next_key??null}}catch(n){return cl(n)}}var zr="https://fullnode.mainnet.aptoslabs.com",Vr="0x1::aptos_coin::AptosCoin",Vn=8;function Es(e={}){return Ut({provider:"aptos-public",defaultUrl:zr,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function Os(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return Ye(t)}function ws(e,t){return Ft({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function ys(e,t={}){let n=Es(t),r=Os(t),o=le(await ce(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:ws(n.trusted,r)}),"aptos-public response");return et(o,n.trusted?r:"","aptos-public response")}function fl(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 pl(e){return Ct({error:"aptos-public request failed"},e)}function bs(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 ml(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function Is(e={},t={}){try{let n=fl(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 p=null,u="view";try{let f=Es(t),m=Os(t),g=et(le(await ce(`${f.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:ws(f.trusted,m)}),"aptos-public view response"),f.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");p=String(g[0])}catch{u="coinstore";let f=await ys(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(f?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");p=String(f.data.coin.value)}let h=r===Vr;return{provider:"aptos-public",address:n,source:u,count:1,balances:[{coinType:r,raw:p??"0",decimals:h?Vn:null,symbol:h?"APT":null,amount:h?bs(p??"0",Vn):null}]}}let s=Math.min(201,o+1),i=await ys(`/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 p of a){if(!p||typeof p!="object"||Array.isArray(p)||typeof p.type!="string"||p.type.length===0||p.type.length>512||!p.data||typeof p.data!="object"||Array.isArray(p.data))throw new Error("aptos-public: account resources contained a malformed row");let u=ml(p.type);if(!u)continue;let h=String(p.data?.coin?.value??"");if(!/^\d+$/u.test(h))throw new Error("aptos-public: coin store contained an invalid balance");let f=u===Vr;c.push({coinType:u,raw:h,decimals:f?Vn:null,symbol:f?"APT":null,amount:f?bs(h,Vn):null,frozen:p?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(p=>p.coinType===Vr)||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 pl(n)}}var Gr="oracle.investigator-fact-projection/1",xs=4*1024*1024;function $e(e){return oe(e)}var Et=oe({evm:$e({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:$e({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:$e({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:$e({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:$e({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:$e({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:$e({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(st)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:$e({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:$e({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:$e({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:$e({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":$e({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:$e({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})}),hl=Et,gl=Et,As=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"}),Ss=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"}),vs=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"}),yl=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),qn=Symbol("missing-public-fact"),zn=8;function bl(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(As,t)?As[t]:t)||"unsupported"}function Yn(e){return je(e)&&Object.getPrototypeOf(e)===Object.prototype}function Z(e,t){return Pe(e,t)}function ct(e){return je(e)}function Hr(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(qr.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]=Hr(i.value,t+1)}return o}if(!ct(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]=Hr(s.value,t+1)}return r}function El(e){if(!Yn(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 Ol(e){if(!ct(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=Z(e,"fetchImpl"),o=Z(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!Yn(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 wl(e){let t=Z(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 Il(e,t,n){let r=Object.hasOwn(Ss,t)?Ss[t]:void 0,o=Object.hasOwn(vs,e)?vs[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)||ie(s))throw new Error("investigator collector: chainId is invalid");return s}function Bn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Al(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 Rs(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 Al(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function Wr(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&Zt(e)}function Me(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return wn(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&Bn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&Bn(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 Rs(n)!==null;if(e==="cosmos"){if(!Bn(n))return!1;let r=Object.hasOwn(st,t)?st[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)&&Bn(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||Wr(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 qe(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"?Rs(t)??t:t}function Sl(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)||!Me(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&Me(e,t,r)||e==="liquid"&&Wr(r);if(ie(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return qe(e,r)}function vl(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 Nl(e,t,n){if(t===Et.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 Ls(e={}){El(e);let t=Z(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)||ie(n))throw new Error("investigator collector: family is invalid");let r=bl(n),o=Object.hasOwn(Et,r)?Et[r]:Et.unsupported,s=Il(r,n,Z(e,"chainId"));Nl(r,o,s);let i=Sl(r,s,Z(e,"address")),a=vl(Z(e,"limit"),o),c=Z(e,"cursor"),d=c===void 0?null:kt(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 ln(e,t){return`${e}_${se(t).slice(7,55)}`}function Ps(e,t,n){return ln("entity",{family:e,chain:t,address:n,kind:"address"})}function Tl(e){return{id:Ps(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function Kn(e,t,n,r=[]){return{schemaVersion:_n,execution:"read-only",status:t,subject:e,entities:[Tl(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function at(e,t){return{code:e,message:t}}var Gn=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 cn(e,t="provider-unavailable"){let n=i=>Pe(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(Gn,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:Gn[s]})}function _l(e){return cn(e).message}function Cs(e,t,n,r,o,s=!1){return{id:ln("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:Gr,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:s,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function Br(e,t,n,r,o,s){let i=t?.source||null,a=Pe(r,"code"),c=a&&Object.hasOwn(Gn,a)?Object.freeze({code:a,httpStatus:Pe(r,"httpStatus")??null,message:Gn[a]}):cn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=Kn(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(Cs("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=Kn(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[at("unavailable",r)]);return o.evidence.push(Cs("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function xl(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=Ye(process.env[n]);if(r)return r}return null}function it(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof Z(n,"fetchImpl")=="function"?Z(n,"fetchImpl"):void 0,timeoutMs:Z(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:xs,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:Fn[Number(t.chainId)]}):e==="solana"?s({rpcUrl:Pr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?kr:Cr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?Dr:jr}):e==="tron"?s({baseUrl:$r}):e==="ton"?s({baseUrl:Fr}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(st,t.chainId)?st[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:zr}):e==="liquid"?s({baseUrl:pr}):o}var Ns=Object.freeze({evm:(e,t,n)=>ss(e,it("evm",e,t,n)),solana:(e,t,n)=>is(e,it("solana",e,t,n)),bitcoin:(e,t,n)=>cs(e,it("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>ls(e.address,it("hyperliquid",e,t,n)),tron:(e,t,n)=>ps(e,it("tron",e,t,n)),ton:(e,t,n)=>ms(e,it("ton",e,t,n)),cosmos:(e,t,n)=>gs(Object.assign(Object.create(null),e,{chain:e.chainId}),it("cosmos",e,t,n)),aptos:(e,t,n)=>Is(e,it("aptos",e,t,n)),liquid:(e,t,n)=>Ro(e,it("liquid",e,t,n))});function Rl(e,t,n,r){let o=Z(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(Ns,e)?Ns[e]:null;return c?d=>c(d,n,r):void 0}function Oe(e){return typeof e=="string"?e||null:Z(e,"hash")||Z(e,"address")||null}function ks(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 qn;let r=yl.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)&&!ie(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 ie(e)&&!a?qn:e}function q(e,t,n,r,o){let s=ks(r,n,o);return s===qn||r===void 0?!1:(e[n]=s,t.push(n),!0)}function Yr(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=ct(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:Gr,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||d,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...s}}function Ll(e,t){let n={},r=[];q(n,r,"transactionHash",e.hash),q(n,r,"blockNumber",e.block_number),q(n,r,"timestamp",e.timestamp),q(n,r,"fromAddress",Oe(e.from)),q(n,r,"toAddress",Oe(e.to)),q(n,r,"createdContractAddress",zt("evm",t,Oe(e.created_contract))?Oe(e.created_contract):void 0),q(n,r,"value",e.value),q(n,r,"status",e.status),q(n,r,"fee",ct(e.fee)?e.fee.value:e.fee),q(n,r,"gasUsed",e.gas_used),q(n,r,"gasLimit",e.gas_limit),q(n,r,"nonce",e.nonce);let o=Oe(e.token);return q(n,r,"tokenAddress",typeof o=="string"&&Me("evm",t,o)?o:void 0),q(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 Pl(e,t){if(!ct(e))return null;let n={},r=[];return q(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),q(n,r,"outputIndex",e.vout),q(n,r,"coinbase",e.is_coinbase),q(n,r,"sequence",e.sequence),q(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&Me("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),q(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function Cl(e,t,n){if(!ct(e))return null;let r={index:t},o=[];return q(r,o,"address",typeof e.scriptpubkey_address=="string"&&Me("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),q(r,o,"value",e.value),q(r,o,"scriptType",e.scriptpubkey_type,64),r}function kl(e,t){let n={},r=[];q(n,r,"transactionId",e.txid),q(n,r,"version",e.version),q(n,r,"locktime",e.locktime),q(n,r,"size",e.size),q(n,r,"weight",e.weight),q(n,r,"fee",e.fee);let o={},s=[];q(o,s,"confirmed",e.status?.confirmed),q(o,s,"blockHeight",e.status?.block_height),q(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),q(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,zn).map(l=>Pl(l,t)).filter(Boolean),d=a.slice(0,zn).map((l,p)=>Cl(l,p,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>zn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>zn})}}function _t(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):Z(t,a);q(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 Wn(e,t,n){return e==="evm"?Ll(n,t):e==="bitcoin"?kl(n,t):e==="solana"?_t(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>Z(r,"err")!==null&&Z(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?_t(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"?_t(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"?_t(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?_t(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?_t(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):_t(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function Bt(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"||qr.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");Bt(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");Bt(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function js(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!ie(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)&&!ie(e)}function jl(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)&&!ie(e)}function Vt(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:js(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Dl(e){if(typeof e!="string"||pt(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&&!mt(t)}catch{return!1}}function zt(e,t,n){return n==null||typeof n=="string"&&Me(e,t,n)}function Ds(e,t,n){return`${e}:${String(t)}:${n}`}function Ts(e,t,n){let r=Oe(n);return typeof r=="string"&&Me(e,t,r)?Ds(e,t,qe(e,r)):null}function Ht(e,t,n){return typeof t=="string"&&typeof n=="string"&&qe(e,t)===qe(e,n)}function $l(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"&&Me("bitcoin",t,i)&&Ht("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&Me("bitcoin",t,i)&&Ht("bitcoin",i,n)})}function Ml(e,t,n,r){if(!ct(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&zt("evm",t,Oe(r.from))&&zt("evm",t,Oe(r.to))&&zt("evm",t,Oe(r.created_contract))&&[Oe(r.from),Oe(r.to),Oe(r.created_contract)].some(o=>Ht("evm",o,n))&&Ke(r.block_number,32)&&Ke(r.value,100)&&Vt(r.timestamp,{iso:!0});if(e==="solana")return In(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&Vt(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&ct(r.status)&&$l(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)))&&Vt(r.status.block_time);if(e==="hyperliquid"){let o=js(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)&&jl(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&Vt(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&Me("tron",t,r.from)&&typeof r.to=="string"&&Me("tron",t,r.to)&&[r.from,r.to].some(o=>Ht("tron",o,n))&&typeof r.tokenAddress=="string"&&Me("tron",t,r.tokenAddress)&&Ke(r.raw,100,{nullable:!1})&&Vt(r.blockTimestamp):e==="ton"?Dl(r.hash)&&Ke(r.lt,40,{nullable:!1})&&zt("ton",t,r.inMessageSource)&&zt("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>Ht("ton",o,n))&&Ke(r.inMessageValueNano,100)&&Vt(r.utime):!1}function Ul(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:Yn(t)?e==="evm"||e==="bitcoin"||e==="ton"?Z(t,"transactions")??null:e==="solana"?Z(t,"signatures")??null:e==="tron"?Z(t,"transfers")??null:null:null}function _s(e,t,n){if(e==="evm")return{type:"transaction",from:Oe(n.from)?qe("evm",Oe(n.from)):null,to:Oe(n.to)??Oe(n.created_contract)?qe("evm",Oe(n.to)??Oe(n.created_contract)):null,asset:Ts("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=ks(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===qn?null:Ds("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?qe("tron",n.from):null,to:n.to?qe("tron",n.to):null,asset:Ts("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?qe("ton",n.inMessageSource):null,to:n.inMessageDestination?qe("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 Fl(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=qe(e.subject.family,s),a=n.get(i);a||(a=Ps(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 $s(e,t){if(qr.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]=Hr(s.value)}return r}function Vl(e,t,n,r,o,s,i,a){let c=$s(o,n.applied+1);if(c.some(D=>!Ml(e.family,e.chain,e.address,D)))throw new Error(`${t.source} returned a malformed history row`);let d=c.length>n.applied,l=c.slice(0,n.applied),p=!!(!Array.isArray(r)&&Z(r,"truncated")),u=Array.isArray(r)?null:Z(r,"nextCursor")??null;for(let D of l)Bt(Wn(e.family,e.chain,D).facts,a),Bt(_s(e.family,e.chain,D),a);Bt(u,a);let h=!!(!Array.isArray(r)&&Z(r,"continuationUnknown")),f=!Array.isArray(r)&&Z(r,"pageComplete")===!0,m=u!=null&&!t.cursor,g=l.length===n.applied&&u==null&&!f,y=[];(p||d)&&y.push(at("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&y.push(at("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(at("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=p||d||h||m||g||e.family==="tron",T=null;if(t.cursor&&u!=null&&!d)try{T=Uo({family:e.family,chain:e.chain,address:e.address,provider:t.source},u)}catch{y.push(at("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let $=Kn(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),P=new Set,U=new Set;return l.forEach(D=>{let C=_s(e.family,e.chain,D),z=Wn(e.family,e.chain,D),ee=ln("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:C.locator,publicFacts:z.facts}),j=ln("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:C.type,locator:C.locator,from:C.from,to:C.to,asset:C.asset,amount:C.amount,transactionId:C.transactionId,blockHeight:C.blockHeight,timestamp:C.timestamp});if(P.has(j))throw new Error(`${t.source} returned duplicate event identity`);if(U.has(ee))throw new Error(`${t.source} returned duplicate evidence identity`);P.add(j),U.add(ee),$.evidence.push({id:ee,status:"OBSERVED",source:t.source,observedAt:s,locator:C.locator,publicFacts:z.facts,projection:z.projection}),$.events.push({id:j,type:C.type,from:C.from,to:C.to,asset:C.asset,amount:C.amount,transactionId:C.transactionId,blockHeight:C.blockHeight,timestamp:C.timestamp,evidenceRefs:[ee]})}),Fl($),t.cursor&&($.cursor={requested:i,next:T}),$}function zl(e,t){return Yn(t)?e==="liquid"?Z(t,"provider")==="liquid-esplora"&&Number.isFinite(Z(t,"txCount"))?[t]:null:Z(t,"balances")??null:null}function Bl(e,t,n,r){if(!ct(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)&&(!ie(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&&!ie(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"&&Me("liquid",t,r.address)&&Ht("liquid",r.address,n)&&r.confidential===Wr(r.address)&&(r.balanceSats===null||Ke(r.balanceSats,100,{nullable:!1})):!1}function Hl(e,t,n,r,o,s,i){let a=$s(o,n.applied+1);if(a.some(h=>!Bl(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)Bt(Wn(e.family,e.chain,h).facts,i);let d=!!Z(r,"truncated")||a.length>n.applied,l=[at("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(at("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(f=>f.confidential===!0);l.push(at("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(at("response-truncated","provider evidence exceeded the safe record bound"));let p=Kn(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 f=Wn(e.family,e.chain,h),m=ln("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:f.facts});if(u.has(m))throw new Error(`${t.source} returned duplicate evidence identity`);u.add(m),p.evidence.push({id:m,status:"OBSERVED",source:t.source,observedAt:s,locator:{address:e.address},publicFacts:f.facts,projection:f.projection})}),p}async function Ms(e={},t={}){Ol(t);let n=Ls(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=wl(t);if(c.status==="UNAVAILABLE"||c===Et.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"&&!os(o))return Hn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let p=xl(r),u=Rl(r,c,t,p);if(typeof u!="function")return Hn(d,{...c,reason:"collector transport is unavailable"},l);let h=a?.payload??null,f=Object.assign(Object.create(null),{address:s,chainId:o,limit:i.applied,cursor:h});r==="solana"&&(f.before=h),r==="tron"&&(f.contract="all",f.onlyConfirmed=!0),r==="ton"&&h&&(f.lt=h.lt,f.hash=h.hash);let m;try{m=await u(f)}catch(g){return Br(d,c,i,cn(g),l,a)}if(Z(m,"error")){let g=To(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 Br(d,c,i,cn(y,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=zl(r,m);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return Hl(d,c,i,m,y,l,p)}let g=Ul(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return Vl(d,c,i,m,g,l,a,p)}catch{return Br(d,c,i,cn(null,"provider-invalid-response"),l,a)}}var ql=Object.freeze(Object.create(null));async function vp(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return Ms(e,ql)}import{createHash as Gl}from"node:crypto";import{types as De}from"node:util";var Wl="oracle.coordination/1",Lp=oe({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Pp=oe({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Yl=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}),Ge=Object.freeze({maxEntities:Ae.maxNodes,maxEvents:Ae.maxEdges,maxEvidence:X.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),un=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),fn=new Set(["FUND","FUNDING"]),Ws=new Set([...un,...fn,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),Kl=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),Jl=new Set(["CREATOR","DEPLOYER"]),Us=new Set(gt),Fs=new Set(["LIVE","INDEXED"]);var Vs=250,Zl=32,Xl=32,he=(e,t)=>e<t?-1:e>t?1:0,ge=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},Ue=e=>(ge(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",xe=e=>ge(typeof e=="object"&&e!==null?I(e,"id"):e),we=e=>[...new Set(e.filter(Boolean))].sort(he),Ql=(e,t)=>he(e.id,t.id),Je=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},ed=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,to=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=ge(e);if(!t)return null;let n=ed.exec(t);if(!n)return null;let[,r,o,s,i,a,c,d="",l]=n,[p,u,h,f,m,g]=[r,o,s,i,a,c].map(Number);if(u<1||u>12||h<1||f>23||m>59||g>59)return null;if(l!=="Z"){let[$,P]=l.slice(1).split(":").map(Number);if($>23||P>59)return null}let y=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(p,u-1,h),E.setUTCHours(f,m,g,y),E.getUTCFullYear()!==p||E.getUTCMonth()!==u-1||E.getUTCDate()!==h||E.getUTCHours()!==f||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let T=Date.parse(t);return Number.isFinite(T)?T:null},Ys=e=>Array.isArray(e)?e:[],I=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&De.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},ne=(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(De.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},lt=(e,t={})=>Object.assign(Object.create(null),e,t),Zn=(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},Kr=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),td=Object.freeze(["id","status"]),Jr=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"]),nd=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),rd=Object.freeze(["numerator","denominator","bps"]),od=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),sd=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function Ks(e){return we([Ue(I(e,"kind")),...ne(I(e,"roles")).map(Ue),...ne(I(e,"tags")).map(t=>Ue(!t||typeof t!="object"?t:I(t,"name")??I(t,"value")))])}function no(e){return e?I(e,"isService")===!0?!0:Ks(e).some(t=>Kl.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function Js(e){return Jl.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function Jn(e){return Ks(e).some(Js)}function id(e){if(!Jn(e)||no(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(I(e,r)!==void 0)return!1;let t=ne(I(e,"roles")).map(Ue),n=ne(I(e,"tags")).map(r=>Ue(r&&typeof r=="object"?I(r,"name")??I(r,"value"):r));return[...t,...n].every(Js)}function Fe(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"||De.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 Gt(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function Zs(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=Gt(e,n),o=Gt(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function ad(e,t){let n=Zs(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function cd(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=Gt(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=Gt(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function Xs(e){if(e&&typeof e=="object"){if(De.isProxy(e)||Array.isArray(e)||!Yt(e,rd)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=I(e,"numerator"),c=I(e,"denominator"),d=I(e,"bps"),l=a!=null||c!=null,p=null;if(l&&(a==null||c==null||(p=Zs(Fe(a),Fe(c)),!p)))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!p&&!u||p&&u&&Number(p.numerator*10000n/p.denominator)!==d?null:p??u}let t=ge(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 ld(e){if(!Array.isArray(e)||e.length>Ae.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 dd(e){let t=Xs(e);return t?Number(t.numerator*10000n/t.denominator):null}var qt=Symbol("alias-conflict");function Ve(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 qt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return qt;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 qt;r=l,o=d}return r}function ro(e,t=64){if(e===void 0)return[];if(Ot(e,t))return null;let n=ne(e,t).map(xe);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(he)}function Qs(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 eo(e,t){return Ve(e,t,n=>{let r=Fe(n);return r?{identity:Qs(r),value:n}:null})}function Zr(e,t){return Ve(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 Yt(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")||!Wt(a.value,s,0))return!1}return!0}function Wt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>X.dataNodes||n>X.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<=X.string;if(!e||typeof e!="object"||De.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>X.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>X.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")||!Wt(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>X.dataFields||(r.fields+=i.length,r.fields>X.dataTotalFields)?!1:i.every(([,a])=>Wt(a,r,n+1))}finally{r.active.delete(e)}}function ei(e,t){let n=I(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||De.isProxy(n)||Array.isArray(n)||!Wt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>X.dataFields)return null;let o=Zn(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 ud(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e)||!Yt(e,nd))return null;let t=Ve(e,["entityId","entity","holder"],xe),n=eo(e,["balance","amount"]),r=ro(I(e,"evidenceRefs"));return!t||t===qt||n===qt||n===null||r===null?null:lt({},{entityId:t,balance:n,evidenceRefs:r})}function fd(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e)||!Yt(e,Kr))return null;let t=ei(e,Kr);if(!t||Object.hasOwn(t,"isService")&&typeof I(t,"isService")!="boolean")return null;let n=xe(I(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=I(t,d);if(l!=null&&to(l)===null)return null}let r=I(t,"roles"),o=I(t,"tags"),s=I(t,"evidenceRefs");if([r,o,s].some(d=>Ot(d)))return null;let i=I(t,"supplyShare");if(i!==void 0&&dd(i)===null)return null;let a=Zn(t,Kr);a.roles=ne(r),a.tags=ne(o);let c=ro(s);return c===null?null:(a.evidenceRefs=c,lt(a,{id:n}))}function pd(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e)||!Yt(e,od))return null;let t=xe(I(e,"id"));if(!t)return null;let n=I(e,"status"),r=typeof n=="string"?n:"MISSING";return lt(Zn(e,td),{id:t,status:r})}function md(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e)||!Yt(e,Jr))return null;let t=ei(e,Jr);if(!t)return null;let n=xe(I(t,"id"));if(!n||Ot(I(t,"holders"))||Ot(I(t,"evidenceRefs")))return null;let r=Ve(t,["from","fromEntityId","funderId"],xe),o=Ve(t,["to","toEntityId","recipientId"],xe),s=Ve(t,["actor","actorEntityId","buyerId"],xe),i=Ve(t,["asset","assetId","tokenId"],xe),a=Ve(t,["pool","poolId"],xe),c=Ve(t,["sourceChain","fromChain"],ge),d=Ve(t,["destinationChain","toChain"],ge),l=Ve(t,["transactionId","transactionHash","txId","txid","hash"],xe),p=Ve(t,["bridgeTransferId"],xe),u=Zr(t,["blockHeight","blockNumber"]),h=Zr(t,["transactionIndex"]),f=Zr(t,["eventIndex","logIndex","index"]),m=eo(t,["amount","value","quantity"]),g=eo(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,p,u,h,f,m,g].includes(qt))return null;let y=ro(I(t,"evidenceRefs"));if(y===null)return null;let E=I(t,"timestamp"),T=to(E);if(E!=null&&T===null)return null;let P=ne(I(t,"holders")).map(ud);if(P.some(C=>C===null))return null;let U=P.map(C=>C.entityId);if(new Set(U).size!==U.length)return null;let D=Zn(t,Jr);return D.holders=P,lt(D,{id:n,type:Ue(I(t,"type")),from:r,to:o,actor:s,asset:i,pool:a,sourceChain:c,destinationChain:d,bridgeTransferId:p,transactionId:l,blockPosition:u,transactionPosition:h,eventPosition:f,amount:m,totalSupply:g,timestampMs:T,evidenceRefs:y})}function Xr(e,t,n,r,o,s){if(De.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(Ql),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function dn(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function hd(e){let t=ge(I(e,"family")),n=ge(I(e,"address")),r=I(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):ge(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=tn(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 gd(e){let t=new Map;for(let n of e){let r=hd(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function zs(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Qr(e){let t=Fe(e);return t?Qs(t):"-"}function yd(e){let t=ne(I(e,"holders")).map(n=>`${zs(I(n,"entityId"))}:${Qr(I(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,Qr(I(e,"amount")),Qr(I(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(zs).join("|")}function bd(e){let t=new Set;for(let n of e){let r=yd(n);if(t.has(r))return!0;t.add(r)}return!1}function dt(e,t,n,r,o,s,i=[]){let a=Gl("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:we(n),reasons:o,caveats:we(i),evidenceRefs:we(r),score:Yl[e]}}function Ed(e,t,n){let r=[...e].sort((l,p)=>l.timestampMs-p.timestampMs||he(l.id,p.id)),o=[],s=new Map,i=0,a=0,c=l=>{let p=l.actor??l.from;p&&s.set(p,(s.get(p)??0)+1)},d=l=>{let p=l.actor??l.from;if(!p)return;let u=(s.get(p)??0)-1;u<=0?s.delete(p):s.set(p,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 te(e,t){let n=ne(I(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function Bs(e,t){let n=ne(I(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function me(e,t){return typeof e=="string"&&t.has(e)}function Hs(e){let t=I(e,"type");if(!Ws.has(t))return!1;let n=I(e,"from"),r=I(e,"to"),o=I(e,"actor")??n,s=I(e,"asset"),i=I(e,"timestampMs");if(fn.has(t))return!!(n&&r);if(un.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(ge(I(e,"sourceChain"))&&ge(I(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=ne(I(e,"holders")).some(c=>xe(I(c,"entityId"))&&Fe(I(c,"balance")));return!!(s&&Fe(I(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Fe(I(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function pn(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 Od(e,t,n,r,o){let s=e.filter(d=>fn.has(d.type)&&me(d.from,t)&&me(d.to,t)&&te(d,n).length),i=pn(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([p],[u])=>he(p,u))){let p=t.get(d);if(no(p))continue;let u=we(l.map(g=>g.to).filter(g=>g!==d));if(u.length<r.minCommonRecipients)continue;let h=te(p,n);if(h.length===0){c.add(d);continue}let f=new Set(u),m=l.filter(g=>f.has(g.to));a.push(dt("COMMON_NON_SERVICE_FUNDER",d,[d,...u],[...h,...m.flatMap(g=>te(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:u.length,eventIds:we(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 wd(e,t,n,r){let o=e.filter(a=>un.has(a.type)&&me(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&te(a,n).length).map(a=>lt(a,{actor:a.actor??a.from})),s=pn(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>he(d,l)))for(let d of Ed(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=we(d.map(h=>h.actor)),[p,u]=a.split("\0");i.push(dt("SYNCHRONIZED_ACTIVITY",`${p.toLowerCase()}:${u}:${d[0].id}`,l,d.flatMap(h=>te(h,n)),[{activityType:p,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 Id(e,t,n){if(!e)return null;if(I(e,"fresh")===!0)return"fresh";let r=I(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=I(e,"firstSeenAt"),s=I(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=to(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function Ad(e,t,n,r,o){let s=e.filter(l=>un.has(l.type)&&me(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&te(l,n).length).map(l=>lt(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let p=t.get(l.actor),u=Id(p,l.timestampMs,r);if(!u)continue;let h=te(p,n);if(h.length===0){a.add(l.actor);continue}i.push(lt(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=pn(i,l=>l.asset),d=[];for(let[l,p]of[...c].sort(([u],[h])=>he(u,h))){let u=we(p.map(f=>f.actor));if(u.length<r.minClusterSize)continue;let h=u.map(f=>{let m=p.filter(g=>g.actor===f);return{entityId:f,bases:we(m.map(g=>g.freshnessBasis)),evidenceRefs:we(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(dt("FRESH_WALLET_CLUSTER",l,u,[...p.flatMap(f=>te(f,n)),...h.flatMap(f=>f.evidenceRefs)],[{asset:l,walletCount:u.length,eventIds:we(p.map(f=>f.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 Sd(e,t,n,r,o){let s=new Map,i=new Set,a=(f,m)=>{if(!(!me(f,t)||m.length===0)){s.has(f)||s.set(f,new Set);for(let g of m)s.get(f).add(g)}};for(let f of t.values()){if(!Jn(f))continue;let m=te(f,n);m.length===0?i.add(f.id):a(f.id,m)}for(let f of e)f.type==="DEPLOY"&&a(f.from??f.actor,te(f,n));let c=[...i].filter(f=>!s.has(f));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(f=>fn.has(f.type)&&s.has(f.from)&&me(f.to,t)&&te(f,n).length),l=pn(d,f=>f.to),p=e.filter(f=>f.type==="BUY"&&me(f.actor??f.from,t)&&f.asset&&te(f,n).length).map(f=>lt(f,{actor:f.actor??f.from})),u=new Map;for(let f of p){let m=we(Ys(l.get(f.actor)).map(g=>g.from));if(m.length>Xl)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${f.asset}`;u.has(y)||u.set(y,[]),u.get(y).push(f)}}let h=[];for(let[f,m]of[...u].sort(([g],[y])=>he(g,y))){let g=we(m.map(U=>U.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,E]=f.split("\0"),T=new Set(g),$=d.filter(U=>U.from===y&&T.has(U.to)),P=we([...s.get(y)??[]]);h.push(dt("DEPLOYER_LINKED_BUYERS",`${y}:${E}`,[y,...g],[...P,...$.flatMap(U=>te(U,n)),...m.flatMap(U=>te(U,n))],[{deployer:y,asset:E,buyerCount:g.length,deployerEvidenceRefs:P,fundingEventIds:we($.map(U=>U.id)),buyEventIds:we(m.map(U=>U.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function vd(e,t,n,r,o,s){let i=[],a=e.filter(p=>p.type==="SUPPLY_SNAPSHOT"&&p.asset&&te(p,r).length),c=0;for(let p of a){let u=Fe(I(p,"totalSupply")??I(p,"supply")),h=ne(I(p,"holders")),f=h.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||Ot(I(y,"evidenceRefs")))return null;let E=ne(I(y,"evidenceRefs")).map(xe);return E.length===0||E.some(T=>!r.has(T))?null:{entityId:xe(I(y,"entityId")),balance:Fe(I(y,"balance")),evidenceRefs:we(E)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(f.length!==h.length||!cd(u,f)){c+=1;continue}let g=f.map(y=>({...y,shareBps:ad(y.balance,u)})).filter(y=>y.shareBps!==null).sort((y,E)=>E.shareBps-y.shareBps||he(y.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(dt("SUPPLY_CONCENTRATION",`${p.asset}:${p.id}`,[g.entityId],[...te(p,r),...g.evidenceRefs],[{asset:p.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:u,snapshotEventId:p.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(p=>{let u=Xs(p.supplyShare);return u?{entity:p,fraction:u,shareBps:Number(u.numerator*10000n/u.denominator)}:null}).filter(Boolean).sort((p,u)=>u.shareBps-p.shareBps||he(p.entity.id,u.entity.id));if(!ld(d.map(p=>p.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 p=ne(I(l.entity,"evidenceRefs")).map(xe),u=p.length>0&&p.every(h=>r.has(h))?we(p):[];u.length&&i.push(dt("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 Nd(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&te(r,n).length).filter(r=>me(r.actor??r.from??r.to,t)).map(r=>dt("LP_REMOVAL",r.id,[r.actor??r.from??r.to],te(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Fe(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function Td(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 _d(e,t,n,r,o){let s=e.filter(u=>u.type==="TRANSFER"&&me(u.from,t)&&me(u.to,t)&&u.from!==u.to&&ge(u.asset)&&u.timestampMs!==null&&Fe(u.amount)&&te(u,n).length).map(u=>lt(u,{parsedAmount:Fe(u.amount)})).sort((u,h)=>u.timestampMs-h.timestampMs||he(u.id,h.id)),i=pn(s,u=>`${u.from}\0${u.asset}`),a=[],c=new Set,d=!1;function l(u,h,f,m){let g=Ys(i.get(`${u.to}\0${u.asset}`)),y=Td(g,u.timestampMs),E=[],T=0,$=y;for(;$<g.length&&T<Zl;$+=1){let P=g[$];if(P.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(T+=1,c.has(P.id)||f.has(P.id)||m.has(P.to)||P.from!==u.to||P.asset!==u.asset)continue;let U=Math.max(u.parsedAmount.decimals,P.parsedAmount.decimals),D=Gt(u.parsedAmount,U),C=Gt(P.parsedAmount,U);D!==null&&C!==null&&C>0n&&C<D&&E.push(P)}return $<g.length&&g[$].timestampMs-h.timestampMs<=r.peelWindowSeconds*1e3&&(d=!0),E}function p(u){if(u.length>=3)return u;let h=new Set(u.map(m=>m.id)),f=new Set([u[0].from,...u.map(m=>m.to)]);for(let m of l(u[u.length-1],u[0],h,f)){let g=p([...u,m]);if(g)return g}return null}for(let u of s){if(c.has(u.id))continue;let h=p([u]);if(!h)continue;let f=[...h];for(;f.length<r.maxPeelDepth;){let m=new Set(f.map(E=>E.id)),g=new Set([f[0].from,...f.map(E=>E.to)]),[y]=l(f[f.length-1],f[0],m,g);if(!y)break;f.push(y)}f.forEach(m=>c.add(m.id)),a.push(f)}return d&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(u=>dt("PEEL_CHAIN",u[0].id,[u[0].from,...u.map(h=>h.to)],u.flatMap(h=>te(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 xd(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&ge(r.sourceChain)&&ge(r.destinationChain)&&te(r,n).length).filter(r=>me(r.actor??r.from??r.to,t)).map(r=>dt("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],te(r,n),[{eventId:r.id,sourceChain:ge(r.sourceChain),destinationChain:ge(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Fe(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function Rd(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])=>he(n,r)))}function qs(e,t){return ne(I(e,"holders")).some(n=>!me(I(n,"entityId"),t))?!1:fn.has(e.type)||e.type==="TRANSFER"?me(e.from,t)&&me(e.to,t):un.has(e.type)?me(e.actor??e.from,t):e.type==="DEPLOY"?me(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?me(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?ne(I(e,"holders")).every(n=>me(I(n,"entityId"),t)):!0}function Ld(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||De.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])=>he(a,c))){let a=i;if(i&&typeof i=="object"&&!Wt(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=Ue(a),d=Ue(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var Pd=Object.freeze(Object.keys(Ge)),Cd=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function Gs(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||De.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 Cp(e,t={}){let n=Gs(t,Pd,{numeric:!0}),r=n?t:{},o={maxEntities:Je(I(r,"maxEntities"),Ge.maxEntities,1,Ae.maxNodes),maxEvents:Je(I(r,"maxEvents"),Ge.maxEvents,1,Ae.maxEdges),maxEvidence:Je(I(r,"maxEvidence"),Ge.maxEvidence,1,X.evidence),minClusterSize:Je(I(r,"minClusterSize"),Ge.minClusterSize,2,10),minCommonRecipients:Je(I(r,"minCommonRecipients"),Ge.minCommonRecipients,2,10),syncWindowSeconds:Je(I(r,"syncWindowSeconds"),Ge.syncWindowSeconds,1,3600),freshWalletSeconds:Je(I(r,"freshWalletSeconds"),Ge.freshWalletSeconds,60,2592e3),peelWindowSeconds:Je(I(r,"peelWindowSeconds"),Ge.peelWindowSeconds,60,604800),maxPeelDepth:Je(I(r,"maxPeelDepth"),Ge.maxPeelDepth,3,8),concentrationThresholdBps:Je(I(r,"concentrationThresholdBps"),Ge.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,S,{fatal:L=!1}={})=>{L&&(i=!0);let k=Ue(w||"UNSPECIFIED_GAP"),Ie=ge(S)??"Input is incomplete.",ue=s.get(k);if(ue){he(Ie,ue.message)<0&&s.set(k,{code:k,status:"UNKNOWN",message:Ie});return}if(s.size>=Vs-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 ${Vs}.`});return}s.set(k,{code:k,status:"UNKNOWN",message:Ie})},c=({entities:w=[],events:S=[],evidenceById:L=new Map,eventWithEvidence:k=[],analyzableEvents:Ie=[],findings:ue=[]}={})=>{let be=i?[]:ue;be.length>X.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${X.findings}.`,{fatal:!0}),be=[]);let ke=[...s.values()].sort((M,F)=>he(M.code,F.code)),A=i||ke.some(M=>M.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(M.code))?"UNKNOWN":ke.length?"PARTIAL":"OK",b=Math.min(100,be.reduce((M,F)=>M+F.score,0)),_=b>=60?"HIGH":b>=25?"MEDIUM":A==="OK"?"LOW":"UNKNOWN";return oe({schemaVersion:Wl,execution:"read-only",reportOnly:!0,status:A,risk:{score:b,level:_},metrics:{entityCount:w.length,eventCount:S.length,evidenceCount:L.size,evidencedEventCount:k.length,eligibleEventCount:Ie.length,findingCounts:Rd(be),bounds:o},findings:be,gaps:ke})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!Gs(e,Cd))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 S=I(e,w);if(S!==void 0&&!Wt(S))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=Xr(I(e,"entities"),fd,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=Xr(I(e,"events"),md,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),p=Xr(I(e,"evidence"),pd,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),u=d.records,h=l.records,f=p.records;(d.overflow||l.overflow||p.overflow||d.malformed||l.malformed||p.malformed)&&(i=!0),Array.isArray(I(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(I(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(I(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),dn(u)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),dn(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),dn(f)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),bd(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),gd(u)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=dn(u)?new Map:new Map(u.map(w=>[w.id,w])),g=f.filter(w=>!Us.has(w.status)),y=f.filter(w=>Us.has(w.status)&&!Fs.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=dn(f)?new Map:new Map(f.filter(w=>Fs.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let T=u.filter(w=>{let S=ne(I(w,"evidenceRefs"));return S.length>0&&S.some(L=>!E.has(L))});T.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${T.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let $=new Set(h.filter(w=>w.type==="DEPLOY"&&me(w.from??w.actor,m)&&te(w,E).length>0).map(w=>w.from??w.actor)),P=u.filter(w=>{let S=ne(I(w,"roles")).length>0||ne(I(w,"tags")).length>0||no(w)||Jn(w)||I(w,"isService")!==void 0||I(w,"fresh")!==void 0||I(w,"txCount")!==void 0||I(w,"firstSeenAt")!==void 0||I(w,"createdAt")!==void 0||I(w,"supplyShare")!==void 0,L=Bs(w,E)||id(w)&&$.has(w.id);return S&&!L}),U=P.filter(w=>I(w,"fresh")!==void 0||I(w,"txCount")!==void 0||I(w,"firstSeenAt")!==void 0||I(w,"createdAt")!==void 0);U.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${U.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let D=u.filter(w=>Jn(w)&&!Bs(w,E)&&!$.has(w.id));D.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${D.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),P.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${P.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let C=h.filter(w=>ne(I(w,"holders")).some(S=>{let L=ne(I(S,"evidenceRefs"));return L.length===0||L.some(k=>!E.has(k))}));C.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${C.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),Ld(I(e,"coverage"),a);let z=I(e,"gaps");if(Ot(z,X.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${X.gaps}.`,{fatal:!0});else{let w=[];for(let S of ne(z,X.gaps)){if(!S||typeof S!="object"||De.isProxy(S)||Array.isArray(S)||!Yt(S,sd)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let L=I(S,"code"),k=I(S,"message");if(L!==void 0&&ge(L)===null||k!==void 0&&ge(k)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:L??"UPSTREAM_GAP",message:k??"An upstream normalization gap was reported."})}w.sort((S,L)=>he(Ue(S.code),Ue(L.code))||he(S.message,L.message));for(let S of w)a(S.code,S.message)}let ee=h.filter(w=>te(w,E).length>0),j=h.filter(w=>te(w,E).length===0);j.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${j.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let Y=ee.filter(w=>!Ws.has(w.type)||!Hs(w));Y.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${Y.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Ne=ee.filter(Hs),B=Ne.filter(w=>!qs(w,m));B.length&&a("EVENT_ENTITY_UNRESOLVED",`${B.length} event(s) contained unresolved entity references.`,{fatal:!0});let R=Ne.filter(w=>qs(w,m));R.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 x=[];return i||(x=[...Od(R,m,E,o,a),...Sd(R,m,E,o,a),...Ad(R,m,E,o,a),...vd(R,u,m,E,o,a),...wd(R,m,E,o),...Nd(R,m,E),..._d(R,m,E,o,a),...xd(R,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,S)=>he(w.kind,S.kind)||he(w.id,S.id)),new Set(x.map(w=>w.id)).size!==x.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),x=[])),c({entities:u,events:h,evidenceById:E,eventWithEvidence:ee,analyzableEvents:R,findings:x})}import{types as ii}from"node:util";var ai="oracle.opensea-wallet-enrichment/1",kd="oracle.nft-overlap-input/1",jd="oracle.nft-overlap/1",ut="REQUEST_PATH_PLUS_MATCHED_PROFILE",Dd=ve(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),Mp=ve(["COMPLETE","PARTIAL","UNKNOWN"]),so="OBSERVED",ti="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",Xn="UNKNOWN",Se=ve({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),er=ve({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"}),Kt=ve(["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."]),$d=ve(["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."]),wt=ve({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."}),Md=ve({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."}),ci=new Set(Dd),Ud=new Set(gt),io=new Set(["LIVE","INDEXED"]),ye=(e,t)=>e<t?-1:e>t?1:0,Fd=/^0x[0-9a-fA-F]{40}$/u,Vd=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,zd=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,Bd=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,li=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,di=/[\u0000-\u001f\u007f-\u009f]/u,Hd=(1n<<256n)-1n;function O(e,t="invalid-nft-overlap"){throw new nt(`nft-overlap: ${e}`,t)}function ui(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function fi(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 re(){return fi([])}function W(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function ve(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&fi(e);let n;try{n=Reflect.ownKeys(e)}catch{O("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{O("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&ve(o.value,t)}return Object.freeze(e),e}function de(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||ii.isProxy(e))&&O(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{O(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&O(`${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{O(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&ui(c)||((typeof a!="string"||!s.has(a))&&O(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&O(`${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 ze(e,t,n,r=0){(!Array.isArray(e)||ii.isProxy(e))&&O(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{O(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&O(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{O(`${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=re();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{O(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&ui(l)||(typeof d!="string"||!a.has(d))&&O(`${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{O(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&O(`${t} must be dense and contain only own data items`,"invalid-array"),W(c,l.value)}return c}function qd(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||di.test(e)||li.test(e))&&O(`${t} is not safe bounded text`,"invalid-string"),e}function xt(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&O(`${n} is not a deterministic ID`,"invalid-id"),e}function pi(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&O(`${t} is not a canonical digest`,"invalid-digest"),e}function ao(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&O(`${t} must be a positive safe integer`,"invalid-chain"),e}function Rt(e){return(typeof e!="string"||!Fd.test(e))&&O("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function Gd(e){(typeof e!="string"||e.length===0||e.length>78||!Vd.test(e))&&O("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{O("tokenId must be uint256","invalid-token-id")}return(t<0n||t>Hd)&&O("tokenId must be uint256","invalid-token-id"),t.toString(10)}function Wd(e){return(typeof e!="string"||!zd.test(e))&&O("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function co(e={}){let t=de(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||O("canonical NFT input is missing a field","missing-field");let n={chainId:ao(t.get("chainId"),"nft.chainId"),contract:Rt(t.get("contract")),tokenId:Gd(t.get("tokenId"))};return ve({id:Ce("nft",n),...n})}function lo(e={}){let t=de(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||O("canonical collection input is missing a field","missing-field");let n={chainId:ao(t.get("chainId"),"collection.chainId"),slug:Wd(t.get("slug"))};return ve({id:Ce("collection",n),...n})}function tr(e={}){let t=de(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=qd(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||O("wallet.family is invalid","invalid-family");let i=r===null?null:ao(r,"wallet.chainId");if(o===null)return ve({id:null,family:s,chainId:i,address:null});s!=="evm"&&O("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=Rt(o);return ve({id:Ce("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function uo(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!Bd.test(e)||di.test(e)||li.test(e)||ie(e)?null:e}function Yd(e,t="snapshot.wallet"){let n=de(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||O(`${t} is missing a required field`,"missing-field");let r=tr({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&O(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function ni(e,t){let n=de(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&O(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return ci.has(r)||O(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&O(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function Kd(e){let t=de(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||O("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");ci.has(n)||O("snapshot.coverage.status is invalid","invalid-status");let r=ni(t.get("profile"),"snapshot.coverage.profile"),o=ni(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&O("inventory cannot be called before profile","invalid-count");let s=(a,c,d,l,p)=>n===a&&r.status===c&&r.calls===d&&o.status===l&&o.calls===p;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)||O("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function Jd(e){let t=ze(e,"snapshot.gaps",Object.keys(wt).length),n=re();for(let s=0;s<t.length;s+=1){let i=de(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&O("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(wt,a)||i.get("message")!==wt[a])&&O("snapshot gap is not a fixed allowlisted gap","invalid-gap"),W(n,a)}let r=re(),o=new Set;for(let s of n)o.has(s)||(o.add(s),W(r,s));return r.sort(ye),r}function Zd(e){return Object.hasOwn(wt,e)||O("OpenSea gap code is invalid","invalid-gap"),ve({code:e,message:wt[e]})}function Xd(e){let t=de(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||O("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(Ud.has(n)||O("OpenSea evidence status is invalid","invalid-status"),xt(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||O("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&O("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&O("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:Rt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&O("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||O("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&O("holding evidence source is invalid","invalid-source");let i=xt(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:xt(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==ut&&O("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:ut}}O("OpenSea evidence kind is invalid","invalid-kind")}function mn(e={}){let t=Xd(e);return ve({id:Ce("evidence",t),digest:se(t),...t})}function Qd(e,t){let n=de(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))||O("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=mn(o);return xt(n.get("id"),"evidence","evidence.id"),pi(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&O("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function eu(e,t){if(e===null)return null;let n=de(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&O("snapshot.profile is missing a required field","missing-field");let r=Rt(n.get("address"));(!t.address||r!==t.address)&&O("profile address does not match snapshot wallet","profile-mismatch");let o=xt(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=uo(n.get("username"));return(s===null||s!==n.get("username"))&&O("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function tu(e,t,n){let r=de(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||O("snapshot holding is missing a required field","missing-field");let s=co({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&O("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&O("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=de(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||O("holding collection is missing a required field","missing-field"),i=lo({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&O("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==ut&&O("holding owner binding is invalid","invalid-owner-binding");let a=ze(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,Se.citationsPerFinding,1).map(d=>xt(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(ye);return c.length!==a.length&&O("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:ut,evidenceRefs:c}}function nu(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 ru(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&O("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&O("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&O("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(er,n.chainId))&&O("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)&&O(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&O(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&O("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&O("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&O("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let y of i)d.has(y.id)&&O("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(y.id,y),n.id&&y.walletId!==n.id&&O("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)&&O("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,p=0;for(let y of s){l.has(y.id)&&O("snapshot holdings must be unique","duplicate-holding"),l.add(y.id),y.collection===null&&(p+=1);for(let E of y.evidenceRefs)d.has(E)||O("holding cites unknown evidence","invalid-reference")}let u=new Set,h=re(),f=re();for(let y of a)u.add(y.code),y.code.startsWith("PROFILE_")&&W(h,y.code),y.code.startsWith("INVENTORY_")&&W(f,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"))&&O("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&O("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)))&&O("attempted coverage cannot contain an availability reason","invalid-coverage"),p>0&&!u.has("INVENTORY_COLLECTION_REJECTED")&&!u.has("INVENTORY_CONFLICTING_HOLDING")&&O("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&O("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&O("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&O("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&O("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"))&&O("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&O("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"&&f.length>0&&O("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(f.length===0||f.some(y=>!g.has(y)))&&O("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(f.length===0||f.some(y=>g.has(y)))&&O("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&f.length>0&&O("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&O("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&O("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&O("incomplete snapshot must contain a fixed gap","invalid-coverage")}function fo(e={}){let t=de(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||O("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&O("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=de(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?Yd(r,"snapshot.wallet"):tr(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=Kd(t.get("coverage")),c=ze(t.get("evidence"),"snapshot.evidence",Se.evidencePerSnapshot).map((E,T)=>{try{let $=de(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${T}]`);return $.has("id")||$.has("digest")?Qd(E,T):mn(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(P=>$.has(P)).map(P=>[P,$.get(P)])))}catch($){throw $}}).sort((E,T)=>ye(E.id,T.id)),d=t.get("profile"),l=null;if(d!==null){let E=de(d,["address","evidenceRef","username"],"snapshot.profile");l=eu(Object.fromEntries(["address","evidenceRef","username"].filter(T=>E.has(T)).map(T=>[T,E.get(T)])),s)}let u=ze(t.get("holdings"),"snapshot.holdings",Se.holdingsPerSnapshot).map((E,T)=>tu(E,T,s)).sort((E,T)=>ye(E.id,T.id)),h=ze(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(wt).length).map(E=>(Object.hasOwn(wt,E)||O("snapshot gap code is invalid","invalid-gap"),E)),f=[...new Set(h)].sort(ye).map(Zd),m={schemaVersion:ai,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:u,evidence:c,gaps:f,caveats:[...Kt]};ru(m);let g=Ce("opensea-snapshot",nu(m)),y=se(m);return ve({...m,snapshotId:g,digest:y})}function ou(e){let t=de(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))||O("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==ai||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&O("OpenSea snapshot envelope is invalid","invalid-envelope"),ze(t.get("caveats"),"snapshot.caveats",Kt.length,Kt.length).some((i,a)=>i!==Kt[a])&&O("snapshot caveats are invalid","invalid-caveat");let o=Jd(t.get("gaps")),s=fo({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 xt(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),pi(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&O("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function su(e){return{code:e,message:Md[e]}}function iu(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"||!io.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"||!io.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==ut||r.has(d.id)||(!a||ye(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:ut,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function ri(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||ye(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function au(e,t,n){(!Array.isArray(n)||n.length<2||n.length>Se.snapshots||n.length*2>Se.citationsPerFinding)&&O("finding citations exceeded the fixed limit","citation-limit");let r=re();for(let l=0;l<n.length;l+=1)W(r,n[l]);r.sort((l,p)=>ye(l.walletId,p.walletId)||ye(l.snapshotId,p.snapshotId)||ye(l.holdingEvidence.id,p.holdingEvidence.id));let o=re(),s=re(),i=new Set;for(let l of r)W(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>Se.citationsPerFinding&&O("finding citations exceeded the fixed limit","citation-limit"),W(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=re();for(let l of i)W(a,l);a.sort(ye);let c={kind:e,status:so,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:Ce(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:se(c),...c}}function oo(e,t){return`${e}:${t.canonical.id}`}function oi(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||ye(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function cu(e,t,n){if(n<=0)return;if(e.length<n){W(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)ye(e[o].key,e[r].key)>0&&(r=o);ye(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function lu(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=re(),i=new Set,a=oi(e),c=oi(t);if(a){let m={section:"exact",group:a,key:oo("exact",a)};W(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:oo("collection",c)};W(s,m),i.add(m.key)}let d=re(),l=Se.findings-s.length,p=(m,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let E=oo(m,y);i.has(E)||cu(d,{section:m,group:y,key:E},l)}};p("exact",e),p("collection",t);let u=re();for(let m of s)W(u,m);for(let m of d)W(u,m);u.length>Se.findings&&O("finding selection exceeded the fixed limit","finding-limit"),u.sort((m,g)=>ye(m.key,g.key));let h=re(),f=re();for(let m of u)W(m.section==="exact"?h:f,m.group);return{exact:h,collections:f,exactCount:n,collectionCount:r,truncated:o>Se.findings}}function Qn(e){return e.coverage.inventory.status==="COMPLETE"}function du(e){e.byWallet.size>Se.snapshots&&O("finding wallet citations exceeded the snapshot limit","citation-limit");let t=re();for(let n of e.byWallet.values())W(t,n);return t.length*2>Se.citationsPerFinding&&O("finding citations exceeded the fixed limit","citation-limit"),t}function si(e,t){let n=re();for(let r of t)W(n,au(e,r.canonical,du(r)));return n.sort((r,o)=>ye(r.id,o.id)),n}function Up(e){arguments.length!==1&&O("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=de(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&O("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==kd&&O("NFT overlap input schema is invalid","invalid-schema");let n=ze(t.get("snapshots"),"NFT overlap snapshots",Se.snapshots,2),r=0;for(let b=0;b<n.length;b+=1){let _=de(n[b],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${b}]`);for(let F of["holdings","evidence","gaps","caveats"])_.has(F)||O(`snapshot ${F} is required`,"missing-field");let M=ze(_.get("holdings"),`NFT overlap snapshots[${b}].holdings`,Se.holdingsPerSnapshot);ze(_.get("evidence"),`NFT overlap snapshots[${b}].evidence`,Se.evidencePerSnapshot),ze(_.get("gaps"),`NFT overlap snapshots[${b}].gaps`,Object.keys(wt).length),ze(_.get("caveats"),`NFT overlap snapshots[${b}].caveats`,Kt.length,Kt.length),r+=M.length,r>Se.totalHoldings&&O("total holdings exceed the fixed limit","holding-limit");for(let F=0;F<M.length;F+=1){let J=de(M[F],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${b}].holdings[${F}]`);J.has("evidenceRefs")||O("holding evidenceRefs are required","missing-field"),ze(J.get("evidenceRefs"),`NFT overlap snapshots[${b}].holdings[${F}].evidenceRefs`,Se.citationsPerFinding,1)}}let o=re();for(let b of n)W(o,ou(b));let s=new Map;for(let b of o){let _=b.wallet.id&&b.wallet.chainId?`${b.wallet.id}:${b.wallet.chainId}`:`noncanonical:${b.snapshotId}`;s.has(_)||s.set(_,re()),W(s.get(_),b)}let i=re(),a=0,c=0,d=re();for(let b of s.keys())W(d,b);d.sort(ye);for(let b of d){let _=s.get(b),M=new Set;for(let F of _)M.add(F.digest);if(M.size>1&&!b.startsWith("noncanonical:")){c+=1;continue}_.sort((F,J)=>ye(F.snapshotId,J.snapshotId)),W(i,_[0]),a+=_.length-1}let l=new Map;for(let b of i)for(let _ of b.evidence)l.has(_.id)||l.set(_.id,new Set),b.wallet.id&&l.get(_.id).add(b.wallet.id);let p=new Set;for(let[b,_]of l)_.size>1&&p.add(b);let u=new Map,h=new Map,f=new Set,m=new Map,g=new Map,y=0,E=0,T=!1,$=c>0,P=c>0;for(let b of i){let _=b.wallet.id;_&&f.add(_),b.coverage.profile.status==="PARTIAL"&&(T=!0);let M=new Map;for(let fe of b.evidence)M.set(fe.id,fe);let F=b.profile?M.get(b.profile.evidenceRef):null,J=!!(b.profile&&_&&F&&F.kind==="PROFILE"&&io.has(F.status)&&F.walletId===_&&F.address===b.wallet.address&&!p.has(F.id)),G=J&&Qn(b),Ee=J&&Qn(b);(Qn(b)||Qn(b))&&!J&&(y+=1);let Le=new Set;b.profile&&Le.add(b.profile.evidenceRef);for(let fe of b.holdings){let Ze=iu(b,fe,M,p);if(!Ze){E+=1,G=!1,Ee=!1;continue}Le.add(Ze.profileEvidence.id),Le.add(Ze.holdingEvidence.id),ri(u,fe.id,{id:fe.id,chainId:fe.chainId,contract:fe.contract,tokenId:fe.tokenId},Ze),fe.collection?ri(h,fe.collection.id,fe.collection,Ze):Ee=!1}for(let fe of b.evidence)Le.has(fe.id)||(E+=1,G=!1,Ee=!1);_?(m.set(_,(m.has(_)?m.get(_):!0)&&G),g.set(_,(g.has(_)?g.get(_):!0)&&Ee)):(G=!1,Ee=!1),G||($=!0),Ee||(P=!0)}let U=new Set,D=new Set;for(let[b,_]of m)_&&U.add(b);for(let[b,_]of g)_&&D.add(b);let C=new Set;for(let b of U)D.has(b)&&C.add(b);let z=lu(u,h),ee=si("EXACT_NFT_OVERLAP",z.exact),j=si("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",z.collections),Y=!$&&f.size>=2&&U.size>=2,Ne=!P&&f.size>=2&&D.size>=2,B=z.exactCount>0?so:Y?ti:Xn,R=z.collectionCount>0?so:Ne?ti:Xn,x=re();c>0&&W(x,"CONFLICTING_DUPLICATE_SNAPSHOT"),($||P)&&W(x,"INPUT_COVERAGE_INCOMPLETE"),$&&W(x,"EXACT_NFT_COVERAGE_INCOMPLETE"),P&&W(x,"COLLECTION_COVERAGE_INCOMPLETE"),T&&W(x,"PROFILE_METADATA_INCOMPLETE"),(y>0||E>0||p.size>0)&&W(x,"INELIGIBLE_HOLDING_EVIDENCE"),f.size<2&&z.exactCount===0&&z.collectionCount===0&&W(x,"INSUFFICIENT_DISTINCT_WALLETS"),z.truncated&&W(x,"FINDINGS_TRUNCATED");let w=re(),S=new Set;for(let b of x)S.has(b)||(S.add(b),W(w,b));w.sort(ye);let L=re();for(let b of w)W(L,su(b));let k=0;for(let b of u.values())k+=b.byWallet.size;let be=!$&&!P&&!T&&!z.truncated&&f.size>=2?"COMPLETE":B!==Xn||R!==Xn?"PARTIAL":"UNKNOWN",ke={schemaVersion:jd,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:be,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:f.size,completeDistinctWallets:C.size,completeExactNftWallets:U.size,completeCollectionWallets:D.size,qualifyingHoldings:k},exactNft:{state:B,findings:ee},collection:{state:R,findings:j},gaps:L,caveats:[...$d],limits:Se},St=Ce("nft-overlap-report",ke),A=se(ke);return ve({...ke,reportId:St,digest:A})}import{types as Lt}from"node:util";var yi=128*1024,bi=1024*1024,Ei=8e3,uu=20,fu=512,pu=1024,Oi=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),mi=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}),nr=/[\u0000-\u001f\u007f-\u009f]/u,mu=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,hu=Object.freeze(["family","chainId","address","includeOpenSea"]),gu=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),rr=(e,t)=>e<t?-1:e>t?1:0;function po(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function We(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function Re(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function yu(e){(!e||typeof e!="object"||Array.isArray(e)||Lt.isProxy(e))&&Re("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{Re("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&Re("args must be a plain object","invalid-object");let r=new Set(hu),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";gu.some(c=>a.includes(c))&&Re("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),Re("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{Re(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&Re(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function bu(e){let t=yu(e);for(let d of["family","address"])t.has(d)||Re(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||nr.test(n))&&Re("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||Re("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||nr.test(o))&&Re("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&Re("args.address must not be a URL","invalid-address");let i=Oi.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(mi,r)?mi[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&Re("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!nr.test(a)||Number.isSafeInteger(a)&&a>0)&&Re("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&Re("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function Eu(e){let t=Oi.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=Rt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:tr({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 fo({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 Ou(){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 wi(e){let t=Ye(e);return t&&t.length<=pu?t:null}function mo(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Lt.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 wu(e,t){if(!Array.isArray(e)||Lt.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=po();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}We(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function hn(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function Iu(e,t,n){let r=mo(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=Rt(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=hn(a,n)?null:uo(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function Au(e,t,n,r){let o=mo(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>fu||nr.test(s)||mu.test(s)||hn(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=wu(o.get("nfts"),uu),c=po();a&&We(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&We(c,"INVENTORY_CURSOR_PRESENT");let d=new Map,l=new Set;for(let h of i){let f,m;try{if(typeof h=="symbol")throw new Error("invalid-row");if(f=mo(h,["identifier","contract","collection"]),!["identifier","contract"].every(E=>f.has(E)))throw new Error("invalid-row");if(![f.get("identifier"),f.get("contract")].every(E=>typeof E=="string"))throw new Error("invalid-row");if(hn(f.get("identifier"),r)||hn(f.get("contract"),r))throw new Error("invalid-row");m=co({chainId:t.chainId,contract:f.get("contract"),tokenId:f.get("identifier")})}catch{We(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(f.has("collection")&&typeof f.get("collection")=="string"&&!hn(f.get("collection"),r))try{g=lo({chainId:t.chainId,slug:f.get("collection")})}catch{g=null}if(g===null&&We(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){We(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=d.get(m.id);if(y){let E=y.collection?.id??null,T=g?.id??null;E===null&&T!==null?(d.set(m.id,{nft:m,collection:g}),We(c,"INVENTORY_DUPLICATE_HOLDING")):T===null||E===T?We(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),We(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let p=po(),u=[n];for(let{nft:h,collection:f}of[...d.values()].sort((m,g)=>rr(m.nft.id,g.nft.id))){let m=mn({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:f?.id??null,ownerBinding:ut});We(u,m),We(p,{...h,collection:f,ownerBinding:ut,evidenceRefs:[n.id,m.id].sort(rr)})}return{holdings:p,evidence:u,gaps:[...new Set(c)].sort(rr)}}function At(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||Lt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function hi(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 ho(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 Su(e){if(!e||typeof e!="object"||Array.isArray(e)||Lt.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"||wi(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return ho([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function vu(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"||Lt.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"?Su(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 gi(e,t){let n=ho([["x-api-key",e]]);return ho([["method","GET"],["headers",n],["fetchImpl",vu],["timeoutMs",Ei],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function Nu(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||Lt.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 Ii(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=Nu(e),n=t.has("requestJson")?t.get("requestJson"):ce,r=t.has("readApiKey")?t.get("readApiKey"):Ou;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&Re("exactly one args object is required","second-options-forbidden");let i=bu(s),a=Eu(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(er,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=wi(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,gi(c,yi));l=Iu(E,a.address,c)}catch(E){return It({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[hi(E,"profile")]})}let p=mn({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),u={address:a.address,evidenceRef:p.id,...l.username!==void 0?{username:l.username}:{}},h=l.usernameRejected?["PROFILE_USERNAME_REJECTED"]:[],m=`https://api.opensea.io/api/v2/chain/${er[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,gi(c,bi));g=Au(E,a,p,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:[p],gaps:[...h,hi(E,"inventory")]})}let y=[...new Set([...h,...g.gaps])].sort(rr);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 qp=Object.freeze({profileMaxBytes:yi,inventoryMaxBytes:bi,timeoutMs:Ei,retries:0,redirects:0,dedupe:!1});var Tu=Ii();async function _u(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 Tu.enrich(e)}export{Pp as COORDINATION_CONFIDENCE,Lp as COORDINATION_RISK_LEVELS,Wl as COORDINATION_SCHEMA_VERSION,gr as DEFAULT_INVESTIGATION_LIMITS,gt as EVIDENCE_STATUSES,Ho as INVESTIGATION_COVERAGE_STATUSES,Ae as INVESTIGATION_LIMITS,rt as INVESTIGATION_POSTURE,X as INVESTIGATION_RECORD_LIMITS,Bo as INVESTIGATION_TARGET_TYPES,_n as INVESTIGATOR_COLLECTION_SCHEMA_VERSION,Na as INVESTIGATOR_CURSOR_MAX_BYTES,mr as INVESTIGATOR_CURSOR_SCHEMA_VERSION,Gr as INVESTIGATOR_FACT_PROJECTION_SCHEMA_VERSION,Ko as INVESTIGATOR_FINDING_TEMPLATES,xs as INVESTIGATOR_PROVIDER_MAX_RESPONSE_BYTES,Dt as INVESTIGATOR_SCHEMA_VERSION,hr as InvestigatorCursorError,nt as InvestigatorError,$d as NFT_OVERLAP_CAVEATS,kd as NFT_OVERLAP_INPUT_SCHEMA_VERSION,Se as NFT_OVERLAP_LIMITS,ti as NFT_OVERLAP_NOT_OBSERVED,so as NFT_OVERLAP_OBSERVED,jd as NFT_OVERLAP_SCHEMA_VERSION,Mp as NFT_OVERLAP_STATUSES,Xn as NFT_OVERLAP_UNKNOWN,er as OPENSEA_CHAIN_SLUGS,Dd as OPENSEA_COVERAGE_STATUSES,ut as OPENSEA_OWNER_BINDING,Kt as OPENSEA_SNAPSHOT_CAVEATS,ai as OPENSEA_WALLET_ENRICHMENT_SCHEMA_VERSION,gl as WALLET_EVIDENCE_CAPABILITIES,Et as WALLET_EVIDENCE_CAPABILITY_MATRIX,Cp as analyzeCoordination,Up as analyzeNftOverlap,pe as assertExactFields,se as canonicalHash,cf as canonicalJson,tn as canonicalTonAddress,Rt as canonicalizeEvmAddress,Wd as canonicalizeOpenSeaCollectionSlug,Gd as canonicalizeUint256TokenId,vp as collectWalletEvidence,vf as crawlEvidenceGraph,co as createCanonicalNft,lo as createCanonicalOpenSeaCollection,tr as createCanonicalWallet,$n as createEvidenceGraph,Sr as createInvestigationRequest,Uo as createInvestigatorCursor,bf as createInvestigatorEvidenceGraph,Nf as createInvestigatorSpider,_c as createOnchainInvestigator,mn as createOpenSeaEvidence,Zd as createOpenSeaGap,fo as createOpenSeaSnapshot,oe as deepFreeze,Ce as deterministicId,_u as enrichOpenSeaWallet,Ic as graphToInvestigationComponents,ns as investigateOnchain,df as normalizeCollectorOutput,lf as normalizeCoverageStatus,He as normalizeData,Ln as normalizeEvidenceStatus,Pn as normalizeInvestigationComponents,kt as normalizeInvestigatorCursor,Ar as normalizeLimits,ou as normalizeOpenSeaSnapshot,uf as normalizeReportComponents,Ir as normalizeTarget,Ls as normalizeWalletEvidenceRequest,_l as sanitizeInvestigatorProviderError,uo as sanitizeOpenSeaUsername,Ef as toInvestigationComponents,hl as walletEvidenceCapabilityMatrix};