@oracle-agent/oracle 0.35.44 → 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.
- package/dist/agent-sessions.mjs +24 -24
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +26 -26
- package/dist/bin/oracle-data-mcp.mjs +14 -14
- package/dist/bin/oracle-gateway.mjs +47 -47
- package/dist/bin/oracle-investigate.mjs +4 -4
- package/dist/bin/oracle-launch-radar-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +23 -23
- package/dist/bin/oracle-scan.mjs +6 -6
- package/dist/bin/oracle.mjs +1 -0
- package/dist/cli/commands/account.mjs +39 -0
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/airdrop.mjs +7 -7
- package/dist/cli/commands/chat.mjs +198 -198
- package/dist/cli/commands/data.mjs +29 -29
- package/dist/cli/commands/doctor.mjs +7 -7
- package/dist/cli/commands/eval.mjs +123 -123
- package/dist/cli/commands/farm.mjs +16 -16
- package/dist/cli/commands/follow.mjs +36 -36
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +205 -205
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +11 -11
- package/dist/cli/commands/resolve.mjs +9 -9
- package/dist/cli/commands/session-vault.mjs +5 -5
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +25 -25
- package/dist/cli/commands/snipe.mjs +7 -7
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +24 -24
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +7 -3
- package/dist/local-signer/runtime.mjs +22 -22
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +7 -7
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/tui/standalone-client.mjs +85 -85
- package/package.json +1 -1
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +3 -3
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/index.html +6 -6
- package/server.json +2 -2
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFile as Id,stat as Sd}from"node:fs/promises";import{createHash as qn}from"node:crypto";import{types as Ut}from"node:util";var Gs=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])/]),Ws=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Js=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Ys(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Ks(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=Ys(n);if(Ws.has(r)||Js.some(o=>r.includes(o)))return!0}return!1}function zr(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Zs=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Xs(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function Qs(e){let t=e.match(Zs)||[];for(let n of t){let r=Xs(n),o=zr(r),s=o?zr(o):null;for(let i of[r,o,s])if(i&&Ks(i))return!0}return!1}var ei=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 et(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function tt(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of ei){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function J(e){return typeof e!="string"||e.length===0?!1:Gs.some(t=>t.test(e))?!0:Qs(e)}import{createHash as eo}from"node:crypto";import{createHash as li}from"node:crypto";import{types as Be}from"node:util";import{AsyncLocalStorage as ti}from"node:async_hooks";var ni=new ti,ri=["http","retry","shared"],oi=512;function Xt(e){let t=ni.getStore();if(!t||t.closed||!ri.includes(e))return null;if(t.spans.length>=oi)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 ut from"node:net";import si from"node:dns";var ii=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Qt(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 Cn(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 jn(e){if(ut.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(ut.isIPv6(e)){let t=Qt(e);if(!t)return!1;let n=Qt("::ffff:0:0");return Cn(t,n,96)?jn([...t.slice(12)].join(".")):Cn(t,Qt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>Cn(t,Qt(o),s)):!1}return!1}function ai(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(ii.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ut.isIP(n);return r!==0&&!jn(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function kn(e,{lookupFn:t=si.promises.lookup}={}){let n=ai(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ut.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=>!jn(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Dn({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||(ut.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(ut.isIP(u))return[{address:u,family:ut.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=ci((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 $n=Symbol.for("oracle.egressGuard.pinCapableFetch");function ci(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[$n]=Object.freeze({pin:t}),e}function Mn(e){return typeof e=="function"&&typeof e[$n]?.pin=="function"}function Br(e,t,n){if(!Mn(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[$n].pin(t,n)}var di=new Set([408,425,429,500,502,503,504]),Hr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ui=2,qr=4e3,fi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,pi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,mi=AbortSignal.prototype.throwIfAborted,hi=EventTarget.prototype.addEventListener,Gr=EventTarget.prototype.removeEventListener,Wr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,kt=e=>e?fi.call(e):!1,gi=e=>e?pi.call(e):void 0,yi=new Set([301,302,303,307,308]),tn=3,Kd=64*1024,ze=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function Y(e){return nt(`HTTP JSON body refused: ${e}`)}function bi(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 Be[t]=="function"&&Be[t](e))}function Ei(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>ze.bytes)throw Y("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>ze.bytes)throw Y("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,f)=>{if(r+=1,r>ze.nodes)throw Y("node limit exceeded");if(f>ze.depth)throw Y("depth limit exceeded");if(l===null){a("null");return}if(typeof l=="string"){a(c(l));return}if(typeof l=="boolean"){a(l?"true":"false");return}if(typeof l=="number"){if(!Number.isFinite(l))throw Y("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw Y("unsupported non-JSON value");if(Be.isProxy(l))throw Y("proxy value");if(bi(l))throw Y("unsupported exotic object");if(i.has(l))throw Y("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw Y("symbol-keyed fields are unsupported");if(Array.isArray(l)){let p=Object.getPrototypeOf(l),m=0;for(;p!==null;){if(Be.isProxy(p))throw Y("proxy array prototype");if(m+=1,m>ze.depth)throw Y("array prototype depth limit exceeded");p=Object.getPrototypeOf(p)}if(l.length>ze.arrayLength)throw Y("array length limit exceeded");for(let y=0;y<l.length;y+=1){let E=Object.getOwnPropertyDescriptor(l,String(y));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw Y("array entries must be dense enumerable own data")}let g=0;for(let y in l){if(s+=1,s>ze.fields)throw Y("enumeration limit exceeded");if(Object.hasOwn(l,y)&&(g+=1,g>l.length))throw Y("named array fields are unsupported")}if(g!==l.length)throw Y("array entries must be dense enumerable own data");a("[");for(let y=0;y<l.length;y+=1)y&&a(","),d(Object.getOwnPropertyDescriptor(l,String(y)).value,f+1);a("]");return}let u=Object.getPrototypeOf(l);if(u!==Object.prototype&&u!==null)throw Y("non-plain object");let h=[];for(let p in l){if(s+=1,s>ze.fields)throw Y("enumeration limit exceeded");if(!Object.hasOwn(l,p))continue;if(o+=1,o>ze.fields)throw Y("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,p);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw Y("object fields must be enumerable own data");h.push([p,m.value])}a("{");for(let p=0;p<h.length;p+=1)p&&a(","),a(c(h[p][0])),a(":"),d(h[p][1],f+1);a("}")}finally{i.delete(l)}};return d(e,0),t.join("")}function Oi(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(Be.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 wi(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Ai(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 Ii(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var Un=new Map,Jr=new WeakMap,Yr=1;function en(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Jr.get(e);return t||(t=Yr,Yr+=1,Jr.set(e,t)),`reference:${t}`}var Si=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Ni=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Kr(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?Si.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 Zr(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(Kr);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Kr(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&Ni.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Ti(e,t,n,r={},o=null){let s=li("sha256"),i=(c,d)=>{let l=String(d);s.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),s.update("=").update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l).update(`
|
|
3
|
-
`)};i("method",e),i("url",t),Object.keys(n||{}).map((c,d)=>({name:c.toLowerCase(),order:d,value:String(n[c])})).sort((c,d)=>c.name.localeCompare(d.name)||c.order-d.order).forEach((c,d)=>{i(`header-name-${d}`,c.name),i(`header-value-${d}`,c.value)}),i("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${c}`,r[c]??"-");return s.digest("hex")}function _i(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,qr):Math.min(250*2**e,qr)+Math.floor(Math.random()*100)}var vi=e=>new Promise(t=>setTimeout(t,e));function nt(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Fn(e,t,n){return nt(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ft(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function xi(e){return e?e.byteLength??e.length??0:0}async function Ri(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&&(ft(e),!r))throw Fn(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 Fn(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+=xi(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 Fn(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function Li(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Pi(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=tn}){let g=null,y=t,E=i?{lookupFn:i}:{};if(c&&!a&&!Mn(y))throw nt(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let S=new AbortController,x=setTimeout(()=>S.abort(),s),R=h?Wr?Wr([h,S.signal]):h:S.signal,j=async(_,{status:T=null}={})=>{let D=await kn(_,E);if(!D.ok)throw nt(T==null?`HTTP refused ${_}: ${D.error}`:`HTTP redirect to ${_} ${D.error}`,T==null?{}:{status:T});let ee=new URL(_).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await Dn({requireUndici:!0,...f?{importUndici:f}:{}})}catch(v){throw nt(T==null?`HTTP refused ${_}: ${v?.message||v}`:`HTTP redirect to ${_} refused: ${v?.message||v}`,T==null?{}:{status:T})}g.pin(ee,D.addresses),y=g.fetch}else Br(y,ee,D.addresses);return D};try{let _=String(e),T=Object.assign(Object.create(null),r||{});c&&await j(_);for(let D=0;D<=m;D+=1){let ee=Object.assign(Object.create(null),{method:n,headers:T,body:o,signal:R,redirect:"manual",dispatcher:void 0}),v=await y(_,ee);if((p==="error"||m===0)&&v.status>=300&&v.status<400)throw ft(v),nt(`HTTP ${v.status} ${n} redirect refused`,{status:v.status,redirectRefused:!0});if(yi.has(v.status)){let ie=l===!0&&n==="POST"&&[307,308].includes(v.status)&&Zr(n,o);if(n!=="GET"&&n!=="HEAD"&&!ie){ft(v);let N=new Error(`HTTP ${v.status} ${n} ${_} redirected non-idempotent request`);throw N.status=v.status,N}if(D===m)throw ft(v),nt(`HTTP ${v.status} ${n} redirect budget exhausted`,{status:v.status,redirectRefused:!0});let ue=v.headers?.get?.("location"),F;try{F=Ai(ue,_)}catch(N){throw ft(v),N}let w=!Ii(F,_);if(ft(v),w&&n==="POST"){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N}if(w&&l){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N.retryable=!1,N}if(w&&(T=wi(T)),c)await j(F,{status:v.status});else if(w){let N=await kn(F,E);if(!N.ok){let L=new Error(`HTTP redirect from ${_} ${N.error}`);throw L.status=v.status,L.retryable=!1,L}a&&N.addresses?.length&&(g||(g=await Dn(f?{importUndici:f}:{})),g&&(g.pin(new URL(F).hostname,N.addresses),y=g.fetch))}_=F;continue}if(typeof u=="function")try{await u(v,{url:_})}catch(ie){throw ft(v),nt(ie?.message||String(ie))}let W=await Ri(v,d,{url:_,onOversize:()=>S.abort()}),Ce=Li(W);if(!v.ok){let ie=new Error(`HTTP ${v.status} ${n} ${_}`);throw ie.status=v.status,ie.retryAfter=v.headers?.get?.("retry-after")??null,ie.body=Ce??W.slice(0,300),ie}return Ce??W}throw new Error(`HTTP redirect loop for ${e}`)}catch(_){if(S.signal.aborted&&!kt(h)){let T=_&&(typeof _=="object"||typeof _=="function")&&!Be.isProxy(_)?_:null,D=T?Object.getOwnPropertyDescriptor(T,"oversize"):null;if(!(D&&Object.hasOwn(D,"value")&&D.value===!0))try{if(!T)throw new TypeError("unsafe rejection");Object.defineProperties(T,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let v=new Error("HTTP request timed out");throw Object.defineProperties(v,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),v}}throw _}finally{clearTimeout(x),g&&await g.close()}}async function K(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Be.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 P=Object.getOwnPropertyDescriptor(t,L);if(!(L==="toJSON"&&P&&Object.hasOwn(P,"value")&&P.value===void 0)){if(!n.has(L))throw new TypeError("HTTP options contain unknown fields");if(!P||!P.enumerable||!Object.hasOwn(P,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=L=>{if(t==null||!Object.hasOwn(t,L))return;let P=Object.getOwnPropertyDescriptor(t,L);if(!P||!Object.hasOwn(P,"value"))throw new TypeError("HTTP options must contain own data properties");return P.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>tn))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${tn}`);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??tn;for(let L of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let P=r(L);if(P!==void 0&&typeof P!="boolean")throw new TypeError(`HTTP ${L} must be boolean`)}let f=r("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let u=r("signal");if(u!==void 0){if(Be.isProxy(u)||!(u instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{kt(u)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let L of["importUndici","lookupFn","validateResponse"]){let P=r(L);if(P!==void 0&&typeof P!="function")throw new TypeError(`HTTP ${L} must be a function`)}let h=r("fetchImpl"),p=h||globalThis.fetch;if(typeof p!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=s??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),E=Oi(y),S=Object.assign(Object.create(null),E);Object.keys(S).some(L=>L.toLowerCase()==="accept")||(S.Accept="application/json");let x=r("body");x!=null&&typeof x!="string"&&(Object.keys(S).find(P=>P.toLowerCase()==="content-type")||(S["Content-Type"]="application/json"),x=Ei(x));let R=i??ui,j=r("lookupFn"),_=!h,T=r("untrustedUrl")===!0,D=r("sameOriginRedirectsOnly")===!0,ee=r("importUndici"),v=r("validateResponse"),W=u,Ce=f??null,ie=async()=>{let L;for(let P=0;P<=R;P++){W&&mi.call(W);let Fe=Xt("http");try{let he=await Pi(e,{fetchImpl:p,method:g,headers:S,body:x,timeoutMs:m,lookupFn:j,realFetch:_,untrustedUrl:T,maxResponseBytes:Ce,sameOriginRedirectsOnly:D,importUndici:ee,validateResponse:v,signal:W,redirectPolicy:d,maxRedirects:l});return Fe?.("succeeded"),he}catch(he){L=he;let ye=Te=>{if(!he||typeof he!="object"&&typeof he!="function"||Be.isProxy(he))return;let xe=Object.getOwnPropertyDescriptor(he,Te);return xe&&Object.hasOwn(xe,"value")?xe.value:void 0},Ne=ye("status");Fe?.("failed",Ne);let Zt=ye("oracleTimeout")===!0||ye("name")==="AbortError"||ye("name")==="TimeoutError"||kt(W),bt=new Set([408,425,429]),A=ye("retryable")===!1?!1:Ne!=null?bt.has(Ne)||di.has(Ne)&&Hr.has(g):!Zt&&Hr.has(g);if(P===R||!A)throw he;let C=_i(P,ye("retryAfter")),te=Xt("retry"),V=!1;try{W?await new Promise((Te,xe)=>{let Ve,je=()=>{clearTimeout(Ve),Gr.call(W,"abort",je),xe(gi(W)||new DOMException("Aborted","AbortError"))};if(kt(W)){je();return}Ve=setTimeout(()=>{Gr.call(W,"abort",je),Te()},C),hi.call(W,"abort",je,{once:!0}),kt(W)&&je()}):await vi(C),V=!0}finally{te?.(V?"succeeded":"failed")}}}throw L};if(!(r("dedupe")!==!1&&!W&&Zr(g,x)))return ie();let F=Ti(g,e,S,{untrustedUrl:T,maxResponseBytes:Ce,sameOriginRedirectsOnly:D,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:R,fetchImpl:en(p),realFetch:_,lookupFn:en(j),importUndici:en(ee),validateResponse:en(v)},x),w=Un.get(F);if(w){let L=Xt("shared");try{let P=await w;return L?.("succeeded"),P}catch(P){throw L?.("failed"),P}}let N=ie().finally(()=>Un.delete(F));return Un.set(F,N),N}import{types as Et}from"node:util";function Ee(e){if(!e||typeof e!="object"||Et.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ge(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Et.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 He(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"||Et.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`);He(a.value,t,n,s,o+1)}return e}if(!Ee(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let i of Object.keys(e)){if(i.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);He(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function Z(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Et.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=Z(i.value,t,n+1)}return o}if(!Ee(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Z(s.value,t,n+1)}return r}var Xr=Symbol("oracle.provider-failure-metadata"),Ci=new Set(["provider-response-too-large","provider-timeout"]);function Ot(e,t){let n=t&&typeof t=="object"&&!Et.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,Xr,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function Qr(e){if(!e||typeof e!="object"||Et.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Xr);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=Ci.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Vn="https://blockstream.info/liquid/api";function ji(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Vn).replace(/\/$/,"")}var ki="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Di(e){let t=0n;for(let s of e){let i=ki.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 $i(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return eo("sha256").update(eo("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var Mi="qpzry9x8gf2tvdw0s3jn54khce6mua7l",to=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function Ui(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<to.length;o+=1)r>>BigInt(o)&1n&&(t^=to[o])}return t}function Fi(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 nn(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=Mi.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||Ui(i)!==c)return!1;let d=Fi(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 Dt(e){let t=String(e??"").trim();if(nn(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=Di(t);return!!(n&&n.length===59&&$i(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function Vi(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)||nn(n),s=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||Dt(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 zi(e,t={}){return Z(await K(`${ji(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function no(e={},t={}){let n=Vi(e.address||e.addr,"address"),r=await zi(`/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:Dt(n),note:f?void 0:Dt(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 co}from"node:util";import{base58 as ro}from"@scure/base";function oo(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)||et(e))return!1;try{let s=ro.decode(e);return s.length===r&&(!o||!tt(s))&&ro.encode(s)===e}catch{return!1}}function rn(e){return oo(e,32,44,32)}function on(e){return oo(e,64,88,64,!0)}var zn="oracle.investigator-cursor/1",Bi=2*1024,Hi=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),so=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),qi=Object.freeze(["block_number","index"]),Bn=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Gi(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function lo(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")&&lo(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function M(e){throw new Bn(e)}function uo(e,t){return(!e||typeof e!="object"||co.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&M(`${t} must be a plain object`),e}function sn(e,t,n){uo(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&M(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return Gi(a)||M(`${n}.toJSON is invalid`),!1}),s=t.filter(i=>!Object.hasOwn(e,i));(o.length!==t.length||o.some(i=>!r.has(i))||s.length)&&M(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&M(`${n} fields must be enumerable own data`)}}function fe(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&M(`${n} fields must be own data`),r.value}function qe(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&M(`${t} is invalid`),e}function io(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=qe(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||J(t))&&M("chain is invalid"),t}function Wi(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Ji(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 Yi(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||Ji(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ao(e,t,n){let r=qe(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&M("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!rn(r))&&M("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Wi(r),s=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),i=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!s||!i)&&M("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Yi(r):null;return o||M("address is invalid for the cursor family"),o}M("family does not support cursors")}function Ki(e){sn(e,qi,"EVM payload");let t=fe(e,"block_number","cursor"),n=fe(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&M("EVM payload values are invalid"),{block_number:t,index:n}}function Zi(e){sn(e,["lt","hash"],"TON payload");let t=qe(fe(e,"lt","cursor"),"TON payload.lt",40),n=qe(fe(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||et(n))&&M("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||tt(r))&&M("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function Xi(e,t){if(e==="evm")return Ki(t);if(e==="ton")return Zi(t);let n=qe(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&M("Bitcoin payload must be a transaction id"),e==="solana"&&!on(n)&&M("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||M(`${e} does not support cursors`),n}function Qi(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"||co.isProxy(r))&&M("envelope is not own-data JSON"),Array.isArray(r)){let s=[];for(let i=0;i<r.length;i+=1){let a=Object.getOwnPropertyDescriptor(r,String(i));(!a||!Object.hasOwn(a,"value"))&&M("envelope is not own-data JSON"),s.push(t(a.value))}return`[${s.join(",")}]`}let o=[];for(let s of Object.keys(r))o.push(`${JSON.stringify(s)}:${t(fe(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Bi&&M("envelope exceeds the byte limit")}function wt(e,t={}){if(e==null)return null;sn(e,Hi,"envelope"),fe(e,"schemaVersion","cursor")!==zn&&M("schemaVersion is unsupported");let n=qe(fe(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(so,n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))&&M("family is invalid");let r=io(fe(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&M("chain is invalid for the cursor family");let o=ao(n,r,fe(e,"address","cursor")),s=qe(fe(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==so[n]||J(s))&&M("provider is invalid"),uo(t,"expected binding");let i=h=>Object.hasOwn(t,h)?fe(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:qe(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:io(i("chain")),d=i("address")===void 0?void 0:ao(n,r,i("address")),l=i("provider")===void 0?void 0:qe(i("provider"),"expected provider",64);a!==void 0&&n!==a&&M("family binding does not match the request"),c!==void 0&&r!==c&&M("chain binding does not match the request"),d!==void 0&&o!==d&&M("address binding does not match the request"),l!==void 0&&s!==l&&M("provider binding does not match the request");let f=Xi(n,fe(e,"payload","cursor")),u={schemaVersion:zn,family:n,chain:r,address:o,provider:s,payload:f};return Qi(u),lo(u)}function fo(e,t){return sn(e,["family","chain","address","provider"],"binding"),wt({schemaVersion:zn,family:fe(e,"family","binding"),chain:fe(e,"chain","binding"),address:fe(e,"address","binding"),provider:fe(e,"provider","binding"),payload:t},e)}function pt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))pt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var dn="oracle.investigator-collection/1",ea=pt(["wallet","token","tx","launch"]),Ft=pt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),ta=pt(["COMPLETE","PARTIAL","UNKNOWN"]),ke=pt({maxDepth:3,maxNodes:250,maxEdges:1e3}),gu=pt({depth:2,nodes:100,edges:400});var ae=pt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),yu=new Set(ea),bu=new Set(Ft),Eu=new Set(ta);var na=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,go=/^(?: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})$/,ra=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),oa=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,sa=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,ia=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),aa=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),ca=new Set(["auth","key","token","xapikey"]),la=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),da=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),un=32,po=64,ua=5,fa=512,pa=262144,Gn=262144,yo=524288,cn=524288,$t=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function I(e,t){throw new $t(e,t)}function ln(e,t){return(!e||typeof e!="object"||Ut.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&I(`${t} must be a plain object`,"invalid-object"),e}function Zn(e,t,n){ln(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&I(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});(o.length>r.size||o.some(s=>!r.has(s)))&&I(`${n} has unknown field(s)`,"unknown-field");for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!i.enumerable||!Object.hasOwn(i,"value"))&&I(`${n}.${s} must be enumerable own data`,"invalid-component")}return e}function bo(e){if(!/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e))return!1;let t=e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1");return!J(t)}function ma(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 Xn(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])||ma(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ha(e){return Xn(e)!==null}var ga="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ya(e){let t=0n;for(let o of e){let s=ga.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 ba(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=ya(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 qn("sha256").update(qn("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function Ea(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||nn(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||ba(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)||ha(e)}function Oa(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?Ea(e):t==="coinType"?bo(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):go.test(e)}function Wn(e,t,n){if(n>12&&I("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>yo&&I("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||Ut.isProxy(e))&&I("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&I("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-component"),t.active.add(e);try{if(Array.isArray(e)){for(let c of Object.getOwnPropertyNames(e))c!=="length"&&(c==="toJSON"&&Object.getOwnPropertyDescriptor(e,c)?.value===void 0||/^(?:0|[1-9]\d*)$/u.test(c)||I("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>cn&&I("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));(!d||!Object.hasOwn(d,"value"))&&I("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Wn(d.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(a,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(a)}let r=Object.getPrototypeOf(e);r!==Object.prototype&&r!==null&&I("value must be a plain object","invalid-component");let o=Object.getOwnPropertyNames(e);for(let a of o){let c=Object.getOwnPropertyDescriptor(e,a);a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0||(!c||!c.enumerable||!Object.hasOwn(c,"value"))&&I(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>cn&&I("value exceeds the freeze field limit","data-limit");let i=r===null?Object.create(null):{};for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Wn(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 Ge(e){return Wn(e,{nodes:0,fields:0,active:new Set},0)}function B(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&I(`${t} must be an own data field`,"invalid-component"),n.value}function Jn(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&I(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function Eo(e,t,{max:n=fa,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&I(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&sa.test(e)||r&&(go.test(e)||bo(e))||o&&Oa(e,o))&&!oa.test(e);return J(e)&&!i&&I(`${t} contains secret-shaped material`,"secret-material"),e}function wa(e,t){(!na.test(e)||/^[0-9a-f]{64}$/iu.test(e)||J(e))&&I(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!la.has(n);return(ca.has(n)||r||da.some(o=>n.includes(o)))&&I(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function fn(e,t,n,r="data-limit"){Ut.isProxy(e)&&I(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||I(`${t} must be an array`,"invalid-component"),e.length>n&&I(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){Object.hasOwn(e,s)||I(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&I(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function Yn(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 Aa(e){let t=Yn(e,1);return typeof t=="string"&&ra.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 Ia(e){let t=Yn(e,1);return typeof t=="string"&&ia.has(t)?!0:Number.isInteger(t)&&aa.has(Yn(e,2))}function Mt(e,t,n,r,o){if(n>ua&&I(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>pa&&I(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return Eo(e,t,{publicIdentifierField:Aa(o),allowDeterministicRecordId:Ia(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||Ut.isProxy(e))&&I(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&I(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>po&&I(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),fn(e,t,po).map((a,c)=>Mt(a,`${t}[${c}]`,n+1,r,[...o,c]));ln(e,t);let s=Object.keys(e);s.length>un&&I(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){wa(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,Mt(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function Kn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&I("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>yo&&I("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&Ut.isProxy(e)&&I("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&I("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=fn(e,"canonical value",ae.evidence,"invalid-json");return r.fields+=c.length,r.fields>cn&&I("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Kn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&I("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>un&&I("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>cn&&I("value exceeds canonical JSON field limit","invalid-json"),i.sort(),`{${i.map(c=>{let d=Object.getOwnPropertyDescriptor(e,c);return(!d||!Object.hasOwn(d,"value"))&&I("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Kn(d.value,r,n+1)}`}).join(",")}}`}finally{r.active.delete(e)}}(e===void 0||typeof e=="bigint"||typeof e=="function"||typeof e=="symbol"||typeof e=="number"&&!Number.isFinite(e))&&I("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&I("value is not canonical JSON","invalid-json"),o}function rt(e){return`sha256:${qn("sha256").update(Kn(e)).digest("hex")}`}function ot(e,t){let n=Eo(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||I("id kind must be a lowercase slug","invalid-id"),`${n}_${rt(t).slice(7)}`}function an(e,t,n,r){let o=fn(e,t,n,"component-limit");return r.fields+=o.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>Mt(s,`${t}[${i}]`,0,r,[t,i]))}function Qn(e){let t=["subject","entities","events","evidence","coverage","gaps"];Zn(e,t,"components"),Jn(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=Mt(B(e,"subject"),"subject",0,n,["subject"]),o=an(B(e,"entities"),"entities",ke.maxNodes,n),s=an(B(e,"events"),"events",ke.maxEdges,n),i=an(B(e,"evidence"),"evidence",ae.evidence,n),a=Mt(B(e,"coverage"),"coverage",0,n,["coverage"]),c=an(B(e,"gaps"),"gaps",ke.maxNodes,n);return Ge({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}var mo=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),Sa=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function Na(e,t,n){if(e===null)return null;if(Zn(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&I("collector output.cursor fields are invalid","invalid-cursor"),B(e,"requested")===null&&B(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&I("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:wt(B(e,"requested"),r),next:wt(B(e,"next"),r)}}catch{I("collector cursor binding or payload is invalid","invalid-cursor")}}function Hn(e,t){let n=new Set;for(let r of e)(!r||typeof r!="object"||!Object.hasOwn(r,"id")||typeof r.id!="string"||r.id.length===0)&&I(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&I(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function Ta(e){let t=e.subject,n=typeof t.chain=="string"&&t.chain.length>0||Number.isSafeInteger(t.chain)&&t.chain>=0;(!Object.hasOwn(t,"family")||typeof t.family!="string"||t.family.length===0||!Object.hasOwn(t,"chain")||!n||!Object.hasOwn(t,"address")||typeof t.address!="string"||t.address.length===0)&&I("collector subject identity is invalid","invalid-reference");let r=e.coverage.source;(!Object.hasOwn(e.coverage,"source")||r!==null&&(typeof r!="string"||r.length===0)||e.coverage.collectorStatus!=="UNAVAILABLE"&&r===null)&&I("collector coverage source is invalid","invalid-reference");let o=Hn(e.entities,"entity");e.entities.some(i=>Object.hasOwn(i,"family")&&i.family===t.family&&Object.hasOwn(i,"chain")&&i.chain===t.chain&&Object.hasOwn(i,"address")&&i.address===t.address)||I("collector subject entity reference is missing","invalid-reference"),Hn(e.events,"event");let s=Hn(e.evidence,"evidence");for(let i of e.events){for(let a of["from","to"])(!Object.hasOwn(i,a)||i[a]!=null&&(typeof i[a]!="string"||!o.has(i[a])))&&I(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(i,"evidenceRefs")||!Array.isArray(i.evidenceRefs)||i.evidenceRefs.some(a=>typeof a!="string"||!s.has(a))||new Set(i.evidenceRefs).size!==i.evidenceRefs.length)&&I("collector event evidence references are invalid","invalid-reference")}}function ho(e,t,n=un){let r=Object.keys(e);r.length>n&&I(`${t} exceeds the field limit`,"data-limit");let o=[];for(let s of r){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!Object.hasOwn(i,"value"))&&I(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function er(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];Zn(e,t,"collector output"),Jn(e,t,"collector output"),B(e,"schemaVersion")!==dn&&I("collector output.schemaVersion is unsupported","invalid-schema-version"),B(e,"execution")!=="read-only"&&B(e,"execution")!=="READ_ONLY"&&I("collector output must be read-only","invalid-posture"),Sa.has(B(e,"status"))||I("collector output.status is invalid","invalid-status"),Array.isArray(B(e,"evidence"))||I("collector output.evidence must be an array","invalid-component"),ln(B(e,"coverage"),"collector output.coverage");let n=Qn({subject:B(e,"subject"),entities:B(e,"entities"),events:B(e,"events"),evidence:fn(B(e,"evidence"),"collector output.evidence",ke.maxEdges,"component-limit").map(o=>{ln(o,"collector evidence"),Jn(o,["status"],"collector evidence");let s=B(o,"status"),i=typeof s=="string"&&Object.hasOwn(mo,s)?mo[s]:null;return i||I("collector evidence status is invalid","invalid-status"),{...ho(o,"collector evidence"),status:i}}),coverage:{...ho(B(e,"coverage"),"collector coverage",un-1),collectorStatus:B(e,"status")},gaps:B(e,"gaps")});Ta(n);let r=Na(B(e,"cursor"),n.subject,n.coverage.source);return Ge({...n,cursor:r})}import{types as hr}from"node:util";var pn=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"}),tr=Object.freeze(["block_number","index"]),Oo=new Set([...tr,"items_count","value","hash","inserted_at","fee"]);function Vt(e){return Number.isSafeInteger(e)&&e>=0}function st(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 _a(e){if(!Ee(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==tr.length||t.some(o=>!tr.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=st(e,"block_number","blockscout transaction",!0),r=st(e,"index","blockscout transaction",!0);if(!Vt(n)||!Vt(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function va(e){if(!Ee(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>Oo.size||t.some(a=>!Oo.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=st(e,"block_number","blockscout provider",!0),r=st(e,"index","blockscout provider",!0);if(!Vt(n)||!Vt(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=st(e,"items_count","blockscout provider");if(o!==void 0&&!Vt(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=st(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=st(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=st(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 xa(e,t={}){let n=Number(e),r=t.baseUrl||pn[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function wo(e){return!!pn[Number(e)]}async function Ao(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=_a(s);for(let[p,m]of Object.entries(h))m!=null&&o.set(p,String(m))}let i=`${xa(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=Z(await K(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,headers:{accept:"application/json","user-agent":"OracleInvestigator/1.0"}}),"blockscout transactions response"),c=ge(a,"items");if(!Ee(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,f=ge(a,"next_page_params");if(f!=null){if(!Ee(f))throw new Error("blockscout transactions returned an invalid next cursor");l=va(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 Ra="mainnet-beta",nr="https://api.mainnet-beta.solana.com";function La(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||nr).trim()}function Pa(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 Ca(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=Z(await K(La(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!Ee(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=ge(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${ge(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return ge(o,"result")}async function Io(e={},t={}){let n=Pa(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 Ca("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:Ra,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 ja="mainnet",rr="https://mempool.space/api",or="https://mempool.space/testnet/api";function So(e={}){return String(e.network||process.env.BTC_NETWORK||ja).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ka(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):So(e)==="testnet"?or:rr}function Da(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 $a(e,t={}){let n=`${ka(t)}${e.startsWith("/")?e:`/${e}`}`;return Z(await K(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function No(e={},t={}){let n=Da(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 $a(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:So(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 sr="https://api.hyperliquid.xyz/info",ir="https://api.hyperliquid-testnet.xyz/info";function Ma({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"?ir:sr}async function Ua(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Ma(t);return Z(await K(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function To(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Ua({type:"userFills",user:e},t)}var _o="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function At({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:vo(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([vo(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[_o]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${_o}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function vo(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function De(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function It(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 ar="https://api.trongrid.io",Fa=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],Va="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function za(e={}){return At({provider:"tron-public",defaultUrl:ar,hosts:Fa,url:e.baseUrl||process.env.TRON_API_URL||""})}function Ba(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return De(t)}function Ha(e,t){return It({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function qa(e,t={}){let n=za(t),r=Ba(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Ha(n.trusted,r)}),"tron-public response");return He(o,n.trusted?r:"","tron-public response")}function xo(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 Ga(e){return Ot({error:"tron-public request failed"},e)}function Wa(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 Ro(e={},t={}){try{let n=xo(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?Va:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",xo(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 qa(`/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:Wa(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 Ga(n)}}var dr="https://toncenter.com/api",Ja=["toncenter.com","testnet.toncenter.com"];function Ya(e={}){return At({provider:"ton-public",defaultUrl:dr,hosts:Ja,url:e.baseUrl||process.env.TON_API_URL||""})}function Ka(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return De(t)}function Za(e,t){return It({Accept:"application/json"},{"X-API-Key":t},e)}async function Xa(e,t={}){let n=Ya(t),r=Ka(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Za(n.trusted,r)}),"ton-public response");return He(o,n.trusted?r:"","ton-public response")}function Qa(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 ec(e){return Ot({error:"ton-public request failed"},e)}function tc(e,t){if(!Ee(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(ge(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 ge(e,"result")}function cr(e){let t=String(e??"").trim();if(et(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||tt(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function lr(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 Lo(e={},t={}){try{let n=Qa(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:cr(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=tc(await Xa(`/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:cr(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=cr(m.transaction_id.hash),y=String(m.transaction_id.lt??"");if(y.length>100||!/^\d+$/u.test(y))throw new Error("ton-public: malformed transaction logical time");if(m.in_msg!=null&&(typeof m.in_msg!="object"||Array.isArray(m.in_msg)))throw new Error("ton-public: malformed inbound message");if(m.out_msgs!=null&&!Array.isArray(m.out_msgs))throw new Error("ton-public: malformed outbound messages");let E=Array.isArray(m.out_msgs),S=m.out_msgs??[];if(S.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let x=0n;for(let j of S){if(!j||typeof j!="object"||Array.isArray(j))throw new Error("ton-public: malformed outbound message");x+=BigInt(lr(j.value??"0","outbound message value",{nullable:!1}))}let R=E?String(x):null;if(R!=null&&R.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:m.utime??null,feeNano:lr(m.fee,"transaction fee"),inMessageValueNano:lr(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:S.length,outMessageValueNano:R}}),u=c.length>=i,h=f.length>0?f[f.length-1]:null,p=u&&h?{lt:h.lt,hash:h.hash}:null;return{provider:"ton-public",address:n,limit:r,count:f.length,cursor:s,nextCursor:p,pageComplete:!u,continuationUnknown:u&&!p,transactions:f}}catch(n){return ec(n)}}var We=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"})}),Po="cosmoshub";function nc(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function rc(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||Po).trim().toLowerCase(),o=Object.hasOwn(We,r)?We[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=nc(r)||r===Po&&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(We).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 oc(e,t,n={}){return Z(await K(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly,headers:{Accept:"application/json"}}),"cosmos-lcd response")}function sc(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 ic(e){return{error:String(e?.message||e).slice(0,200)}}function ac(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 cc(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function lc(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:cc(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?ac(r,t.decimals):null}}async function Co(e={},t={}){try{let n=rc(e,t),r=sc(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 oc(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=>lc(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 ic(n)}}var fr="https://fullnode.mainnet.aptoslabs.com",ur="0x1::aptos_coin::AptosCoin",mn=8;function Do(e={}){return At({provider:"aptos-public",defaultUrl:fr,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function $o(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return De(t)}function Mo(e,t){return It({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function jo(e,t={}){let n=Do(t),r=$o(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Mo(n.trusted,r)}),"aptos-public response");return He(o,n.trusted?r:"","aptos-public response")}function dc(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 uc(e){return Ot({error:"aptos-public request failed"},e)}function ko(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 fc(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function Uo(e={},t={}){try{let n=dc(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=Do(t),m=$o(t),g=He(Z(await K(`${p.baseUrl}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Mo(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 jo(`/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===ur;return{provider:"aptos-public",address:n,source:u,count:1,balances:[{coinType:r,raw:f??"0",decimals:h?mn:null,symbol:h?"APT":null,amount:h?ko(f??"0",mn):null}]}}let s=Math.min(201,o+1),i=await jo(`/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=fc(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===ur;c.push({coinType:u,raw:h,decimals:p?mn:null,symbol:p?"APT":null,amount:p?ko(h,mn):null,frozen:f?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(f=>f.coinType===ur)||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 uc(n)}}var gr="oracle.investigator-fact-projection/1",Go=4*1024*1024;function we(e){return Ge(e)}var it=Ge({evm:we({status:"AVAILABLE",mode:"transaction-history",source:"blockscout",chainIds:Object.freeze([1,10,137,324,8453,42161,534352]),chainStatus:Object.freeze({1:"AVAILABLE",10:"AVAILABLE",137:"AVAILABLE",324:"AVAILABLE",8453:"AVAILABLE",42161:"AVAILABLE",534352:"AVAILABLE",56:"UNAVAILABLE",130:"UNAVAILABLE",143:"UNAVAILABLE",360:"UNAVAILABLE",988:"UNAVAILABLE",999:"UNAVAILABLE",1329:"UNAVAILABLE",1868:"UNAVAILABLE",2020:"UNAVAILABLE",2741:"UNAVAILABLE",4326:"UNAVAILABLE",4663:"UNAVAILABLE",5031:"UNAVAILABLE",8333:"UNAVAILABLE",33139:"UNAVAILABLE",43114:"UNAVAILABLE",43419:"UNAVAILABLE",57073:"UNAVAILABLE",69e3:"UNAVAILABLE",80094:"UNAVAILABLE",81457:"UNAVAILABLE",7777777:"UNAVAILABLE"}),maxLimit:50,cursor:"CONDITIONAL",cursorMode:"conditional",cursorReason:"A continuation is exposed only when Blockscout does not over-return and force client truncation",facts:"Bounded Blockscout transaction fact projections"}),solana:we({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:we({status:"AVAILABLE",mode:"transaction-history",source:"bitcoin-esplora",chainIds:Object.freeze(["mainnet","testnet"]),maxLimit:25,cursor:!0,facts:"Bounded Esplora transaction facts with input/output summaries"}),hyperliquid:we({status:"AVAILABLE",mode:"fill-history",source:"hyperliquid-info",chainIds:Object.freeze(["hyperliquid-mainnet","hyperliquid-testnet"]),maxLimit:1e3,cursor:!1,facts:"Bounded public userFills fact projections"}),tron:we({status:"AVAILABLE",mode:"trc20-transfer-history",source:"tron-public",chainIds:Object.freeze(["tron-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded confirmed TRC20 transfer facts, not native TRX history"}),ton:we({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(We)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"aptos-public",chainIds:Object.freeze(["aptos-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded legacy CoinStore holding facts only; Fungible Asset enumeration and transaction history are not collected"}),liquid:we({status:"EVIDENCE_ONLY",mode:"address-state",source:"liquid-esplora",chainIds:Object.freeze(["liquid-mainnet"]),maxLimit:1,cursor:!1,facts:"Bounded address transaction-count and confidentiality-form facts only; per-asset balances and transaction timeline are unavailable"}),sui:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["celestia-mainnet"]),maxLimit:0,cursor:!1,reason:"DA address history is unavailable; Cosmos account state uses family cosmos and chainId celestia"}),unsupported:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})});var Fo=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"}),Vo=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"}),zo=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"}),pc=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),En=Symbol("missing-public-fact"),hn=8;function mc(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Fo,t)?Fo[t]:t)||"unsupported"}function An(e){return Ee(e)&&Object.getPrototypeOf(e)===Object.prototype}function U(e,t){return ge(e,t)}function Ke(e){return Ee(e)}function mr(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]=mr(i.value,t+1)}return o}if(!Ke(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]=mr(s.value,t+1)}return r}function hc(e){if(!An(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 gc(e){if(!Ke(e))throw new Error("investigator collector: internal options must be a plain object");let t=new Set(["now","transports","fetchImpl","timeoutMs"]);if(Object.keys(e).filter(s=>!t.has(s)).length)throw new Error("investigator collector: internal options have unknown fields");let r=U(e,"fetchImpl"),o=U(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!An(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 yc(e){let t=U(e,"now"),n=typeof t=="function"?t():t??new Date,r=n instanceof Date?n:new Date(n);if(!Number.isFinite(r.getTime()))throw new Error("investigator collector: now must be a valid date");return r.toISOString()}function bc(e,t,n){let r=Object.hasOwn(Vo,t)?Vo[t]:void 0,o=Object.hasOwn(zo,e)?zo[e]:void 0,s=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(s)||s<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return s}if(typeof s!="string"||s.length===0||s.length>96||/[\u0000-\u001f\u007f]/u.test(s)||/:\/\//u.test(s)||/^[0-9a-f]{64}$/iu.test(s)||J(s))throw new Error("investigator collector: chainId is invalid");return s}function gn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Ec(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 Wo(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 Ec(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function yr(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&Dt(e)}function Ae(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return rn(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&gn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&gn(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 Wo(n)!==null;if(e==="cosmos"){if(!gn(n))return!1;let r=Object.hasOwn(We,t)?We[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)&&gn(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||yr(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 Re(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"?Wo(t)??t:t}function Oc(e,t,n){if(typeof n!="string"||n.length===0||n.length>256||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("investigator collector: address is invalid");let r=n.trim();if(!r||/:\/\//u.test(r)||!Ae(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&Ae(e,t,r)||e==="liquid"&&yr(r);if(J(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return Re(e,r)}function wc(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 Ac(e,t,n){if(t===it.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 Jo(e={}){hc(e);let t=U(e,"family"),n=typeof t=="string"?t.trim().toLowerCase():"";if(n.length>63||!/^[a-z][a-z0-9-]*$/u.test(n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))throw new Error("investigator collector: family is invalid");let r=mc(n),o=Object.hasOwn(it,r)?it[r]:it.unsupported,s=bc(r,n,U(e,"chainId"));Ac(r,o,s);let i=Oc(r,s,U(e,"address")),a=wc(U(e,"limit"),o),c=U(e,"cursor"),d=c===void 0?null:wt(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 zt(e,t){return`${e}_${rt(t).slice(7,55)}`}function Yo(e,t,n){return zt("entity",{family:e,chain:t,address:n,kind:"address"})}function Ic(e){return{id:Yo(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function In(e,t,n,r=[]){return{schemaVersion:dn,execution:"read-only",status:t,subject:e,entities:[Ic(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function Ye(e,t){return{code:e,message:t}}var On=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 bn(e,t="provider-unavailable"){let n=i=>ge(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(On,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:On[s]})}function Ko(e,t,n,r,o,s=!1){return{id:zt("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 pr(e,t,n,r,o,s){let i=t?.source||null,a=ge(r,"code"),c=a&&Object.hasOwn(On,a)?Object.freeze({code:a,httpStatus:ge(r,"httpStatus")??null,message:On[a]}):bn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=In(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(Ko("ERROR",i,o,e,d,!0)),l.cursor=t?.cursor?{requested:s,next:null}:null,l}function yn(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=In(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[Ye("unavailable",r)]);return o.evidence.push(Ko("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function Sc(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=De(process.env[n]);if(r)return r}return null}function Je(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof U(n,"fetchImpl")=="function"?U(n,"fetchImpl"):void 0,timeoutMs:U(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:Go,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:pn[Number(t.chainId)]}):e==="solana"?s({rpcUrl:nr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?or:rr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?ir:sr}):e==="tron"?s({baseUrl:ar}):e==="ton"?s({baseUrl:dr}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(We,t.chainId)?We[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:fr}):e==="liquid"?s({baseUrl:Vn}):o}var Bo=Object.freeze({evm:(e,t,n)=>Ao(e,Je("evm",e,t,n)),solana:(e,t,n)=>Io(e,Je("solana",e,t,n)),bitcoin:(e,t,n)=>No(e,Je("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>To(e.address,Je("hyperliquid",e,t,n)),tron:(e,t,n)=>Ro(e,Je("tron",e,t,n)),ton:(e,t,n)=>Lo(e,Je("ton",e,t,n)),cosmos:(e,t,n)=>Co(Object.assign(Object.create(null),e,{chain:e.chainId}),Je("cosmos",e,t,n)),aptos:(e,t,n)=>Uo(e,Je("aptos",e,t,n)),liquid:(e,t,n)=>no(e,Je("liquid",e,t,n))});function Nc(e,t,n,r){let o=U(n,"transports"),s=o&&Object.hasOwn(o,e)?o[e]:null,i=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=s||i;if(a)return d=>a(d,n);let c=Object.hasOwn(Bo,e)?Bo[e]:null;return c?d=>c(d,n,r):void 0}function ce(e){return typeof e=="string"?e||null:U(e,"hash")||U(e,"address")||null}function Zo(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 En;let r=pc.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,s=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),i=t==="coinType"&&/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e)&&!J(o),a=r&&(/^(?:(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/u.test(e)||s||i);return J(e)&&!a?En:e}function k(e,t,n,r,o){let s=Zo(r,n,o);return s===En||r===void 0?!1:(e[n]=s,t.push(n),!0)}function br(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=Ke(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 Tc(e,t){let n={},r=[];k(n,r,"transactionHash",e.hash),k(n,r,"blockNumber",e.block_number),k(n,r,"timestamp",e.timestamp),k(n,r,"fromAddress",ce(e.from)),k(n,r,"toAddress",ce(e.to)),k(n,r,"createdContractAddress",Nt("evm",t,ce(e.created_contract))?ce(e.created_contract):void 0),k(n,r,"value",e.value),k(n,r,"status",e.status),k(n,r,"fee",Ke(e.fee)?e.fee.value:e.fee),k(n,r,"gasUsed",e.gas_used),k(n,r,"gasLimit",e.gas_limit),k(n,r,"nonce",e.nonce);let o=ce(e.token);return k(n,r,"tokenAddress",typeof o=="string"&&Ae("evm",t,o)?o:void 0),k(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:br("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function _c(e,t){if(!Ke(e))return null;let n={},r=[];return k(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),k(n,r,"outputIndex",e.vout),k(n,r,"coinbase",e.is_coinbase),k(n,r,"sequence",e.sequence),k(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&Ae("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),k(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function vc(e,t,n){if(!Ke(e))return null;let r={index:t},o=[];return k(r,o,"address",typeof e.scriptpubkey_address=="string"&&Ae("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),k(r,o,"value",e.value),k(r,o,"scriptType",e.scriptpubkey_type,64),r}function xc(e,t){let n={},r=[];k(n,r,"transactionId",e.txid),k(n,r,"version",e.version),k(n,r,"locktime",e.locktime),k(n,r,"size",e.size),k(n,r,"weight",e.weight),k(n,r,"fee",e.fee);let o={},s=[];k(o,s,"confirmed",e.status?.confirmed),k(o,s,"blockHeight",e.status?.block_height),k(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),k(o,s,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let i=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=i.slice(0,hn).map(l=>_c(l,t)).filter(Boolean),d=a.slice(0,hn).map((l,f)=>vc(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:br("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:i.length,inputSelected:c.length,inputsTruncated:i.length>hn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>hn})}}function mt(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):U(t,a);k(r,o,i,l,c),typeof a=="string"?s.push(a):typeof d=="string"&&s.push(d)}return{facts:r,projection:br(e,t,o,{sourceFields:s})}}function wn(e,t,n){return e==="evm"?Tc(n,t):e==="bitcoin"?xc(n,t):e==="solana"?mt(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>U(r,"err")!==null&&U(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?mt(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"?mt(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"?mt(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?mt(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?mt(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):mt(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function Tt(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");Tt(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");Tt(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function Xo(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!J(e)}function $e(e,t=100,{nullable:n=!0}={}){return e==null?n:Number.isSafeInteger(e)&&e>=0?!0:typeof e=="string"&&e.length>0&&e.length<=t&&/^\d+$/u.test(e)&&!J(e)}function Rc(e,t=100,{nullable:n=!0}={}){return e==null?n:typeof e=="number"?Number.isFinite(e):typeof e=="string"&&e.length>0&&e.length<=t&&/^-?\d+(?:\.\d+)?$/u.test(e)&&!J(e)}function St(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:Xo(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Lc(e){if(typeof e!="string"||et(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&&!tt(t)}catch{return!1}}function Nt(e,t,n){return n==null||typeof n=="string"&&Ae(e,t,n)}function Qo(e,t,n){return`${e}:${String(t)}:${n}`}function Ho(e,t,n){let r=ce(n);return typeof r=="string"&&Ae(e,t,r)?Qo(e,t,Re(e,r)):null}function _t(e,t,n){return typeof t=="string"&&typeof n=="string"&&Re(e,t)===Re(e,n)}function Pc(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(s=>{let i=s?.prevout?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&_t("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&_t("bitcoin",i,n)})}function Cc(e,t,n,r){if(!Ke(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&Nt("evm",t,ce(r.from))&&Nt("evm",t,ce(r.to))&&Nt("evm",t,ce(r.created_contract))&&[ce(r.from),ce(r.to),ce(r.created_contract)].some(o=>_t("evm",o,n))&&$e(r.block_number,32)&&$e(r.value,100)&&St(r.timestamp,{iso:!0});if(e==="solana")return on(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&St(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&Ke(r.status)&&Pc(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&$e(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&St(r.status.block_time);if(e==="hyperliquid"){let o=Xo(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||$e(r.tid,32,{nullable:!1});return o&&s&&i&&(r.hash!=null||r.tid!=null)&&Rc(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&St(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&Ae("tron",t,r.from)&&typeof r.to=="string"&&Ae("tron",t,r.to)&&[r.from,r.to].some(o=>_t("tron",o,n))&&typeof r.tokenAddress=="string"&&Ae("tron",t,r.tokenAddress)&&$e(r.raw,100,{nullable:!1})&&St(r.blockTimestamp):e==="ton"?Lc(r.hash)&&$e(r.lt,40,{nullable:!1})&&Nt("ton",t,r.inMessageSource)&&Nt("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>_t("ton",o,n))&&$e(r.inMessageValueNano,100)&&St(r.utime):!1}function jc(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:An(t)?e==="evm"||e==="bitcoin"||e==="ton"?U(t,"transactions")??null:e==="solana"?U(t,"signatures")??null:e==="tron"?U(t,"transfers")??null:null:null}function qo(e,t,n){if(e==="evm")return{type:"transaction",from:ce(n.from)?Re("evm",ce(n.from)):null,to:ce(n.to)??ce(n.created_contract)?Re("evm",ce(n.to)??ce(n.created_contract)):null,asset:Ho("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=Zo(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===En?null:Qo("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?Re("tron",n.from):null,to:n.to?Re("tron",n.to):null,asset:Ho("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?Re("ton",n.inMessageSource):null,to:n.inMessageDestination?Re("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 kc(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=Re(e.subject.family,s),a=n.get(i);a||(a=Yo(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 es(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]=mr(s.value)}return r}function Dc(e,t,n,r,o,s,i,a){let c=es(o,n.applied+1);if(c.some(_=>!Cc(e.family,e.chain,e.address,_)))throw new Error(`${t.source} returned a malformed history row`);let d=c.length>n.applied,l=c.slice(0,n.applied),f=!!(!Array.isArray(r)&&U(r,"truncated")),u=Array.isArray(r)?null:U(r,"nextCursor")??null;for(let _ of l)Tt(wn(e.family,e.chain,_).facts,a),Tt(qo(e.family,e.chain,_),a);Tt(u,a);let h=!!(!Array.isArray(r)&&U(r,"continuationUnknown")),p=!Array.isArray(r)&&U(r,"pageComplete")===!0,m=u!=null&&!t.cursor,g=l.length===n.applied&&u==null&&!p,y=[];(f||d)&&y.push(Ye("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&y.push(Ye("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(Ye("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=f||d||h||m||g||e.family==="tron",S=null;if(t.cursor&&u!=null&&!d)try{S=fo({family:e.family,chain:e.chain,address:e.address,provider:t.source},u)}catch{y.push(Ye("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let x=In(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:l.length,historyAvailable:!0,cursorSupported:t.cursor},y),R=new Set,j=new Set;return l.forEach(_=>{let T=qo(e.family,e.chain,_),D=wn(e.family,e.chain,_),ee=zt("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:T.locator,publicFacts:D.facts}),v=zt("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:T.type,locator:T.locator,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp});if(R.has(v))throw new Error(`${t.source} returned duplicate event identity`);if(j.has(ee))throw new Error(`${t.source} returned duplicate evidence identity`);R.add(v),j.add(ee),x.evidence.push({id:ee,status:"OBSERVED",source:t.source,observedAt:s,locator:T.locator,publicFacts:D.facts,projection:D.projection}),x.events.push({id:v,type:T.type,from:T.from,to:T.to,asset:T.asset,amount:T.amount,transactionId:T.transactionId,blockHeight:T.blockHeight,timestamp:T.timestamp,evidenceRefs:[ee]})}),kc(x),t.cursor&&(x.cursor={requested:i,next:S}),x}function $c(e,t){return An(t)?e==="liquid"?U(t,"provider")==="liquid-esplora"&&Number.isFinite(U(t,"txCount"))?[t]:null:U(t,"balances")??null:null}function Mc(e,t,n,r){if(!Ke(r))return!1;if(e==="cosmos"){let o=/^ibc\/[0-9a-f]{64}$/iu.test(String(r.denom??""));return typeof r.denom=="string"&&r.denom.length>0&&r.denom.length<=256&&!/[\u0000-\u001f\u007f]/u.test(r.denom)&&(!J(r.denom)||o)&&$e(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),s=/^0x[0-9a-f]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(o),i=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return s&&!J(i)&&$e(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&Ae("liquid",t,r.address)&&_t("liquid",r.address,n)&&r.confidential===yr(r.address)&&(r.balanceSats===null||$e(r.balanceSats,100,{nullable:!1})):!1}function Uc(e,t,n,r,o,s,i){let a=es(o,n.applied+1);if(a.some(h=>!Mc(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)Tt(wn(e.family,e.chain,h).facts,i);let d=!!U(r,"truncated")||a.length>n.applied,l=[Ye("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(Ye("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(Ye("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(Ye("response-truncated","provider evidence exceeded the safe record bound"));let f=In(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=wn(e.family,e.chain,h),m=zt("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 ts(e={},t={}){gc(t);let n=Jo(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=yc(t);if(c.status==="UNAVAILABLE"||c===it.unsupported)return yn(d,c,l);if(!c.chainIds.some(g=>String(g)===String(o)))return yn(d,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},l);if(r==="evm"&&!wo(o))return yn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let f=Sc(r),u=Nc(r,c,t,f);if(typeof u!="function")return yn(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 pr(d,c,i,bn(g),l,a)}if(U(m,"error")){let g=Qr(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 pr(d,c,i,bn(y,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=$c(r,m);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return Uc(d,c,i,m,y,l,f)}let g=jc(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return Dc(d,c,i,m,g,l,a,f)}catch{return pr(d,c,i,bn(null,"provider-invalid-response"),l,a)}}var Fc=Object.freeze(Object.create(null));async function ns(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return ts(e,Fc)}import{createHash as Vc}from"node:crypto";import{types as Oe}from"node:util";var zc="oracle.coordination/1",_f=Ge({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),vf=Ge({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Bc=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}),Le=Object.freeze({maxEntities:ke.maxNodes,maxEvents:ke.maxEdges,maxEvidence:ae.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),Ht=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),qt=new Set(["FUND","FUNDING"]),us=new Set([...Ht,...qt,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),Hc=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),qc=new Set(["CREATOR","DEPLOYER"]),rs=new Set(Ft),os=new Set(["LIVE","INDEXED"]);var ss=250,Gc=32,Wc=32,re=(e,t)=>e<t?-1:e>t?1:0,oe=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},Ie=e=>(oe(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",pe=e=>oe(typeof e=="object"&&e!==null?O(e,"id"):e),le=e=>[...new Set(e.filter(Boolean))].sort(re),Jc=(e,t)=>re(e.id,t.id),Me=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},Yc=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,Nr=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=oe(e);if(!t)return null;let n=Yc.exec(t);if(!n)return null;let[,r,o,s,i,a,c,d="",l]=n,[f,u,h,p,m,g]=[r,o,s,i,a,c].map(Number);if(u<1||u>12||h<1||p>23||m>59||g>59)return null;if(l!=="Z"){let[x,R]=l.slice(1).split(":").map(Number);if(x>23||R>59)return null}let y=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(f,u-1,h),E.setUTCHours(p,m,g,y),E.getUTCFullYear()!==f||E.getUTCMonth()!==u-1||E.getUTCDate()!==h||E.getUTCHours()!==p||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let S=Date.parse(t);return Number.isFinite(S)?S:null},fs=e=>Array.isArray(e)?e:[],O=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&Oe.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0},q=(e,t=64)=>{if(at(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},at=(e,t=64)=>{if(e==null)return!1;if(Oe.isProxy(e)||!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>t||Object.getOwnPropertySymbols(e).length>0)return!0;let n=new Set(["length"]);for(let r=0;r<e.length;r+=1)n.add(String(r));for(let r of Object.getOwnPropertyNames(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(!(r==="toJSON"&&o&&Object.hasOwn(o,"value")&&o.value===void 0&&o.enumerable===!1)&&!n.has(r))return!0}for(let r=0;r<e.length;r+=1){let o=Object.getOwnPropertyDescriptor(e,String(r));if(!o||!o.enumerable||!Object.hasOwn(o,"value"))return!0}return!1},Ze=(e,t={})=>Object.assign(Object.create(null),e,t),Nn=(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},Er=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),Kc=Object.freeze(["id","status"]),Or=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"]),Zc=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),Xc=Object.freeze(["numerator","denominator","bps"]),Qc=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),el=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function ps(e){return le([Ie(O(e,"kind")),...q(O(e,"roles")).map(Ie),...q(O(e,"tags")).map(t=>Ie(!t||typeof t!="object"?t:O(t,"name")??O(t,"value")))])}function Tr(e){return e?O(e,"isService")===!0?!0:ps(e).some(t=>Hc.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function ms(e){return qc.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function Sn(e){return ps(e).some(ms)}function tl(e){if(!Sn(e)||Tr(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(O(e,r)!==void 0)return!1;let t=q(O(e,"roles")).map(Ie),n=q(O(e,"tags")).map(r=>Ie(r&&typeof r=="object"?O(r,"name")??O(r,"value"):r));return[...t,...n].every(ms)}function Se(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[s,i=""]=e.split(".");return{raw:`${s}${i}`.replace(/^0+(?=\d)/u,""),decimals:i.length}}if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return null;let t=s=>{if(!Object.hasOwn(e,s))return{present:!1,value:void 0};let i=Object.getOwnPropertyDescriptor(e,s);return!i||!Object.hasOwn(i,"value")?{present:!0,invalid:!0}:{present:!0,value:i.value}},n=t("decimals");if(n.invalid||n.present&&n.value!=null&&(!Number.isInteger(n.value)||n.value<0||n.value>255))return null;let r=n.value==null?0:n.value,o=[];for(let s of["raw","atoms","baseUnits"]){let i=t(s);if(i.invalid)return null;if(!(!i.present||i.value==null)){if(typeof i.value!="string"||!/^\d+$/u.test(i.value)||i.value.length>512)return null;o.push(i.value.replace(/^0+(?=\d)/u,""))}}for(let s of["value","decimal","amount"]){let i=t(s);if(i.invalid)return null;if(!i.present||i.value==null)continue;if(typeof i.value!="string"||!/^\d+(?:\.\d+)?$/u.test(i.value)||i.value.length>512)return null;let[a,c=""]=i.value.split(".");if(c.length>r)return null;o.push(`${a}${c.padEnd(r,"0")}`.replace(/^0+(?=\d)/u,""))}return o.length===0||new Set(o).size!==1?null:{raw:o[0],decimals:r}}function xt(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function hs(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=xt(e,n),o=xt(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function nl(e,t){let n=hs(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function rl(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=xt(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=xt(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function gs(e){if(e&&typeof e=="object"){if(Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Xc)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=O(e,"numerator"),c=O(e,"denominator"),d=O(e,"bps"),l=a!=null||c!=null,f=null;if(l&&(a==null||c==null||(f=hs(Se(a),Se(c)),!f)))return null;let u=null;if(d!=null){if(!Number.isInteger(d)||d<0||d>1e4)return null;u={numerator:BigInt(d),denominator:10000n}}return!f&&!u||f&&u&&Number(f.numerator*10000n/f.denominator)!==d?null:f??u}let t=oe(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),s=BigInt(`${n}${r}`),i=s<=o?o:o*100n;return s<=i?{numerator:s,denominator:i}:null}function ol(e){if(!Array.isArray(e)||e.length>ke.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 sl(e){let t=gs(e);return t?Number(t.numerator*10000n/t.denominator):null}var vt=Symbol("alias-conflict");function _e(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 vt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return vt;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 vt;r=l,o=d}return r}function _r(e,t=64){if(e===void 0)return[];if(at(e,t))return null;let n=q(e,t).map(pe);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(re)}function ys(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 Sr(e,t){return _e(e,t,n=>{let r=Se(n);return r?{identity:ys(r),value:n}:null})}function wr(e,t){return _e(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 Lt(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")||!Rt(a.value,s,0))return!1}return!0}function Rt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>ae.dataNodes||n>ae.dataDepth)return!1;if(e==null||typeof e=="boolean")return!0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="string")return e.length<=ae.string;if(!e||typeof e!="object"||Oe.isProxy(e)||r.active.has(e))return!1;r.active.add(e);try{if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||e.length>ae.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let d=0;d<e.length;d+=1)c.add(String(d));for(let d of a){let l=Object.getOwnPropertyDescriptor(e,d);if(!(d==="toJSON"&&l&&Object.hasOwn(l,"value")&&l.value===void 0&&l.enumerable===!1)&&(typeof d!="string"||!c.has(d)))return!1}if(r.fields+=e.length,r.fields>ae.dataTotalFields)return!1;for(let d=0;d<e.length;d+=1){let l=Object.getOwnPropertyDescriptor(e,String(d));if(!l||!l.enumerable||!Object.hasOwn(l,"value")||!Rt(l.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let s=Reflect.ownKeys(e),i=[];for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);if(!(a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0&&c.enumerable===!1)){if(typeof a!="string"||!c||!c.enumerable||!Object.hasOwn(c,"value"))return!1;i.push([a,c.value])}}return i.length>ae.dataFields||(r.fields+=i.length,r.fields>ae.dataTotalFields)?!1:i.every(([,a])=>Rt(a,r,n+1))}finally{r.active.delete(e)}}function bs(e,t){let n=O(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||Oe.isProxy(n)||Array.isArray(n)||!Rt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>ae.dataFields)return null;let o=Nn(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 il(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Zc))return null;let t=_e(e,["entityId","entity","holder"],pe),n=Sr(e,["balance","amount"]),r=_r(O(e,"evidenceRefs"));return!t||t===vt||n===vt||n===null||r===null?null:Ze({},{entityId:t,balance:n,evidenceRefs:r})}function al(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Er))return null;let t=bs(e,Er);if(!t||Object.hasOwn(t,"isService")&&typeof O(t,"isService")!="boolean")return null;let n=pe(O(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=O(t,d);if(l!=null&&Nr(l)===null)return null}let r=O(t,"roles"),o=O(t,"tags"),s=O(t,"evidenceRefs");if([r,o,s].some(d=>at(d)))return null;let i=O(t,"supplyShare");if(i!==void 0&&sl(i)===null)return null;let a=Nn(t,Er);a.roles=q(r),a.tags=q(o);let c=_r(s);return c===null?null:(a.evidenceRefs=c,Ze(a,{id:n}))}function cl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Qc))return null;let t=pe(O(e,"id"));if(!t)return null;let n=O(e,"status"),r=typeof n=="string"?n:"MISSING";return Ze(Nn(e,Kc),{id:t,status:r})}function ll(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Or))return null;let t=bs(e,Or);if(!t)return null;let n=pe(O(t,"id"));if(!n||at(O(t,"holders"))||at(O(t,"evidenceRefs")))return null;let r=_e(t,["from","fromEntityId","funderId"],pe),o=_e(t,["to","toEntityId","recipientId"],pe),s=_e(t,["actor","actorEntityId","buyerId"],pe),i=_e(t,["asset","assetId","tokenId"],pe),a=_e(t,["pool","poolId"],pe),c=_e(t,["sourceChain","fromChain"],oe),d=_e(t,["destinationChain","toChain"],oe),l=_e(t,["transactionId","transactionHash","txId","txid","hash"],pe),f=_e(t,["bridgeTransferId"],pe),u=wr(t,["blockHeight","blockNumber"]),h=wr(t,["transactionIndex"]),p=wr(t,["eventIndex","logIndex","index"]),m=Sr(t,["amount","value","quantity"]),g=Sr(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,f,u,h,p,m,g].includes(vt))return null;let y=_r(O(t,"evidenceRefs"));if(y===null)return null;let E=O(t,"timestamp"),S=Nr(E);if(E!=null&&S===null)return null;let R=q(O(t,"holders")).map(il);if(R.some(T=>T===null))return null;let j=R.map(T=>T.entityId);if(new Set(j).size!==j.length)return null;let _=Nn(t,Or);return _.holders=R,Ze(_,{id:n,type:Ie(O(t,"type")),from:r,to:o,actor:s,asset:i,pool:a,sourceChain:c,destinationChain:d,bridgeTransferId:f,transactionId:l,blockPosition:u,transactionPosition:h,eventPosition:p,amount:m,totalSupply:g,timestampMs:S,evidenceRefs:y})}function Ar(e,t,n,r,o,s){if(Oe.isProxy(e))return s(r,"A proxy record array was refused."),{records:[],overflow:!1,malformed:!0};if(!Array.isArray(e))return{records:[],overflow:!1,malformed:!1};if(e.length>n)return s(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(at(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(Jc),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function Bt(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function dl(e){let t=oe(O(e,"family")),n=oe(O(e,"address")),r=O(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):oe(r);if(!t||!o||!n)return null;let s=t.toLowerCase(),i=["evm","ethereum","eth","eip155"].includes(s)?"eip155":s,a=n;["eip155","hyperliquid"].includes(i)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(i==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(i)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),i==="ton"&&(a=Xn(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 ul(e){let t=new Map;for(let n of e){let r=dl(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function is(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Ir(e){let t=Se(e);return t?ys(t):"-"}function fl(e){let t=q(O(e,"holders")).map(n=>`${is(O(n,"entityId"))}:${Ir(O(n,"balance"))}`).sort().join(";");return[e.type,e.from,e.to,e.actor,e.asset,e.pool,e.sourceChain,e.destinationChain,e.bridgeTransferId,e.timestampMs,Ir(O(e,"amount")),Ir(O(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(is).join("|")}function pl(e){let t=new Set;for(let n of e){let r=fl(n);if(t.has(r))return!0;t.add(r)}return!1}function Xe(e,t,n,r,o,s,i=[]){let a=Vc("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:le(n),reasons:o,caveats:le(i),evidenceRefs:le(r),score:Bc[e]}}function ml(e,t,n){let r=[...e].sort((l,f)=>l.timestampMs-f.timestampMs||re(l.id,f.id)),o=[],s=new Map,i=0,a=0,c=l=>{let f=l.actor??l.from;f&&s.set(f,(s.get(f)??0)+1)},d=l=>{let f=l.actor??l.from;if(!f)return;let u=(s.get(f)??0)-1;u<=0?s.delete(f):s.set(f,u)};for(;i<r.length;){for(;a<r.length&&r[a].timestampMs-r[i].timestampMs<=t;)c(r[a]),a+=1;s.size>=n?(o.push(r.slice(i,a)),i=a,s.clear()):(d(r[i]),i+=1,a<i&&(a=i))}return o}function H(e,t){let n=q(O(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function as(e,t){let n=q(O(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function ne(e,t){return typeof e=="string"&&t.has(e)}function cs(e){let t=O(e,"type");if(!us.has(t))return!1;let n=O(e,"from"),r=O(e,"to"),o=O(e,"actor")??n,s=O(e,"asset"),i=O(e,"timestampMs");if(qt.has(t))return!!(n&&r);if(Ht.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(oe(O(e,"sourceChain"))&&oe(O(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=q(O(e,"holders")).some(c=>pe(O(c,"entityId"))&&Se(O(c,"balance")));return!!(s&&Se(O(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Se(O(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function Gt(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 hl(e,t,n,r,o){let s=e.filter(d=>qt.has(d.type)&&ne(d.from,t)&&ne(d.to,t)&&H(d,n).length),i=Gt(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([f],[u])=>re(f,u))){let f=t.get(d);if(Tr(f))continue;let u=le(l.map(g=>g.to).filter(g=>g!==d));if(u.length<r.minCommonRecipients)continue;let h=H(f,n);if(h.length===0){c.add(d);continue}let p=new Set(u),m=l.filter(g=>p.has(g.to));a.push(Xe("COMMON_NON_SERVICE_FUNDER",d,[d,...u],[...h,...m.flatMap(g=>H(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:u.length,eventIds:le(m.map(g=>g.id))}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["A common funding source is a coordination signal, not an identity conclusion."]))}return c.size>0&&o("FUNDER_CLASSIFICATION_EVIDENCE_UNRESOLVED",`${c.size} non-service funder premise(s) lacked usable entity evidence and were excluded.`),a}function gl(e,t,n,r){let o=e.filter(a=>Ht.has(a.type)&&ne(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&H(a,n).length).map(a=>Ze(a,{actor:a.actor??a.from})),s=Gt(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>re(d,l)))for(let d of ml(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=le(d.map(h=>h.actor)),[f,u]=a.split("\0");i.push(Xe("SYNCHRONIZED_ACTIVITY",`${f.toLowerCase()}:${u}:${d[0].id}`,l,d.flatMap(h=>H(h,n)),[{activityType:f,asset:u,actorCount:l.length,windowSeconds:Math.floor((d[d.length-1].timestampMs-d[0].timestampMs)/1e3),eventIds:d.map(h=>h.id)}],{fact:"HIGH",coordination:l.length>=4?"HIGH":"MEDIUM"},["Timing proximity alone does not establish common control."]))}return i}function yl(e,t,n){if(!e)return null;if(O(e,"fresh")===!0)return"fresh";let r=O(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=O(e,"firstSeenAt"),s=O(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=Nr(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function bl(e,t,n,r,o){let s=e.filter(l=>Ht.has(l.type)&&ne(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&H(l,n).length).map(l=>Ze(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let f=t.get(l.actor),u=yl(f,l.timestampMs,r);if(!u)continue;let h=H(f,n);if(h.length===0){a.add(l.actor);continue}i.push(Ze(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=Gt(i,l=>l.asset),d=[];for(let[l,f]of[...c].sort(([u],[h])=>re(u,h))){let u=le(f.map(p=>p.actor));if(u.length<r.minClusterSize)continue;let h=u.map(p=>{let m=f.filter(g=>g.actor===p);return{entityId:p,bases:le(m.map(g=>g.freshnessBasis)),evidenceRefs:le(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(Xe("FRESH_WALLET_CLUSTER",l,u,[...f.flatMap(p=>H(p,n)),...h.flatMap(p=>p.evidenceRefs)],[{asset:l,walletCount:u.length,eventIds:le(f.map(p=>p.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:h}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return d}function El(e,t,n,r,o){let s=new Map,i=new Set,a=(p,m)=>{if(!(!ne(p,t)||m.length===0)){s.has(p)||s.set(p,new Set);for(let g of m)s.get(p).add(g)}};for(let p of t.values()){if(!Sn(p))continue;let m=H(p,n);m.length===0?i.add(p.id):a(p.id,m)}for(let p of e)p.type==="DEPLOY"&&a(p.from??p.actor,H(p,n));let c=[...i].filter(p=>!s.has(p));c.length>0&&o("DEPLOYER_EVIDENCE_UNRESOLVED",`${c.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`);let d=e.filter(p=>qt.has(p.type)&&s.has(p.from)&&ne(p.to,t)&&H(p,n).length),l=Gt(d,p=>p.to),f=e.filter(p=>p.type==="BUY"&&ne(p.actor??p.from,t)&&p.asset&&H(p,n).length).map(p=>Ze(p,{actor:p.actor??p.from})),u=new Map;for(let p of f){let m=le(fs(l.get(p.actor)).map(g=>g.from));if(m.length>Wc)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let g of m){let y=`${g}\0${p.asset}`;u.has(y)||u.set(y,[]),u.get(y).push(p)}}let h=[];for(let[p,m]of[...u].sort(([g],[y])=>re(g,y))){let g=le(m.map(j=>j.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,E]=p.split("\0"),S=new Set(g),x=d.filter(j=>j.from===y&&S.has(j.to)),R=le([...s.get(y)??[]]);h.push(Xe("DEPLOYER_LINKED_BUYERS",`${y}:${E}`,[y,...g],[...R,...x.flatMap(j=>H(j,n)),...m.flatMap(j=>H(j,n))],[{deployer:y,asset:E,buyerCount:g.length,deployerEvidenceRefs:R,fundingEventIds:le(x.map(j=>j.id)),buyEventIds:le(m.map(j=>j.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function Ol(e,t,n,r,o,s){let i=[],a=e.filter(f=>f.type==="SUPPLY_SNAPSHOT"&&f.asset&&H(f,r).length),c=0;for(let f of a){let u=Se(O(f,"totalSupply")??O(f,"supply")),h=q(O(f,"holders")),p=h.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||at(O(y,"evidenceRefs")))return null;let E=q(O(y,"evidenceRefs")).map(pe);return E.length===0||E.some(S=>!r.has(S))?null:{entityId:pe(O(y,"entityId")),balance:Se(O(y,"balance")),evidenceRefs:le(E)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(p.length!==h.length||!rl(u,p)){c+=1;continue}let g=p.map(y=>({...y,shareBps:nl(y.balance,u)})).filter(y=>y.shareBps!==null).sort((y,E)=>E.shareBps-y.shareBps||re(y.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(Xe("SUPPLY_CONCENTRATION",`${f.asset}:${f.id}`,[g.entityId],[...H(f,r),...g.evidenceRefs],[{asset:f.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:u,snapshotEventId:f.id}],{fact:"HIGH",coordination:"LOW"},["Supply concentration is a structural fact and is not proof of coordinated control."]))}if(c>0&&s("SUPPLY_SEMANTICS_UNRESOLVED",`${c} supply snapshot(s) had impossible or incomplete total/holder arithmetic and were excluded.`),a.length)return i;let d=t.map(f=>{let u=gs(f.supplyShare);return u?{entity:f,fraction:u,shareBps:Number(u.numerator*10000n/u.denominator)}:null}).filter(Boolean).sort((f,u)=>u.shareBps-f.shareBps||re(f.entity.id,u.entity.id));if(!ol(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=q(O(l.entity,"evidenceRefs")).map(pe),u=f.length>0&&f.every(h=>r.has(h))?le(f):[];u.length&&i.push(Xe("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 wl(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Xe("LP_REMOVAL",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function Al(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 Il(e,t,n,r,o){let s=e.filter(u=>u.type==="TRANSFER"&&ne(u.from,t)&&ne(u.to,t)&&u.from!==u.to&&oe(u.asset)&&u.timestampMs!==null&&Se(u.amount)&&H(u,n).length).map(u=>Ze(u,{parsedAmount:Se(u.amount)})).sort((u,h)=>u.timestampMs-h.timestampMs||re(u.id,h.id)),i=Gt(s,u=>`${u.from}\0${u.asset}`),a=[],c=new Set,d=!1;function l(u,h,p,m){let g=fs(i.get(`${u.to}\0${u.asset}`)),y=Al(g,u.timestampMs),E=[],S=0,x=y;for(;x<g.length&&S<Gc;x+=1){let R=g[x];if(R.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(S+=1,c.has(R.id)||p.has(R.id)||m.has(R.to)||R.from!==u.to||R.asset!==u.asset)continue;let j=Math.max(u.parsedAmount.decimals,R.parsedAmount.decimals),_=xt(u.parsedAmount,j),T=xt(R.parsedAmount,j);_!==null&&T!==null&&T>0n&&T<_&&E.push(R)}return x<g.length&&g[x].timestampMs-h.timestampMs<=r.peelWindowSeconds*1e3&&(d=!0),E}function f(u){if(u.length>=3)return u;let h=new Set(u.map(m=>m.id)),p=new Set([u[0].from,...u.map(m=>m.to)]);for(let m of l(u[u.length-1],u[0],h,p)){let g=f([...u,m]);if(g)return g}return null}for(let u of s){if(c.has(u.id))continue;let h=f([u]);if(!h)continue;let p=[...h];for(;p.length<r.maxPeelDepth;){let m=new Set(p.map(E=>E.id)),g=new Set([p[0].from,...p.map(E=>E.to)]),[y]=l(p[p.length-1],p[0],m,g);if(!y)break;p.push(y)}p.forEach(m=>c.add(m.id)),a.push(p)}return d&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(u=>Xe("PEEL_CHAIN",u[0].id,[u[0].from,...u.map(h=>h.to)],u.flatMap(h=>H(h,n)),[{hopCount:u.length,asset:u[0].asset,eventIds:u.map(h=>h.id),amounts:u.map(h=>h.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function Sl(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&oe(r.sourceChain)&&oe(r.destinationChain)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Xe("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,sourceChain:oe(r.sourceChain),destinationChain:oe(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function Nl(e){let t=Object.create(null);for(let n of e)t[n.kind]=(t[n.kind]??0)+1;return Object.fromEntries(Object.entries(t).sort(([n],[r])=>re(n,r)))}function ls(e,t){return q(O(e,"holders")).some(n=>!ne(O(n,"entityId"),t))?!1:qt.has(e.type)||e.type==="TRANSFER"?ne(e.from,t)&&ne(e.to,t):Ht.has(e.type)?ne(e.actor??e.from,t):e.type==="DEPLOY"?ne(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?ne(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?q(O(e,"holders")).every(n=>ne(O(n,"entityId"),t)):!0}function Tl(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||Oe.isProxy(e)){t("MALFORMED_COVERAGE","Coverage must contain own data fields.",{fatal:!0});return}let n=[],r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0){t("MALFORMED_COVERAGE","Coverage must contain ordinary own data without symbol fields.",{fatal:!0});return}let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0&&i.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([s,i.value])}for(let[s,i]of n.sort(([a],[c])=>re(a,c))){let a=i;if(i&&typeof i=="object"&&!Rt(i)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(i&&typeof i=="object"&&!Array.isArray(i)){let l=Object.getOwnPropertyDescriptor(i,"status");if(l&&!Object.hasOwn(l,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=l?l.value:void 0}if(typeof a!="string")continue;let c=Ie(a),d=Ie(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var _l=Object.freeze(Object.keys(Le)),vl=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function ds(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return!1;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});if(o.length>t.length||o.some(s=>!t.includes(s)))return!1;for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")||n&&(typeof i.value!="number"||!Number.isFinite(i.value)))return!1}return!0}function Es(e,t={}){let n=ds(t,_l,{numeric:!0}),r=n?t:{},o={maxEntities:Me(O(r,"maxEntities"),Le.maxEntities,1,ke.maxNodes),maxEvents:Me(O(r,"maxEvents"),Le.maxEvents,1,ke.maxEdges),maxEvidence:Me(O(r,"maxEvidence"),Le.maxEvidence,1,ae.evidence),minClusterSize:Me(O(r,"minClusterSize"),Le.minClusterSize,2,10),minCommonRecipients:Me(O(r,"minCommonRecipients"),Le.minCommonRecipients,2,10),syncWindowSeconds:Me(O(r,"syncWindowSeconds"),Le.syncWindowSeconds,1,3600),freshWalletSeconds:Me(O(r,"freshWalletSeconds"),Le.freshWalletSeconds,60,2592e3),peelWindowSeconds:Me(O(r,"peelWindowSeconds"),Le.peelWindowSeconds,60,604800),maxPeelDepth:Me(O(r,"maxPeelDepth"),Le.maxPeelDepth,3,8),concentrationThresholdBps:Me(O(r,"concentrationThresholdBps"),Le.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,N,{fatal:L=!1}={})=>{L&&(i=!0);let P=Ie(w||"UNSPECIFIED_GAP"),Fe=oe(N)??"Input is incomplete.",he=s.get(P);if(he){re(Fe,he.message)<0&&s.set(P,{code:P,status:"UNKNOWN",message:Fe});return}if(s.size>=ss-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 ${ss}.`});return}s.set(P,{code:P,status:"UNKNOWN",message:Fe})},c=({entities:w=[],events:N=[],evidenceById:L=new Map,eventWithEvidence:P=[],analyzableEvents:Fe=[],findings:he=[]}={})=>{let ye=i?[]:he;ye.length>ae.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${ae.findings}.`,{fatal:!0}),ye=[]);let Ne=[...s.values()].sort((te,V)=>re(te.code,V.code)),bt=i||Ne.some(te=>te.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(te.code))?"UNKNOWN":Ne.length?"PARTIAL":"OK",A=Math.min(100,ye.reduce((te,V)=>te+V.score,0)),C=A>=60?"HIGH":A>=25?"MEDIUM":bt==="OK"?"LOW":"UNKNOWN";return Ge({schemaVersion:zc,execution:"read-only",reportOnly:!0,status:bt,risk:{score:A,level:C},metrics:{entityCount:w.length,eventCount:N.length,evidenceCount:L.size,evidencedEventCount:P.length,eligibleEventCount:Fe.length,findingCounts:Nl(ye),bounds:o},findings:ye,gaps:Ne})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!ds(e,vl))return a("INVALID_INPUT","Expected a bounded own-data coordination envelope.",{fatal:!0}),c();if(!e||typeof e!="object"||Array.isArray(e))return a("INVALID_INPUT","Expected an object containing normalized entities, events, and evidence.",{fatal:!0}),c();for(let w of["subject","chain"]){let N=O(e,w);if(N!==void 0&&!Rt(N))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=Ar(O(e,"entities"),al,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=Ar(O(e,"events"),ll,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),f=Ar(O(e,"evidence"),cl,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),u=d.records,h=l.records,p=f.records;(d.overflow||l.overflow||f.overflow||d.malformed||l.malformed||f.malformed)&&(i=!0),Array.isArray(O(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(O(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(O(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),Bt(u)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),Bt(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),Bt(p)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),pl(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),ul(u)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=Bt(u)?new Map:new Map(u.map(w=>[w.id,w])),g=p.filter(w=>!rs.has(w.status)),y=p.filter(w=>rs.has(w.status)&&!os.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=Bt(p)?new Map:new Map(p.filter(w=>os.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let S=u.filter(w=>{let N=q(O(w,"evidenceRefs"));return N.length>0&&N.some(L=>!E.has(L))});S.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${S.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let x=new Set(h.filter(w=>w.type==="DEPLOY"&&ne(w.from??w.actor,m)&&H(w,E).length>0).map(w=>w.from??w.actor)),R=u.filter(w=>{let N=q(O(w,"roles")).length>0||q(O(w,"tags")).length>0||Tr(w)||Sn(w)||O(w,"isService")!==void 0||O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0||O(w,"supplyShare")!==void 0,L=as(w,E)||tl(w)&&x.has(w.id);return N&&!L}),j=R.filter(w=>O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0);j.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${j.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let _=u.filter(w=>Sn(w)&&!as(w,E)&&!x.has(w.id));_.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${_.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),R.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${R.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let T=h.filter(w=>q(O(w,"holders")).some(N=>{let L=q(O(N,"evidenceRefs"));return L.length===0||L.some(P=>!E.has(P))}));T.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${T.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),Tl(O(e,"coverage"),a);let D=O(e,"gaps");if(at(D,ae.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${ae.gaps}.`,{fatal:!0});else{let w=[];for(let N of q(D,ae.gaps)){if(!N||typeof N!="object"||Oe.isProxy(N)||Array.isArray(N)||!Lt(N,el)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let L=O(N,"code"),P=O(N,"message");if(L!==void 0&&oe(L)===null||P!==void 0&&oe(P)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:L??"UPSTREAM_GAP",message:P??"An upstream normalization gap was reported."})}w.sort((N,L)=>re(Ie(N.code),Ie(L.code))||re(N.message,L.message));for(let N of w)a(N.code,N.message)}let ee=h.filter(w=>H(w,E).length>0),v=h.filter(w=>H(w,E).length===0);v.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${v.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let W=ee.filter(w=>!us.has(w.type)||!cs(w));W.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${W.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Ce=ee.filter(cs),ie=Ce.filter(w=>!ls(w,m));ie.length&&a("EVENT_ENTITY_UNRESOLVED",`${ie.length} event(s) contained unresolved entity references.`,{fatal:!0});let ue=Ce.filter(w=>ls(w,m));ue.length===0&&a("NO_ANALYZABLE_EVENTS","No fully referenced evidence-backed event had semantics supported by coordination analysis; no low-risk conclusion was produced.");let F=[];return i||(F=[...hl(ue,m,E,o,a),...El(ue,m,E,o,a),...bl(ue,m,E,o,a),...Ol(ue,u,m,E,o,a),...gl(ue,m,E,o),...wl(ue,m,E),...Il(ue,m,E,o,a),...Sl(ue,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,N)=>re(w.kind,N.kind)||re(w.id,N.id)),new Set(F.map(w=>w.id)).size!==F.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),F=[])),c({entities:u,events:h,evidenceById:E,eventWithEvidence:ee,analyzableEvents:ue,findings:F})}import{types as yt}from"node:util";import{types as Ns}from"node:util";var vn="oracle.opensea-wallet-enrichment/1",xl="oracle.nft-overlap-input/1",Rl="oracle.nft-overlap/1",Qe="REQUEST_PATH_PLUS_MATCHED_PROFILE",Ll=de(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),Cf=de(["COMPLETE","PARTIAL","UNKNOWN"]),xr="OBSERVED",Os="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",Tn="UNKNOWN",X=de({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Ct=de({1:"ethereum",10:"optimism",130:"unichain",137:"polygon",143:"monad",360:"shape",988:"stablechain",999:"hyperevm",1329:"sei",1868:"soneium",2020:"ronin",2741:"abstract",4326:"megaeth",4663:"robinhood",5031:"somnia",8333:"b3",8453:"base",33139:"ape_chain",42161:"arbitrum",43114:"avalanche",43419:"gunzilla",57073:"ink",69e3:"animechain",80094:"bera_chain",81457:"blast",7777777:"zora"}),Pt=de(["OpenSea profile and inventory records are marketplace-indexed observations, not on-chain ownership proof.","No identity, common-control, intent, or wallet-owner inference is made.","Inventory is limited to one unpaginated page of at most 20 holdings."]),Pl=de(["Overlap is limited to exact canonical NFT identities and exact chain-bound OpenSea collection slugs in the supplied snapshots.","An exact OpenSea collection slug overlap is a marketplace-index observation, not an on-chain or common-control claim.","No identity, ownership, common-control, intent, risk, or wrongdoing conclusion is made."]),ct=de({NOT_REQUESTED:"OpenSea enrichment was not requested.",UNSUPPORTED_CHAIN_FAMILY:"OpenSea enrichment is unavailable for this chain family.",UNSUPPORTED_CHAIN:"OpenSea enrichment is unavailable for this fixed chain mapping.",INVALID_EVM_ADDRESS:"OpenSea enrichment requires a canonical EVM address.",API_KEY_UNAVAILABLE:"OpenSea enrichment is unavailable because its production API key is not configured.",PROFILE_AUTHENTICATION_FAILED:"The OpenSea profile request was not authenticated.",PROFILE_ACCESS_FORBIDDEN:"The OpenSea profile request was forbidden.",PROFILE_RATE_LIMITED:"The OpenSea profile request was rate limited.",PROFILE_UPSTREAM_UNAVAILABLE:"The OpenSea profile service was unavailable.",PROFILE_TIMEOUT:"The OpenSea profile request timed out.",PROFILE_REDIRECT_REFUSED:"The OpenSea profile response attempted a redirect and was refused.",PROFILE_RESPONSE_TOO_LARGE:"The OpenSea profile response exceeded the fixed byte limit.",PROFILE_NOT_FOUND:"The OpenSea profile was not found.",PROFILE_MALFORMED:"The OpenSea profile response did not satisfy the bounded contract.",PROFILE_ADDRESS_MISMATCH:"The OpenSea profile did not match the requested canonical wallet.",PROFILE_TRANSPORT_FAILED:"The OpenSea profile request failed.",PROFILE_USERNAME_REJECTED:"Optional OpenSea username metadata was omitted because it did not satisfy the safe display contract.",INVENTORY_AUTHENTICATION_FAILED:"The OpenSea inventory request was not authenticated.",INVENTORY_ACCESS_FORBIDDEN:"The OpenSea inventory request was forbidden.",INVENTORY_RATE_LIMITED:"The OpenSea inventory request was rate limited.",INVENTORY_UPSTREAM_UNAVAILABLE:"The OpenSea inventory service was unavailable.",INVENTORY_TIMEOUT:"The OpenSea inventory request timed out.",INVENTORY_REDIRECT_REFUSED:"The OpenSea inventory response attempted a redirect and was refused.",INVENTORY_RESPONSE_TOO_LARGE:"The OpenSea inventory response exceeded the fixed byte limit.",INVENTORY_NOT_FOUND:"The OpenSea inventory was not found.",INVENTORY_MALFORMED:"The OpenSea inventory response did not satisfy the bounded contract.",INVENTORY_TRANSPORT_FAILED:"The OpenSea inventory request failed.",INVENTORY_CURSOR_PRESENT:"OpenSea reported another inventory page; no cursor was retained or followed.",INVENTORY_ROW_LIMIT:"OpenSea returned more than the fixed 20-row inventory bound.",INVENTORY_ROW_REJECTED:"At least one OpenSea inventory row did not satisfy the canonical holding contract.",INVENTORY_COLLECTION_REJECTED:"At least one canonical OpenSea holding lacked a valid bounded collection slug; exact NFT evidence was retained.",INVENTORY_DUPLICATE_HOLDING:"At least one duplicate OpenSea holding was collapsed.",INVENTORY_CONFLICTING_HOLDING:"At least one conflicting OpenSea collection association was excluded while exact-NFT evidence was retained."}),Cl=de({CONFLICTING_DUPLICATE_SNAPSHOT:"Conflicting snapshots for the same chain and canonical wallet were excluded.",INPUT_COVERAGE_INCOMPLETE:"At least one included snapshot had incomplete relevant inventory coverage.",EXACT_NFT_COVERAGE_INCOMPLETE:"At least one included exact-NFT inventory was incomplete.",COLLECTION_COVERAGE_INCOMPLETE:"At least one included collection-slug inventory was incomplete.",PROFILE_METADATA_INCOMPLETE:"At least one matched profile omitted unsafe optional username metadata.",INELIGIBLE_HOLDING_EVIDENCE:"At least one holding lacked separate wallet-bound LIVE or INDEXED profile and holding evidence.",INSUFFICIENT_DISTINCT_WALLETS:"Fewer than two distinct canonical wallet IDs qualified for a negative overlap statement.",FINDINGS_TRUNCATED:"Deterministic finding limits omitted additional qualifying overlaps."}),Ts=new Set(Ll),jl=new Set(Ft),Rr=new Set(["LIVE","INDEXED"]),se=(e,t)=>e<t?-1:e>t?1:0,kl=/^0x[0-9a-fA-F]{40}$/u,Dl=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,$l=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,Ml=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,_s=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,vs=/[\u0000-\u001f\u007f-\u009f]/u,Ul=(1n<<256n)-1n;function b(e,t="invalid-nft-overlap"){throw new $t(`nft-overlap: ${e}`,t)}function xs(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function Rs(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 G(){return Rs([])}function $(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function de(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&Rs(e);let n;try{n=Reflect.ownKeys(e)}catch{b("normalized output could not be frozen safely","invalid-object")}for(let r of n){if(r==="toJSON")continue;let o;try{o=Object.getOwnPropertyDescriptor(e,r)}catch{b("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&de(o.value,t)}return Object.freeze(e),e}function Q(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||Ns.isProxy(e))&&b(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{b(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&b(`${n} must be a plain object`,"invalid-object");let s=new Set(t),i=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{b(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&xs(c)||((typeof a!="string"||!s.has(a))&&b(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&b(`${n}.${a} must be an own data field`,"invalid-object"),i.set(a,c.value))}return Object.freeze({has:a=>i.has(a),get:a=>i.get(a)})}function ve(e,t,n,r=0){(!Array.isArray(e)||Ns.isProxy(e))&&b(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{b(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&b(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{b(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let d=0;d<s;d+=1)a.add(String(d));let c=G();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{b(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&xs(l)||(typeof d!="string"||!a.has(d))&&b(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let d=0;d<s;d+=1){let l;try{l=Object.getOwnPropertyDescriptor(e,String(d))}catch{b(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&b(`${t} must be dense and contain only own data items`,"invalid-array"),$(c,l.value)}return c}function Fl(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||vs.test(e)||_s.test(e))&&b(`${t} is not safe bounded text`,"invalid-string"),e}function ht(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&b(`${n} is not a deterministic ID`,"invalid-id"),e}function Ls(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&b(`${t} is not a canonical digest`,"invalid-digest"),e}function Lr(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&b(`${t} must be a positive safe integer`,"invalid-chain"),e}function gt(e){return(typeof e!="string"||!kl.test(e))&&b("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function Vl(e){(typeof e!="string"||e.length===0||e.length>78||!Dl.test(e))&&b("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{b("tokenId must be uint256","invalid-token-id")}return(t<0n||t>Ul)&&b("tokenId must be uint256","invalid-token-id"),t.toString(10)}function zl(e){return(typeof e!="string"||!$l.test(e))&&b("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Pr(e={}){let t=Q(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||b("canonical NFT input is missing a field","missing-field");let n={chainId:Lr(t.get("chainId"),"nft.chainId"),contract:gt(t.get("contract")),tokenId:Vl(t.get("tokenId"))};return de({id:ot("nft",n),...n})}function Cr(e={}){let t=Q(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||b("canonical collection input is missing a field","missing-field");let n={chainId:Lr(t.get("chainId"),"collection.chainId"),slug:zl(t.get("slug"))};return de({id:ot("collection",n),...n})}function xn(e={}){let t=Q(e,["family","chainId","address"],"canonical wallet input"),n=t.has("family")?t.get("family"):"evm",r=t.has("chainId")?t.get("chainId"):null,o=t.has("address")?t.get("address"):null,s=Fl(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||b("wallet.family is invalid","invalid-family");let i=r===null?null:Lr(r,"wallet.chainId");if(o===null)return de({id:null,family:s,chainId:i,address:null});s!=="evm"&&b("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=gt(o);return de({id:ot("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function jr(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!Ml.test(e)||vs.test(e)||_s.test(e)||J(e)?null:e}function Bl(e,t="snapshot.wallet"){let n=Q(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||b(`${t} is missing a required field`,"missing-field");let r=xn({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&b(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function ws(e,t){let n=Q(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&b(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return Ts.has(r)||b(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&b(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function Hl(e){let t=Q(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||b("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");Ts.has(n)||b("snapshot.coverage.status is invalid","invalid-status");let r=ws(t.get("profile"),"snapshot.coverage.profile"),o=ws(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&b("inventory cannot be called before profile","invalid-count");let s=(a,c,d,l,f)=>n===a&&r.status===c&&r.calls===d&&o.status===l&&o.calls===f;return s("NOT_REQUESTED","NOT_REQUESTED",0,"NOT_REQUESTED",0)||s("UNAVAILABLE","UNAVAILABLE",0,"UNAVAILABLE",0)||s("UNKNOWN","UNKNOWN",1,"UNAVAILABLE",0)||n==="PARTIAL"&&["COMPLETE","PARTIAL"].includes(r.status)&&["COMPLETE","PARTIAL","UNKNOWN"].includes(o.status)&&r.calls===1&&o.calls===1&&(r.status!=="COMPLETE"||o.status!=="COMPLETE")||s("COMPLETE","COMPLETE",1,"COMPLETE",1)||b("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function ql(e){let t=ve(e,"snapshot.gaps",Object.keys(ct).length),n=G();for(let s=0;s<t.length;s+=1){let i=Q(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&b("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(ct,a)||i.get("message")!==ct[a])&&b("snapshot gap is not a fixed allowlisted gap","invalid-gap"),$(n,a)}let r=G(),o=new Set;for(let s of n)o.has(s)||(o.add(s),$(r,s));return r.sort(se),r}function Gl(e){return Object.hasOwn(ct,e)||b("OpenSea gap code is invalid","invalid-gap"),de({code:e,message:ct[e]})}function Wl(e){let t=Q(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||b("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),s=t.get("walletId");if(jl.has(n)||b("OpenSea evidence status is invalid","invalid-status"),ht(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||b("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&b("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&b("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:gt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&b("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||b("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&b("holding evidence source is invalid","invalid-source");let i=ht(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:ht(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==Qe&&b("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:Qe}}b("OpenSea evidence kind is invalid","invalid-kind")}function Wt(e={}){let t=Wl(e);return de({id:ot("evidence",t),digest:rt(t),...t})}function Jl(e,t){let n=Q(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(i=>n.has(i))||b("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(i=>n.has(i)).map(i=>[i,n.get(i)])),s=Wt(o);return ht(n.get("id"),"evidence","evidence.id"),Ls(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&b("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function Yl(e,t){if(e===null)return null;let n=Q(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&b("snapshot.profile is missing a required field","missing-field");let r=gt(n.get("address"));(!t.address||r!==t.address)&&b("profile address does not match snapshot wallet","profile-mismatch");let o=ht(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=jr(n.get("username"));return(s===null||s!==n.get("username"))&&b("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function Kl(e,t,n){let r=Q(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||b("snapshot holding is missing a required field","missing-field");let s=Pr({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&b("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&b("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=Q(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||b("holding collection is missing a required field","missing-field"),i=Cr({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&b("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==Qe&&b("holding owner binding is invalid","invalid-owner-binding");let a=ve(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,X.citationsPerFinding,1).map(d=>ht(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(se);return c.length!==a.length&&b("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:Qe,evidenceRefs:c}}function Zl(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 Xl(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&b("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&b("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&b("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||s.length>0||i.length>0)&&(!n.chainId||!Object.hasOwn(Ct,n.chainId))&&b("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||s.length>0||i.length>0)&&b(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&b(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&b("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&b("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&b("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let y of i)d.has(y.id)&&b("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(y.id,y),n.id&&y.walletId!==n.id&&b("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let y=d.get(o.evidenceRef);(!y||y.kind!=="PROFILE"||y.address!==o.address)&&b("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,f=0;for(let y of s){l.has(y.id)&&b("snapshot holdings must be unique","duplicate-holding"),l.add(y.id),y.collection===null&&(f+=1);for(let E of y.evidenceRefs)d.has(E)||b("holding cites unknown evidence","invalid-reference")}let u=new Set,h=G(),p=G();for(let y of a)u.add(y.code),y.code.startsWith("PROFILE_")&&$(h,y.code),y.code.startsWith("INVENTORY_")&&$(p,y.code);let m=new Set(["UNSUPPORTED_CHAIN_FAMILY","UNSUPPORTED_CHAIN","INVALID_EVM_ADDRESS","API_KEY_UNAVAILABLE"]);r.status==="NOT_REQUESTED"&&(t||a.length!==1||!u.has("NOT_REQUESTED"))&&b("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&b("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(u.has("NOT_REQUESTED")||[...m].some(y=>u.has(y)))&&b("attempted coverage cannot contain an availability reason","invalid-coverage"),f>0&&!u.has("INVENTORY_COLLECTION_REJECTED")&&!u.has("INVENTORY_CONFLICTING_HOLDING")&&b("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&b("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&b("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&b("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&b("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(h.length===0||h.some(y=>y==="PROFILE_USERNAME_REJECTED"))&&b("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&b("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let g=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&p.length>0&&b("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(p.length===0||p.some(y=>!g.has(y)))&&b("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(p.length===0||p.some(y=>g.has(y)))&&b("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&p.length>0&&b("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&b("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&b("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&b("incomplete snapshot must contain a fixed gap","invalid-coverage")}function kr(e={}){let t=Q(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||b("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&b("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=Q(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?Bl(r,"snapshot.wallet"):xn(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=Hl(t.get("coverage")),c=ve(t.get("evidence"),"snapshot.evidence",X.evidencePerSnapshot).map((E,S)=>{try{let x=Q(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${S}]`);return x.has("id")||x.has("digest")?Jl(E,S):Wt(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(R=>x.has(R)).map(R=>[R,x.get(R)])))}catch(x){throw x}}).sort((E,S)=>se(E.id,S.id)),d=t.get("profile"),l=null;if(d!==null){let E=Q(d,["address","evidenceRef","username"],"snapshot.profile");l=Yl(Object.fromEntries(["address","evidenceRef","username"].filter(S=>E.has(S)).map(S=>[S,E.get(S)])),s)}let u=ve(t.get("holdings"),"snapshot.holdings",X.holdingsPerSnapshot).map((E,S)=>Kl(E,S,s)).sort((E,S)=>se(E.id,S.id)),h=ve(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(ct).length).map(E=>(Object.hasOwn(ct,E)||b("snapshot gap code is invalid","invalid-gap"),E)),p=[...new Set(h)].sort(se).map(Gl),m={schemaVersion:vn,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:u,evidence:c,gaps:p,caveats:[...Pt]};Xl(m);let g=ot("opensea-snapshot",Zl(m)),y=rt(m);return de({...m,snapshotId:g,digest:y})}function Ql(e){let t=Q(e,["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],"OpenSea snapshot");["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"].every(i=>t.has(i))||b("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==vn||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&b("OpenSea snapshot envelope is invalid","invalid-envelope"),ve(t.get("caveats"),"snapshot.caveats",Pt.length,Pt.length).some((i,a)=>i!==Pt[a])&&b("snapshot caveats are invalid","invalid-caveat");let o=ql(t.get("gaps")),s=kr({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 ht(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),Ls(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&b("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function ed(e){return{code:e,message:Cl[e]}}function td(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"||!Rr.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"||!Rr.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==Qe||r.has(d.id)||(!a||se(d.id,a.id)<0)&&(a=d)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:Qe,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function As(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let s=o.byWallet.get(r.walletId);(!s||se(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function nd(e,t,n){(!Array.isArray(n)||n.length<2||n.length>X.snapshots||n.length*2>X.citationsPerFinding)&&b("finding citations exceeded the fixed limit","citation-limit");let r=G();for(let l=0;l<n.length;l+=1)$(r,n[l]);r.sort((l,f)=>se(l.walletId,f.walletId)||se(l.snapshotId,f.snapshotId)||se(l.holdingEvidence.id,f.holdingEvidence.id));let o=G(),s=G(),i=new Set;for(let l of r)$(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),$(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=G();for(let l of i)$(a,l);a.sort(se);let c={kind:e,status:xr,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:ot(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:rt(c),...c}}function vr(e,t){return`${e}:${t.canonical.id}`}function Is(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||se(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function rd(e,t,n){if(n<=0)return;if(e.length<n){$(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)se(e[o].key,e[r].key)>0&&(r=o);se(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function od(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=G(),i=new Set,a=Is(e),c=Is(t);if(a){let m={section:"exact",group:a,key:vr("exact",a)};$(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:vr("collection",c)};$(s,m),i.add(m.key)}let d=G(),l=X.findings-s.length,f=(m,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let E=vr(m,y);i.has(E)||rd(d,{section:m,group:y,key:E},l)}};f("exact",e),f("collection",t);let u=G();for(let m of s)$(u,m);for(let m of d)$(u,m);u.length>X.findings&&b("finding selection exceeded the fixed limit","finding-limit"),u.sort((m,g)=>se(m.key,g.key));let h=G(),p=G();for(let m of u)$(m.section==="exact"?h:p,m.group);return{exact:h,collections:p,exactCount:n,collectionCount:r,truncated:o>X.findings}}function _n(e){return e.coverage.inventory.status==="COMPLETE"}function sd(e){e.byWallet.size>X.snapshots&&b("finding wallet citations exceeded the snapshot limit","citation-limit");let t=G();for(let n of e.byWallet.values())$(t,n);return t.length*2>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),t}function Ss(e,t){let n=G();for(let r of t)$(n,nd(e,r.canonical,sd(r)));return n.sort((r,o)=>se(r.id,o.id)),n}function Ps(e){arguments.length!==1&&b("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=Q(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&b("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==xl&&b("NFT overlap input schema is invalid","invalid-schema");let n=ve(t.get("snapshots"),"NFT overlap snapshots",X.snapshots,2),r=0;for(let A=0;A<n.length;A+=1){let C=Q(n[A],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${A}]`);for(let V of["holdings","evidence","gaps","caveats"])C.has(V)||b(`snapshot ${V} is required`,"missing-field");let te=ve(C.get("holdings"),`NFT overlap snapshots[${A}].holdings`,X.holdingsPerSnapshot);ve(C.get("evidence"),`NFT overlap snapshots[${A}].evidence`,X.evidencePerSnapshot),ve(C.get("gaps"),`NFT overlap snapshots[${A}].gaps`,Object.keys(ct).length),ve(C.get("caveats"),`NFT overlap snapshots[${A}].caveats`,Pt.length,Pt.length),r+=te.length,r>X.totalHoldings&&b("total holdings exceed the fixed limit","holding-limit");for(let V=0;V<te.length;V+=1){let Te=Q(te[V],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${A}].holdings[${V}]`);Te.has("evidenceRefs")||b("holding evidenceRefs are required","missing-field"),ve(Te.get("evidenceRefs"),`NFT overlap snapshots[${A}].holdings[${V}].evidenceRefs`,X.citationsPerFinding,1)}}let o=G();for(let A of n)$(o,Ql(A));let s=new Map;for(let A of o){let C=A.wallet.id&&A.wallet.chainId?`${A.wallet.id}:${A.wallet.chainId}`:`noncanonical:${A.snapshotId}`;s.has(C)||s.set(C,G()),$(s.get(C),A)}let i=G(),a=0,c=0,d=G();for(let A of s.keys())$(d,A);d.sort(se);for(let A of d){let C=s.get(A),te=new Set;for(let V of C)te.add(V.digest);if(te.size>1&&!A.startsWith("noncanonical:")){c+=1;continue}C.sort((V,Te)=>se(V.snapshotId,Te.snapshotId)),$(i,C[0]),a+=C.length-1}let l=new Map;for(let A of i)for(let C of A.evidence)l.has(C.id)||l.set(C.id,new Set),A.wallet.id&&l.get(C.id).add(A.wallet.id);let f=new Set;for(let[A,C]of l)C.size>1&&f.add(A);let u=new Map,h=new Map,p=new Set,m=new Map,g=new Map,y=0,E=0,S=!1,x=c>0,R=c>0;for(let A of i){let C=A.wallet.id;C&&p.add(C),A.coverage.profile.status==="PARTIAL"&&(S=!0);let te=new Map;for(let be of A.evidence)te.set(be.id,be);let V=A.profile?te.get(A.profile.evidenceRef):null,Te=!!(A.profile&&C&&V&&V.kind==="PROFILE"&&Rr.has(V.status)&&V.walletId===C&&V.address===A.wallet.address&&!f.has(V.id)),xe=Te&&_n(A),Ve=Te&&_n(A);(_n(A)||_n(A))&&!Te&&(y+=1);let je=new Set;A.profile&&je.add(A.profile.evidenceRef);for(let be of A.holdings){let jt=td(A,be,te,f);if(!jt){E+=1,xe=!1,Ve=!1;continue}je.add(jt.profileEvidence.id),je.add(jt.holdingEvidence.id),As(u,be.id,{id:be.id,chainId:be.chainId,contract:be.contract,tokenId:be.tokenId},jt),be.collection?As(h,be.collection.id,be.collection,jt):Ve=!1}for(let be of A.evidence)je.has(be.id)||(E+=1,xe=!1,Ve=!1);C?(m.set(C,(m.has(C)?m.get(C):!0)&&xe),g.set(C,(g.has(C)?g.get(C):!0)&&Ve)):(xe=!1,Ve=!1),xe||(x=!0),Ve||(R=!0)}let j=new Set,_=new Set;for(let[A,C]of m)C&&j.add(A);for(let[A,C]of g)C&&_.add(A);let T=new Set;for(let A of j)_.has(A)&&T.add(A);let D=od(u,h),ee=Ss("EXACT_NFT_OVERLAP",D.exact),v=Ss("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",D.collections),W=!x&&p.size>=2&&j.size>=2,Ce=!R&&p.size>=2&&_.size>=2,ie=D.exactCount>0?xr:W?Os:Tn,ue=D.collectionCount>0?xr:Ce?Os:Tn,F=G();c>0&&$(F,"CONFLICTING_DUPLICATE_SNAPSHOT"),(x||R)&&$(F,"INPUT_COVERAGE_INCOMPLETE"),x&&$(F,"EXACT_NFT_COVERAGE_INCOMPLETE"),R&&$(F,"COLLECTION_COVERAGE_INCOMPLETE"),S&&$(F,"PROFILE_METADATA_INCOMPLETE"),(y>0||E>0||f.size>0)&&$(F,"INELIGIBLE_HOLDING_EVIDENCE"),p.size<2&&D.exactCount===0&&D.collectionCount===0&&$(F,"INSUFFICIENT_DISTINCT_WALLETS"),D.truncated&&$(F,"FINDINGS_TRUNCATED");let w=G(),N=new Set;for(let A of F)N.has(A)||(N.add(A),$(w,A));w.sort(se);let L=G();for(let A of w)$(L,ed(A));let P=0;for(let A of u.values())P+=A.byWallet.size;let ye=!x&&!R&&!S&&!D.truncated&&p.size>=2?"COMPLETE":ie!==Tn||ue!==Tn?"PARTIAL":"UNKNOWN",Ne={schemaVersion:Rl,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:ye,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:p.size,completeDistinctWallets:T.size,completeExactNftWallets:j.size,completeCollectionWallets:_.size,qualifyingHoldings:P},exactNft:{state:ie,findings:ee},collection:{state:ue,findings:v},gaps:L,caveats:[...Pl],limits:X},Zt=ot("nft-overlap-report",Ne),bt=rt(Ne);return de({...Ne,reportId:Zt,digest:bt})}var Ds=128*1024,$s=1024*1024,Ms=8e3,id=20,ad=512,cd=1024,Us=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Cs=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}),Rn=/[\u0000-\u001f\u007f-\u009f]/u,ld=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,dd=Object.freeze(["family","chainId","address","includeOpenSea"]),ud=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),Ln=(e,t)=>e<t?-1:e>t?1:0;function Dr(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function Pe(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function me(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function fd(e){(!e||typeof e!="object"||Array.isArray(e)||yt.isProxy(e))&&me("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{me("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&me("args must be a plain object","invalid-object");let r=new Set(dd),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";ud.some(c=>a.includes(c))&&me("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),me("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{me(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&me(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function pd(e){let t=fd(e);for(let d of["family","address"])t.has(d)||me(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||Rn.test(n))&&me("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||me("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||Rn.test(o))&&me("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&me("args.address must not be a URL","invalid-address");let i=Us.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(Cs,r)?Cs[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&me("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!Rn.test(a)||Number.isSafeInteger(a)&&a>0)&&me("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&me("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function md(e){let t=Us.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=gt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:xn({family:n,chainId:e.chainId,address:r}),evm:t}}function lt({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 kr({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 hd(){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 Fs(e){let t=De(e);return t&&t.length<=cd?t:null}function $r(e,t){if(!e||typeof e!="object"||Array.isArray(e)||yt.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 gd(e,t){if(!Array.isArray(e)||yt.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=Dr();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}Pe(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function Jt(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function yd(e,t,n){let r=$r(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=gt(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=Jt(a,n)?null:jr(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function bd(e,t,n,r){let o=$r(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>ad||Rn.test(s)||ld.test(s)||Jt(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=gd(o.get("nfts"),id),c=Dr();a&&Pe(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&Pe(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=$r(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(Jt(p.get("identifier"),r)||Jt(p.get("contract"),r))throw new Error("invalid-row");m=Pr({chainId:t.chainId,contract:p.get("contract"),tokenId:p.get("identifier")})}catch{Pe(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(p.has("collection")&&typeof p.get("collection")=="string"&&!Jt(p.get("collection"),r))try{g=Cr({chainId:t.chainId,slug:p.get("collection")})}catch{g=null}if(g===null&&Pe(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){Pe(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=d.get(m.id);if(y){let E=y.collection?.id??null,S=g?.id??null;E===null&&S!==null?(d.set(m.id,{nft:m,collection:g}),Pe(c,"INVENTORY_DUPLICATE_HOLDING")):S===null||E===S?Pe(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),Pe(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let f=Dr(),u=[n];for(let{nft:h,collection:p}of[...d.values()].sort((m,g)=>Ln(m.nft.id,g.nft.id))){let m=Wt({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:p?.id??null,ownerBinding:Qe});Pe(u,m),Pe(f,{...h,collection:p,ownerBinding:Qe,evidenceRefs:[n.id,m.id].sort(Ln)})}return{holdings:f,evidence:u,gaps:[...new Set(c)].sort(Ln)}}function dt(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||yt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function js(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=dt(e,"status"),o=dt(e,"name"),s=dt(e,"message");return dt(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":dt(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:dt(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:dt(e,"oracleTimeout")===!0||dt(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 Mr(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 Ed(e){if(!e||typeof e!="object"||Array.isArray(e)||yt.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"||Fs(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return Mr([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function Od(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"||yt.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"?Ed(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 ks(e,t){let n=Mr([["x-api-key",e]]);return Mr([["method","GET"],["headers",n],["fetchImpl",Od],["timeoutMs",Ms],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function wd(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||yt.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 Vs(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=wd(e),n=t.has("requestJson")?t.get("requestJson"):K,r=t.has("readApiKey")?t.get("readApiKey"):hd;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&me("exactly one args object is required","second-options-forbidden");let i=pd(s),a=md(i);if(!i.includeOpenSea)return lt({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(Ct,a.chainId))return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=Fs(r())}catch{c=null}if(!c)return lt({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,ks(c,Ds));l=yd(E,a.address,c)}catch(E){return lt({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[js(E,"profile")]})}let f=Wt({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/${Ct[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,ks(c,$s));g=bd(E,a,f,c)}catch(E){return lt({requested:!0,target:a,status:"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:u,evidence:[f],gaps:[...h,js(E,"inventory")]})}let y=[...new Set([...h,...g.gaps])].sort(Ln);return lt({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 Uf=Object.freeze({profileMaxBytes:Ds,inventoryMaxBytes:$s,timeoutMs:Ms,retries:0,redirects:0,dedupe:!1});var Ad=Vs();async function zs(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 Ad.enrich(e)}var Fr="oracle.investigator-cli/2",Ur=2*1024*1024,Nd=/^[^\u0000-\u001f\u007f]+$/u,Td=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Ue=class extends Error{constructor(t){super(t),this.name="CliError"}};function z(e){throw new Ue(e)}function _d(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if(!r||typeof r!="object"||t.has(r))throw new Ue("output is not bounded own-data JSON");t.add(r);try{let s=" ".repeat(o),i=" ".repeat(o+1);if(Array.isArray(r)){let c=[];for(let d=0;d<r.length;d+=1){let l=Object.getOwnPropertyDescriptor(r,String(d));if(!l||!Object.hasOwn(l,"value"))throw new Ue("output is not bounded own-data JSON");c.push(n(l.value,o+1))}return c.length?`[
|
|
2
|
+
import{readFile as Sd,stat as Nd}from"node:fs/promises";import{createHash as qn}from"node:crypto";import{types as Ut}from"node:util";var Gs=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])/]),Ws=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),Js=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function Ys(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function Ks(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=Ys(n);if(Ws.has(r)||Js.some(o=>r.includes(o)))return!0}return!1}function zr(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var Zs=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function Xs(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function Qs(e){let t=e.match(Zs)||[];for(let n of t){let r=Xs(n),o=zr(r),s=o?zr(o):null;for(let i of[r,o,s])if(i&&Ks(i))return!0}return!1}var ei=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 et(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function tt(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of ei){if(e.byteLength<t.length)continue;let n=!0;for(let r=0;r<t.length;r+=1){let o=e[r];if((o>=65&&o<=90?o+32:o)!==t[r]){n=!1;break}}if(n)return!0}return!1}function J(e){return typeof e!="string"||e.length===0?!1:Gs.some(t=>t.test(e))?!0:Qs(e)}import{createHash as eo}from"node:crypto";import{createHash as di}from"node:crypto";import{types as Be}from"node:util";import{AsyncLocalStorage as ti}from"node:async_hooks";var ni=new ti,ri=["http","retry","shared"],oi=512;function Xt(e){let t=ni.getStore();if(!t||t.closed||!ri.includes(e))return null;if(t.spans.length>=oi)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 ut from"node:net";import si from"node:dns";var ii=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Qt(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(":"),f=p.at(-1);if(f?.includes(".")){let h=f.split(".").map(Number);if(h.length!==4||h.some(u=>!Number.isInteger(u)||u<0||u>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 Cn(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 jn(e){if(ut.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(ut.isIPv6(e)){let t=Qt(e);if(!t)return!1;let n=Qt("::ffff:0:0");return Cn(t,n,96)?jn([...t.slice(12)].join(".")):Cn(t,Qt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>Cn(t,Qt(o),s)):!1}return!1}function ai(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(ii.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=ut.isIP(n);return r!==0&&!jn(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function kn(e,{lookupFn:t=si.promises.lookup}={}){let n=ai(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:ut.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=>!jn(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function ci(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 Dn({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(u=>typeof u=="string"?{address:u}:u).filter(u=>u&&u.address).map(u=>({address:u.address,family:u.family||(ut.isIPv6(u.address)?6:4)})),c=(h,u,m)=>{i.set(s(h),a(typeof u=="string"?[{address:u,family:m}]:u))},d=h=>{let u=s(h);if(ut.isIP(u))return[{address:u,family:ut.isIPv6(u)?6:4}];let m=i.get(u);if(!m||!m.length)throw new Error(`refused: unpinned host ${h} during pinned fetch`);return m},l=ci(),p=l&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:l.uri,token:`Bearer ${l.token}`,connectTimeout:1e4}):new n({connect:{lookup(h,u,m){let g;try{g=d(h)}catch(y){return m(y)}return u?.all?m(null,g):m(null,g[0].address,g[0].family)}}}),f=li((h,u={})=>r(h,{...u,dispatcher:p}),c);return{dispatcher:p,fetch:f,pin:c,resolve:d,async close(){try{await p.destroy()}catch{}}}}var $n=Symbol.for("oracle.egressGuard.pinCapableFetch");function li(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[$n]=Object.freeze({pin:t}),e}function Mn(e){return typeof e=="function"&&typeof e[$n]?.pin=="function"}function Br(e,t,n){if(!Mn(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[$n].pin(t,n)}var ui=new Set([408,425,429,500,502,503,504]),Hr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),fi=2,qr=4e3,pi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,mi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,hi=AbortSignal.prototype.throwIfAborted,gi=EventTarget.prototype.addEventListener,Gr=EventTarget.prototype.removeEventListener,Wr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,kt=e=>e?pi.call(e):!1,yi=e=>e?mi.call(e):void 0,bi=new Set([301,302,303,307,308]),tn=3,Zd=64*1024,ze=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function Y(e){return nt(`HTTP JSON body refused: ${e}`)}function Ei(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 Be[t]=="function"&&Be[t](e))}function Oi(e){let t=[],n=0,r=0,o=0,s=0,i=new WeakSet,a=l=>{if(n+=Buffer.byteLength(l,"utf8"),n>ze.bytes)throw Y("serialized byte limit exceeded");t.push(l)},c=l=>{if(Buffer.byteLength(l,"utf8")>ze.bytes)throw Y("serialized byte limit exceeded");return JSON.stringify(l)},d=(l,p)=>{if(r+=1,r>ze.nodes)throw Y("node limit exceeded");if(p>ze.depth)throw Y("depth limit exceeded");if(l===null){a("null");return}if(typeof l=="string"){a(c(l));return}if(typeof l=="boolean"){a(l?"true":"false");return}if(typeof l=="number"){if(!Number.isFinite(l))throw Y("non-finite number");a(Object.is(l,-0)?"0":String(l));return}if(typeof l!="object")throw Y("unsupported non-JSON value");if(Be.isProxy(l))throw Y("proxy value");if(Ei(l))throw Y("unsupported exotic object");if(i.has(l))throw Y("cyclic value");i.add(l);try{if(Object.getOwnPropertySymbols(l).length>0)throw Y("symbol-keyed fields are unsupported");if(Array.isArray(l)){let u=Object.getPrototypeOf(l),m=0;for(;u!==null;){if(Be.isProxy(u))throw Y("proxy array prototype");if(m+=1,m>ze.depth)throw Y("array prototype depth limit exceeded");u=Object.getPrototypeOf(u)}if(l.length>ze.arrayLength)throw Y("array length limit exceeded");for(let y=0;y<l.length;y+=1){let E=Object.getOwnPropertyDescriptor(l,String(y));if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw Y("array entries must be dense enumerable own data")}let g=0;for(let y in l){if(s+=1,s>ze.fields)throw Y("enumeration limit exceeded");if(Object.hasOwn(l,y)&&(g+=1,g>l.length))throw Y("named array fields are unsupported")}if(g!==l.length)throw Y("array entries must be dense enumerable own data");a("[");for(let y=0;y<l.length;y+=1)y&&a(","),d(Object.getOwnPropertyDescriptor(l,String(y)).value,p+1);a("]");return}let f=Object.getPrototypeOf(l);if(f!==Object.prototype&&f!==null)throw Y("non-plain object");let h=[];for(let u in l){if(s+=1,s>ze.fields)throw Y("enumeration limit exceeded");if(!Object.hasOwn(l,u))continue;if(o+=1,o>ze.fields)throw Y("field limit exceeded");let m=Object.getOwnPropertyDescriptor(l,u);if(!m||!Object.hasOwn(m,"value")||m.enumerable!==!0)throw Y("object fields must be enumerable own data");h.push([u,m.value])}a("{");for(let u=0;u<h.length;u+=1)u&&a(","),a(c(h[u][0])),a(":"),d(h[u][1],p+1);a("}")}finally{i.delete(l)}};return d(e,0),t.join("")}function wi(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(Be.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 Ai(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Ii(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 Si(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var Un=new Map,Jr=new WeakMap,Yr=1;function en(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Jr.get(e);return t||(t=Yr,Yr+=1,Jr.set(e,t)),`reference:${t}`}var Ni=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),_i=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Kr(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?Ni.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 Zr(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(Kr);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return Kr(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&_i.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function Ti(e,t,n,r={},o=null){let s=di("sha256"),i=(c,d)=>{let l=String(d);s.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),s.update("=").update(String(Buffer.byteLength(l,"utf8"))).update(":").update(l).update(`
|
|
3
|
+
`)};i("method",e),i("url",t),Object.keys(n||{}).map((c,d)=>({name:c.toLowerCase(),order:d,value:String(n[c])})).sort((c,d)=>c.name.localeCompare(d.name)||c.order-d.order).forEach((c,d)=>{i(`header-name-${d}`,c.name),i(`header-value-${d}`,c.value)}),i("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${c}`,r[c]??"-");return s.digest("hex")}function vi(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,qr):Math.min(250*2**e,qr)+Math.floor(Math.random()*100)}var xi=e=>new Promise(t=>setTimeout(t,e));function nt(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Fn(e,t,n){return nt(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function ft(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Ri(e){return e?e.byteLength??e.length??0:0}async function Li(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&&(ft(e),!r))throw Fn(n,`content-length ${s}`,t);let i=e.body?.getReader?.();if(!i){let p=await e.text(),f=Buffer.byteLength(p,"utf8");if(f>t){if(!r)throw Fn(n,`body ${f} 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:f}=await i.read();if(f)break;if(p&&(a.push(Buffer.from(p)),c+=Ri(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 Fn(n,`streamed ${c} bytes`,t);let l=Buffer.concat(a);return(d?l.subarray(0,t):l).toString("utf8")}function Pi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Ci(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:f,signal:h,redirectPolicy:u="follow",maxRedirects:m=tn}){let g=null,y=t,E=i?{lookupFn:i}:{};if(c&&!a&&!Mn(y))throw nt(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let S=new AbortController,x=setTimeout(()=>S.abort(),s),R=h?Wr?Wr([h,S.signal]):h:S.signal,j=async(T,{status:_=null}={})=>{let D=await kn(T,E);if(!D.ok)throw nt(_==null?`HTTP refused ${T}: ${D.error}`:`HTTP redirect to ${T} ${D.error}`,_==null?{}:{status:_});let ee=new URL(T).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await Dn({requireUndici:!0,...p?{importUndici:p}:{}})}catch(v){throw nt(_==null?`HTTP refused ${T}: ${v?.message||v}`:`HTTP redirect to ${T} refused: ${v?.message||v}`,_==null?{}:{status:_})}g.pin(ee,D.addresses),y=g.fetch}else Br(y,ee,D.addresses);return D};try{let T=String(e),_=Object.assign(Object.create(null),r||{});c&&await j(T);for(let D=0;D<=m;D+=1){let ee=Object.assign(Object.create(null),{method:n,headers:_,body:o,signal:R,redirect:"manual",dispatcher:void 0}),v=await y(T,ee);if((u==="error"||m===0)&&v.status>=300&&v.status<400)throw ft(v),nt(`HTTP ${v.status} ${n} redirect refused`,{status:v.status,redirectRefused:!0});if(bi.has(v.status)){let ie=l===!0&&n==="POST"&&[307,308].includes(v.status)&&Zr(n,o);if(n!=="GET"&&n!=="HEAD"&&!ie){ft(v);let N=new Error(`HTTP ${v.status} ${n} ${T} redirected non-idempotent request`);throw N.status=v.status,N}if(D===m)throw ft(v),nt(`HTTP ${v.status} ${n} redirect budget exhausted`,{status:v.status,redirectRefused:!0});let ue=v.headers?.get?.("location"),F;try{F=Ii(ue,T)}catch(N){throw ft(v),N}let w=!Si(F,T);if(ft(v),w&&n==="POST"){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N}if(w&&l){let N=new Error(`HTTP ${v.status} ${n} cross-origin redirect refused`);throw N.status=v.status,N.retryable=!1,N}if(w&&(_=Ai(_)),c)await j(F,{status:v.status});else if(w){let N=await kn(F,E);if(!N.ok){let L=new Error(`HTTP redirect from ${T} ${N.error}`);throw L.status=v.status,L.retryable=!1,L}a&&N.addresses?.length&&(g||(g=await Dn(p?{importUndici:p}:{})),g&&(g.pin(new URL(F).hostname,N.addresses),y=g.fetch))}T=F;continue}if(typeof f=="function")try{await f(v,{url:T})}catch(ie){throw ft(v),nt(ie?.message||String(ie))}let W=await Li(v,d,{url:T,onOversize:()=>S.abort()}),Ce=Pi(W);if(!v.ok){let ie=new Error(`HTTP ${v.status} ${n} ${T}`);throw ie.status=v.status,ie.retryAfter=v.headers?.get?.("retry-after")??null,ie.body=Ce??W.slice(0,300),ie}return Ce??W}throw new Error(`HTTP redirect loop for ${e}`)}catch(T){if(S.signal.aborted&&!kt(h)){let _=T&&(typeof T=="object"||typeof T=="function")&&!Be.isProxy(T)?T:null,D=_?Object.getOwnPropertyDescriptor(_,"oversize"):null;if(!(D&&Object.hasOwn(D,"value")&&D.value===!0))try{if(!_)throw new TypeError("unsafe rejection");Object.defineProperties(_,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let v=new Error("HTTP request timed out");throw Object.defineProperties(v,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),v}}throw T}finally{clearTimeout(x),g&&await g.close()}}async function K(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&Be.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 P=Object.getOwnPropertyDescriptor(t,L);if(!(L==="toJSON"&&P&&Object.hasOwn(P,"value")&&P.value===void 0)){if(!n.has(L))throw new TypeError("HTTP options contain unknown fields");if(!P||!P.enumerable||!Object.hasOwn(P,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=L=>{if(t==null||!Object.hasOwn(t,L))return;let P=Object.getOwnPropertyDescriptor(t,L);if(!P||!Object.hasOwn(P,"value"))throw new TypeError("HTTP options must contain own data properties");return P.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>tn))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${tn}`);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??tn;for(let L of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let P=r(L);if(P!==void 0&&typeof P!="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 f=r("signal");if(f!==void 0){if(Be.isProxy(f)||!(f instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{kt(f)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let L of["importUndici","lookupFn","validateResponse"]){let P=r(L);if(P!==void 0&&typeof P!="function")throw new TypeError(`HTTP ${L} must be a function`)}let h=r("fetchImpl"),u=h||globalThis.fetch;if(typeof u!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let m=s??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),E=wi(y),S=Object.assign(Object.create(null),E);Object.keys(S).some(L=>L.toLowerCase()==="accept")||(S.Accept="application/json");let x=r("body");x!=null&&typeof x!="string"&&(Object.keys(S).find(P=>P.toLowerCase()==="content-type")||(S["Content-Type"]="application/json"),x=Oi(x));let R=i??fi,j=r("lookupFn"),T=!h,_=r("untrustedUrl")===!0,D=r("sameOriginRedirectsOnly")===!0,ee=r("importUndici"),v=r("validateResponse"),W=f,Ce=p??null,ie=async()=>{let L;for(let P=0;P<=R;P++){W&&hi.call(W);let Fe=Xt("http");try{let he=await Ci(e,{fetchImpl:u,method:g,headers:S,body:x,timeoutMs:m,lookupFn:j,realFetch:T,untrustedUrl:_,maxResponseBytes:Ce,sameOriginRedirectsOnly:D,importUndici:ee,validateResponse:v,signal:W,redirectPolicy:d,maxRedirects:l});return Fe?.("succeeded"),he}catch(he){L=he;let ye=_e=>{if(!he||typeof he!="object"&&typeof he!="function"||Be.isProxy(he))return;let xe=Object.getOwnPropertyDescriptor(he,_e);return xe&&Object.hasOwn(xe,"value")?xe.value:void 0},Ne=ye("status");Fe?.("failed",Ne);let Zt=ye("oracleTimeout")===!0||ye("name")==="AbortError"||ye("name")==="TimeoutError"||kt(W),bt=new Set([408,425,429]),A=ye("retryable")===!1?!1:Ne!=null?bt.has(Ne)||ui.has(Ne)&&Hr.has(g):!Zt&&Hr.has(g);if(P===R||!A)throw he;let C=vi(P,ye("retryAfter")),te=Xt("retry"),V=!1;try{W?await new Promise((_e,xe)=>{let Ve,je=()=>{clearTimeout(Ve),Gr.call(W,"abort",je),xe(yi(W)||new DOMException("Aborted","AbortError"))};if(kt(W)){je();return}Ve=setTimeout(()=>{Gr.call(W,"abort",je),_e()},C),gi.call(W,"abort",je,{once:!0}),kt(W)&&je()}):await xi(C),V=!0}finally{te?.(V?"succeeded":"failed")}}}throw L};if(!(r("dedupe")!==!1&&!W&&Zr(g,x)))return ie();let F=Ti(g,e,S,{untrustedUrl:_,maxResponseBytes:Ce,sameOriginRedirectsOnly:D,redirectPolicy:d,maxRedirects:l,timeoutMs:m,retries:R,fetchImpl:en(u),realFetch:T,lookupFn:en(j),importUndici:en(ee),validateResponse:en(v)},x),w=Un.get(F);if(w){let L=Xt("shared");try{let P=await w;return L?.("succeeded"),P}catch(P){throw L?.("failed"),P}}let N=ie().finally(()=>Un.delete(F));return Un.set(F,N),N}import{types as Et}from"node:util";function Ee(e){if(!e||typeof e!="object"||Et.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ge(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Et.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 He(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"||Et.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`);He(a.value,t,n,s,o+1)}return e}if(!Ee(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let i of Object.keys(e)){if(i.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,i);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);He(a.value,t,n,s,o+1)}return e}finally{s.active.delete(e)}}function Z(e,t="provider response",n=0){if(n>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Et.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let i=Object.getOwnPropertyDescriptor(e,String(s));if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=Z(i.value,t,n+1)}return o}if(!Ee(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Z(s.value,t,n+1)}return r}var Xr=Symbol("oracle.provider-failure-metadata"),ji=new Set(["provider-response-too-large","provider-timeout"]);function Ot(e,t){let n=t&&typeof t=="object"&&!Et.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,Xr,{value:Object.freeze({status:o,code:i}),enumerable:!1,configurable:!1,writable:!1}),e}function Qr(e){if(!e||typeof e!="object"||Et.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,Xr);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=ji.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var Vn="https://blockstream.info/liquid/api";function ki(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||Vn).replace(/\/$/,"")}var Di="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function $i(e){let t=0n;for(let s of e){let i=Di.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 Mi(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return eo("sha256").update(eo("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}var Ui="qpzry9x8gf2tvdw0s3jn54khce6mua7l",to=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn];function Fi(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<to.length;o+=1)r>>BigInt(o)&1n&&(t^=to[o])}return t}function Vi(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 nn(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 f=Ui.indexOf(p);if(f<0)return!1;s.push(f)}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||Fi(i)!==c)return!1;let d=Vi(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 Dt(e){let t=String(e??"").trim();if(nn(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=$i(t);return!!(n&&n.length===59&&Mi(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function zi(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)||nn(n),s=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||Dt(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 Bi(e,t={}){return Z(await K(`${ki(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function no(e={},t={}){let n=zi(e.address||e.addr,"address"),r=await Bi(`/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),f=p?l.map(i):[];if(p&&f.some(m=>m==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let h=p?f[0]+f[2]:null,u=p?f[1]+f[3]:null;if(p&&(!Number.isSafeInteger(h)||!Number.isSafeInteger(u)||u>h))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:d,balanceSats:p?String(h-u):null,confidential:Dt(n),note:p?void 0:Dt(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 co}from"node:util";import{base58 as ro}from"@scure/base";function oo(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)||et(e))return!1;try{let s=ro.decode(e);return s.length===r&&(!o||!tt(s))&&ro.encode(s)===e}catch{return!1}}function rn(e){return oo(e,32,44,32)}function on(e){return oo(e,64,88,64,!0)}var zn="oracle.investigator-cursor/1",Hi=2*1024,qi=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),so=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),Gi=Object.freeze(["block_number","index"]),Bn=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}};function Wi(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function lo(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")&&lo(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function M(e){throw new Bn(e)}function uo(e,t){return(!e||typeof e!="object"||co.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&M(`${t} must be a plain object`),e}function sn(e,t,n){uo(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&M(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(i=>{if(i!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,i);return Wi(a)||M(`${n}.toJSON is invalid`),!1}),s=t.filter(i=>!Object.hasOwn(e,i));(o.length!==t.length||o.some(i=>!r.has(i))||s.length)&&M(`${n} fields are invalid`);for(let i of o){let a=Object.getOwnPropertyDescriptor(e,i);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&M(`${n} fields must be enumerable own data`)}}function fe(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&M(`${n} fields must be own data`),r.value}function qe(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&M(`${t} is invalid`),e}function io(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=qe(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||J(t))&&M("chain is invalid"),t}function Ji(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Yi(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 Ki(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||Yi(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ao(e,t,n){let r=qe(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&M("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!rn(r))&&M("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Ji(r),s=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),i=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!s||!i)&&M("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Ki(r):null;return o||M("address is invalid for the cursor family"),o}M("family does not support cursors")}function Zi(e){sn(e,Gi,"EVM payload");let t=fe(e,"block_number","cursor"),n=fe(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&M("EVM payload values are invalid"),{block_number:t,index:n}}function Xi(e){sn(e,["lt","hash"],"TON payload");let t=qe(fe(e,"lt","cursor"),"TON payload.lt",40),n=qe(fe(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||et(n))&&M("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||tt(r))&&M("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function Qi(e,t){if(e==="evm")return Zi(t);if(e==="ton")return Xi(t);let n=qe(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&M("Bitcoin payload must be a transaction id"),e==="solana"&&!on(n)&&M("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||M(`${e} does not support cursors`),n}function ea(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"||co.isProxy(r))&&M("envelope is not own-data JSON"),Array.isArray(r)){let s=[];for(let i=0;i<r.length;i+=1){let a=Object.getOwnPropertyDescriptor(r,String(i));(!a||!Object.hasOwn(a,"value"))&&M("envelope is not own-data JSON"),s.push(t(a.value))}return`[${s.join(",")}]`}let o=[];for(let s of Object.keys(r))o.push(`${JSON.stringify(s)}:${t(fe(r,s,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Hi&&M("envelope exceeds the byte limit")}function wt(e,t={}){if(e==null)return null;sn(e,qi,"envelope"),fe(e,"schemaVersion","cursor")!==zn&&M("schemaVersion is unsupported");let n=qe(fe(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(so,n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))&&M("family is invalid");let r=io(fe(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&M("chain is invalid for the cursor family");let o=ao(n,r,fe(e,"address","cursor")),s=qe(fe(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(s)||s!==so[n]||J(s))&&M("provider is invalid"),uo(t,"expected binding");let i=h=>Object.hasOwn(t,h)?fe(t,h,"expected binding"):void 0,a=i("family")===void 0?void 0:qe(i("family"),"expected family",64).toLowerCase(),c=i("chain")===void 0?void 0:io(i("chain")),d=i("address")===void 0?void 0:ao(n,r,i("address")),l=i("provider")===void 0?void 0:qe(i("provider"),"expected provider",64);a!==void 0&&n!==a&&M("family binding does not match the request"),c!==void 0&&r!==c&&M("chain binding does not match the request"),d!==void 0&&o!==d&&M("address binding does not match the request"),l!==void 0&&s!==l&&M("provider binding does not match the request");let p=Qi(n,fe(e,"payload","cursor")),f={schemaVersion:zn,family:n,chain:r,address:o,provider:s,payload:p};return ea(f),lo(f)}function fo(e,t){return sn(e,["family","chain","address","provider"],"binding"),wt({schemaVersion:zn,family:fe(e,"family","binding"),chain:fe(e,"chain","binding"),address:fe(e,"address","binding"),provider:fe(e,"provider","binding"),payload:t},e)}function pt(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))pt(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}var dn="oracle.investigator-collection/1",ta=pt(["wallet","token","tx","launch"]),Ft=pt(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),na=pt(["COMPLETE","PARTIAL","UNKNOWN"]),ke=pt({maxDepth:3,maxNodes:250,maxEdges:1e3}),yu=pt({depth:2,nodes:100,edges:400});var ae=pt({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),bu=new Set(ta),Eu=new Set(Ft),Ou=new Set(na);var ra=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,go=/^(?: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})$/,oa=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),sa=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,ia=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,aa=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),ca=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),la=new Set(["auth","key","token","xapikey"]),da=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),ua=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),un=32,po=64,fa=5,pa=512,ma=262144,Gn=262144,yo=524288,cn=524288,$t=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};function I(e,t){throw new $t(e,t)}function ln(e,t){return(!e||typeof e!="object"||Ut.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&I(`${t} must be a plain object`,"invalid-object"),e}function Zn(e,t,n){ln(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&I(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});(o.length>r.size||o.some(s=>!r.has(s)))&&I(`${n} has unknown field(s)`,"unknown-field");for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!i.enumerable||!Object.hasOwn(i,"value"))&&I(`${n}.${s} must be enumerable own data`,"invalid-component")}return e}function bo(e){if(!/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e))return!1;let t=e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1");return!J(t)}function ha(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 Xn(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])||ha(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function ga(e){return Xn(e)!==null}var ya="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function ba(e){let t=0n;for(let o of e){let s=ya.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 Ea(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=ba(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 qn("sha256").update(qn("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function Oa(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||nn(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||Ea(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)||ga(e)}function wa(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?Oa(e):t==="coinType"?bo(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):go.test(e)}function Wn(e,t,n){if(n>12&&I("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>yo&&I("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||Ut.isProxy(e))&&I("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&I("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-component"),t.active.add(e);try{if(Array.isArray(e)){for(let c of Object.getOwnPropertyNames(e))c!=="length"&&(c==="toJSON"&&Object.getOwnPropertyDescriptor(e,c)?.value===void 0||/^(?:0|[1-9]\d*)$/u.test(c)||I("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>cn&&I("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let d=Object.getOwnPropertyDescriptor(e,String(c));(!d||!Object.hasOwn(d,"value"))&&I("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Wn(d.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(a,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(a)}let r=Object.getPrototypeOf(e);r!==Object.prototype&&r!==null&&I("value must be a plain object","invalid-component");let o=Object.getOwnPropertyNames(e);for(let a of o){let c=Object.getOwnPropertyDescriptor(e,a);a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0||(!c||!c.enumerable||!Object.hasOwn(c,"value"))&&I(`${a} must be enumerable own data`,"invalid-component")}let s=Object.keys(e);t.fields+=s.length,t.fields>cn&&I("value exceeds the freeze field limit","data-limit");let i=r===null?Object.create(null):{};for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(i,a,{value:Wn(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 Ge(e){return Wn(e,{nodes:0,fields:0,active:new Set},0)}function B(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&I(`${t} must be an own data field`,"invalid-component"),n.value}function Jn(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&I(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function Eo(e,t,{max:n=pa,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:s=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&I(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let i=(s&&ia.test(e)||r&&(go.test(e)||bo(e))||o&&wa(e,o))&&!sa.test(e);return J(e)&&!i&&I(`${t} contains secret-shaped material`,"secret-material"),e}function Aa(e,t){(!ra.test(e)||/^[0-9a-f]{64}$/iu.test(e)||J(e))&&I(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!da.has(n);return(la.has(n)||r||ua.some(o=>n.includes(o)))&&I(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function fn(e,t,n,r="data-limit"){Ut.isProxy(e)&&I(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||I(`${t} must be an array`,"invalid-component"),e.length>n&&I(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){Object.hasOwn(e,s)||I(`${t} must contain dense own entries`,"invalid-component");let i=Object.getOwnPropertyDescriptor(e,String(s));(!i||!Object.hasOwn(i,"value"))&&I(`${t} entries must be own data`,"invalid-component"),o[s]=i.value}return o}function Yn(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 Ia(e){let t=Yn(e,1);return typeof t=="string"&&oa.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 Sa(e){let t=Yn(e,1);return typeof t=="string"&&aa.has(t)?!0:Number.isInteger(t)&&ca.has(Yn(e,2))}function Mt(e,t,n,r,o){if(n>fa&&I(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>ma&&I(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return Eo(e,t,{publicIdentifierField:Ia(o),allowDeterministicRecordId:Sa(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||Ut.isProxy(e))&&I(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&I(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&I(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>po&&I(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),fn(e,t,po).map((a,c)=>Mt(a,`${t}[${c}]`,n+1,r,[...o,c]));ln(e,t);let s=Object.keys(e);s.length>un&&I(`${t} exceeds the field limit`,"data-limit"),r.fields+=s.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),s.sort();let i=[];for(let a of s){Aa(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&I(`${t}.${a} must be an own data field`,"invalid-component"),i.push([a,Mt(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(i)}finally{r.active.delete(e)}}function Kn(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&I("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>yo&&I("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&Ut.isProxy(e)&&I("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&I("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&I("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=fn(e,"canonical value",ae.evidence,"invalid-json");return r.fields+=c.length,r.fields>cn&&I("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(d=>Kn(d,r,n+1)).join(",")}]`}let s=Object.getPrototypeOf(e);s!==Object.prototype&&s!==null&&I("value is not canonical JSON","invalid-json");let i=Object.keys(e);return i.length>un&&I("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=i.length,r.fields>cn&&I("value exceeds canonical JSON field limit","invalid-json"),i.sort(),`{${i.map(c=>{let d=Object.getOwnPropertyDescriptor(e,c);return(!d||!Object.hasOwn(d,"value"))&&I("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Kn(d.value,r,n+1)}`}).join(",")}}`}finally{r.active.delete(e)}}(e===void 0||typeof e=="bigint"||typeof e=="function"||typeof e=="symbol"||typeof e=="number"&&!Number.isFinite(e))&&I("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&I("value is not canonical JSON","invalid-json"),o}function rt(e){return`sha256:${qn("sha256").update(Kn(e)).digest("hex")}`}function ot(e,t){let n=Eo(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||I("id kind must be a lowercase slug","invalid-id"),`${n}_${rt(t).slice(7)}`}function an(e,t,n,r){let o=fn(e,t,n,"component-limit");return r.fields+=o.length,r.fields>Gn&&I(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((s,i)=>Mt(s,`${t}[${i}]`,0,r,[t,i]))}function Qn(e){let t=["subject","entities","events","evidence","coverage","gaps"];Zn(e,t,"components"),Jn(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=Mt(B(e,"subject"),"subject",0,n,["subject"]),o=an(B(e,"entities"),"entities",ke.maxNodes,n),s=an(B(e,"events"),"events",ke.maxEdges,n),i=an(B(e,"evidence"),"evidence",ae.evidence,n),a=Mt(B(e,"coverage"),"coverage",0,n,["coverage"]),c=an(B(e,"gaps"),"gaps",ke.maxNodes,n);return Ge({subject:r,entities:o,events:s,evidence:i,coverage:a,gaps:c})}var mo=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),Na=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"]);function _a(e,t,n){if(e===null)return null;if(Zn(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&I("collector output.cursor fields are invalid","invalid-cursor"),B(e,"requested")===null&&B(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&I("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:wt(B(e,"requested"),r),next:wt(B(e,"next"),r)}}catch{I("collector cursor binding or payload is invalid","invalid-cursor")}}function Hn(e,t){let n=new Set;for(let r of e)(!r||typeof r!="object"||!Object.hasOwn(r,"id")||typeof r.id!="string"||r.id.length===0)&&I(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&I(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function Ta(e){let t=e.subject,n=typeof t.chain=="string"&&t.chain.length>0||Number.isSafeInteger(t.chain)&&t.chain>=0;(!Object.hasOwn(t,"family")||typeof t.family!="string"||t.family.length===0||!Object.hasOwn(t,"chain")||!n||!Object.hasOwn(t,"address")||typeof t.address!="string"||t.address.length===0)&&I("collector subject identity is invalid","invalid-reference");let r=e.coverage.source;(!Object.hasOwn(e.coverage,"source")||r!==null&&(typeof r!="string"||r.length===0)||e.coverage.collectorStatus!=="UNAVAILABLE"&&r===null)&&I("collector coverage source is invalid","invalid-reference");let o=Hn(e.entities,"entity");e.entities.some(i=>Object.hasOwn(i,"family")&&i.family===t.family&&Object.hasOwn(i,"chain")&&i.chain===t.chain&&Object.hasOwn(i,"address")&&i.address===t.address)||I("collector subject entity reference is missing","invalid-reference"),Hn(e.events,"event");let s=Hn(e.evidence,"evidence");for(let i of e.events){for(let a of["from","to"])(!Object.hasOwn(i,a)||i[a]!=null&&(typeof i[a]!="string"||!o.has(i[a])))&&I(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(i,"evidenceRefs")||!Array.isArray(i.evidenceRefs)||i.evidenceRefs.some(a=>typeof a!="string"||!s.has(a))||new Set(i.evidenceRefs).size!==i.evidenceRefs.length)&&I("collector event evidence references are invalid","invalid-reference")}}function ho(e,t,n=un){let r=Object.keys(e);r.length>n&&I(`${t} exceeds the field limit`,"data-limit");let o=[];for(let s of r){let i=Object.getOwnPropertyDescriptor(e,s);(!i||!Object.hasOwn(i,"value"))&&I(`${t}.${s} must be an own data field`,"invalid-component"),o.push([s,i.value])}return Object.fromEntries(o)}function er(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];Zn(e,t,"collector output"),Jn(e,t,"collector output"),B(e,"schemaVersion")!==dn&&I("collector output.schemaVersion is unsupported","invalid-schema-version"),B(e,"execution")!=="read-only"&&B(e,"execution")!=="READ_ONLY"&&I("collector output must be read-only","invalid-posture"),Na.has(B(e,"status"))||I("collector output.status is invalid","invalid-status"),Array.isArray(B(e,"evidence"))||I("collector output.evidence must be an array","invalid-component"),ln(B(e,"coverage"),"collector output.coverage");let n=Qn({subject:B(e,"subject"),entities:B(e,"entities"),events:B(e,"events"),evidence:fn(B(e,"evidence"),"collector output.evidence",ke.maxEdges,"component-limit").map(o=>{ln(o,"collector evidence"),Jn(o,["status"],"collector evidence");let s=B(o,"status"),i=typeof s=="string"&&Object.hasOwn(mo,s)?mo[s]:null;return i||I("collector evidence status is invalid","invalid-status"),{...ho(o,"collector evidence"),status:i}}),coverage:{...ho(B(e,"coverage"),"collector coverage",un-1),collectorStatus:B(e,"status")},gaps:B(e,"gaps")});Ta(n);let r=_a(B(e,"cursor"),n.subject,n.coverage.source);return Ge({...n,cursor:r})}import{types as hr}from"node:util";var pn=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"}),tr=Object.freeze(["block_number","index"]),Oo=new Set([...tr,"items_count","value","hash","inserted_at","fee"]);function Vt(e){return Number.isSafeInteger(e)&&e>=0}function st(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 va(e){if(!Ee(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==tr.length||t.some(o=>!tr.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=st(e,"block_number","blockscout transaction",!0),r=st(e,"index","blockscout transaction",!0);if(!Vt(n)||!Vt(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function xa(e){if(!Ee(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>Oo.size||t.some(a=>!Oo.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=st(e,"block_number","blockscout provider",!0),r=st(e,"index","blockscout provider",!0);if(!Vt(n)||!Vt(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=st(e,"items_count","blockscout provider");if(o!==void 0&&!Vt(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=st(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=st(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=st(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 Ra(e,t={}){let n=Number(e),r=t.baseUrl||pn[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function wo(e){return!!pn[Number(e)]}async function Ao(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=va(s);for(let[u,m]of Object.entries(h))m!=null&&o.set(u,String(m))}let i=`${Ra(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=Z(await K(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,headers:{accept:"application/json","user-agent":"OracleInvestigator/1.0"}}),"blockscout transactions response"),c=ge(a,"items");if(!Ee(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let d=c.slice(0,r),l=null,p=ge(a,"next_page_params");if(p!=null){if(!Ee(p))throw new Error("blockscout transactions returned an invalid next cursor");l=xa(p)}let f=c.length>d.length?null:l;return{provider:"blockscout",chainId:n,address:String(e.address),limit:r,cursor:s??null,nextCursor:f,pageComplete:c.length<=d.length&&l==null,count:d.length,truncated:c.length>d.length,transactions:d,raw:{items:d,next_page_params:f}}}var La="mainnet-beta",nr="https://api.mainnet-beta.solana.com";function Pa(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||nr).trim()}function Ca(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 ja(e,t=[],n={}){let r=String(e||"");if(r==="sendTransaction"||r==="sendRawTransaction"||r==="requestAirdrop"||r==="requestAirDrop"||/airdrop/i.test(r)||/^send/i.test(r))throw new Error(`solana-rpc: ${r} refused \u2014 @oracle-agent/oracle is prepare-only (no broadcast/airdrop)`);let o=Z(await K(Pa(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly}),"solana-rpc response");if(!Ee(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let s=ge(o,"error");if(s)throw new Error(`solana-rpc ${e}: ${ge(s,"message")||JSON.stringify(s)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return ge(o,"result")}async function Io(e={},t={}){let n=Ca(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 ja("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:La,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 ka="mainnet",rr="https://mempool.space/api",or="https://mempool.space/testnet/api";function So(e={}){return String(e.network||process.env.BTC_NETWORK||ka).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Da(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):So(e)==="testnet"?or:rr}function $a(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 Ma(e,t={}){let n=`${Da(t)}${e.startsWith("/")?e:`/${e}`}`;return Z(await K(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function No(e={},t={}){let n=$a(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 Ma(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:So(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 sr="https://api.hyperliquid.xyz/info",ir="https://api.hyperliquid-testnet.xyz/info";function Ua({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"?ir:sr}async function Fa(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Ua(t);return Z(await K(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function _o(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Fa({type:"userFills",user:e},t)}var To="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function At({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:vo(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([vo(t),...n]).has(c)){let l=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!l?{baseUrl:i,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:i,trusted:!0,host:c}}if(String(process.env[To]||"")==="1")return{baseUrl:i,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${To}=1 to permit it)`);return{baseUrl:i,trusted:!1,host:c}}function vo(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function De(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function It(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 ar="https://api.trongrid.io",Va=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],za="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";function Ba(e={}){return At({provider:"tron-public",defaultUrl:ar,hosts:Va,url:e.baseUrl||process.env.TRON_API_URL||""})}function Ha(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return De(t)}function qa(e,t){return It({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Ga(e,t={}){let n=Ba(t),r=Ha(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:qa(n.trusted,r)}),"tron-public response");return He(o,n.trusted?r:"","tron-public response")}function xo(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 Wa(e){return Ot({error:"tron-public request failed"},e)}function Ja(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 Ro(e={},t={}){try{let n=xo(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?za:e.contract;i&&String(i).toLowerCase()!=="all"&&s.set("contract_address",xo(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 Ga(`/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:Ja(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 Wa(n)}}var dr="https://toncenter.com/api",Ya=["toncenter.com","testnet.toncenter.com"];function Ka(e={}){return At({provider:"ton-public",defaultUrl:dr,hosts:Ya,url:e.baseUrl||process.env.TON_API_URL||""})}function Za(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return De(t)}function Xa(e,t){return It({Accept:"application/json"},{"X-API-Key":t},e)}async function Qa(e,t={}){let n=Ka(t),r=Za(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Xa(n.trusted,r)}),"ton-public response");return He(o,n.trusted?r:"","ton-public response")}function ec(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 tc(e){return Ot({error:"ton-public request failed"},e)}function nc(e,t){if(!Ee(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(ge(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 ge(e,"result")}function cr(e){let t=String(e??"").trim();if(et(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||tt(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function lr(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 Lo(e={},t={}){try{let n=ec(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:cr(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=nc(await Qa(`/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:cr(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=cr(m.transaction_id.hash),y=String(m.transaction_id.lt??"");if(y.length>100||!/^\d+$/u.test(y))throw new Error("ton-public: malformed transaction logical time");if(m.in_msg!=null&&(typeof m.in_msg!="object"||Array.isArray(m.in_msg)))throw new Error("ton-public: malformed inbound message");if(m.out_msgs!=null&&!Array.isArray(m.out_msgs))throw new Error("ton-public: malformed outbound messages");let E=Array.isArray(m.out_msgs),S=m.out_msgs??[];if(S.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let x=0n;for(let j of S){if(!j||typeof j!="object"||Array.isArray(j))throw new Error("ton-public: malformed outbound message");x+=BigInt(lr(j.value??"0","outbound message value",{nullable:!1}))}let R=E?String(x):null;if(R!=null&&R.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:m.utime??null,feeNano:lr(m.fee,"transaction fee"),inMessageValueNano:lr(m.in_msg?.value,"inbound message value"),inMessageSource:m.in_msg?.source||null,inMessageDestination:m.in_msg?.destination||null,outMessageCount:S.length,outMessageValueNano:R}}),f=c.length>=i,h=p.length>0?p[p.length-1]:null,u=f&&h?{lt:h.lt,hash:h.hash}:null;return{provider:"ton-public",address:n,limit:r,count:p.length,cursor:s,nextCursor:u,pageComplete:!f,continuationUnknown:f&&!u,transactions:p}}catch(n){return tc(n)}}var We=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"})}),Po="cosmoshub";function rc(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function oc(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||Po).trim().toLowerCase(),o=Object.hasOwn(We,r)?We[r]:null,s=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),i=rc(r)||r===Po&&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(We).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 sc(e,t,n={}){return Z(await K(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,maxResponseBytes:n.maxResponseBytes,sameOriginRedirectsOnly:n.sameOriginRedirectsOnly,headers:{Accept:"application/json"}}),"cosmos-lcd response")}function ic(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 ac(e){return{error:String(e?.message||e).slice(0,200)}}function cc(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 lc(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function dc(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:lc(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?cc(r,t.decimals):null}}async function Co(e={},t={}){try{let n=oc(e,t),r=ic(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 sc(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=>dc(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 ac(n)}}var fr="https://fullnode.mainnet.aptoslabs.com",ur="0x1::aptos_coin::AptosCoin",mn=8;function Do(e={}){return At({provider:"aptos-public",defaultUrl:fr,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function $o(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return De(t)}function Mo(e,t){return It({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function jo(e,t={}){let n=Do(t),r=$o(t),o=Z(await K(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Mo(n.trusted,r)}),"aptos-public response");return He(o,n.trusted?r:"","aptos-public response")}function uc(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 fc(e){return Ot({error:"aptos-public request failed"},e)}function ko(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 pc(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function Uo(e={},t={}){try{let n=uc(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,f="view";try{let u=Do(t),m=$o(t),g=He(Z(await K(`${u.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:Mo(u.trusted,m)}),"aptos-public view response"),u.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{f="coinstore";let u=await jo(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(u?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");p=String(u.data.coin.value)}let h=r===ur;return{provider:"aptos-public",address:n,source:f,count:1,balances:[{coinType:r,raw:p??"0",decimals:h?mn:null,symbol:h?"APT":null,amount:h?ko(p??"0",mn):null}]}}let s=Math.min(201,o+1),i=await jo(`/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 f=pc(p.type);if(!f)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 u=f===ur;c.push({coinType:f,raw:h,decimals:u?mn:null,symbol:u?"APT":null,amount:u?ko(h,mn):null,frozen:p?.data?.frozen??null})}let d=c.slice(0,o),l=d.find(p=>p.coinType===ur)||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 fc(n)}}var gr="oracle.investigator-fact-projection/1",Go=4*1024*1024;function we(e){return Ge(e)}var it=Ge({evm:we({status:"AVAILABLE",mode:"transaction-history",source:"blockscout",chainIds:Object.freeze([1,10,137,324,8453,42161,534352]),chainStatus:Object.freeze({1:"AVAILABLE",10:"AVAILABLE",137:"AVAILABLE",324:"AVAILABLE",8453:"AVAILABLE",42161:"AVAILABLE",534352:"AVAILABLE",56:"UNAVAILABLE",130:"UNAVAILABLE",143:"UNAVAILABLE",360:"UNAVAILABLE",988:"UNAVAILABLE",999:"UNAVAILABLE",1329:"UNAVAILABLE",1868:"UNAVAILABLE",2020:"UNAVAILABLE",2741:"UNAVAILABLE",4326:"UNAVAILABLE",4663:"UNAVAILABLE",5031:"UNAVAILABLE",8333:"UNAVAILABLE",33139:"UNAVAILABLE",43114:"UNAVAILABLE",43419:"UNAVAILABLE",57073:"UNAVAILABLE",69e3:"UNAVAILABLE",80094:"UNAVAILABLE",81457:"UNAVAILABLE",7777777:"UNAVAILABLE"}),maxLimit:50,cursor:"CONDITIONAL",cursorMode:"conditional",cursorReason:"A continuation is exposed only when Blockscout does not over-return and force client truncation",facts:"Bounded Blockscout transaction fact projections"}),solana:we({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:we({status:"AVAILABLE",mode:"transaction-history",source:"bitcoin-esplora",chainIds:Object.freeze(["mainnet","testnet"]),maxLimit:25,cursor:!0,facts:"Bounded Esplora transaction facts with input/output summaries"}),hyperliquid:we({status:"AVAILABLE",mode:"fill-history",source:"hyperliquid-info",chainIds:Object.freeze(["hyperliquid-mainnet","hyperliquid-testnet"]),maxLimit:1e3,cursor:!1,facts:"Bounded public userFills fact projections"}),tron:we({status:"AVAILABLE",mode:"trc20-transfer-history",source:"tron-public",chainIds:Object.freeze(["tron-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded confirmed TRC20 transfer facts, not native TRX history"}),ton:we({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(We)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:we({status:"EVIDENCE_ONLY",mode:"holdings",source:"aptos-public",chainIds:Object.freeze(["aptos-mainnet"]),maxLimit:200,cursor:!1,facts:"Bounded legacy CoinStore holding facts only; Fungible Asset enumeration and transaction history are not collected"}),liquid:we({status:"EVIDENCE_ONLY",mode:"address-state",source:"liquid-esplora",chainIds:Object.freeze(["liquid-mainnet"]),maxLimit:1,cursor:!1,facts:"Bounded address transaction-count and confidentiality-form facts only; per-asset balances and transaction timeline are unavailable"}),sui:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["celestia-mainnet"]),maxLimit:0,cursor:!1,reason:"DA address history is unavailable; Cosmos account state uses family cosmos and chainId celestia"}),unsupported:we({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})});var Fo=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"}),Vo=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"}),zo=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"}),mc=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),En=Symbol("missing-public-fact"),hn=8;function hc(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(Fo,t)?Fo[t]:t)||"unsupported"}function An(e){return Ee(e)&&Object.getPrototypeOf(e)===Object.prototype}function U(e,t){return ge(e,t)}function Ke(e){return Ee(e)}function mr(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]=mr(i.value,t+1)}return o}if(!Ke(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]=mr(s.value,t+1)}return r}function gc(e){if(!An(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 yc(e){if(!Ke(e))throw new Error("investigator collector: internal options must be a plain object");let t=new Set(["now","transports","fetchImpl","timeoutMs"]);if(Object.keys(e).filter(s=>!t.has(s)).length)throw new Error("investigator collector: internal options have unknown fields");let r=U(e,"fetchImpl"),o=U(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!An(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 bc(e){let t=U(e,"now"),n=typeof t=="function"?t():t??new Date,r=n instanceof Date?n:new Date(n);if(!Number.isFinite(r.getTime()))throw new Error("investigator collector: now must be a valid date");return r.toISOString()}function Ec(e,t,n){let r=Object.hasOwn(Vo,t)?Vo[t]:void 0,o=Object.hasOwn(zo,e)?zo[e]:void 0,s=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(s)||s<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return s}if(typeof s!="string"||s.length===0||s.length>96||/[\u0000-\u001f\u007f]/u.test(s)||/:\/\//u.test(s)||/^[0-9a-f]{64}$/iu.test(s)||J(s))throw new Error("investigator collector: chainId is invalid");return s}function gn(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Oc(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 Wo(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 Oc(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function yr(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&Dt(e)}function Ae(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return rn(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&gn(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&gn(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 Wo(n)!==null;if(e==="cosmos"){if(!gn(n))return!1;let r=Object.hasOwn(We,t)?We[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)&&gn(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||yr(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 Re(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"?Wo(t)??t:t}function wc(e,t,n){if(typeof n!="string"||n.length===0||n.length>256||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("investigator collector: address is invalid");let r=n.trim();if(!r||/:\/\//u.test(r)||!Ae(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&Ae(e,t,r)||e==="liquid"&&yr(r);if(J(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return Re(e,r)}function Ac(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 Ic(e,t,n){if(t===it.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 Jo(e={}){gc(e);let t=U(e,"family"),n=typeof t=="string"?t.trim().toLowerCase():"";if(n.length>63||!/^[a-z][a-z0-9-]*$/u.test(n)||/^[0-9a-f]{64}$/iu.test(n)||J(n))throw new Error("investigator collector: family is invalid");let r=hc(n),o=Object.hasOwn(it,r)?it[r]:it.unsupported,s=Ec(r,n,U(e,"chainId"));Ic(r,o,s);let i=wc(r,s,U(e,"address")),a=Ac(U(e,"limit"),o),c=U(e,"cursor"),d=c===void 0?null:wt(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 zt(e,t){return`${e}_${rt(t).slice(7,55)}`}function Yo(e,t,n){return zt("entity",{family:e,chain:t,address:n,kind:"address"})}function Sc(e){return{id:Yo(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function In(e,t,n,r=[]){return{schemaVersion:dn,execution:"read-only",status:t,subject:e,entities:[Sc(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function Ye(e,t){return{code:e,message:t}}var On=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 bn(e,t="provider-unavailable"){let n=i=>ge(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(On,s)||(s="provider-unavailable"),Object.freeze({code:s,httpStatus:o,message:On[s]})}function Ko(e,t,n,r,o,s=!1){return{id:zt("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 pr(e,t,n,r,o,s){let i=t?.source||null,a=ge(r,"code"),c=a&&Object.hasOwn(On,a)?Object.freeze({code:a,httpStatus:ge(r,"httpStatus")??null,message:On[a]}):bn(r),d={source:i,failureCode:c.code,httpStatus:c.httpStatus},l=In(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(Ko("ERROR",i,o,e,d,!0)),l.cursor=t?.cursor?{requested:s,next:null}:null,l}function yn(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=In(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[Ye("unavailable",r)]);return o.evidence.push(Ko("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function Nc(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=De(process.env[n]);if(r)return r}return null}function Je(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof U(n,"fetchImpl")=="function"?U(n,"fetchImpl"):void 0,timeoutMs:U(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:Go,sameOriginRedirectsOnly:!0}),s=(i={})=>Object.assign(Object.create(null),o,i);return e==="evm"?s({baseUrl:pn[Number(t.chainId)]}):e==="solana"?s({rpcUrl:nr}):e==="bitcoin"?s({network:t.chainId,baseUrl:t.chainId==="testnet"?or:rr}):e==="hyperliquid"?s({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?ir:sr}):e==="tron"?s({baseUrl:ar}):e==="ton"?s({baseUrl:dr}):e==="cosmos"?s({chain:t.chainId,baseUrl:Object.hasOwn(We,t.chainId)?We[t.chainId]?.lcd:void 0}):e==="aptos"?s({baseUrl:fr}):e==="liquid"?s({baseUrl:Vn}):o}var Bo=Object.freeze({evm:(e,t,n)=>Ao(e,Je("evm",e,t,n)),solana:(e,t,n)=>Io(e,Je("solana",e,t,n)),bitcoin:(e,t,n)=>No(e,Je("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>_o(e.address,Je("hyperliquid",e,t,n)),tron:(e,t,n)=>Ro(e,Je("tron",e,t,n)),ton:(e,t,n)=>Lo(e,Je("ton",e,t,n)),cosmos:(e,t,n)=>Co(Object.assign(Object.create(null),e,{chain:e.chainId}),Je("cosmos",e,t,n)),aptos:(e,t,n)=>Uo(e,Je("aptos",e,t,n)),liquid:(e,t,n)=>no(e,Je("liquid",e,t,n))});function _c(e,t,n,r){let o=U(n,"transports"),s=o&&Object.hasOwn(o,e)?o[e]:null,i=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=s||i;if(a)return d=>a(d,n);let c=Object.hasOwn(Bo,e)?Bo[e]:null;return c?d=>c(d,n,r):void 0}function ce(e){return typeof e=="string"?e||null:U(e,"hash")||U(e,"address")||null}function Zo(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 En;let r=mc.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,s=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),i=t==="coinType"&&/^0x[0-9a-fA-F]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(e)&&!J(o),a=r&&(/^(?:(?:-1|0):[0-9a-fA-F]{64}|(?:0x)?[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,128}|[A-Za-z0-9+/_=-]{43,128})$/u.test(e)||s||i);return J(e)&&!a?En:e}function k(e,t,n,r,o){let s=Zo(r,n,o);return s===En||r===void 0?!1:(e[n]=s,t.push(n),!0)}function br(e,t,n,r={}){let{sourceFields:o=[],...s}=r,i=Ke(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 Tc(e,t){let n={},r=[];k(n,r,"transactionHash",e.hash),k(n,r,"blockNumber",e.block_number),k(n,r,"timestamp",e.timestamp),k(n,r,"fromAddress",ce(e.from)),k(n,r,"toAddress",ce(e.to)),k(n,r,"createdContractAddress",Nt("evm",t,ce(e.created_contract))?ce(e.created_contract):void 0),k(n,r,"value",e.value),k(n,r,"status",e.status),k(n,r,"fee",Ke(e.fee)?e.fee.value:e.fee),k(n,r,"gasUsed",e.gas_used),k(n,r,"gasLimit",e.gas_limit),k(n,r,"nonce",e.nonce);let o=ce(e.token);return k(n,r,"tokenAddress",typeof o=="string"&&Ae("evm",t,o)?o:void 0),k(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:br("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function vc(e,t){if(!Ke(e))return null;let n={},r=[];return k(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),k(n,r,"outputIndex",e.vout),k(n,r,"coinbase",e.is_coinbase),k(n,r,"sequence",e.sequence),k(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&Ae("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),k(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function xc(e,t,n){if(!Ke(e))return null;let r={index:t},o=[];return k(r,o,"address",typeof e.scriptpubkey_address=="string"&&Ae("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),k(r,o,"value",e.value),k(r,o,"scriptType",e.scriptpubkey_type,64),r}function Rc(e,t){let n={},r=[];k(n,r,"transactionId",e.txid),k(n,r,"version",e.version),k(n,r,"locktime",e.locktime),k(n,r,"size",e.size),k(n,r,"weight",e.weight),k(n,r,"fee",e.fee);let o={},s=[];k(o,s,"confirmed",e.status?.confirmed),k(o,s,"blockHeight",e.status?.block_height),k(o,s,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),k(o,s,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let i=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=i.slice(0,hn).map(l=>vc(l,t)).filter(Boolean),d=a.slice(0,hn).map((l,p)=>xc(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:br("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:i.length,inputSelected:c.length,inputsTruncated:i.length>hn,outputCount:a.length,outputSelected:d.length,outputsTruncated:a.length>hn})}}function mt(e,t,n){let r={},o=[],s=[];for(let[i,a,c,d]of n){let l=typeof a=="function"?a(t):U(t,a);k(r,o,i,l,c),typeof a=="string"?s.push(a):typeof d=="string"&&s.push(d)}return{facts:r,projection:br(e,t,o,{sourceFields:s})}}function wn(e,t,n){return e==="evm"?Tc(n,t):e==="bitcoin"?Rc(n,t):e==="solana"?mt(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>U(r,"err")!==null&&U(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?mt(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"?mt(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"?mt(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?mt(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?mt(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):mt(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function _t(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");_t(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");_t(i.value,t,o,r+1)}}finally{o.active.delete(e)}}}function Xo(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!J(e)}function $e(e,t=100,{nullable:n=!0}={}){return e==null?n:Number.isSafeInteger(e)&&e>=0?!0:typeof e=="string"&&e.length>0&&e.length<=t&&/^\d+$/u.test(e)&&!J(e)}function Lc(e,t=100,{nullable:n=!0}={}){return e==null?n:typeof e=="number"?Number.isFinite(e):typeof e=="string"&&e.length>0&&e.length<=t&&/^-?\d+(?:\.\d+)?$/u.test(e)&&!J(e)}function St(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:Xo(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Pc(e){if(typeof e!="string"||et(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&&!tt(t)}catch{return!1}}function Nt(e,t,n){return n==null||typeof n=="string"&&Ae(e,t,n)}function Qo(e,t,n){return`${e}:${String(t)}:${n}`}function Ho(e,t,n){let r=ce(n);return typeof r=="string"&&Ae(e,t,r)?Qo(e,t,Re(e,r)):null}function Tt(e,t,n){return typeof t=="string"&&typeof n=="string"&&Re(e,t)===Re(e,n)}function Cc(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(s=>{let i=s?.prevout?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&Tt("bitcoin",i,n)})||o.some(s=>{let i=s?.scriptpubkey_address;return typeof i=="string"&&Ae("bitcoin",t,i)&&Tt("bitcoin",i,n)})}function jc(e,t,n,r){if(!Ke(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&Nt("evm",t,ce(r.from))&&Nt("evm",t,ce(r.to))&&Nt("evm",t,ce(r.created_contract))&&[ce(r.from),ce(r.to),ce(r.created_contract)].some(o=>Tt("evm",o,n))&&$e(r.block_number,32)&&$e(r.value,100)&&St(r.timestamp,{iso:!0});if(e==="solana")return on(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&St(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&Ke(r.status)&&Cc(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&$e(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&St(r.status.block_time);if(e==="hyperliquid"){let o=Xo(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||$e(r.tid,32,{nullable:!1});return o&&s&&i&&(r.hash!=null||r.tid!=null)&&Lc(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&St(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&Ae("tron",t,r.from)&&typeof r.to=="string"&&Ae("tron",t,r.to)&&[r.from,r.to].some(o=>Tt("tron",o,n))&&typeof r.tokenAddress=="string"&&Ae("tron",t,r.tokenAddress)&&$e(r.raw,100,{nullable:!1})&&St(r.blockTimestamp):e==="ton"?Pc(r.hash)&&$e(r.lt,40,{nullable:!1})&&Nt("ton",t,r.inMessageSource)&&Nt("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>Tt("ton",o,n))&&$e(r.inMessageValueNano,100)&&St(r.utime):!1}function kc(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:An(t)?e==="evm"||e==="bitcoin"||e==="ton"?U(t,"transactions")??null:e==="solana"?U(t,"signatures")??null:e==="tron"?U(t,"transfers")??null:null:null}function qo(e,t,n){if(e==="evm")return{type:"transaction",from:ce(n.from)?Re("evm",ce(n.from)):null,to:ce(n.to)??ce(n.created_contract)?Re("evm",ce(n.to)??ce(n.created_contract)):null,asset:Ho("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=Zo(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===En?null:Qo("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?Re("tron",n.from):null,to:n.to?Re("tron",n.to):null,asset:Ho("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?Re("ton",n.inMessageSource):null,to:n.inMessageDestination?Re("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 Dc(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=Re(e.subject.family,s),a=n.get(i);a||(a=Yo(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 es(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]=mr(s.value)}return r}function $c(e,t,n,r,o,s,i,a){let c=es(o,n.applied+1);if(c.some(T=>!jc(e.family,e.chain,e.address,T)))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)&&U(r,"truncated")),f=Array.isArray(r)?null:U(r,"nextCursor")??null;for(let T of l)_t(wn(e.family,e.chain,T).facts,a),_t(qo(e.family,e.chain,T),a);_t(f,a);let h=!!(!Array.isArray(r)&&U(r,"continuationUnknown")),u=!Array.isArray(r)&&U(r,"pageComplete")===!0,m=f!=null&&!t.cursor,g=l.length===n.applied&&f==null&&!u,y=[];(p||d)&&y.push(Ye("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(h||g||m)&&y.push(Ye("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(Ye("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let E=p||d||h||m||g||e.family==="tron",S=null;if(t.cursor&&f!=null&&!d)try{S=fo({family:e.family,chain:e.chain,address:e.address,provider:t.source},f)}catch{y.push(Ye("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),E=!0}let x=In(e,E?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:l.length,historyAvailable:!0,cursorSupported:t.cursor},y),R=new Set,j=new Set;return l.forEach(T=>{let _=qo(e.family,e.chain,T),D=wn(e.family,e.chain,T),ee=zt("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:_.locator,publicFacts:D.facts}),v=zt("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:_.type,locator:_.locator,from:_.from,to:_.to,asset:_.asset,amount:_.amount,transactionId:_.transactionId,blockHeight:_.blockHeight,timestamp:_.timestamp});if(R.has(v))throw new Error(`${t.source} returned duplicate event identity`);if(j.has(ee))throw new Error(`${t.source} returned duplicate evidence identity`);R.add(v),j.add(ee),x.evidence.push({id:ee,status:"OBSERVED",source:t.source,observedAt:s,locator:_.locator,publicFacts:D.facts,projection:D.projection}),x.events.push({id:v,type:_.type,from:_.from,to:_.to,asset:_.asset,amount:_.amount,transactionId:_.transactionId,blockHeight:_.blockHeight,timestamp:_.timestamp,evidenceRefs:[ee]})}),Dc(x),t.cursor&&(x.cursor={requested:i,next:S}),x}function Mc(e,t){return An(t)?e==="liquid"?U(t,"provider")==="liquid-esplora"&&Number.isFinite(U(t,"txCount"))?[t]:null:U(t,"balances")??null:null}function Uc(e,t,n,r){if(!Ke(r))return!1;if(e==="cosmos"){let o=/^ibc\/[0-9a-f]{64}$/iu.test(String(r.denom??""));return typeof r.denom=="string"&&r.denom.length>0&&r.denom.length<=256&&!/[\u0000-\u001f\u007f]/u.test(r.denom)&&(!J(r.denom)||o)&&$e(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),s=/^0x[0-9a-f]{1,64}::[A-Za-z_][A-Za-z0-9_]*::[A-Za-z_][A-Za-z0-9_]*(?:<[^\u0000-\u001f\u007f]{1,160}>)?$/u.test(o),i=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return s&&!J(i)&&$e(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&Ae("liquid",t,r.address)&&Tt("liquid",r.address,n)&&r.confidential===yr(r.address)&&(r.balanceSats===null||$e(r.balanceSats,100,{nullable:!1})):!1}function Fc(e,t,n,r,o,s,i){let a=es(o,n.applied+1);if(a.some(h=>!Uc(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)_t(wn(e.family,e.chain,h).facts,i);let d=!!U(r,"truncated")||a.length>n.applied,l=[Ye("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&l.push(Ye("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(u=>u.confidential===!0);l.push(Ye("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(Ye("response-truncated","provider evidence exceeded the safe record bound"));let p=In(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),f=new Set;return c.forEach(h=>{let u=wn(e.family,e.chain,h),m=zt("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:u.facts});if(f.has(m))throw new Error(`${t.source} returned duplicate evidence identity`);f.add(m),p.evidence.push({id:m,status:"OBSERVED",source:t.source,observedAt:s,locator:{address:e.address},publicFacts:u.facts,projection:u.projection})}),p}async function ts(e={},t={}){yc(t);let n=Jo(e),{family:r,chain:o,address:s,limits:i,cursor:a,capability:c}=n,d={family:r,chain:o,address:s},l=bc(t);if(c.status==="UNAVAILABLE"||c===it.unsupported)return yn(d,c,l);if(!c.chainIds.some(g=>String(g)===String(o)))return yn(d,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},l);if(r==="evm"&&!wo(o))return yn(d,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},l);let p=Nc(r),f=_c(r,c,t,p);if(typeof f!="function")return yn(d,{...c,reason:"collector transport is unavailable"},l);let h=a?.payload??null,u=Object.assign(Object.create(null),{address:s,chainId:o,limit:i.applied,cursor:h});r==="solana"&&(u.before=h),r==="tron"&&(u.contract="all",u.onlyConfirmed=!0),r==="ton"&&h&&(u.lt=h.lt,u.hash=h.hash);let m;try{m=await f(u)}catch(g){return pr(d,c,i,bn(g),l,a)}if(U(m,"error")){let g=Qr(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 pr(d,c,i,bn(y,E),l,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=Mc(r,m);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return Fc(d,c,i,m,y,l,p)}let g=kc(r,m);if(!Array.isArray(g))throw new Error("invalid history response");return $c(d,c,i,m,g,l,a,p)}catch{return pr(d,c,i,bn(null,"provider-invalid-response"),l,a)}}var Vc=Object.freeze(Object.create(null));async function ns(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return ts(e,Vc)}import{createHash as zc}from"node:crypto";import{types as Oe}from"node:util";var Bc="oracle.coordination/1",vf=Ge({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),xf=Ge({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),Hc=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}),Le=Object.freeze({maxEntities:ke.maxNodes,maxEvents:ke.maxEdges,maxEvidence:ae.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),Ht=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),qt=new Set(["FUND","FUNDING"]),us=new Set([...Ht,...qt,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),qc=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),Gc=new Set(["CREATOR","DEPLOYER"]),rs=new Set(Ft),os=new Set(["LIVE","INDEXED"]);var ss=250,Wc=32,Jc=32,re=(e,t)=>e<t?-1:e>t?1:0,oe=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},Ie=e=>(oe(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",pe=e=>oe(typeof e=="object"&&e!==null?O(e,"id"):e),le=e=>[...new Set(e.filter(Boolean))].sort(re),Yc=(e,t)=>re(e.id,t.id),Me=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},Kc=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,Nr=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=oe(e);if(!t)return null;let n=Kc.exec(t);if(!n)return null;let[,r,o,s,i,a,c,d="",l]=n,[p,f,h,u,m,g]=[r,o,s,i,a,c].map(Number);if(f<1||f>12||h<1||u>23||m>59||g>59)return null;if(l!=="Z"){let[x,R]=l.slice(1).split(":").map(Number);if(x>23||R>59)return null}let y=Number(d.padEnd(3,"0")),E=new Date(0);if(E.setUTCFullYear(p,f-1,h),E.setUTCHours(u,m,g,y),E.getUTCFullYear()!==p||E.getUTCMonth()!==f-1||E.getUTCDate()!==h||E.getUTCHours()!==u||E.getUTCMinutes()!==m||E.getUTCSeconds()!==g)return null;let S=Date.parse(t);return Number.isFinite(S)?S:null},fs=e=>Array.isArray(e)?e:[],O=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&Oe.isProxy(e)||!Object.hasOwn(Object(e),t))return;let n=Object.getOwnPropertyDescriptor(Object(e),t);return n&&Object.hasOwn(n,"value")?n.value:void 0},q=(e,t=64)=>{if(at(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},at=(e,t=64)=>{if(e==null)return!1;if(Oe.isProxy(e)||!Array.isArray(e)||Object.getPrototypeOf(e)!==Array.prototype||e.length>t||Object.getOwnPropertySymbols(e).length>0)return!0;let n=new Set(["length"]);for(let r=0;r<e.length;r+=1)n.add(String(r));for(let r of Object.getOwnPropertyNames(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(!(r==="toJSON"&&o&&Object.hasOwn(o,"value")&&o.value===void 0&&o.enumerable===!1)&&!n.has(r))return!0}for(let r=0;r<e.length;r+=1){let o=Object.getOwnPropertyDescriptor(e,String(r));if(!o||!o.enumerable||!Object.hasOwn(o,"value"))return!0}return!1},Ze=(e,t={})=>Object.assign(Object.create(null),e,t),Nn=(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},Er=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),Zc=Object.freeze(["id","status"]),Or=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"]),Xc=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),Qc=Object.freeze(["numerator","denominator","bps"]),el=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),tl=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);function ps(e){return le([Ie(O(e,"kind")),...q(O(e,"roles")).map(Ie),...q(O(e,"tags")).map(t=>Ie(!t||typeof t!="object"?t:O(t,"name")??O(t,"value")))])}function _r(e){return e?O(e,"isService")===!0?!0:ps(e).some(t=>qc.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function ms(e){return Gc.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function Sn(e){return ps(e).some(ms)}function nl(e){if(!Sn(e)||_r(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(O(e,r)!==void 0)return!1;let t=q(O(e,"roles")).map(Ie),n=q(O(e,"tags")).map(r=>Ie(r&&typeof r=="object"?O(r,"name")??O(r,"value"):r));return[...t,...n].every(ms)}function Se(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[s,i=""]=e.split(".");return{raw:`${s}${i}`.replace(/^0+(?=\d)/u,""),decimals:i.length}}if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return null;let t=s=>{if(!Object.hasOwn(e,s))return{present:!1,value:void 0};let i=Object.getOwnPropertyDescriptor(e,s);return!i||!Object.hasOwn(i,"value")?{present:!0,invalid:!0}:{present:!0,value:i.value}},n=t("decimals");if(n.invalid||n.present&&n.value!=null&&(!Number.isInteger(n.value)||n.value<0||n.value>255))return null;let r=n.value==null?0:n.value,o=[];for(let s of["raw","atoms","baseUnits"]){let i=t(s);if(i.invalid)return null;if(!(!i.present||i.value==null)){if(typeof i.value!="string"||!/^\d+$/u.test(i.value)||i.value.length>512)return null;o.push(i.value.replace(/^0+(?=\d)/u,""))}}for(let s of["value","decimal","amount"]){let i=t(s);if(i.invalid)return null;if(!i.present||i.value==null)continue;if(typeof i.value!="string"||!/^\d+(?:\.\d+)?$/u.test(i.value)||i.value.length>512)return null;let[a,c=""]=i.value.split(".");if(c.length>r)return null;o.push(`${a}${c.padEnd(r,"0")}`.replace(/^0+(?=\d)/u,""))}return o.length===0||new Set(o).size!==1?null:{raw:o[0],decimals:r}}function xt(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function hs(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=xt(e,n),o=xt(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function rl(e,t){let n=hs(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function ol(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(s=>s.balance.decimals)),r=xt(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let s of t){let i=xt(s.balance,n);if(i===null||i<0n||i>r||(o+=i,o>r))return!1}return!0}function gs(e){if(e&&typeof e=="object"){if(Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Qc)||Object.keys(e).some(h=>!["numerator","denominator","bps"].includes(h)))return null;let a=O(e,"numerator"),c=O(e,"denominator"),d=O(e,"bps"),l=a!=null||c!=null,p=null;if(l&&(a==null||c==null||(p=hs(Se(a),Se(c)),!p)))return null;let f=null;if(d!=null){if(!Number.isInteger(d)||d<0||d>1e4)return null;f={numerator:BigInt(d),denominator:10000n}}return!p&&!f||p&&f&&Number(p.numerator*10000n/p.denominator)!==d?null:p??f}let t=oe(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),s=BigInt(`${n}${r}`),i=s<=o?o:o*100n;return s<=i?{numerator:s,denominator:i}:null}function sl(e){if(!Array.isArray(e)||e.length>ke.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 il(e){let t=gs(e);return t?Number(t.numerator*10000n/t.denominator):null}var vt=Symbol("alias-conflict");function Te(e,t,n){let r=null,o=null;for(let s of t){if(!Object.hasOwn(e,s))continue;let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!Object.hasOwn(i,"value"))return vt;let a=i.value;if(a==null)continue;let c=n(a);if(c==null)return vt;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 vt;r=l,o=d}return r}function Tr(e,t=64){if(e===void 0)return[];if(at(e,t))return null;let n=q(e,t).map(pe);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(re)}function ys(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 Sr(e,t){return Te(e,t,n=>{let r=Se(n);return r?{identity:ys(r),value:n}:null})}function wr(e,t){return Te(e,t,n=>{let r;if(Number.isSafeInteger(n)&&n>=0)r=String(n);else if(typeof n=="string"&&/^\d{1,40}$/u.test(n.trim()))r=n.trim().replace(/^0+(?=\d)/u,"");else return null;return{identity:r,value:r}})}function Lt(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")||!Rt(a.value,s,0))return!1}return!0}function Rt(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>ae.dataNodes||n>ae.dataDepth)return!1;if(e==null||typeof e=="boolean")return!0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="string")return e.length<=ae.string;if(!e||typeof e!="object"||Oe.isProxy(e)||r.active.has(e))return!1;r.active.add(e);try{if(Array.isArray(e)){if(Object.getPrototypeOf(e)!==Array.prototype||e.length>ae.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let d=0;d<e.length;d+=1)c.add(String(d));for(let d of a){let l=Object.getOwnPropertyDescriptor(e,d);if(!(d==="toJSON"&&l&&Object.hasOwn(l,"value")&&l.value===void 0&&l.enumerable===!1)&&(typeof d!="string"||!c.has(d)))return!1}if(r.fields+=e.length,r.fields>ae.dataTotalFields)return!1;for(let d=0;d<e.length;d+=1){let l=Object.getOwnPropertyDescriptor(e,String(d));if(!l||!l.enumerable||!Object.hasOwn(l,"value")||!Rt(l.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let s=Reflect.ownKeys(e),i=[];for(let a of s){let c=Object.getOwnPropertyDescriptor(e,a);if(!(a==="toJSON"&&c&&Object.hasOwn(c,"value")&&c.value===void 0&&c.enumerable===!1)){if(typeof a!="string"||!c||!c.enumerable||!Object.hasOwn(c,"value"))return!1;i.push([a,c.value])}}return i.length>ae.dataFields||(r.fields+=i.length,r.fields>ae.dataTotalFields)?!1:i.every(([,a])=>Rt(a,r,n+1))}finally{r.active.delete(e)}}function bs(e,t){let n=O(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||Oe.isProxy(n)||Array.isArray(n)||!Rt(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>ae.dataFields)return null;let o=Nn(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 al(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Xc))return null;let t=Te(e,["entityId","entity","holder"],pe),n=Sr(e,["balance","amount"]),r=Tr(O(e,"evidenceRefs"));return!t||t===vt||n===vt||n===null||r===null?null:Ze({},{entityId:t,balance:n,evidenceRefs:r})}function cl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Er))return null;let t=bs(e,Er);if(!t||Object.hasOwn(t,"isService")&&typeof O(t,"isService")!="boolean")return null;let n=pe(O(t,"id"));if(!n)return null;for(let d of["firstSeenAt","createdAt"]){let l=O(t,d);if(l!=null&&Nr(l)===null)return null}let r=O(t,"roles"),o=O(t,"tags"),s=O(t,"evidenceRefs");if([r,o,s].some(d=>at(d)))return null;let i=O(t,"supplyShare");if(i!==void 0&&il(i)===null)return null;let a=Nn(t,Er);a.roles=q(r),a.tags=q(o);let c=Tr(s);return c===null?null:(a.evidenceRefs=c,Ze(a,{id:n}))}function ll(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,el))return null;let t=pe(O(e,"id"));if(!t)return null;let n=O(e,"status"),r=typeof n=="string"?n:"MISSING";return Ze(Nn(e,Zc),{id:t,status:r})}function dl(e){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e)||!Lt(e,Or))return null;let t=bs(e,Or);if(!t)return null;let n=pe(O(t,"id"));if(!n||at(O(t,"holders"))||at(O(t,"evidenceRefs")))return null;let r=Te(t,["from","fromEntityId","funderId"],pe),o=Te(t,["to","toEntityId","recipientId"],pe),s=Te(t,["actor","actorEntityId","buyerId"],pe),i=Te(t,["asset","assetId","tokenId"],pe),a=Te(t,["pool","poolId"],pe),c=Te(t,["sourceChain","fromChain"],oe),d=Te(t,["destinationChain","toChain"],oe),l=Te(t,["transactionId","transactionHash","txId","txid","hash"],pe),p=Te(t,["bridgeTransferId"],pe),f=wr(t,["blockHeight","blockNumber"]),h=wr(t,["transactionIndex"]),u=wr(t,["eventIndex","logIndex","index"]),m=Sr(t,["amount","value","quantity"]),g=Sr(t,["totalSupply","supply"]);if([r,o,s,i,a,c,d,l,p,f,h,u,m,g].includes(vt))return null;let y=Tr(O(t,"evidenceRefs"));if(y===null)return null;let E=O(t,"timestamp"),S=Nr(E);if(E!=null&&S===null)return null;let R=q(O(t,"holders")).map(al);if(R.some(_=>_===null))return null;let j=R.map(_=>_.entityId);if(new Set(j).size!==j.length)return null;let T=Nn(t,Or);return T.holders=R,Ze(T,{id:n,type:Ie(O(t,"type")),from:r,to:o,actor:s,asset:i,pool:a,sourceChain:c,destinationChain:d,bridgeTransferId:p,transactionId:l,blockPosition:f,transactionPosition:h,eventPosition:u,amount:m,totalSupply:g,timestampMs:S,evidenceRefs:y})}function Ar(e,t,n,r,o,s){if(Oe.isProxy(e))return s(r,"A proxy record array was refused."),{records:[],overflow:!1,malformed:!0};if(!Array.isArray(e))return{records:[],overflow:!1,malformed:!1};if(e.length>n)return s(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(at(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(Yc),a>0&&s(r,`${a} malformed record(s) were ignored.`),{records:i,overflow:!1,malformed:a>0}}function Bt(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function ul(e){let t=oe(O(e,"family")),n=oe(O(e,"address")),r=O(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):oe(r);if(!t||!o||!n)return null;let s=t.toLowerCase(),i=["evm","ethereum","eth","eip155"].includes(s)?"eip155":s,a=n;["eip155","hyperliquid"].includes(i)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(i==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(i)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),i==="ton"&&(a=Xn(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 fl(e){let t=new Map;for(let n of e){let r=ul(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function is(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function Ir(e){let t=Se(e);return t?ys(t):"-"}function pl(e){let t=q(O(e,"holders")).map(n=>`${is(O(n,"entityId"))}:${Ir(O(n,"balance"))}`).sort().join(";");return[e.type,e.from,e.to,e.actor,e.asset,e.pool,e.sourceChain,e.destinationChain,e.bridgeTransferId,e.timestampMs,Ir(O(e,"amount")),Ir(O(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(is).join("|")}function ml(e){let t=new Set;for(let n of e){let r=pl(n);if(t.has(r))return!0;t.add(r)}return!1}function Xe(e,t,n,r,o,s,i=[]){let a=zc("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:s.fact,coordinationConfidence:s.coordination,entities:le(n),reasons:o,caveats:le(i),evidenceRefs:le(r),score:Hc[e]}}function hl(e,t,n){let r=[...e].sort((l,p)=>l.timestampMs-p.timestampMs||re(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 f=(s.get(p)??0)-1;f<=0?s.delete(p):s.set(p,f)};for(;i<r.length;){for(;a<r.length&&r[a].timestampMs-r[i].timestampMs<=t;)c(r[a]),a+=1;s.size>=n?(o.push(r.slice(i,a)),i=a,s.clear()):(d(r[i]),i+=1,a<i&&(a=i))}return o}function H(e,t){let n=q(O(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function as(e,t){let n=q(O(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function ne(e,t){return typeof e=="string"&&t.has(e)}function cs(e){let t=O(e,"type");if(!us.has(t))return!1;let n=O(e,"from"),r=O(e,"to"),o=O(e,"actor")??n,s=O(e,"asset"),i=O(e,"timestampMs");if(qt.has(t))return!!(n&&r);if(Ht.has(t))return!!(o&&s&&(t==="BUY"||i!==null));if(t==="BRIDGE")return!!(oe(O(e,"sourceChain"))&&oe(O(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=q(O(e,"holders")).some(c=>pe(O(c,"entityId"))&&Se(O(c,"balance")));return!!(s&&Se(O(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&s&&i!==null&&Se(O(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function Gt(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 gl(e,t,n,r,o){let s=e.filter(d=>qt.has(d.type)&&ne(d.from,t)&&ne(d.to,t)&&H(d,n).length),i=Gt(s,d=>d.from),a=[],c=new Set;for(let[d,l]of[...i].sort(([p],[f])=>re(p,f))){let p=t.get(d);if(_r(p))continue;let f=le(l.map(g=>g.to).filter(g=>g!==d));if(f.length<r.minCommonRecipients)continue;let h=H(p,n);if(h.length===0){c.add(d);continue}let u=new Set(f),m=l.filter(g=>u.has(g.to));a.push(Xe("COMMON_NON_SERVICE_FUNDER",d,[d,...f],[...h,...m.flatMap(g=>H(g,n))],[{funder:d,funderEvidenceRefs:h,recipientCount:f.length,eventIds:le(m.map(g=>g.id))}],{fact:"HIGH",coordination:f.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 yl(e,t,n,r){let o=e.filter(a=>Ht.has(a.type)&&ne(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&H(a,n).length).map(a=>Ze(a,{actor:a.actor??a.from})),s=Gt(o,a=>`${a.type}\0${a.asset}`),i=[];for(let[a,c]of[...s].sort(([d],[l])=>re(d,l)))for(let d of hl(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let l=le(d.map(h=>h.actor)),[p,f]=a.split("\0");i.push(Xe("SYNCHRONIZED_ACTIVITY",`${p.toLowerCase()}:${f}:${d[0].id}`,l,d.flatMap(h=>H(h,n)),[{activityType:p,asset:f,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 bl(e,t,n){if(!e)return null;if(O(e,"fresh")===!0)return"fresh";let r=O(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=O(e,"firstSeenAt"),s=O(e,"createdAt"),i=o!=null?"firstSeenAt":"createdAt",a=Nr(i==="firstSeenAt"?o:s);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?i:null}function El(e,t,n,r,o){let s=e.filter(l=>Ht.has(l.type)&&ne(l.actor??l.from,t)&&l.asset&&l.timestampMs!==null&&H(l,n).length).map(l=>Ze(l,{actor:l.actor??l.from})),i=[],a=new Set;for(let l of s){let p=t.get(l.actor),f=bl(p,l.timestampMs,r);if(!f)continue;let h=H(p,n);if(h.length===0){a.add(l.actor);continue}i.push(Ze(l,{freshnessBasis:f,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=Gt(i,l=>l.asset),d=[];for(let[l,p]of[...c].sort(([f],[h])=>re(f,h))){let f=le(p.map(u=>u.actor));if(f.length<r.minClusterSize)continue;let h=f.map(u=>{let m=p.filter(g=>g.actor===u);return{entityId:u,bases:le(m.map(g=>g.freshnessBasis)),evidenceRefs:le(m.flatMap(g=>g.freshnessEvidenceRefs))}});d.push(Xe("FRESH_WALLET_CLUSTER",l,f,[...p.flatMap(u=>H(u,n)),...h.flatMap(u=>u.evidenceRefs)],[{asset:l,walletCount:f.length,eventIds:le(p.map(u=>u.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:h}],{fact:"HIGH",coordination:f.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return d}function Ol(e,t,n,r,o){let s=new Map,i=new Set,a=(u,m)=>{if(!(!ne(u,t)||m.length===0)){s.has(u)||s.set(u,new Set);for(let g of m)s.get(u).add(g)}};for(let u of t.values()){if(!Sn(u))continue;let m=H(u,n);m.length===0?i.add(u.id):a(u.id,m)}for(let u of e)u.type==="DEPLOY"&&a(u.from??u.actor,H(u,n));let c=[...i].filter(u=>!s.has(u));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(u=>qt.has(u.type)&&s.has(u.from)&&ne(u.to,t)&&H(u,n).length),l=Gt(d,u=>u.to),p=e.filter(u=>u.type==="BUY"&&ne(u.actor??u.from,t)&&u.asset&&H(u,n).length).map(u=>Ze(u,{actor:u.actor??u.from})),f=new Map;for(let u of p){let m=le(fs(l.get(u.actor)).map(g=>g.from));if(m.length>Jc)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${u.asset}`;f.has(y)||f.set(y,[]),f.get(y).push(u)}}let h=[];for(let[u,m]of[...f].sort(([g],[y])=>re(g,y))){let g=le(m.map(j=>j.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,E]=u.split("\0"),S=new Set(g),x=d.filter(j=>j.from===y&&S.has(j.to)),R=le([...s.get(y)??[]]);h.push(Xe("DEPLOYER_LINKED_BUYERS",`${y}:${E}`,[y,...g],[...R,...x.flatMap(j=>H(j,n)),...m.flatMap(j=>H(j,n))],[{deployer:y,asset:E,buyerCount:g.length,deployerEvidenceRefs:R,fundingEventIds:le(x.map(j=>j.id)),buyEventIds:le(m.map(j=>j.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return h}function wl(e,t,n,r,o,s){let i=[],a=e.filter(p=>p.type==="SUPPLY_SNAPSHOT"&&p.asset&&H(p,r).length),c=0;for(let p of a){let f=Se(O(p,"totalSupply")??O(p,"supply")),h=q(O(p,"holders")),u=h.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||at(O(y,"evidenceRefs")))return null;let E=q(O(y,"evidenceRefs")).map(pe);return E.length===0||E.some(S=>!r.has(S))?null:{entityId:pe(O(y,"entityId")),balance:Se(O(y,"balance")),evidenceRefs:le(E)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(u.length!==h.length||!ol(f,u)){c+=1;continue}let g=u.map(y=>({...y,shareBps:rl(y.balance,f)})).filter(y=>y.shareBps!==null).sort((y,E)=>E.shareBps-y.shareBps||re(y.entityId,E.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||i.push(Xe("SUPPLY_CONCENTRATION",`${p.asset}:${p.id}`,[g.entityId],[...H(p,r),...g.evidenceRefs],[{asset:p.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:f,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 f=gs(p.supplyShare);return f?{entity:p,fraction:f,shareBps:Number(f.numerator*10000n/f.denominator)}:null}).filter(Boolean).sort((p,f)=>f.shareBps-p.shareBps||re(p.entity.id,f.entity.id));if(!sl(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=q(O(l.entity,"evidenceRefs")).map(pe),f=p.length>0&&p.every(h=>r.has(h))?le(p):[];f.length&&i.push(Xe("SUPPLY_CONCENTRATION",l.entity.id,[l.entity.id],f,[{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 Al(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Xe("LP_REMOVAL",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function Il(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 Sl(e,t,n,r,o){let s=e.filter(f=>f.type==="TRANSFER"&&ne(f.from,t)&&ne(f.to,t)&&f.from!==f.to&&oe(f.asset)&&f.timestampMs!==null&&Se(f.amount)&&H(f,n).length).map(f=>Ze(f,{parsedAmount:Se(f.amount)})).sort((f,h)=>f.timestampMs-h.timestampMs||re(f.id,h.id)),i=Gt(s,f=>`${f.from}\0${f.asset}`),a=[],c=new Set,d=!1;function l(f,h,u,m){let g=fs(i.get(`${f.to}\0${f.asset}`)),y=Il(g,f.timestampMs),E=[],S=0,x=y;for(;x<g.length&&S<Wc;x+=1){let R=g[x];if(R.timestampMs-h.timestampMs>r.peelWindowSeconds*1e3)break;if(S+=1,c.has(R.id)||u.has(R.id)||m.has(R.to)||R.from!==f.to||R.asset!==f.asset)continue;let j=Math.max(f.parsedAmount.decimals,R.parsedAmount.decimals),T=xt(f.parsedAmount,j),_=xt(R.parsedAmount,j);T!==null&&_!==null&&_>0n&&_<T&&E.push(R)}return x<g.length&&g[x].timestampMs-h.timestampMs<=r.peelWindowSeconds*1e3&&(d=!0),E}function p(f){if(f.length>=3)return f;let h=new Set(f.map(m=>m.id)),u=new Set([f[0].from,...f.map(m=>m.to)]);for(let m of l(f[f.length-1],f[0],h,u)){let g=p([...f,m]);if(g)return g}return null}for(let f of s){if(c.has(f.id))continue;let h=p([f]);if(!h)continue;let u=[...h];for(;u.length<r.maxPeelDepth;){let m=new Set(u.map(E=>E.id)),g=new Set([u[0].from,...u.map(E=>E.to)]),[y]=l(u[u.length-1],u[0],m,g);if(!y)break;u.push(y)}u.forEach(m=>c.add(m.id)),a.push(u)}return d&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(f=>Xe("PEEL_CHAIN",f[0].id,[f[0].from,...f.map(h=>h.to)],f.flatMap(h=>H(h,n)),[{hopCount:f.length,asset:f[0].asset,eventIds:f.map(h=>h.id),amounts:f.map(h=>h.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function Nl(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&oe(r.sourceChain)&&oe(r.destinationChain)&&H(r,n).length).filter(r=>ne(r.actor??r.from??r.to,t)).map(r=>Xe("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],H(r,n),[{eventId:r.id,sourceChain:oe(r.sourceChain),destinationChain:oe(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:Se(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function _l(e){let t=Object.create(null);for(let n of e)t[n.kind]=(t[n.kind]??0)+1;return Object.fromEntries(Object.entries(t).sort(([n],[r])=>re(n,r)))}function ls(e,t){return q(O(e,"holders")).some(n=>!ne(O(n,"entityId"),t))?!1:qt.has(e.type)||e.type==="TRANSFER"?ne(e.from,t)&&ne(e.to,t):Ht.has(e.type)?ne(e.actor??e.from,t):e.type==="DEPLOY"?ne(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?ne(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?q(O(e,"holders")).every(n=>ne(O(n,"entityId"),t)):!0}function Tl(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||Oe.isProxy(e)){t("MALFORMED_COVERAGE","Coverage must contain own data fields.",{fatal:!0});return}let n=[],r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0){t("MALFORMED_COVERAGE","Coverage must contain ordinary own data without symbol fields.",{fatal:!0});return}let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0&&i.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([s,i.value])}for(let[s,i]of n.sort(([a],[c])=>re(a,c))){let a=i;if(i&&typeof i=="object"&&!Rt(i)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(i&&typeof i=="object"&&!Array.isArray(i)){let l=Object.getOwnPropertyDescriptor(i,"status");if(l&&!Object.hasOwn(l,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=l?l.value:void 0}if(typeof a!="string")continue;let c=Ie(a),d=Ie(s);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${d}_COVERAGE_${c}`,`${s} coverage is ${c}.`):c==="PARTIAL"&&t(`${d}_COVERAGE_PARTIAL`,`${s} coverage is PARTIAL.`)}}var vl=Object.freeze(Object.keys(Le)),xl=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"]);function ds(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||Oe.isProxy(e)||Array.isArray(e))return!1;let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null||Object.getOwnPropertySymbols(e).length>0)return!1;let o=Object.getOwnPropertyNames(e).filter(s=>{let i=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&i&&Object.hasOwn(i,"value")&&i.value===void 0)});if(o.length>t.length||o.some(s=>!t.includes(s)))return!1;for(let s of o){let i=Object.getOwnPropertyDescriptor(e,s);if(!i||!i.enumerable||!Object.hasOwn(i,"value")||n&&(typeof i.value!="number"||!Number.isFinite(i.value)))return!1}return!0}function Es(e,t={}){let n=ds(t,vl,{numeric:!0}),r=n?t:{},o={maxEntities:Me(O(r,"maxEntities"),Le.maxEntities,1,ke.maxNodes),maxEvents:Me(O(r,"maxEvents"),Le.maxEvents,1,ke.maxEdges),maxEvidence:Me(O(r,"maxEvidence"),Le.maxEvidence,1,ae.evidence),minClusterSize:Me(O(r,"minClusterSize"),Le.minClusterSize,2,10),minCommonRecipients:Me(O(r,"minCommonRecipients"),Le.minCommonRecipients,2,10),syncWindowSeconds:Me(O(r,"syncWindowSeconds"),Le.syncWindowSeconds,1,3600),freshWalletSeconds:Me(O(r,"freshWalletSeconds"),Le.freshWalletSeconds,60,2592e3),peelWindowSeconds:Me(O(r,"peelWindowSeconds"),Le.peelWindowSeconds,60,604800),maxPeelDepth:Me(O(r,"maxPeelDepth"),Le.maxPeelDepth,3,8),concentrationThresholdBps:Me(O(r,"concentrationThresholdBps"),Le.concentrationThresholdBps,1,1e4)},s=new Map,i=!1,a=(w,N,{fatal:L=!1}={})=>{L&&(i=!0);let P=Ie(w||"UNSPECIFIED_GAP"),Fe=oe(N)??"Input is incomplete.",he=s.get(P);if(he){re(Fe,he.message)<0&&s.set(P,{code:P,status:"UNKNOWN",message:Fe});return}if(s.size>=ss-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 ${ss}.`});return}s.set(P,{code:P,status:"UNKNOWN",message:Fe})},c=({entities:w=[],events:N=[],evidenceById:L=new Map,eventWithEvidence:P=[],analyzableEvents:Fe=[],findings:he=[]}={})=>{let ye=i?[]:he;ye.length>ae.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${ae.findings}.`,{fatal:!0}),ye=[]);let Ne=[...s.values()].sort((te,V)=>re(te.code,V.code)),bt=i||Ne.some(te=>te.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(te.code))?"UNKNOWN":Ne.length?"PARTIAL":"OK",A=Math.min(100,ye.reduce((te,V)=>te+V.score,0)),C=A>=60?"HIGH":A>=25?"MEDIUM":bt==="OK"?"LOW":"UNKNOWN";return Ge({schemaVersion:Bc,execution:"read-only",reportOnly:!0,status:bt,risk:{score:A,level:C},metrics:{entityCount:w.length,eventCount:N.length,evidenceCount:L.size,evidencedEventCount:P.length,eligibleEventCount:Fe.length,findingCounts:_l(ye),bounds:o},findings:ye,gaps:Ne})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!ds(e,xl))return a("INVALID_INPUT","Expected a bounded own-data coordination envelope.",{fatal:!0}),c();if(!e||typeof e!="object"||Array.isArray(e))return a("INVALID_INPUT","Expected an object containing normalized entities, events, and evidence.",{fatal:!0}),c();for(let w of["subject","chain"]){let N=O(e,w);if(N!==void 0&&!Rt(N))return a("INVALID_INPUT",`${w} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let d=Ar(O(e,"entities"),cl,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),l=Ar(O(e,"events"),dl,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),p=Ar(O(e,"evidence"),ll,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),f=d.records,h=l.records,u=p.records;(d.overflow||l.overflow||p.overflow||d.malformed||l.malformed||p.malformed)&&(i=!0),Array.isArray(O(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(O(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(O(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),Bt(f)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),Bt(h)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),Bt(u)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),ml(h)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),fl(f)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let m=Bt(f)?new Map:new Map(f.map(w=>[w.id,w])),g=u.filter(w=>!rs.has(w.status)),y=u.filter(w=>rs.has(w.status)&&!os.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=Bt(u)?new Map:new Map(u.filter(w=>os.has(w.status)).map(w=>[w.id,w]));E.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let S=f.filter(w=>{let N=q(O(w,"evidenceRefs"));return N.length>0&&N.some(L=>!E.has(L))});S.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${S.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let x=new Set(h.filter(w=>w.type==="DEPLOY"&&ne(w.from??w.actor,m)&&H(w,E).length>0).map(w=>w.from??w.actor)),R=f.filter(w=>{let N=q(O(w,"roles")).length>0||q(O(w,"tags")).length>0||_r(w)||Sn(w)||O(w,"isService")!==void 0||O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0||O(w,"supplyShare")!==void 0,L=as(w,E)||nl(w)&&x.has(w.id);return N&&!L}),j=R.filter(w=>O(w,"fresh")!==void 0||O(w,"txCount")!==void 0||O(w,"firstSeenAt")!==void 0||O(w,"createdAt")!==void 0);j.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${j.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let T=f.filter(w=>Sn(w)&&!as(w,E)&&!x.has(w.id));T.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${T.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),R.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${R.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let _=h.filter(w=>q(O(w,"holders")).some(N=>{let L=q(O(N,"evidenceRefs"));return L.length===0||L.some(P=>!E.has(P))}));_.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${_.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),Tl(O(e,"coverage"),a);let D=O(e,"gaps");if(at(D,ae.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${ae.gaps}.`,{fatal:!0});else{let w=[];for(let N of q(D,ae.gaps)){if(!N||typeof N!="object"||Oe.isProxy(N)||Array.isArray(N)||!Lt(N,tl)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let L=O(N,"code"),P=O(N,"message");if(L!==void 0&&oe(L)===null||P!==void 0&&oe(P)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}w.push({code:L??"UPSTREAM_GAP",message:P??"An upstream normalization gap was reported."})}w.sort((N,L)=>re(Ie(N.code),Ie(L.code))||re(N.message,L.message));for(let N of w)a(N.code,N.message)}let ee=h.filter(w=>H(w,E).length>0),v=h.filter(w=>H(w,E).length===0);v.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${v.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let W=ee.filter(w=>!us.has(w.type)||!cs(w));W.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${W.length} evidence-backed event(s) lacked complete analyzable semantics.`);let Ce=ee.filter(cs),ie=Ce.filter(w=>!ls(w,m));ie.length&&a("EVENT_ENTITY_UNRESOLVED",`${ie.length} event(s) contained unresolved entity references.`,{fatal:!0});let ue=Ce.filter(w=>ls(w,m));ue.length===0&&a("NO_ANALYZABLE_EVENTS","No fully referenced evidence-backed event had semantics supported by coordination analysis; no low-risk conclusion was produced.");let F=[];return i||(F=[...gl(ue,m,E,o,a),...Ol(ue,m,E,o,a),...El(ue,m,E,o,a),...wl(ue,f,m,E,o,a),...yl(ue,m,E,o),...Al(ue,m,E),...Sl(ue,m,E,o,a),...Nl(ue,m,E)].filter(w=>w.evidenceRefs.length>0).sort((w,N)=>re(w.kind,N.kind)||re(w.id,N.id)),new Set(F.map(w=>w.id)).size!==F.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),F=[])),c({entities:f,events:h,evidenceById:E,eventWithEvidence:ee,analyzableEvents:ue,findings:F})}import{types as yt}from"node:util";import{types as Ns}from"node:util";var vn="oracle.opensea-wallet-enrichment/1",Rl="oracle.nft-overlap-input/1",Ll="oracle.nft-overlap/1",Qe="REQUEST_PATH_PLUS_MATCHED_PROFILE",Pl=de(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),jf=de(["COMPLETE","PARTIAL","UNKNOWN"]),xr="OBSERVED",Os="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",_n="UNKNOWN",X=de({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),Ct=de({1:"ethereum",10:"optimism",130:"unichain",137:"polygon",143:"monad",360:"shape",988:"stablechain",999:"hyperevm",1329:"sei",1868:"soneium",2020:"ronin",2741:"abstract",4326:"megaeth",4663:"robinhood",5031:"somnia",8333:"b3",8453:"base",33139:"ape_chain",42161:"arbitrum",43114:"avalanche",43419:"gunzilla",57073:"ink",69e3:"animechain",80094:"bera_chain",81457:"blast",7777777:"zora"}),Pt=de(["OpenSea profile and inventory records are marketplace-indexed observations, not on-chain ownership proof.","No identity, common-control, intent, or wallet-owner inference is made.","Inventory is limited to one unpaginated page of at most 20 holdings."]),Cl=de(["Overlap is limited to exact canonical NFT identities and exact chain-bound OpenSea collection slugs in the supplied snapshots.","An exact OpenSea collection slug overlap is a marketplace-index observation, not an on-chain or common-control claim.","No identity, ownership, common-control, intent, risk, or wrongdoing conclusion is made."]),ct=de({NOT_REQUESTED:"OpenSea enrichment was not requested.",UNSUPPORTED_CHAIN_FAMILY:"OpenSea enrichment is unavailable for this chain family.",UNSUPPORTED_CHAIN:"OpenSea enrichment is unavailable for this fixed chain mapping.",INVALID_EVM_ADDRESS:"OpenSea enrichment requires a canonical EVM address.",API_KEY_UNAVAILABLE:"OpenSea enrichment is unavailable because its production API key is not configured.",PROFILE_AUTHENTICATION_FAILED:"The OpenSea profile request was not authenticated.",PROFILE_ACCESS_FORBIDDEN:"The OpenSea profile request was forbidden.",PROFILE_RATE_LIMITED:"The OpenSea profile request was rate limited.",PROFILE_UPSTREAM_UNAVAILABLE:"The OpenSea profile service was unavailable.",PROFILE_TIMEOUT:"The OpenSea profile request timed out.",PROFILE_REDIRECT_REFUSED:"The OpenSea profile response attempted a redirect and was refused.",PROFILE_RESPONSE_TOO_LARGE:"The OpenSea profile response exceeded the fixed byte limit.",PROFILE_NOT_FOUND:"The OpenSea profile was not found.",PROFILE_MALFORMED:"The OpenSea profile response did not satisfy the bounded contract.",PROFILE_ADDRESS_MISMATCH:"The OpenSea profile did not match the requested canonical wallet.",PROFILE_TRANSPORT_FAILED:"The OpenSea profile request failed.",PROFILE_USERNAME_REJECTED:"Optional OpenSea username metadata was omitted because it did not satisfy the safe display contract.",INVENTORY_AUTHENTICATION_FAILED:"The OpenSea inventory request was not authenticated.",INVENTORY_ACCESS_FORBIDDEN:"The OpenSea inventory request was forbidden.",INVENTORY_RATE_LIMITED:"The OpenSea inventory request was rate limited.",INVENTORY_UPSTREAM_UNAVAILABLE:"The OpenSea inventory service was unavailable.",INVENTORY_TIMEOUT:"The OpenSea inventory request timed out.",INVENTORY_REDIRECT_REFUSED:"The OpenSea inventory response attempted a redirect and was refused.",INVENTORY_RESPONSE_TOO_LARGE:"The OpenSea inventory response exceeded the fixed byte limit.",INVENTORY_NOT_FOUND:"The OpenSea inventory was not found.",INVENTORY_MALFORMED:"The OpenSea inventory response did not satisfy the bounded contract.",INVENTORY_TRANSPORT_FAILED:"The OpenSea inventory request failed.",INVENTORY_CURSOR_PRESENT:"OpenSea reported another inventory page; no cursor was retained or followed.",INVENTORY_ROW_LIMIT:"OpenSea returned more than the fixed 20-row inventory bound.",INVENTORY_ROW_REJECTED:"At least one OpenSea inventory row did not satisfy the canonical holding contract.",INVENTORY_COLLECTION_REJECTED:"At least one canonical OpenSea holding lacked a valid bounded collection slug; exact NFT evidence was retained.",INVENTORY_DUPLICATE_HOLDING:"At least one duplicate OpenSea holding was collapsed.",INVENTORY_CONFLICTING_HOLDING:"At least one conflicting OpenSea collection association was excluded while exact-NFT evidence was retained."}),jl=de({CONFLICTING_DUPLICATE_SNAPSHOT:"Conflicting snapshots for the same chain and canonical wallet were excluded.",INPUT_COVERAGE_INCOMPLETE:"At least one included snapshot had incomplete relevant inventory coverage.",EXACT_NFT_COVERAGE_INCOMPLETE:"At least one included exact-NFT inventory was incomplete.",COLLECTION_COVERAGE_INCOMPLETE:"At least one included collection-slug inventory was incomplete.",PROFILE_METADATA_INCOMPLETE:"At least one matched profile omitted unsafe optional username metadata.",INELIGIBLE_HOLDING_EVIDENCE:"At least one holding lacked separate wallet-bound LIVE or INDEXED profile and holding evidence.",INSUFFICIENT_DISTINCT_WALLETS:"Fewer than two distinct canonical wallet IDs qualified for a negative overlap statement.",FINDINGS_TRUNCATED:"Deterministic finding limits omitted additional qualifying overlaps."}),_s=new Set(Pl),kl=new Set(Ft),Rr=new Set(["LIVE","INDEXED"]),se=(e,t)=>e<t?-1:e>t?1:0,Dl=/^0x[0-9a-fA-F]{40}$/u,$l=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,Ml=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,Ul=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,Ts=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,vs=/[\u0000-\u001f\u007f-\u009f]/u,Fl=(1n<<256n)-1n;function b(e,t="invalid-nft-overlap"){throw new $t(`nft-overlap: ${e}`,t)}function xs(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function Rs(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 G(){return Rs([])}function $(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function de(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&Rs(e);let n;try{n=Reflect.ownKeys(e)}catch{b("normalized output could not be frozen safely","invalid-object")}for(let r of n){if(r==="toJSON")continue;let o;try{o=Object.getOwnPropertyDescriptor(e,r)}catch{b("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&de(o.value,t)}return Object.freeze(e),e}function Q(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||Ns.isProxy(e))&&b(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{b(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&b(`${n} must be a plain object`,"invalid-object");let s=new Set(t),i=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{b(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&xs(c)||((typeof a!="string"||!s.has(a))&&b(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&b(`${n}.${a} must be an own data field`,"invalid-object"),i.set(a,c.value))}return Object.freeze({has:a=>i.has(a),get:a=>i.get(a)})}function ve(e,t,n,r=0){(!Array.isArray(e)||Ns.isProxy(e))&&b(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{b(`${t} could not be inspected safely`,"invalid-array")}let s=o?.value;(!Number.isInteger(s)||s<r||s>n)&&b(`${t} must contain from ${r} through ${n} items`,"array-limit");let i;try{i=Reflect.ownKeys(e)}catch{b(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let d=0;d<s;d+=1)a.add(String(d));let c=G();for(let d of i){let l;try{l=Object.getOwnPropertyDescriptor(e,d)}catch{b(`${t} could not be inspected safely`,"invalid-array")}d==="toJSON"&&xs(l)||(typeof d!="string"||!a.has(d))&&b(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let d=0;d<s;d+=1){let l;try{l=Object.getOwnPropertyDescriptor(e,String(d))}catch{b(`${t}[${d}] could not be inspected safely`,"invalid-array")}(!l||!("value"in l))&&b(`${t} must be dense and contain only own data items`,"invalid-array"),$(c,l.value)}return c}function Vl(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||vs.test(e)||Ts.test(e))&&b(`${t} is not safe bounded text`,"invalid-string"),e}function ht(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&b(`${n} is not a deterministic ID`,"invalid-id"),e}function Ls(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&b(`${t} is not a canonical digest`,"invalid-digest"),e}function Lr(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&b(`${t} must be a positive safe integer`,"invalid-chain"),e}function gt(e){return(typeof e!="string"||!Dl.test(e))&&b("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function zl(e){(typeof e!="string"||e.length===0||e.length>78||!$l.test(e))&&b("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{b("tokenId must be uint256","invalid-token-id")}return(t<0n||t>Fl)&&b("tokenId must be uint256","invalid-token-id"),t.toString(10)}function Bl(e){return(typeof e!="string"||!Ml.test(e))&&b("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Pr(e={}){let t=Q(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||b("canonical NFT input is missing a field","missing-field");let n={chainId:Lr(t.get("chainId"),"nft.chainId"),contract:gt(t.get("contract")),tokenId:zl(t.get("tokenId"))};return de({id:ot("nft",n),...n})}function Cr(e={}){let t=Q(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||b("canonical collection input is missing a field","missing-field");let n={chainId:Lr(t.get("chainId"),"collection.chainId"),slug:Bl(t.get("slug"))};return de({id:ot("collection",n),...n})}function xn(e={}){let t=Q(e,["family","chainId","address"],"canonical wallet input"),n=t.has("family")?t.get("family"):"evm",r=t.has("chainId")?t.get("chainId"):null,o=t.has("address")?t.get("address"):null,s=Vl(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(s)||b("wallet.family is invalid","invalid-family");let i=r===null?null:Lr(r,"wallet.chainId");if(o===null)return de({id:null,family:s,chainId:i,address:null});s!=="evm"&&b("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=gt(o);return de({id:ot("wallet",{family:"evm",address:a}),family:"evm",chainId:i,address:a})}function jr(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!Ul.test(e)||vs.test(e)||Ts.test(e)||J(e)?null:e}function Hl(e,t="snapshot.wallet"){let n=Q(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||b(`${t} is missing a required field`,"missing-field");let r=xn({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&b(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function ws(e,t){let n=Q(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&b(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return _s.has(r)||b(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&b(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function ql(e){let t=Q(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||b("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");_s.has(n)||b("snapshot.coverage.status is invalid","invalid-status");let r=ws(t.get("profile"),"snapshot.coverage.profile"),o=ws(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&b("inventory cannot be called before profile","invalid-count");let s=(a,c,d,l,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)||b("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function Gl(e){let t=ve(e,"snapshot.gaps",Object.keys(ct).length),n=G();for(let s=0;s<t.length;s+=1){let i=Q(t[s],["code","message"],`snapshot.gaps[${s}]`);(!i.has("code")||!i.has("message"))&&b("snapshot gap is missing a field","missing-field");let a=i.get("code");(!Object.hasOwn(ct,a)||i.get("message")!==ct[a])&&b("snapshot gap is not a fixed allowlisted gap","invalid-gap"),$(n,a)}let r=G(),o=new Set;for(let s of n)o.has(s)||(o.add(s),$(r,s));return r.sort(se),r}function Wl(e){return Object.hasOwn(ct,e)||b("OpenSea gap code is invalid","invalid-gap"),de({code:e,message:ct[e]})}function Jl(e){let t=Q(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let i of["status","source","kind","walletId"])t.has(i)||b("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),s=t.get("walletId");if(kl.has(n)||b("OpenSea evidence status is invalid","invalid-status"),ht(s,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||b("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(i=>t.has(i))&&b("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&b("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:s,address:gt(t.get("address"))};if(o==="HOLDING"){t.has("address")&&b("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||b("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&b("holding evidence source is invalid","invalid-source");let i=ht(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:ht(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==Qe&&b("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:s,assetId:i,collectionId:a,ownerBinding:Qe}}b("OpenSea evidence kind is invalid","invalid-kind")}function Wt(e={}){let t=Jl(e);return de({id:ot("evidence",t),digest:rt(t),...t})}function Yl(e,t){let n=Q(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(i=>n.has(i))||b("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(i=>n.has(i)).map(i=>[i,n.get(i)])),s=Wt(o);return ht(n.get("id"),"evidence","evidence.id"),Ls(n.get("digest"),"evidence.digest"),(n.get("id")!==s.id||n.get("digest")!==s.digest)&&b("OpenSea evidence ID or digest does not match its content","digest-mismatch"),s}function Kl(e,t){if(e===null)return null;let n=Q(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&b("snapshot.profile is missing a required field","missing-field");let r=gt(n.get("address"));(!t.address||r!==t.address)&&b("profile address does not match snapshot wallet","profile-mismatch");let o=ht(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let s=jr(n.get("username"));return(s===null||s!==n.get("username"))&&b("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:s}}return{address:r,evidenceRef:o}}function Zl(e,t,n){let r=Q(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(d=>r.has(d))||b("snapshot holding is missing a required field","missing-field");let s=Pr({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==s.id&&b("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==s.chainId&&b("holding chain does not match snapshot wallet","chain-mismatch");let i=null;if(r.get("collection")!==null){let d=Q(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(l=>d.has(l))||b("holding collection is missing a required field","missing-field"),i=Cr({chainId:d.get("chainId"),slug:d.get("slug")}),(d.get("id")!==i.id||i.chainId!==s.chainId)&&b("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==Qe&&b("holding owner binding is invalid","invalid-owner-binding");let a=ve(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,X.citationsPerFinding,1).map(d=>ht(d,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(se);return c.length!==a.length&&b("holding evidence references must be unique","duplicate-reference"),{...s,collection:i,ownerBinding:Qe,evidenceRefs:c}}function Xl(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 Ql(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:s,evidence:i,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&b("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&b("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||s.length>0||i.length>0)&&b("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||s.length>0||i.length>0)&&(!n.chainId||!Object.hasOwn(Ct,n.chainId))&&b("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||s.length>0||i.length>0)&&b(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&b(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&b("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&b("inventory call requires a matched profile","invalid-profile"),s.length>0&&(o===null||r.inventory.calls!==1)&&b("holdings require a matched profile and inventory call","invalid-profile");let d=new Map;for(let y of i)d.has(y.id)&&b("snapshot evidence IDs must be unique","duplicate-evidence"),d.set(y.id,y),n.id&&y.walletId!==n.id&&b("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let y=d.get(o.evidenceRef);(!y||y.kind!=="PROFILE"||y.address!==o.address)&&b("profile citation does not reference its matched profile evidence","invalid-reference")}let l=new Set,p=0;for(let y of s){l.has(y.id)&&b("snapshot holdings must be unique","duplicate-holding"),l.add(y.id),y.collection===null&&(p+=1);for(let E of y.evidenceRefs)d.has(E)||b("holding cites unknown evidence","invalid-reference")}let f=new Set,h=G(),u=G();for(let y of a)f.add(y.code),y.code.startsWith("PROFILE_")&&$(h,y.code),y.code.startsWith("INVENTORY_")&&$(u,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||!f.has("NOT_REQUESTED"))&&b("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!m.has(a[0].code))&&b("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(f.has("NOT_REQUESTED")||[...m].some(y=>f.has(y)))&&b("attempted coverage cannot contain an availability reason","invalid-coverage"),p>0&&!f.has("INVENTORY_COLLECTION_REJECTED")&&!f.has("INVENTORY_CONFLICTING_HOLDING")&&b("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&b("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&b("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&h.length>0&&b("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(h.length!==1||h[0]!=="PROFILE_USERNAME_REJECTED")&&b("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(h.length===0||h.some(y=>y==="PROFILE_USERNAME_REJECTED"))&&b("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&h.length>0&&b("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let g=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&u.length>0&&b("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(u.length===0||u.some(y=>!g.has(y)))&&b("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(u.length===0||u.some(y=>g.has(y)))&&b("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&u.length>0&&b("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&s.length>0&&b("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&b("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&b("incomplete snapshot must contain a fixed gap","invalid-coverage")}function kr(e={}){let t=Q(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(E=>t.has(E))||b("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&b("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=Q(r,["id","family","chainId","address"],"snapshot.wallet"),s=o.has("id")?Hl(r,"snapshot.wallet"):xn(Object.fromEntries(["family","chainId","address"].filter(E=>o.has(E)).map(E=>[E,o.get(E)]))),i=ql(t.get("coverage")),c=ve(t.get("evidence"),"snapshot.evidence",X.evidencePerSnapshot).map((E,S)=>{try{let x=Q(E,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${S}]`);return x.has("id")||x.has("digest")?Yl(E,S):Wt(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(R=>x.has(R)).map(R=>[R,x.get(R)])))}catch(x){throw x}}).sort((E,S)=>se(E.id,S.id)),d=t.get("profile"),l=null;if(d!==null){let E=Q(d,["address","evidenceRef","username"],"snapshot.profile");l=Kl(Object.fromEntries(["address","evidenceRef","username"].filter(S=>E.has(S)).map(S=>[S,E.get(S)])),s)}let f=ve(t.get("holdings"),"snapshot.holdings",X.holdingsPerSnapshot).map((E,S)=>Zl(E,S,s)).sort((E,S)=>se(E.id,S.id)),h=ve(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(ct).length).map(E=>(Object.hasOwn(ct,E)||b("snapshot gap code is invalid","invalid-gap"),E)),u=[...new Set(h)].sort(se).map(Wl),m={schemaVersion:vn,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:s,coverage:i,profile:l,holdings:f,evidence:c,gaps:u,caveats:[...Pt]};Ql(m);let g=ot("opensea-snapshot",Xl(m)),y=rt(m);return de({...m,snapshotId:g,digest:y})}function ed(e){let t=Q(e,["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],"OpenSea snapshot");["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"].every(i=>t.has(i))||b("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==vn||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&b("OpenSea snapshot envelope is invalid","invalid-envelope"),ve(t.get("caveats"),"snapshot.caveats",Pt.length,Pt.length).some((i,a)=>i!==Pt[a])&&b("snapshot caveats are invalid","invalid-caveat");let o=Gl(t.get("gaps")),s=kr({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 ht(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),Ls(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==s.snapshotId||t.get("digest")!==s.digest)&&b("snapshot ID or digest does not match normalized content","digest-mismatch"),s}function td(e){return{code:e,message:jl[e]}}function nd(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"||!Rr.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"||!Rr.has(d.status)||d.walletId!==e.wallet.id||d.assetId!==t.id||d.collectionId!==(t.collection?.id??null)||d.ownerBinding!==Qe||r.has(d.id)||(!a||se(d.id,a.id)<0)&&(a=d)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:Qe,profileEvidence:{id:i.id,status:i.status},holdingEvidence:{id:a.id,status:a.status}}:null}function As(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let s=o.byWallet.get(r.walletId);(!s||se(`${r.snapshotId}:${r.holdingEvidence.id}`,`${s.snapshotId}:${s.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function rd(e,t,n){(!Array.isArray(n)||n.length<2||n.length>X.snapshots||n.length*2>X.citationsPerFinding)&&b("finding citations exceeded the fixed limit","citation-limit");let r=G();for(let l=0;l<n.length;l+=1)$(r,n[l]);r.sort((l,p)=>se(l.walletId,p.walletId)||se(l.snapshotId,p.snapshotId)||se(l.holdingEvidence.id,p.holdingEvidence.id));let o=G(),s=G(),i=new Set;for(let l of r)$(o,l.walletId),i.add(l.profileEvidence.id),i.add(l.holdingEvidence.id),i.size>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),$(s,{walletId:l.walletId,chainId:l.chainId,address:l.address,snapshotId:l.snapshotId,ownerBinding:l.ownerBinding,profileEvidence:l.profileEvidence,holdingEvidence:l.holdingEvidence});let a=G();for(let l of i)$(a,l);a.sort(se);let c={kind:e,status:xr,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:s,evidenceRefs:a};return{id:ot(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:rt(c),...c}}function vr(e,t){return`${e}:${t.canonical.id}`}function Is(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||se(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function od(e,t,n){if(n<=0)return;if(e.length<n){$(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)se(e[o].key,e[r].key)>0&&(r=o);se(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function sd(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=G(),i=new Set,a=Is(e),c=Is(t);if(a){let m={section:"exact",group:a,key:vr("exact",a)};$(s,m),i.add(m.key)}if(c){let m={section:"collection",group:c,key:vr("collection",c)};$(s,m),i.add(m.key)}let d=G(),l=X.findings-s.length,p=(m,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let E=vr(m,y);i.has(E)||od(d,{section:m,group:y,key:E},l)}};p("exact",e),p("collection",t);let f=G();for(let m of s)$(f,m);for(let m of d)$(f,m);f.length>X.findings&&b("finding selection exceeded the fixed limit","finding-limit"),f.sort((m,g)=>se(m.key,g.key));let h=G(),u=G();for(let m of f)$(m.section==="exact"?h:u,m.group);return{exact:h,collections:u,exactCount:n,collectionCount:r,truncated:o>X.findings}}function Tn(e){return e.coverage.inventory.status==="COMPLETE"}function id(e){e.byWallet.size>X.snapshots&&b("finding wallet citations exceeded the snapshot limit","citation-limit");let t=G();for(let n of e.byWallet.values())$(t,n);return t.length*2>X.citationsPerFinding&&b("finding citations exceeded the fixed limit","citation-limit"),t}function Ss(e,t){let n=G();for(let r of t)$(n,rd(e,r.canonical,id(r)));return n.sort((r,o)=>se(r.id,o.id)),n}function Ps(e){arguments.length!==1&&b("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=Q(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&b("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==Rl&&b("NFT overlap input schema is invalid","invalid-schema");let n=ve(t.get("snapshots"),"NFT overlap snapshots",X.snapshots,2),r=0;for(let A=0;A<n.length;A+=1){let C=Q(n[A],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${A}]`);for(let V of["holdings","evidence","gaps","caveats"])C.has(V)||b(`snapshot ${V} is required`,"missing-field");let te=ve(C.get("holdings"),`NFT overlap snapshots[${A}].holdings`,X.holdingsPerSnapshot);ve(C.get("evidence"),`NFT overlap snapshots[${A}].evidence`,X.evidencePerSnapshot),ve(C.get("gaps"),`NFT overlap snapshots[${A}].gaps`,Object.keys(ct).length),ve(C.get("caveats"),`NFT overlap snapshots[${A}].caveats`,Pt.length,Pt.length),r+=te.length,r>X.totalHoldings&&b("total holdings exceed the fixed limit","holding-limit");for(let V=0;V<te.length;V+=1){let _e=Q(te[V],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${A}].holdings[${V}]`);_e.has("evidenceRefs")||b("holding evidenceRefs are required","missing-field"),ve(_e.get("evidenceRefs"),`NFT overlap snapshots[${A}].holdings[${V}].evidenceRefs`,X.citationsPerFinding,1)}}let o=G();for(let A of n)$(o,ed(A));let s=new Map;for(let A of o){let C=A.wallet.id&&A.wallet.chainId?`${A.wallet.id}:${A.wallet.chainId}`:`noncanonical:${A.snapshotId}`;s.has(C)||s.set(C,G()),$(s.get(C),A)}let i=G(),a=0,c=0,d=G();for(let A of s.keys())$(d,A);d.sort(se);for(let A of d){let C=s.get(A),te=new Set;for(let V of C)te.add(V.digest);if(te.size>1&&!A.startsWith("noncanonical:")){c+=1;continue}C.sort((V,_e)=>se(V.snapshotId,_e.snapshotId)),$(i,C[0]),a+=C.length-1}let l=new Map;for(let A of i)for(let C of A.evidence)l.has(C.id)||l.set(C.id,new Set),A.wallet.id&&l.get(C.id).add(A.wallet.id);let p=new Set;for(let[A,C]of l)C.size>1&&p.add(A);let f=new Map,h=new Map,u=new Set,m=new Map,g=new Map,y=0,E=0,S=!1,x=c>0,R=c>0;for(let A of i){let C=A.wallet.id;C&&u.add(C),A.coverage.profile.status==="PARTIAL"&&(S=!0);let te=new Map;for(let be of A.evidence)te.set(be.id,be);let V=A.profile?te.get(A.profile.evidenceRef):null,_e=!!(A.profile&&C&&V&&V.kind==="PROFILE"&&Rr.has(V.status)&&V.walletId===C&&V.address===A.wallet.address&&!p.has(V.id)),xe=_e&&Tn(A),Ve=_e&&Tn(A);(Tn(A)||Tn(A))&&!_e&&(y+=1);let je=new Set;A.profile&&je.add(A.profile.evidenceRef);for(let be of A.holdings){let jt=nd(A,be,te,p);if(!jt){E+=1,xe=!1,Ve=!1;continue}je.add(jt.profileEvidence.id),je.add(jt.holdingEvidence.id),As(f,be.id,{id:be.id,chainId:be.chainId,contract:be.contract,tokenId:be.tokenId},jt),be.collection?As(h,be.collection.id,be.collection,jt):Ve=!1}for(let be of A.evidence)je.has(be.id)||(E+=1,xe=!1,Ve=!1);C?(m.set(C,(m.has(C)?m.get(C):!0)&&xe),g.set(C,(g.has(C)?g.get(C):!0)&&Ve)):(xe=!1,Ve=!1),xe||(x=!0),Ve||(R=!0)}let j=new Set,T=new Set;for(let[A,C]of m)C&&j.add(A);for(let[A,C]of g)C&&T.add(A);let _=new Set;for(let A of j)T.has(A)&&_.add(A);let D=sd(f,h),ee=Ss("EXACT_NFT_OVERLAP",D.exact),v=Ss("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",D.collections),W=!x&&u.size>=2&&j.size>=2,Ce=!R&&u.size>=2&&T.size>=2,ie=D.exactCount>0?xr:W?Os:_n,ue=D.collectionCount>0?xr:Ce?Os:_n,F=G();c>0&&$(F,"CONFLICTING_DUPLICATE_SNAPSHOT"),(x||R)&&$(F,"INPUT_COVERAGE_INCOMPLETE"),x&&$(F,"EXACT_NFT_COVERAGE_INCOMPLETE"),R&&$(F,"COLLECTION_COVERAGE_INCOMPLETE"),S&&$(F,"PROFILE_METADATA_INCOMPLETE"),(y>0||E>0||p.size>0)&&$(F,"INELIGIBLE_HOLDING_EVIDENCE"),u.size<2&&D.exactCount===0&&D.collectionCount===0&&$(F,"INSUFFICIENT_DISTINCT_WALLETS"),D.truncated&&$(F,"FINDINGS_TRUNCATED");let w=G(),N=new Set;for(let A of F)N.has(A)||(N.add(A),$(w,A));w.sort(se);let L=G();for(let A of w)$(L,td(A));let P=0;for(let A of f.values())P+=A.byWallet.size;let ye=!x&&!R&&!S&&!D.truncated&&u.size>=2?"COMPLETE":ie!==_n||ue!==_n?"PARTIAL":"UNKNOWN",Ne={schemaVersion:Ll,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:ye,input:{suppliedSnapshots:n.length,includedSnapshots:i.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:u.size,completeDistinctWallets:_.size,completeExactNftWallets:j.size,completeCollectionWallets:T.size,qualifyingHoldings:P},exactNft:{state:ie,findings:ee},collection:{state:ue,findings:v},gaps:L,caveats:[...Cl],limits:X},Zt=ot("nft-overlap-report",Ne),bt=rt(Ne);return de({...Ne,reportId:Zt,digest:bt})}var Ds=128*1024,$s=1024*1024,Ms=8e3,ad=20,cd=512,ld=1024,Us=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Cs=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}),Rn=/[\u0000-\u001f\u007f-\u009f]/u,dd=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,ud=Object.freeze(["family","chainId","address","includeOpenSea"]),fd=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),Ln=(e,t)=>e<t?-1:e>t?1:0;function Dr(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function Pe(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function me(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function pd(e){(!e||typeof e!="object"||Array.isArray(e)||yt.isProxy(e))&&me("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{me("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&me("args must be a plain object","invalid-object");let r=new Set(ud),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";fd.some(c=>a.includes(c))&&me("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),me("args have an unknown own field","unknown-field")}let i;try{i=Object.getOwnPropertyDescriptor(e,s)}catch{me(`args.${s} could not be inspected safely`,"invalid-object")}(!i||!("value"in i))&&me(`args.${s} must be an own data field`,"invalid-object"),o.set(s,i.value)}return o}function md(e){let t=pd(e);for(let d of["family","address"])t.has(d)||me(`args.${d} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||Rn.test(n))&&me("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||me("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||Rn.test(o))&&me("args.address is invalid","invalid-address");let s=o.trim();(!s||/:\/\//u.test(s))&&me("args.address must not be a URL","invalid-address");let i=Us.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(Cs,r)?Cs[r]:null;i?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&me("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!Rn.test(a)||Number.isSafeInteger(a)&&a>0)&&me("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&me("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:s,includeOpenSea:c}}function hd(e){let t=Us.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=gt(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:xn({family:n,chainId:e.chainId,address:r}),evm:t}}function lt({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 kr({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 gd(){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 Fs(e){let t=De(e);return t&&t.length<=ld?t:null}function $r(e,t){if(!e||typeof e!="object"||Array.isArray(e)||yt.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 yd(e,t){if(!Array.isArray(e)||yt.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=Dr();for(let i=0;i<o;i+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(i))}catch{throw new Error("malformed-response")}Pe(s,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:s,overflow:r>t}}function Jt(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function bd(e,t,n){let r=$r(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=gt(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=Jt(a,n)?null:jr(a),(s===null||s!==a)&&(s=void 0,i=!0)}return{address:o,...s!==void 0?{username:s}:{},usernameRejected:i}}function Ed(e,t,n,r){let o=$r(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>cd||Rn.test(s)||dd.test(s)||Jt(s,r)))throw new Error("malformed-response");let{rows:i,overflow:a}=yd(o.get("nfts"),ad),c=Dr();a&&Pe(c,"INVENTORY_ROW_LIMIT"),typeof s=="string"&&Pe(c,"INVENTORY_CURSOR_PRESENT");let d=new Map,l=new Set;for(let h of i){let u,m;try{if(typeof h=="symbol")throw new Error("invalid-row");if(u=$r(h,["identifier","contract","collection"]),!["identifier","contract"].every(E=>u.has(E)))throw new Error("invalid-row");if(![u.get("identifier"),u.get("contract")].every(E=>typeof E=="string"))throw new Error("invalid-row");if(Jt(u.get("identifier"),r)||Jt(u.get("contract"),r))throw new Error("invalid-row");m=Pr({chainId:t.chainId,contract:u.get("contract"),tokenId:u.get("identifier")})}catch{Pe(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(u.has("collection")&&typeof u.get("collection")=="string"&&!Jt(u.get("collection"),r))try{g=Cr({chainId:t.chainId,slug:u.get("collection")})}catch{g=null}if(g===null&&Pe(c,"INVENTORY_COLLECTION_REJECTED"),l.has(m.id)){Pe(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=d.get(m.id);if(y){let E=y.collection?.id??null,S=g?.id??null;E===null&&S!==null?(d.set(m.id,{nft:m,collection:g}),Pe(c,"INVENTORY_DUPLICATE_HOLDING")):S===null||E===S?Pe(c,"INVENTORY_DUPLICATE_HOLDING"):(d.set(m.id,{nft:m,collection:null}),l.add(m.id),Pe(c,"INVENTORY_CONFLICTING_HOLDING"));continue}d.set(m.id,{nft:m,collection:g})}let p=Dr(),f=[n];for(let{nft:h,collection:u}of[...d.values()].sort((m,g)=>Ln(m.nft.id,g.nft.id))){let m=Wt({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:h.id,collectionId:u?.id??null,ownerBinding:Qe});Pe(f,m),Pe(p,{...h,collection:u,ownerBinding:Qe,evidenceRefs:[n.id,m.id].sort(Ln)})}return{holdings:p,evidence:f,gaps:[...new Set(c)].sort(Ln)}}function dt(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||yt.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function js(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=dt(e,"status"),o=dt(e,"name"),s=dt(e,"message");return dt(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":dt(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:dt(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:dt(e,"oracleTimeout")===!0||dt(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 Mr(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 Od(e){if(!e||typeof e!="object"||Array.isArray(e)||yt.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"||Fs(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return Mr([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function wd(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"||yt.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"?Od(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 ks(e,t){let n=Mr([["x-api-key",e]]);return Mr([["method","GET"],["headers",n],["fetchImpl",wd],["timeoutMs",Ms],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function Ad(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||yt.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 Vs(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=Ad(e),n=t.has("requestJson")?t.get("requestJson"):K,r=t.has("readApiKey")?t.get("readApiKey"):gd;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(s){arguments.length!==1&&me("exactly one args object is required","second-options-forbidden");let i=md(s),a=hd(i);if(!i.includeOpenSea)return lt({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(Ct,a.chainId))return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return lt({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=Fs(r())}catch{c=null}if(!c)return lt({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,ks(c,Ds));l=bd(E,a.address,c)}catch(E){return lt({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[js(E,"profile")]})}let p=Wt({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),f={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/${Ct[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let E=await n(m,ks(c,$s));g=Ed(E,a,p,c)}catch(E){return lt({requested:!0,target:a,status:"PARTIAL",profileStatus:h.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:f,evidence:[p],gaps:[...h,js(E,"inventory")]})}let y=[...new Set([...h,...g.gaps])].sort(Ln);return lt({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:f,holdings:g.holdings,evidence:g.evidence,gaps:y})}return Object.freeze({enrich:o})}var Ff=Object.freeze({profileMaxBytes:Ds,inventoryMaxBytes:$s,timeoutMs:Ms,retries:0,redirects:0,dedupe:!1});var Id=Vs();async function zs(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 Id.enrich(e)}var Fr="oracle.investigator-cli/2",Ur=2*1024*1024,_d=/^[^\u0000-\u001f\u007f]+$/u,Td=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),Ue=class extends Error{constructor(t){super(t),this.name="CliError"}};function z(e){throw new Ue(e)}function vd(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="boolean")return String(r);if(typeof r=="string")return JSON.stringify(r);if(typeof r=="number"&&Number.isFinite(r))return String(r);if(!r||typeof r!="object"||t.has(r))throw new Ue("output is not bounded own-data JSON");t.add(r);try{let s=" ".repeat(o),i=" ".repeat(o+1);if(Array.isArray(r)){let c=[];for(let d=0;d<r.length;d+=1){let l=Object.getOwnPropertyDescriptor(r,String(d));if(!l||!Object.hasOwn(l,"value"))throw new Ue("output is not bounded own-data JSON");c.push(n(l.value,o+1))}return c.length?`[
|
|
4
4
|
${i}${c.join(`,
|
|
5
5
|
${i}`)}
|
|
6
6
|
${s}]`:"[]"}let a=[];for(let c of Object.keys(r)){let d=Object.getOwnPropertyDescriptor(r,c);if(!d||!Object.hasOwn(d,"value"))throw new Ue("output is not bounded own-data JSON");a.push(`${JSON.stringify(c)}: ${n(d.value,o+1)}`)}return a.length?`{
|
|
7
7
|
${i}${a.join(`,
|
|
8
8
|
${i}`)}
|
|
9
|
-
${s}}`:"{}"}finally{t.delete(r)}};return n(e,0)}function Kt(e){process.stdout.write(`${
|
|
10
|
-
`)}function Yt(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||!
|
|
9
|
+
${s}}`:"{}"}finally{t.delete(r)}};return n(e,0)}function Kt(e){process.stdout.write(`${vd(e)}
|
|
10
|
+
`)}function Yt(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||!_d.test(e))&&z(`${t} is invalid`),e}function Vr(e,t,n=new Set){let r={};for(let o=0;o<e.length;){let s=e[o];if(!t.has(s)&&!n.has(s)&&z("unknown option"),Object.hasOwn(r,s)&&z("duplicate option"),n.has(s)){r[s]=!0,o+=1;continue}let i=e[o+1];(i===void 0||i.startsWith("--"))&&z("option value is missing"),r[s]=i,o+=2}return r}function Pn(e,t){return Object.hasOwn(e,t)||z("required option is missing"),e[t]}function xd(e){if(e===void 0)return;/^[1-9]\d*$/u.test(e)||z("limit must be a positive integer");let t=Number(e);return Number.isSafeInteger(t)||z("limit must be a positive integer"),t}function Rd(e,t){if(e!==void 0){if(Yt(e,"chain id",96),Td.has(t)){/^[1-9]\d*$/u.test(e)||z("EVM chain id must be a positive integer");let n=Number(e);return Number.isSafeInteger(n)||z("EVM chain id must be a positive integer"),n}return e}}function Ld(e){if(e===void 0)return;let t=Yt(e,"cursor",2048);Buffer.byteLength(t,"utf8")>2048&&z("cursor exceeds the byte limit");let n;try{n=JSON.parse(t)}catch{z("cursor must be a versioned JSON envelope")}return(!n||typeof n!="object"||Array.isArray(n))&&z("cursor must be a versioned JSON envelope"),n}async function Pd(){let e=[],t=0;for await(let n of process.stdin)t+=n.length,t>Ur&&z("input exceeds the size limit"),e.push(n);return Buffer.concat(e).toString("utf8")}async function Bs(e){Yt(e,"input reference",4096);try{if(e==="-")return await Pd();let t=await Nd(e);t.isFile()||z("input must be a file or stdin"),t.size>Ur&&z("input exceeds the size limit");let n=await Sd(e);return n.length>Ur&&z("input exceeds the size limit"),n.toString("utf8")}catch(t){if(t instanceof Ue)throw t;z("unable to read input")}}function Hs(e){try{let t=JSON.parse(e.replace(/^\uFEFF/u,""));return(!t||typeof t!="object"||Array.isArray(t))&&z("input must be a JSON object"),t}catch(t){if(t instanceof Ue)throw t;z("input is not valid JSON")}}function Cd(e){try{let t=Object.getOwnPropertyDescriptor(e,"schemaVersion");return(t&&Object.hasOwn(t,"value")?t.value:void 0)==="oracle.investigator-collection/1"?er(e):Qn(e)}catch{z("input does not satisfy the investigator collection/components contract")}}function jd(e){if(!e||typeof e!="object"||Array.isArray(e))return{input:"UNKNOWN"};let t=Object.getOwnPropertyDescriptor(e,"collectorStatus"),n=t&&Object.hasOwn(t,"value")?t.value:void 0;if(n!==void 0)return{collection:n==="COMPLETE"?"COMPLETE":n==="PARTIAL"?"PARTIAL":"UNKNOWN"};let r=[];for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))continue;let i=s.value,a=i;if(i&&typeof i=="object"&&!Array.isArray(i)){let c=Object.getOwnPropertyDescriptor(i,"status");a=c&&Object.hasOwn(c,"value")?c.value:void 0}["COMPLETE","PARTIAL","UNKNOWN"].includes(a)&&r.push([o,a])}return r.length>0?Object.fromEntries(r):{input:"UNKNOWN"}}function qs(e){return Es({subject:e.subject,entities:e.entities,events:e.events,evidence:e.evidence,coverage:jd(e.coverage),gaps:e.gaps})}async function kd(e){e.length!==0&&z("help does not accept options"),Kt({schemaVersion:Fr,execution:"read-only",reportOnly:!0,command:"help",usage:"oracle-investigate <capabilities|wallet|analyze|overlap> [options]",commands:{capabilities:"print the static capability matrix",wallet:"collect bounded wallet evidence; --include-opensea is a valueless explicit opt-in",analyze:"analyze a bounded offline coordination JSON input",overlap:"analyze strict OpenSea snapshots offline with --input"}})}async function Dd(e){e.length!==0&&z("capabilities does not accept options"),Kt({schemaVersion:Fr,execution:"read-only",reportOnly:!0,command:"capabilities",capabilities:it,openSea:{schemaVersion:vn,flag:"--include-opensea",chainSlugs:Ct,maxHoldings:X.holdingsPerSnapshot,pagination:!1,identityInference:!1,launchRadar:{status:"UNAVAILABLE",reason:"OpenSea enrichment is investigator-only and is not a Launch Radar evidence source."}},nftOverlap:{command:"overlap --input <file|->",networkAccess:!1,limits:X}})}async function $d(e){let t=Vr(e,new Set(["--family","--address","--chain-id","--limit","--cursor"]),new Set(["--include-opensea"])),n=Yt(Pn(t,"--family"),"family",64).toLowerCase(),r=Yt(Pn(t,"--address"),"address",256),o=Rd(t["--chain-id"],n),s=xd(t["--limit"]),i=Ld(t["--cursor"]),a=t["--include-opensea"]===!0,c;try{c=await ns({family:n,address:r,chainId:o,limit:s,...i===void 0?{}:{cursor:i}})}catch{z("wallet arguments are invalid")}let d=await zs({family:n,address:r,...o!==void 0?{chainId:o}:{},includeOpenSea:a}),l;try{l=er(c)}catch{z("collector output did not satisfy the investigator contract")}let p=qs(l);Kt({schemaVersion:Fr,execution:"read-only",reportOnly:!0,command:"wallet",status:c.status,collection:c,coordination:p,openSea:d})}async function Md(e){let t=Vr(e,new Set(["--input"])),n=Pn(t,"--input"),r=Cd(Hs(await Bs(n)));Kt(qs(r))}async function Ud(e){let t=Vr(e,new Set(["--input"])),n=Pn(t,"--input");try{Kt(Ps(Hs(await Bs(n))))}catch(r){if(r instanceof Ue)throw r;z("input does not satisfy the NFT overlap contract")}}async function Fd(){let[e,...t]=process.argv.slice(2);if(e==="--help"||e==="-h"||e==="help")return kd(t);if(e==="capabilities")return Dd(t);if(e==="wallet")return $d(t);if(e==="analyze")return Md(t);if(e==="overlap")return Ud(t);z("command must be --help, capabilities, wallet, analyze, or overlap")}try{await Fd()}catch(e){let t=e instanceof Ue?e.message:"operation failed";process.stderr.write(`oracle-investigate: ${t}
|
|
11
11
|
`),process.exitCode=1}
|