@oracle-agent/oracle 0.35.43 → 0.35.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-sessions.mjs +24 -24
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +19 -19
- package/dist/bin/oracle-gateway.mjs +48 -48
- package/dist/bin/oracle-investigate.mjs +5 -5
- package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +26 -26
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/bin/oracle.mjs +13 -12
- package/dist/cli/commands/account.mjs +39 -0
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/airdrop.mjs +10 -10
- package/dist/cli/commands/chat.mjs +218 -217
- package/dist/cli/commands/data.mjs +244 -8
- package/dist/cli/commands/doctor.mjs +7 -7
- package/dist/cli/commands/eval.mjs +157 -153
- package/dist/cli/commands/extension-policy.mjs +1 -1
- package/dist/cli/commands/farm.mjs +19 -19
- package/dist/cli/commands/fees.mjs +3 -3
- package/dist/cli/commands/follow.mjs +36 -36
- package/dist/cli/commands/mcp.mjs +6 -6
- package/dist/cli/commands/mint.mjs +11 -11
- package/dist/cli/commands/model.mjs +222 -221
- package/dist/cli/commands/quickstart.mjs +7 -7
- package/dist/cli/commands/receipt.mjs +11 -11
- package/dist/cli/commands/resolve.mjs +12 -12
- 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 +11 -11
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +15 -15
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +26 -26
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +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 +90 -88
- package/package.json +1 -1
- package/public/eval-report.json +347 -13
- 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,7 +1,240 @@
|
|
|
1
|
-
import{parseArgs as m}from"node:util";import{spawn as v}from"node:child_process";var k=["SIGINT","SIGTERM","SIGHUP"];function h(r,a=[],t={},o=r){return new Promise(s=>{let e=v(r,a,t),n=!1,c=null,i=new Map(k.map(l=>[l,()=>{c||=l,e.exitCode===null&&e.signalCode===null&&e.kill(l)}]));for(let[l,d]of i)process.on(l,d);let p=()=>{for(let[l,d]of i)process.off(l,d)};e.once("error",l=>{n||(n=!0,p(),process.stderr.write(`oracle: could not start ${o}: ${l.message}
|
|
2
|
-
`),s(1))}),e.once("exit",(l,d)=>{if(n)return;n=!0,p();let f=c||d;if(f){process.kill(process.pid,f);return}s(l??1)})})}var w="http://127.0.0.1:8787";function g(){process.stderr.write(`usage: oracle data <serve|call|catalog|health> [args]
|
|
1
|
+
var O4=Object.defineProperty;var _=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var ht=(e,t)=>{for(var n in t)O4(e,n,{get:t[n],enumerable:!0})};var wE={};ht(wE,{beginDataLatencySpan:()=>fa,captureDataLatency:()=>L4});import{AsyncLocalStorage as C4}from"node:async_hooks";import{performance as P4}from"node:perf_hooks";function gE(e){let t=0,n=0;for(let r of[...e].sort((o,i)=>o.startMs-i.startMs)){let o=r.startMs+r.durationMs;n+=Math.max(0,o-Math.max(t,r.startMs)),t=Math.max(t,o)}return Mo(n)}function fa(e){let t=yE.getStore();if(!t||t.closed||!bE.includes(e))return null;if(t.spans.length>=R4)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)}}async function L4(e,{now:t=()=>P4.now()}={}){let n={start:t(),now:t,spans:[],droppedSpans:0,closed:!1},r,o,i=!0;try{r=await yE.run(n,e)}catch(u){o=u,i=!1}let s=Mo(t()-n.start);n.closed=!0;let a=n.droppedSpans===0&&n.spans.every(u=>u.durationMs!==null),c=n.spans.map(u=>({...u,startMs:Mo(u.startMs),durationMs:u.durationMs===null?Mo(s-u.startMs):Mo(u.durationMs)})),l=Object.fromEntries(bE.map(u=>{let d=c.filter(p=>p.stage===u);return[u,{count:d.length,failed:d.filter(p=>p.outcome==="failed").length,cumulativeMs:Mo(d.reduce((p,m)=>p+m.durationMs,0)),activeMs:gE(d)}]}));return{value:r,error:o,trace:{schemaVersion:1,ok:i,totalMs:s,stages:l,spans:c,complete:a,droppedSpans:n.droppedSpans,unattributedMs:a?Mo(s-gE(c)):null,sourceAgeMs:null}}}var yE,bE,R4,Mo,Om=_(()=>{yE=new C4,bE=["http","retry","shared"],R4=512,Mo=e=>Math.round(Math.max(0,e)*1e3)/1e3});import $o from"node:net";import M4 from"node:dns";function ou(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let n=u=>{if(!u)return[];let d=u.split(":"),p=d.at(-1);if(p?.includes(".")){let m=p.split(".").map(Number);if(m.length!==4||m.some(f=>!Number.isInteger(f)||f<0||f>255))return null;d.splice(d.length-1,1,(m[0]<<8|m[1]).toString(16),(m[2]<<8|m[3]).toString(16))}return d.some(m=>!/^[0-9a-f]{1,4}$/.test(m))?null:d.map(m=>Number.parseInt(m,16))},[r,o]=t.split("::"),i=n(r),s=n(o);if(!i||!s)return null;let a=t.includes("::"),c=8-i.length-s.length;if(!a&&c!==0||a&&c<1)return null;let l=[...i,...Array(Math.max(0,c)).fill(0),...s];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function Nm(e,t,n){let r=Math.floor(n/8),o=n%8;for(let s=0;s<r;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Tm(e){if($o.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($o.isIPv6(e)){let t=ou(e);if(!t)return!1;let n=ou("::ffff:0:0");return Nm(t,n,96)?Tm([...t.slice(12)].join(".")):Nm(t,ou("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Nm(t,ou(o),i)):!1}return!1}function Cm(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($4.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=$o.isIP(n);return r!==0&&!Tm(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Pm(e,{lookupFn:t=M4.promises.lookup}={}){let n=Cm(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:$o.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=>!Tm(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}function B4(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 Rm({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r,o;try{o=await t(),n=o.Agent,r=o.fetch}catch(m){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${m?.message||m}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=m=>String(m).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,a=m=>(Array.isArray(m)?m:[m]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||($o.isIPv6(f.address)?6:4)})),c=(m,f,h)=>{s.set(i(m),a(typeof f=="string"?[{address:f,family:h}]:f))},l=m=>{let f=i(m);if($o.isIP(f))return[{address:f,family:$o.isIPv6(f)?6:4}];let h=s.get(f);if(!h||!h.length)throw new Error(`refused: unpinned host ${m} during pinned fetch`);return h},u=B4(),d=u&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:u.uri,token:`Bearer ${u.token}`,connectTimeout:1e4}):new n({connect:{lookup(m,f,h){let g;try{g=l(m)}catch(y){return h(y)}return f?.all?h(null,g):h(null,g[0].address,g[0].family)}}}),p=D4((m,f={})=>r(m,{...f,dispatcher:d}),c);return{dispatcher:d,fetch:p,pin:c,resolve:l,async close(){try{await d.destroy()}catch{}}}}function D4(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[Lm]=Object.freeze({pin:t}),e}function Mm(e){return typeof e=="function"&&typeof e[Lm]?.pin=="function"}function SE(e,t,n){if(!Mm(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Lm].pin(t,n)}var $4,Lm,$m=_(()=>{$4=new Set(["localhost","metadata.google.internal","metadata.goog"]);Lm=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as U4}from"node:crypto";import{types as er}from"node:util";function Ye(e){return $r(`HTTP JSON body refused: ${e}`)}function K4(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 er[t]=="function"&&er[t](e))}function Y4(e){let t=[],n=0,r=0,o=0,i=0,s=new WeakSet,a=u=>{if(n+=Buffer.byteLength(u,"utf8"),n>Zn.bytes)throw Ye("serialized byte limit exceeded");t.push(u)},c=u=>{if(Buffer.byteLength(u,"utf8")>Zn.bytes)throw Ye("serialized byte limit exceeded");return JSON.stringify(u)},l=(u,d)=>{if(r+=1,r>Zn.nodes)throw Ye("node limit exceeded");if(d>Zn.depth)throw Ye("depth limit exceeded");if(u===null){a("null");return}if(typeof u=="string"){a(c(u));return}if(typeof u=="boolean"){a(u?"true":"false");return}if(typeof u=="number"){if(!Number.isFinite(u))throw Ye("non-finite number");a(Object.is(u,-0)?"0":String(u));return}if(typeof u!="object")throw Ye("unsupported non-JSON value");if(er.isProxy(u))throw Ye("proxy value");if(K4(u))throw Ye("unsupported exotic object");if(s.has(u))throw Ye("cyclic value");s.add(u);try{if(Object.getOwnPropertySymbols(u).length>0)throw Ye("symbol-keyed fields are unsupported");if(Array.isArray(u)){let f=Object.getPrototypeOf(u),h=0;for(;f!==null;){if(er.isProxy(f))throw Ye("proxy array prototype");if(h+=1,h>Zn.depth)throw Ye("array prototype depth limit exceeded");f=Object.getPrototypeOf(f)}if(u.length>Zn.arrayLength)throw Ye("array length limit exceeded");for(let y=0;y<u.length;y+=1){let b=Object.getOwnPropertyDescriptor(u,String(y));if(!b||!Object.hasOwn(b,"value")||b.enumerable!==!0)throw Ye("array entries must be dense enumerable own data")}let g=0;for(let y in u){if(i+=1,i>Zn.fields)throw Ye("enumeration limit exceeded");if(Object.hasOwn(u,y)&&(g+=1,g>u.length))throw Ye("named array fields are unsupported")}if(g!==u.length)throw Ye("array entries must be dense enumerable own data");a("[");for(let y=0;y<u.length;y+=1)y&&a(","),l(Object.getOwnPropertyDescriptor(u,String(y)).value,d+1);a("]");return}let p=Object.getPrototypeOf(u);if(p!==Object.prototype&&p!==null)throw Ye("non-plain object");let m=[];for(let f in u){if(i+=1,i>Zn.fields)throw Ye("enumeration limit exceeded");if(!Object.hasOwn(u,f))continue;if(o+=1,o>Zn.fields)throw Ye("field limit exceeded");let h=Object.getOwnPropertyDescriptor(u,f);if(!h||!Object.hasOwn(h,"value")||h.enumerable!==!0)throw Ye("object fields must be enumerable own data");m.push([f,h.value])}a("{");for(let f=0;f<m.length;f+=1)f&&a(","),a(c(m[f][0])),a(":"),l(m[f][1],d+1);a("}")}finally{s.delete(u)}};return l(e,0),t.join("")}function X4(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(er.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let n=new Set;for(let r of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(r))throw new TypeError("HTTP header names must be valid tokens");let o=r.toLowerCase();if(n.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");n.add(o);let i=Object.getOwnPropertyDescriptor(e,r);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[r]=String(s)}return t}function J4(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Q4(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 Z4(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function iu(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=IE.get(e);return t||(t=kE,kE+=1,IE.set(e,t)),`reference:${t}`}function _E(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?e6.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 OE(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(_E);if(!n||typeof n!="object")return!1;if(Object.hasOwn(n,"jsonrpc")||Object.hasOwn(n,"method"))return _E(n);let r=Object.hasOwn(n,"type")?n.type:null;return typeof r=="string"&&t6.has(r)&&(!Object.hasOwn(n,"action")||n.action==null)&&(!Object.hasOwn(n,"signature")||n.signature==null)&&(!Object.hasOwn(n,"nonce")||n.nonce==null)}function n6(e,t,n,r={},o=null){let i=U4("sha256"),s=(c,l)=>{let u=String(l);i.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),i.update("=").update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u).update(`
|
|
2
|
+
`)};s("method",e),s("url",t),Object.keys(n||{}).map((c,l)=>({name:c.toLowerCase(),order:l,value:String(n[c])})).sort((c,l)=>c.name.localeCompare(l.name)||c.order-l.order).forEach((c,l)=>{s(`header-name-${l}`,c.name),s(`header-value-${l}`,c.value)}),s("body",o??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${c}`,r[c]??"-");return i.digest("hex")}function r6(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,EE):Math.min(250*2**e,EE)+Math.floor(Math.random()*100)}function $r(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Dm(e,t,n){return $r(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Bo(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function i6(e){return e?e.byteLength??e.length??0:0}async function s6(e,t,{url:n,truncate:r=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Bo(e),!r))throw Dm(n,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Dm(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let a=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await s.read();if(p)break;if(d&&(a.push(Buffer.from(d)),c+=i6(d),c>t)){l=!0;break}}}finally{if(l)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Dm(n,`streamed ${c} bytes`,t);let u=Buffer.concat(a);return(l?u.subarray(0,t):u).toString("utf8")}function a6(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function c6(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:s,realFetch:a,untrustedUrl:c=!1,maxResponseBytes:l=null,sameOriginRedirectsOnly:u=!1,importUndici:d,validateResponse:p,signal:m,redirectPolicy:f="follow",maxRedirects:h=su}){let g=null,y=t,b=s?{lookupFn:s}:{};if(c&&!a&&!Mm(y))throw $r(`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 w=new AbortController,S=setTimeout(()=>w.abort(),i),v=m?AE?AE([m,w.signal]):m:w.signal,I=async(A,{status:E=null}={})=>{let k=await Pm(A,b);if(!k.ok)throw $r(E==null?`HTTP refused ${A}: ${k.error}`:`HTTP redirect to ${A} ${k.error}`,E==null?{}:{status:E});let O=new URL(A).hostname;if(a){if(g&&(await g.close(),g=null),!g)try{g=await Rm({requireUndici:!0,...d?{importUndici:d}:{}})}catch(T){throw $r(E==null?`HTTP refused ${A}: ${T?.message||T}`:`HTTP redirect to ${A} refused: ${T?.message||T}`,E==null?{}:{status:E})}g.pin(O,k.addresses),y=g.fetch}else SE(y,O,k.addresses);return k};try{let A=String(e),E=Object.assign(Object.create(null),r||{});c&&await I(A);for(let k=0;k<=h;k+=1){let O=Object.assign(Object.create(null),{method:n,headers:E,body:o,signal:v,redirect:"manual",dispatcher:void 0}),T=await y(A,O);if((f==="error"||h===0)&&T.status>=300&&T.status<400)throw Bo(T),$r(`HTTP ${T.status} ${n} redirect refused`,{status:T.status,redirectRefused:!0});if(G4.has(T.status)){let H=u===!0&&n==="POST"&&[307,308].includes(T.status)&&OE(n,o);if(n!=="GET"&&n!=="HEAD"&&!H){Bo(T);let B=new Error(`HTTP ${T.status} ${n} ${A} redirected non-idempotent request`);throw B.status=T.status,B}if(k===h)throw Bo(T),$r(`HTTP ${T.status} ${n} redirect budget exhausted`,{status:T.status,redirectRefused:!0});let $=T.headers?.get?.("location"),j;try{j=Q4($,A)}catch(B){throw Bo(T),B}let C=!Z4(j,A);if(Bo(T),C&&n==="POST"){let B=new Error(`HTTP ${T.status} ${n} cross-origin redirect refused`);throw B.status=T.status,B}if(C&&u){let B=new Error(`HTTP ${T.status} ${n} cross-origin redirect refused`);throw B.status=T.status,B.retryable=!1,B}if(C&&(E=J4(E)),c)await I(j,{status:T.status});else if(C){let B=await Pm(j,b);if(!B.ok){let V=new Error(`HTTP redirect from ${A} ${B.error}`);throw V.status=T.status,V.retryable=!1,V}a&&B.addresses?.length&&(g||(g=await Rm(d?{importUndici:d}:{})),g&&(g.pin(new URL(j).hostname,B.addresses),y=g.fetch))}A=j;continue}if(typeof p=="function")try{await p(T,{url:A})}catch(H){throw Bo(T),$r(H?.message||String(H))}let D=await s6(T,l,{url:A,onOversize:()=>w.abort()}),X=a6(D);if(!T.ok){let H=new Error(`HTTP ${T.status} ${n} ${A}`);throw H.status=T.status,H.retryAfter=T.headers?.get?.("retry-after")??null,H.body=X??D.slice(0,300),H}return X??D}throw new Error(`HTTP redirect loop for ${e}`)}catch(A){if(w.signal.aborted&&!ma(m)){let E=A&&(typeof A=="object"||typeof A=="function")&&!er.isProxy(A)?A:null,k=E?Object.getOwnPropertyDescriptor(E,"oversize"):null;if(!(k&&Object.hasOwn(k,"value")&&k.value===!0))try{if(!E)throw new TypeError("unsafe rejection");Object.defineProperties(E,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let T=new Error("HTTP request timed out");throw Object.defineProperties(T,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),T}}throw A}finally{clearTimeout(S),g&&await g.close()}}async function x(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&er.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 V of Object.getOwnPropertyNames(t)){let K=Object.getOwnPropertyDescriptor(t,V);if(!(V==="toJSON"&&K&&Object.hasOwn(K,"value")&&K.value===void 0)){if(!n.has(V))throw new TypeError("HTTP options contain unknown fields");if(!K||!K.enumerable||!Object.hasOwn(K,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let r=V=>{if(t==null||!Object.hasOwn(t,V))return;let K=Object.getOwnPropertyDescriptor(t,V);if(!K||!Object.hasOwn(K,"value"))throw new TypeError("HTTP options must contain own data properties");return K.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=r("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=r("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=r("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let a=r("redirectPolicy");if(a!==void 0&&a!=="follow"&&a!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let c=r("maxRedirects");if(c!==void 0&&(!Number.isInteger(c)||c<0||c>su))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${su}`);if(a==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let l=a??"follow",u=l==="error"?0:c??su;for(let V of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let K=r(V);if(K!==void 0&&typeof K!="boolean")throw new TypeError(`HTTP ${V} must be boolean`)}let d=r("maxResponseBytes");if(d!==void 0&&(!Number.isInteger(d)||d<1||d>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=r("signal");if(p!==void 0){if(er.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ma(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let V of["importUndici","lookupFn","validateResponse"]){let K=r(V);if(K!==void 0&&typeof K!="function")throw new TypeError(`HTTP ${V} must be a function`)}let m=r("fetchImpl"),f=m||globalThis.fetch;if(typeof f!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let h=i??12e3,g=(o||"GET").toUpperCase(),y=r("headers"),b=X4(y),w=Object.assign(Object.create(null),b);Object.keys(w).some(V=>V.toLowerCase()==="accept")||(w.Accept="application/json");let S=r("body");S!=null&&typeof S!="string"&&(Object.keys(w).find(K=>K.toLowerCase()==="content-type")||(w["Content-Type"]="application/json"),S=Y4(S));let v=s??q4,I=r("lookupFn"),A=!m,E=r("untrustedUrl")===!0,k=r("sameOriginRedirectsOnly")===!0,O=r("importUndici"),T=r("validateResponse"),D=p,X=d??null,H=async()=>{let V;for(let K=0;K<=v;K++){D&&z4.call(D);let Oe=fa("http");try{let Ee=await c6(e,{fetchImpl:f,method:g,headers:w,body:S,timeoutMs:h,lookupFn:I,realFetch:A,untrustedUrl:E,maxResponseBytes:X,sameOriginRedirectsOnly:k,importUndici:O,validateResponse:T,signal:D,redirectPolicy:l,maxRedirects:u});return Oe?.("succeeded"),Ee}catch(Ee){V=Ee;let xe=Z=>{if(!Ee||typeof Ee!="object"&&typeof Ee!="function"||er.isProxy(Ee))return;let re=Object.getOwnPropertyDescriptor(Ee,Z);return re&&Object.hasOwn(re,"value")?re.value:void 0},qe=xe("status");Oe?.("failed",qe);let un=xe("oracleTimeout")===!0||xe("name")==="AbortError"||xe("name")==="TimeoutError"||ma(D),$t=new Set([408,425,429]),W=xe("retryable")===!1?!1:qe!=null?$t.has(qe)||F4.has(qe)&&vE.has(g):!un&&vE.has(g);if(K===v||!W)throw Ee;let R=r6(K,xe("retryAfter")),F=fa("retry"),z=!1;try{D?await new Promise((Z,re)=>{let me,be=()=>{clearTimeout(me),xE.call(D,"abort",be),re(W4(D)||new DOMException("Aborted","AbortError"))};if(ma(D)){be();return}me=setTimeout(()=>{xE.call(D,"abort",be),Z()},R),V4.call(D,"abort",be,{once:!0}),ma(D)&&be()}):await o6(R),z=!0}finally{F?.(z?"succeeded":"failed")}}}throw V};if(!(r("dedupe")!==!1&&!D&&OE(g,S)))return H();let j=n6(g,e,w,{untrustedUrl:E,maxResponseBytes:X,sameOriginRedirectsOnly:k,redirectPolicy:l,maxRedirects:u,timeoutMs:h,retries:v,fetchImpl:iu(f),realFetch:A,lookupFn:iu(I),importUndici:iu(O),validateResponse:iu(T)},S),C=Bm.get(j);if(C){let V=fa("shared");try{let K=await C;return V?.("succeeded"),K}catch(K){throw V?.("failed"),K}}let B=H().finally(()=>Bm.delete(j));return Bm.set(j,B),B}async function Xe(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Ge(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),s=0;return await Promise.all(Array.from({length:o},async()=>{for(;s<r.length;){let a=s++;i[a]=await n(r[a],a)}})),i}var F4,vE,q4,EE,j4,H4,z4,V4,xE,AE,ma,W4,G4,su,Lae,Zn,Bm,IE,kE,e6,t6,o6,q=_(()=>{Om();$m();F4=new Set([408,425,429,500,502,503,504]),vE=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),q4=2,EE=4e3,j4=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,H4=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,z4=AbortSignal.prototype.throwIfAborted,V4=EventTarget.prototype.addEventListener,xE=EventTarget.prototype.removeEventListener,AE=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ma=e=>e?j4.call(e):!1,W4=e=>e?H4.call(e):void 0,G4=new Set([301,302,303,307,308]),su=3,Lae=64*1024,Zn=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Bm=new Map,IE=new WeakMap,kE=1;e6=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),t6=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);o6=e=>new Promise(t=>setTimeout(t,e))});function Fm(e){return NE.get(Number(e))||null}function TE(e,t=process.env){let n=Fm(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function CE(e){return NE.has(Number(e))}var Um,NE,PE=_(()=>{Um={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},NE=new Map(Object.values(Um).map(e=>[e.chainId,e]))});var lu={};ht(lu,{PUBLIC_RPC_FALLBACKS:()=>jm,erc20Allowance:()=>Vm,erc20BalanceOf:()=>ya,resolveRpcUrl:()=>cu,rpcBatch:()=>DE,rpcBlockNumber:()=>ga,rpcCall:()=>J,rpcChainId:()=>Hm,rpcGasPrice:()=>zm,rpcGetBalance:()=>Do,rpcHealth:()=>Pi,rpcHealthAll:()=>Wm,transactionReceipt:()=>ba});import{Interface as l6,getAddress as u6}from"ethers";function Br(e,t){try{return u6(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function d6(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function qm(e){return e==null?null:Number.parseInt(String(e),16)}function cu(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=TE(e,n);return r||jm[Number(e)]||null}function ME(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!p6.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function f6(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function $E(e){if(e?.error)throw f6(e.error);return e?.result}function m6(e,t,n){return`${e}
|
|
3
|
+
${t}
|
|
4
|
+
${JSON.stringify(n??[])}`}async function BE(e,t,n){return x(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function DE(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>RE)throw new Error(`rpcBatch: at most ${RE} calls`);for(let i of t)ME(i?.method);let r=cu(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,s)=>({jsonrpc:"2.0",id:s+1,method:i.method,params:i.params||[]}));try{let i=await BE(r,o,n);if(Array.isArray(i)&&i.length===t.length){let s=new Map(i.map(a=>[Number(a?.id),a]));return t.map((a,c)=>$E(s.get(c+1)??i[c]))}}catch{}return Promise.all(t.map(i=>J(e,i.method,i.params||[],n)))}async function J(e,t,n=[],r={}){let o=String(t||""),i=ME(o),s=cu(e,r);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=LE.get(s);if(u!=null)return u}let c=r.dedupe!==!1&&!r.signal?m6(s,o,n):null;if(c&&ha.has(c))return ha.get(c);let l=(async()=>{let u=await BE(s,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=$E(u);return i==="eth_chainid"&&typeof d=="string"&&LE.set(s,d),d})();return c&&(ha.set(c,l),l.finally(()=>{ha.get(c)===l&&ha.delete(c)}).catch(()=>{})),l}async function Pi(e,t={}){let[n,r]=await DE(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:Fm(e)?.name||null}}async function ga(e,t={}){let n=await J(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Hm(e,t={}){let n=await J(e,"eth_chainId",[],t);return parseInt(n,16)}async function zm(e,t={}){let n=await J(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Do(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await J(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Vm(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Br(e.token||e.tokenAddress,"token"),o=Br(e.owner,"owner"),i=Br(e.spender,"spender"),s=au.encodeFunctionData("allowance",[o,i]),a=await J(n,"eth_call",[{to:r,data:s},e.blockTag||"latest"],t),c=au.decodeFunctionResult("allowance",a),l=BigInt(c[0]);return{chainId:n,token:r,owner:o,spender:i,allowance:l.toString(),allowanceHex:`0x${l.toString(16)}`,blockTag:e.blockTag||"latest"}}async function ya(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Br(e.token||e.tokenAddress,"token"),o=Br(e.account||e.owner||e.address,"account"),i=au.encodeFunctionData("balanceOf",[o]),s=await J(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),a=au.decodeFunctionResult("balanceOf",s),c=BigInt(a[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function ba(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=d6(e.txHash||e.hash||e.transactionHash),o=await J(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=qm(o.status),s=i===1,a=i===1?"success":i===0?"reverted":"unknown",c=s?null:a==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?Br(e.expectedTo,"expectedTo"):null,u=o.to?Br(o.to,"receipt.to"):null;return l&&u!==l&&(s=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:s,chainId:n,txHash:r,status:a,reason:c,statusCode:i,to:u,from:o.from?Br(o.from,"receipt.from"):null,blockNumber:qm(o.blockNumber),transactionIndex:qm(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Wm(e={}){let t=e.chainIds||Object.values(Um).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!CE(r)&&!jm[r]&&!cu(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Pi(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var au,jm,p6,RE,ha,LE,Ne=_(()=>{q();PE();au=new l6(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);jm={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};p6=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;RE=32,ha=new Map,LE=new Map});function UE(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function Gm(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),s=String(r||"").toLowerCase(),a=(t||[]).map((c,l)=>{let u=UE(o,c),d=String(u.address||"").toLowerCase(),p=String(u.symbol||"").toLowerCase(),m=Number(c.liquidityUsd??c.liquidity?.usd),f=Number.isFinite(m)?m:0,h=String(c.dex||c.dexId||"").toLowerCase(),g=0;return i.has(d)||h6.has(p)?g=300:s&&d===s&&(g=100),h.includes("v4")?g+=20:h.includes("v3")?g+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(g+=8),{pool:c,score:g*1e12+f,index:l,otherAddr:d,liquidityUsd:f}});return a.sort((c,l)=>l.score-c.score||c.index-l.index),a.map(c=>c.pool)}function FE(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&UE(e,n[0]).address||null}var h6,Km=_(()=>{h6=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function HE(e,t,n){let r=nt(t),o=nt(n),i=nt(e?.baseToken?.address),s=nt(e?.quoteToken?.address);return i===r&&s===o||i===o&&s===r}function zE(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function y6(e,t,n){let r=nt(e?.baseToken?.address)===nt(t),o=r?e?.baseToken:e?.quoteToken,i=r?e?.quoteToken:e?.baseToken,s=a=>({address:a?.address??null,name:a?.name??null,symbol:a?.symbol??null});return Object.freeze({chainSlug:e?.chainId??null,dexId:e?.dexId??null,poolAddress:e?.pairAddress??null,url:e?.url??null,labels:Object.freeze([...e?.labels??[]]),token0:Object.freeze(s(o)),token1:Object.freeze(s(i)),priceNative:e?.priceNative??null,priceUsd:e?.priceUsd??null,txns:e?.txns??null,volume:e?.volume??null,priceChange:e?.priceChange??null,liquidity:e?.liquidity??null,liquidityUsd:zE(e),fdv:qE(e?.fdv),marketCap:qE(e?.marketCap),pairCreatedAt:e?.pairCreatedAt??null,info:e?.info??null,boosts:e?.boosts??null})}function VE(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||Ym).replace(/\/$/,"")}function Uo(e,t){if(typeof e!="string"&&typeof e!="number")throw new Error(`${t} required`);let n=String(e).trim();if(!n||n.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:+~-]*$/u.test(n))throw new Error(`${t} must be a valid path component of at most 128 characters`);return encodeURIComponent(n)}function b6(e){if(typeof e!="string")throw new Error("query required");let t=e.trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/u.test(t))throw new Error("query must contain 1 to 200 printable characters");return t}function uu(e=Ri,t=Ri){if(!Number.isInteger(e)||e<1||e>t)throw new Error(`limit must be an integer from 1 to ${t}`);return e}function tr(e,t){return x(`${VE(t)}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}function du(e,t){let r=(Array.isArray(e)?e:e==null?[]:[e]).slice(0,t);return Object.freeze({items:Object.freeze(r),count:r.length,limit:t})}function WE(e){let t=Array.isArray(e)?e:Array.isArray(e?.pairs)?e.pairs:[];return Object.freeze({schemaVersion:e&&!Array.isArray(e)?e.schemaVersion??null:null,pairs:Object.freeze(t),count:t.length})}async function GE(e={}){let n=(await x(`${VE(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function jn(e,t={}){return tr(`/latest/dex/tokens/${Uo(e,"tokenAddress")}`,t)}async function Sa(e,t={}){return tr(`/latest/dex/search?q=${encodeURIComponent(b6(e))}`,t)}async function KE(e,t,n={}){return tr(`/latest/dex/pairs/${Uo(e,"chainId")}/${Uo(t,"pairAddress")}`,n)}async function YE({limit:e=Ri}={},t={}){let n=uu(e);return du(await tr("/token-profiles/latest/v1",t),n)}async function XE({limit:e=Ri}={},t={}){let n=uu(e);return du(await tr("/community-takeovers/latest/v1",t),n)}async function JE({limit:e=Ri}={},t={}){let n=uu(e);return du(await tr("/token-boosts/latest/v1",t),n)}async function QE({limit:e=Ri}={},t={}){let n=uu(e);return du(await tr("/token-boosts/top/v1",t),n)}async function ZE({chainId:e,tokenAddress:t}={},n={}){let r=await tr(`/token-pairs/v1/${Uo(e,"chainId")}/${Uo(t,"tokenAddress")}`,n);return WE(r)}async function ex({chainId:e,tokenAddresses:t}={},n={}){let r=Array.isArray(t)?t:typeof t=="string"?t.split(","):[];if(r.length<1||r.length>wa)throw new Error(`tokenAddresses must contain 1 to ${wa} addresses`);let o=r.map(s=>Uo(s,"tokenAddress")).join(","),i=await tr(`/tokens/v1/${Uo(e,"chainId")}/${o}`,n);return WE(i)}async function tx({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await va({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function va({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=nt(g6[Number(e)]||e),s=new Set(jE(r).filter(Boolean).map(nt)),a=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(a.map(p=>jn(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${nt(m?.chainId)}:${nt(m?.dexId)}:${nt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>nt(p?.chainId)===i).filter(p=>HE(p,t,n)).filter(p=>!s.size||s.has(nt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:zE(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}async function nx({chainSlug:e,token0:t,token1:n,limit:r=10,dexIds:o=[]}={},i={}){if(!e||!t||!n)throw new Error("dexscreenerExactPairPools: chainSlug, token0, and token1 required");if(!Number.isInteger(r)||r<1||r>10)throw new Error("dexscreenerExactPairPools: limit must be an integer from 1 to 10");let s=new Set(jE(o).filter(Boolean).map(nt)),a=await Promise.allSettled([t,n].map(u=>jn(u,{...i,baseUrl:i.dexscreenerBaseUrl??i.baseUrl,timeoutMs:i.dexscreenerTimeoutMs??i.timeoutMs??12e3}))),c=new Set,l=[];for(let u of a)if(u.status==="fulfilled")for(let d of u.value?.pairs??u.value?.data?.pairs??[]){if(nt(d?.chainId)!==nt(e)||!HE(d,t,n)||s.size&&!s.has(nt(d?.dexId)))continue;let p=`${nt(d?.chainId)}:${nt(d?.pairAddress)}`;c.has(p)||(c.add(p),l.push(y6(d,t,n)))}return l.sort((u,d)=>(d.liquidityUsd??-1)-(u.liquidityUsd??-1)||String(u.poolAddress).localeCompare(String(d.poolAddress))).slice(0,r)}var Ym,g6,nt,jE,qE,Ri,wa,nr=_(()=>{q();Km();Ym="https://api.dexscreener.com",g6=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),nt=e=>String(e??"").toLowerCase(),jE=e=>Array.isArray(e)?e:e==null?[]:[e];qE=e=>{if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null};Ri=100,wa=30});import{readFileSync as S6}from"node:fs";import{homedir as v6}from"node:os";import{join as pu}from"node:path";function E6(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let n=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return n?[n]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=v6();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||pu(t,".config","oracle")).trim();return[e,pu(n,"exec.env")].filter(Boolean)}return[e,pu(t,".config","oracle","exec.env"),pu(t,".config","mad-desk","exec.env")].filter(Boolean)}function rx(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of E6())try{let i=S6(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(s&&(r=s[1].trim(),r))break}catch{}if(!String(r||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return r}var ox=_(()=>{});var ix=_(()=>{});import{createHash as x6,createHmac as ax,timingSafeEqual as A6}from"node:crypto";function mu(e){return Array.isArray(e)?`[${e.map(mu).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${mu(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function cx(e,{required:t=!1}={}){try{return rx(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Jm(e){let{signature:t,...n}=e;return n}function lx(e,{secret:t}={}){let n=cx(t);return n?{...e,signature:ax("sha256",n).update(mu(Jm(e))).digest("hex")}:e}function I6(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return x6("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function De(e,{chainId:t,venue:n,data:r,secret:o}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");if(Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(String(e.venue).toLowerCase()!==String(n||"").toLowerCase())throw new Error("auto-slippage guard venue mismatch");let i=cx(o);if(i){let m=ax("sha256",i).update(mu(Jm(e))).digest("hex");if(!k6(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let s=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(s)||s<0||s>fu||!Number.isInteger(a)||a<0||a>fu||s>a)throw new Error("auto-slippage guard bounds are invalid");let c=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(c<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let u=c*BigInt(1e4-s),d=u/10000n;if(u%10000n!==0n&&(d+=1n),l<d)throw new Error("auto-slippage guard is under-protected relative to its quote");let p=O6(r);if(p!=null&&p!==l)throw new Error(`auto-slippage: calldata encodes floor ${p}, not the guard floor ${l} \u2014 refusing to bind`);return lx({...Jm(e),calldataHash:I6(r)},{secret:o})}function k6(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:A6(n,r)}function Xm(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function _6(e){let t=e==null?fu:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("auto-slippage cap must be a non-negative integer bps value");return Math.min(t,fu)}function Bt({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Xm(e,0),s=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,a=Math.min(60,Math.abs(Xm(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Xm(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+s+a+c)),u=_6(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Qm({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:s=!1,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l=sx,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=Bt({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:s,requestedCapBps:a});if(!p.executable)throw new Error(`auto-slippage requires ${p.requiredBps} bps above hard/requested cap ${p.capBps}; route blocked`);let m=Number(c);if(!Number.isFinite(m))throw new Error("auto-slippage: quotedAtMs must be a finite number");let f=Math.min(3e4,Math.max(1e3,Number(l)||sx)),h=d*BigInt(1e4-p.selectedBps),g=h/10000n;if(h%10000n!==0n&&(g+=1n),g>d&&(g=d),d>0n&&g<=0n)throw new Error(`auto-slippage: quote ${d} is too small to express a ${p.selectedBps} bps floor without rounding to zero`);let y=Number((d-g)*10000n/(d===0n?1n:d));if(y>p.capBps)throw new Error(`auto-slippage: realised floor implies ${y} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return lx({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:g.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:m,expiresAtMs:m+f},{secret:u})}function O6(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let n=t.slice(0,10).toLowerCase(),r=[];for(let i=10;i+64<=t.length;i+=64)r.push(t.slice(i,i+64));let o=i=>r[i]==null?null:BigInt("0x"+r[i]);switch(n){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function we(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Qm({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:s,requestedCapBps:a,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var fu,sx,Ot=_(()=>{ox();ix();fu=100,sx=2e4});import{createHash as N6,createHmac as T6,timingSafeEqual as ece}from"node:crypto";function C6(e){let t=e==null||e===""?Li:Number(e);return!Number.isFinite(t)||t<0?Li:Math.min(t,eh)}function Zm(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Zm).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Zm(e[n])}`).join(",")}}`}function ux(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function px(e=process.env){return ux(process.env)||ux(e)}function P6(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function rr(e){let t=P6(e);return N6("sha256").update(Zm(t)).digest("hex")}function fx(e,t=px()){return t?T6("sha256",t).update(String(e)).digest("hex"):""}function U(e,{provider:t,kind:n,env:r=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Li:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>eh)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...a,preparedAt:c,expiresAt:l,prepareVersion:dx},m=rr(p),f=px(r),h=f?fx(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}function th(e,{maxAgeMs:t=Li,nowMs:n=Date.now(),providers:r=null,kinds:o=null,label:i="operator"}={}){if(!e||typeof e!="object")throw new Error(`${i}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${i}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==dx)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let s=rr(e);if(String(e.prepareHash||"")!==s)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let a=Number(e.preparedAt),c=Number(e.expiresAt),l=C6(t),u=n-a,d=c-a;if(!Number.isFinite(u)||!Number.isFinite(c)||!Number.isFinite(d)||u<0||d<=0||d>eh||u>l||n>=c)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${u}, max=${l})`);if(r&&!new Set(r).has(e.provider))throw new Error(`${i}: provider ${e.provider} not allowed here`);if(o&&!new Set(o).has(e.kind))throw new Error(`${i}: kind ${e.kind} not allowed here`);return!0}var dx,Li,eh,oe=_(()=>{dx=2,Li=300*1e3,eh=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var ch={};ht(ch,{PANCAKE_FEE_TIERS:()=>hu,UNI_V3_CHAINS:()=>wt,UNI_V3_FEE_TIERS:()=>yx,UNI_V3_VENUES:()=>Sx,uniV3Chains:()=>ah,uniV3EthUsdc:()=>yu,uniV3Health:()=>sh,uniV3PrepareExactIn:()=>ih,uniV3QuoteExactIn:()=>or,uniV3QuoteExactInPath:()=>oh});import{Interface as hx,getAddress as Ea,isAddress as gx}from"ethers";function rh(e,t){let n=Number(e),r=wt[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(wt).join(", ")})`);let o=Sx[n]||{};if(!t){if(!r.quoter||!r.router){let c=Object.keys(o).join(", ")||"none registered";throw new Error(`uniswap-v3: chain ${n} (${r.name}) has no canonical Uniswap v3 deployment -- name a venue explicitly (known: ${c})`)}return{chainId:n,venue:r.name,...r}}let i=String(t).toLowerCase();if(i===r.name&&r.quoter&&r.router)return{chainId:n,venue:r.name,...r};let s=o,a=s[i];if(!a){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(s)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:a.quoter,router:a.router,feeTiers:a.feeTiers||null}}function nh(e,t){let n=wt[Number(t)];if(!e||e===bx||e===wx||/^eth$/i.test(String(e)))return Ea(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ea(n.weth);if(/^usdc$/i.test(r))return Ea(n.usdc);if(!gx(r))throw new Error(`invalid token address: ${e}`);return Ea(r)}function L6(e){let t=String(e||"uniswap").toLowerCase();return t==="uniswap"?["uniswap-v3","uniswap"]:t==="pancakeswap"?["pancakeswap-v3","pancakeswap"]:t==="hyperswap"?["hyperswap-v3","hyperswap"]:[t,`${t}-v3`]}function M6(e,t){if(e.length!==t.length+1)throw new Error("path: fees.length must be tokens.length - 1");let n="0x";for(let r=0;r<t.length;r++)n+=e[r].slice(2).toLowerCase(),n+=Number(t[r]).toString(16).padStart(6,"0");return n+=e[e.length-1].slice(2).toLowerCase(),n}async function or(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=rh(e.chainId??8453,e.venue),s=nh(e.tokenIn||"WETH",n),a=nh(e.tokenOut||wt[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");let l=i&&i.length?i:yx,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],p=await Promise.all(u.map(async A=>{let E=gu.encodeFunctionData("quoteExactInputSingle",[{tokenIn:s,tokenOut:a,amountIn:c,fee:A,sqrtPriceLimitX96:0n}]);try{let k=await J(n,"eth_call",[{to:r,data:E},"latest"],t);if(!k||k==="0x")return{fee:A,ok:!1,error:"empty result"};let O=gu.decodeFunctionResult("quoteExactInputSingle",k);return{fee:A,ok:!0,amountOut:O[0].toString(),sqrtPriceX96After:O[1].toString(),initializedTicksCrossed:Number(O[2]),gasEstimate:O[3].toString()}}catch(k){return{fee:A,ok:!1,error:String(k.message||k).slice(0,160)}}})),m=null;for(let A of p)A.ok&&(!m||BigInt(A.amountOut)>BigInt(m.amountOut))&&(m=A);if(!m){let A=p.map(E=>`${E.fee}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${A}`)}let f=e.liquidityUsd==null?await va({chainId:n,tokenA:s,tokenB:a,dexIds:L6(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(f.slice(0,8).map(async A=>{if(!(!A.pairAddress||!gx(A.pairAddress)))try{let E=await J(n,"eth_call",[{to:A.pairAddress,data:R6},"latest"],t),k=E&&E!=="0x"&&E.length<=66?Number.parseInt(E,16):NaN;if(!Number.isFinite(k)||k<=0||k>1e6)return;let O=h[k];(O==null||A.liquidityUsd>O.liquidityUsd)&&(h[k]=A)}catch{}}));let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),y=null;if(e.fee==null&&g>0&&BigInt(m.amountOut)>0n){let A=BigInt(m.amountOut),k=p.filter(O=>O.ok&&Number((A-BigInt(O.amountOut))*10000n/A)<=g).filter(O=>h[O.fee]?.liquidityUsd!=null).sort((O,T)=>h[T.fee].liquidityUsd-h[O.fee].liquidityUsd)[0];k&&k.fee!==m.fee&&(y={priceBestFee:m.fee,chosenFee:k.fee,chosenPoolUsd:h[k.fee].liquidityUsd,bandBps:g},m=k)}let b=h[m.fee]??null,w=f[0]??null,S=b??w,v=e.liquidityUsd??b?.liquidityUsd??w?.liquidityUsd??null,I=e.liquidityUsd!=null?"caller":b?"pool":w?"pair":null;return we({venue:"uniswap-v3",chainId:n,chain:wt[n].name,quoter:r,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:m.fee,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:v,liquiditySource:S,liquidityAttribution:I,liquidityPick:y,sqrtPriceX96After:m.sqrtPriceX96After,initializedTicksCrossed:m.initializedTicksCrossed,triedFees:p,best:!0},{chainId:n,venue:o,amountOut:m.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function oh(e={},t={}){let{chainId:n,quoter:r,router:o}=rh(e.chainId??8453),i=(e.tokens||[]).map(p=>nh(p,n)),s=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required");let c=M6(i,s),l=gu.encodeFunctionData("quoteExactInput",[c,a]),u=await J(n,"eth_call",[{to:r,data:l},"latest"],t),d=gu.decodeFunctionResult("quoteExactInput",u);return we({venue:"uniswap-v3",chainId:n,chain:wt[n].name,quoter:r,tokens:i,fees:s,path:c,amountIn:a.toString(),amountOut:d[0].toString(),gasEstimate:d[3].toString()},{chainId:n,venue:o,amountOut:d[0].toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function yu(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await or({chainId:n,tokenIn:wt[n].weth,tokenOut:wt[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function ih(e={},t={}){let n=Number(e.chainId??8453),r=rh(n,e.venue),o=Ea(e.recipient),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===bx||i===wx||/^eth$/i.test(i),a=await or(e,t),c=mx.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,fee:a.fee,recipient:o,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]),l=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),d=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,p=mx.encodeFunctionData("multicall",[d,[c]]);return U({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:s?a.amountIn:"0",slippageGuard:De(a.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function sh(e={}){let t=Number(e.chainId??8453);try{let n=await yu({chainId:t,amountIn:"1000000000000000"},e);return{ok:!0,chainId:t,fee:n.fee,amountOutUsdc:n.amountOutUsdc,midPxHint:n.amountOutUsdc/.001}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function ah(){return Object.entries(wt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var wt,yx,R6,gu,mx,bx,wx,hu,Sx,Mi=_(()=>{Ne();nr();Ot();oe();wt={1:{name:"ethereum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},8453:{name:"base",quoter:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",router:"0x2626664c2603336E57B271c5C0b26F421741e481",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},4663:{name:"robinhood",quoter:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",router:"0xcaf681a66d020601342297493863e78c959e5cb2",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"},999:{name:"hyperevm",weth:"0x5555555555555555555555555555555555555555",usdc:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"},10:{name:"optimism",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",quoter:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",router:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",quoter:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",router:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},43114:{name:"avalanche",quoter:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",router:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}},yx=[100,500,3e3,1e4],R6="0xddca3f43",gu=new hx(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)","function quoteExactInput(bytes path, uint256 amountIn) returns (uint256 amountOut, uint160[] sqrtPriceX96AfterList, uint32[] initializedTicksCrossedList, uint256 gasEstimate)"]),mx=new hx(["function exactInputSingle((address tokenIn,address tokenOut,uint24 fee,address recipient,uint256 amountIn,uint256 amountOutMinimum,uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)","function multicall(uint256 deadline,bytes[] data) payable returns (bytes[] results)"]),bx="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",wx="0x0000000000000000000000000000000000000000",hu=[100,500,2500,1e4],Sx={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:hu}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:hu}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:hu}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Sh={};ht(Sh,{UNI_V4_CHAINS:()=>Gt,UNI_V4_FEE_TIERS:()=>dh,computeV4PoolId:()=>Su,decodeV4HookPermissions:()=>fh,uniV4Chains:()=>bh,uniV4Health:()=>wh,uniV4InspectHook:()=>hh,uniV4PrepareExactIn:()=>yh,uniV4QuoteExactIn:()=>Dr,uniV4QuoteExactOut:()=>gh});import{AbiCoder as $6,Interface as lh,getAddress as Dt,isAddress as uh,keccak256 as Ex}from"ethers";function fh(e){let t=Fo(e),n=Number(BigInt(t)&D6),r=Object.fromEntries(vx.map(([s,a])=>[a,!!(n&1<<s)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([s,a])=>r[s]&&!r[a]).map(([s,a])=>`${s} requires ${a}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(vx.filter(([,s])=>r[s]).map(([,s])=>s)),valid:i.length===0,violations:Object.freeze(i)})}function xa(e){let t=Number(e),n=Gt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Gt).join(", ")})`);return{chainId:t,...n}}function Fo(e){if(e==null||e==="")return St;let t=String(e);if(!uh(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Dt(t)}function Di(e,t){let n=Gt[Number(t)];if(Bi(e))return Dt(St);let r=String(e);if(/^weth$/i.test(r))return Dt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return Dt(n.usdc);if(!uh(r))throw new Error(`invalid token address: ${e}`);return Dt(r)}function Bi(e){let t=String(e||"").trim().toLowerCase();return!t||t===j6.toLowerCase()||t===St.toLowerCase()||t==="eth"}function Su({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=St}){let i=Dt(e),s=Dt(t);if(i.toLowerCase()===s.toLowerCase())throw new Error("poolKey currencies must differ");let[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=Fo(o);return Ex($i.encode(["address","address","uint24","int24","address"],[a,c,Number(n),Number(r),l]))}function mh({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=St}){let i=Dt(e),s=Dt(t),[a,c]=i.toLowerCase()<s.toLowerCase()?[i,s]:[s,i],l=i.toLowerCase()===a.toLowerCase();return{poolKey:{currency0:a,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:Fo(o)},zeroForOne:l}}function H6({poolKey:e,poolId:t,tokenIn:n,tokenOut:r,fee:o,tickSpacing:i,hooks:s}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("uniswap-v4 exact poolKey must be an object");let a=Dt(e.currency0),c=Dt(e.currency1);if(a.toLowerCase()>=c.toLowerCase())throw new Error("uniswap-v4 exact poolKey requires canonical currency ordering");let l=Number(e.fee),u=Number(e.tickSpacing);if(!Number.isInteger(l)||l<0||l>16777215)throw new Error("uniswap-v4 exact poolKey requires uint24 fee");if(!Number.isInteger(u)||u<-8388608||u>8388607)throw new Error("uniswap-v4 exact poolKey requires int24 tickSpacing");let d=Fo(e.hooks),p={currency0:a,currency1:c,fee:l,tickSpacing:u,hooks:d},m=Dt(n),f=Dt(r);if(m.toLowerCase()===f.toLowerCase())throw new Error("tokenIn and tokenOut must differ");let h=new Set([a.toLowerCase(),c.toLowerCase()]);if(!h.has(m.toLowerCase())||!h.has(f.toLowerCase()))throw new Error("uniswap-v4 exact poolKey currencies do not match tokenIn/tokenOut");if(o!=null&&Number(o)!==l)throw new Error("uniswap-v4 exact poolKey fee conflicts with top-level fee");if(i!=null&&Number(i)!==u)throw new Error("uniswap-v4 exact poolKey tickSpacing conflicts with top-level tickSpacing");if(s!=null&&Fo(s).toLowerCase()!==d.toLowerCase())throw new Error("uniswap-v4 exact poolKey hooks conflict with top-level hooks");let g=Ex($i.encode(["address","address","uint24","int24","address"],[a,c,l,u,d]));if(t!=null){if(!/^0x[0-9a-f]{64}$/i.test(String(t)))throw new Error("uniswap-v4 exact poolId must be bytes32");if(String(t).toLowerCase()!==g.toLowerCase())throw new Error(`uniswap-v4 exact poolId mismatch: expected ${g}`)}return{poolKey:p,poolId:g,zeroForOne:m.toLowerCase()===a.toLowerCase()}}function z6({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=fh(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),s=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,a=[],c="none";return e!==St&&(c="low",a.push("nonzero hook requires independent contract review")),r&&(c="medium",a.push("pool uses a dynamic LP fee")),s&&(c="medium",a.push("hook runs during swap or donate flow")),i&&(c="high",a.push("hook can return custom accounting deltas")),o.valid||(c="critical",a.push(...o.violations)),r&&e===St&&(c="critical",a.push("dynamic-fee pool has no hook authority")),e!==St&&o.enabled.length===0&&(c="critical",a.push("nonzero hook declares no permissions")),n||(c="critical",a.push("pool is not initialized")),e!==St&&!t&&(c="critical",a.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==St,returnsDelta:i,reasons:Object.freeze(a)})}async function hh(e={},t={}){let n=xa(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Di(e.tokenIn||"WETH",n.chainId),o=Di(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),s=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(s)||s<-8388608||s>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let a=Fo(e.hooks),{poolKey:c}=mh({tokenIn:r,tokenOut:o,fee:i,tickSpacing:s,hooks:a}),l=Su(c),u=t.rpcCall||J,d=bu.encodeFunctionData("getSlot0",[l]),p=bu.encodeFunctionData("getLiquidity",[l]),[m,f,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),a===St?Promise.resolve(null):u(n.chainId,"eth_getCode",[a,"latest"],t)]),g=bu.decodeFunctionResult("getSlot0",m),y=bu.decodeFunctionResult("getLiquidity",f)[0],b=g[0],w=b>0n,S=a===St?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&ph),I=z6({hook:a,codePresent:S,initialized:w,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:w,sqrtPriceX96:b.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:y.toString(),dynamicFee:v}),hook:Object.freeze({address:a,codePresent:S,codeBytes:S?(h.length-2)/2:0,permissions:fh(a)}),risk:I})}async function Dr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=xa(e.chainId??8453),s=Di(e.tokenIn||"WETH",n),a=Di(e.tokenOut||Gt[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.poolKey==null?null:H6({poolKey:e.poolKey,poolId:e.poolId,tokenIn:s,tokenOut:a,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks}),u=l?[{fee:l.poolKey.fee,tickSpacing:l.poolKey.tickSpacing}]:e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...dh],d=l?l.poolKey.hooks:e.hooks||St,m=await Promise.all(u.map(async k=>{let O=l||mh({tokenIn:s,tokenOut:a,fee:k.fee,tickSpacing:k.tickSpacing,hooks:d}),{poolKey:T,zeroForOne:D}=O,X=wu.encodeFunctionData("quoteExactInputSingle",[{poolKey:T,zeroForOne:D,exactAmount:c,hookData:"0x"}]);try{let H=await(t.rpcCall||J)(n,"eth_call",[{to:r,data:X},"latest"],t);if(!H||H==="0x")return{...k,ok:!1,error:"empty result"};let $=wu.decodeFunctionResult("quoteExactInputSingle",H);return{fee:k.fee,tickSpacing:k.tickSpacing,ok:!0,amountOut:$[0].toString(),gasEstimate:$[1].toString(),poolKey:T,zeroForOne:D,poolId:O.poolId||Su({...T})}}catch(H){return{...k,ok:!1,error:String(H.message||H).slice(0,160)}}})),f=null;for(let k of m)k.ok&&(!f||BigInt(k.amountOut)>BigInt(f.amountOut))&&(f=k);if(!f){let k=m.map(O=>`${O.fee}/${O.tickSpacing}:${O.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${k}`)}let h=e.liquidityUsd==null?await va({chainId:n,tokenA:s,tokenB:a,dexIds:xx},t).catch(()=>[]):[],g=new Map;for(let k of h){let O=String(k.pairAddress||"").toLowerCase();O&&g.set(O,k)}let y=k=>g.get(String(k.poolId||"").toLowerCase())??null,b=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!l&&!(e.fee!=null&&e.tickSpacing!=null)&&b>0&&BigInt(f.amountOut)>0n){let k=BigInt(f.amountOut),T=m.filter(D=>D.ok&&Number((k-BigInt(D.amountOut))*10000n/k)<=b).filter(D=>y(D)?.liquidityUsd!=null).sort((D,X)=>y(X).liquidityUsd-y(D).liquidityUsd)[0];T&&T.poolId!==f.poolId&&(w={priceBestFee:f.fee,chosenFee:T.fee,chosenPoolUsd:y(T).liquidityUsd,bandBps:b},f=T)}let S=y(f),v=h[0]??null,I=S??v,A=e.liquidityUsd??S?.liquidityUsd??v?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":S?"pool":v?"pair":null;return we({venue:"uniswap-v4",chainId:n,chain:Gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:c.toString(),fee:f.fee,tickSpacing:f.tickSpacing,hooks:f.poolKey.hooks,poolId:f.poolId,poolKey:Object.freeze({...f.poolKey}),zeroForOne:f.zeroForOne,amountOut:f.amountOut,gasEstimate:f.gasEstimate,liquidityUsd:A,liquiditySource:I,liquidityAttribution:E,liquidityPick:w,triedTiers:m,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&uh(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!Bi(e.tokenIn)&&!Bi(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&f.poolKey.hooks===St&&!(f.fee&ph)},{chainId:n,venue:i||r,amountOut:f.amountOut,liquidityUsd:A,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function gh(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=xa(e.chainId??8453),s=Di(e.tokenIn||"WETH",n),a=Di(e.tokenOut||Gt[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...dh],u=e.hooks||St,p=await Promise.all(l.map(async h=>{let{poolKey:g,zeroForOne:y}=mh({tokenIn:s,tokenOut:a,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),b=wu.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:y,exactAmount:c,hookData:"0x"}]);try{let w=await(t.rpcCall||J)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!w||w==="0x")return{...h,ok:!1,error:"empty result"};let S=wu.decodeFunctionResult("quoteExactOutputSingle",w);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:S[0].toString(),gasEstimate:S[1].toString(),poolKey:g,zeroForOne:y,poolId:Su({...g})}}catch(w){return{...h,ok:!1,error:String(w.message||w).slice(0,160)}}})),m=null;for(let h of p)h.ok&&(!m||BigInt(h.amountIn)<BigInt(m.amountIn))&&(m=h);if(!m){let h=p.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await tx({chainId:n,tokenA:s,tokenB:a,dexIds:xx},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:Gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:s,tokenOut:a,amountIn:m.amountIn,amountOut:c.toString(),gasEstimate:m.gasEstimate,fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function yh(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(I=>Object.hasOwn(e,I)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=xa(r);if(Fo(e.poolKey?.hooks??e.hooks)!==St)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.poolKey?.fee??e.fee)&ph)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let a=Dt(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let c=Number(e.slippageBps);if(!Number.isInteger(c)||c<0||c>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let l=Number(e.deadlineSeconds);if(!Number.isInteger(l)||l<30||l>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");let u=e.poolKey&&typeof e.poolKey=="object"?[e.poolKey.currency0,e.poolKey.currency1]:[];if(Bi(e.tokenIn)||Bi(e.tokenOut)||u.some(Bi))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let d=await Dr(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let p=BigInt(d.amountOut)*BigInt(1e4-c)/10000n,m={currency0:d.zeroForOne?d.tokenIn:d.tokenOut,currency1:d.zeroForOne?d.tokenOut:d.tokenIn,fee:d.fee,tickSpacing:d.tickSpacing,hooks:d.hooks},h=$i.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[m,d.zeroForOne,BigInt(d.amountIn),p,0n,"0x"]]),g=$i.encode(["address","uint256"],[d.tokenIn,BigInt(d.amountIn)]),y=$i.encode(["address","uint256"],[d.tokenOut,p]),b=$i.encode(["bytes","bytes[]"],[F6,[h,g,y]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+l,v=B6.encodeFunctionData("execute",[U6,[b],S]);return U({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...d,amountOutMinimum:p.toString(),slippageBps:c},hookInspection:null,requiresApproval:{token:d.tokenIn,spender:q6,amount:d.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:v,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function bh(){return Object.entries(Gt).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function wh(e={}){let t=xa(e.chainId??8453),n=await J(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var $i,St,Gt,dh,wu,B6,bu,vx,D6,ph,U6,F6,q6,j6,xx,Ui=_(()=>{Ne();nr();Ot();oe();$i=$6.defaultAbiCoder(),St="0x0000000000000000000000000000000000000000",Gt={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},dh=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],wu=new lh(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut, uint256 gasEstimate)","function quoteExactOutputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountIn, uint256 gasEstimate)"]),B6=new lh(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),bu=new lh(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),vx=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),D6=(1n<<14n)-1n,ph=8388608;U6="0x10",F6="0x060c0f",q6="0x000000000022D473030F116dDEE9F6B43aC78BA3",j6="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";xx=["uniswap-v4","uniswapv4"]});function K6(e){if(!e||e==="0x")return{kind:"empty",reason:"reverted without a reason (often a require with no message, or out of gas)"};let t=String(e).slice(2),n=t.slice(0,8);if(n===V6)try{let r=parseInt(t.slice(72,136),16),o=t.slice(136,136+r*2);return{kind:"revert",reason:Buffer.from(o,"hex").toString("utf8"),selector:`0x${n}`}}catch{return{kind:"revert",reason:"Error(string) payload could not be decoded",selector:`0x${n}`}}if(n===W6){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:G6[r]||`panic code 0x${r.toString(16)}`,selector:`0x${n}`}}return{kind:"custom",reason:`custom error ${`0x${n}`} (decoding needs the contract ABI)`,selector:`0x${n}`}}function Y6(e){let t=[e?.data,e?.error?.data,e?.data?.data,e?.cause?.data,e?.body?.error?.data];for(let o of t){if(typeof o=="string"&&o.startsWith("0x")&&o.length>2)return o;if(typeof o?.data=="string"&&o.data.startsWith("0x")&&o.data.length>2)return o.data}let r=String(e?.message||"").match(/0x[0-9a-fA-F]{72,}/);return r?r[0]:null}function X6(e,t){if(t)return!0;let n=String(e?.message||"").toLowerCase();return!!/execution reverted|revert|invalid opcode|out of gas|stack underflow|insufficient funds for/.test(n)}function J6(e={}){let t={};return e.from&&(t.from=String(e.from).toLowerCase()),e.to&&(t.to=String(e.to).toLowerCase()),e.data&&e.data!=="0x"&&(t.data=e.data),e.value!=null&&String(e.value)!=="0"&&(t.value=`0x${BigInt(e.value).toString(16)}`),t}async function qo(e={},t={}){let n=t.rpcCall||J,r=Number(e.chainId),o=e.tx||{};if(!Number.isInteger(r))return{status:"error",willRevert:null,error:"chainId is required"};if(!o.to||!/^0x[a-fA-F0-9]{40}$/.test(String(o.to)))return{status:"error",willRevert:null,error:"tx.to must be a valid address"};if(o.from&&!/^0x[a-fA-F0-9]{40}$/.test(String(o.from)))return{status:"error",willRevert:null,error:"tx.from must be a valid address"};let i=J6(o),s=[],a=null,c=!1,l=null;try{a=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=Y6(f);if(!X6(f,!!h))return{status:"unavailable",willRevert:null,chainId:r,error:f?.message||"simulation unavailable",notes:["could not reach the node; this is NOT evidence the transaction would fail"]};c=!0,l=K6(h),h||(l.reason="execution reverted (node did not return a reason payload)",l.kind="revert-no-data")}if(c)return{status:"ok",willRevert:!0,chainId:r,revert:l,summary:`would REVERT: ${l.reason}`,notes:["simulated against current chain state; signing this now would burn gas and fail"]};let u=null,d=null;if(e.estimateGas!==!1)try{let f=await n(r,"eth_estimateGas",[i,"pending"],t);u=BigInt(f);let h=BigInt(Math.max(0,Math.floor(e.gasBufferPercent??20)));d=u+u*h/100n,s.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){s.push(`gas estimation failed: ${f?.message||"unknown"}`)}s.push("a pass reflects CURRENT chain state \u2014 it is not a guarantee the transaction lands, and in a contested mint the state changes between blocks");let p=`0x${"0".repeat(64)}`,m=a===p;return m&&s.push("call did not revert but returned boolean false \u2014 some ERC-20s (e.g. USDC) signal failure this way instead of reverting"),{status:"ok",willRevert:!1,returnsFalse:m,chainId:r,returnData:a,gasEstimate:u==null?null:u.toString(),gasLimit:d==null?null:d.toString(),summary:m?"executes but returns FALSE \u2014 the contract is rejecting this operation":u?`would succeed, ~${u} gas`:"would succeed",notes:s}}async function Ax(e={}){let t=Date.now();try{let n=await qo({chainId:1,tx:{to:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",data:`0x70a08231${"0".repeat(64)}`},estimateGas:!1},e),r=n.status==="ok";return{provider:"evm-simulate",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"eth_call reachable":n.error||"probe failed"}}catch(n){return{provider:"evm-simulate",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var V6,W6,G6,vu=_(()=>{Ne();V6="08c379a0",W6="4e487b71",G6=Object.freeze({1:"assertion failed",17:"arithmetic overflow or underflow",18:"division or modulo by zero",33:"invalid enum value",34:"invalid storage byte array encoding",49:"pop() on an empty array",50:"array index out of bounds",65:"out of memory",81:"call to an uninitialized function pointer"})});function e5(e={}){let t=[],n=[];if(!e||typeof e!="object")return{ok:!1,errors:["definition must be an object"],warnings:n};if((!Number.isInteger(e.chainId)||e.chainId<=0)&&t.push("chainId must be a positive integer"),(typeof e.key!="string"||!/^[a-z][a-z0-9-]*$/.test(e.key||""))&&t.push('key must be a lowercase slug (e.g. "base")'),(typeof e.name!="string"||!e.name.trim())&&t.push("name is required"),!Array.isArray(e.rpcEnv)||e.rpcEnv.length===0)t.push("rpcEnv must list at least one environment variable name");else for(let o of e.rpcEnv)(typeof o!="string"||!/^[A-Z][A-Z0-9_]*$/.test(o))&&t.push(`rpcEnv entry "${o}" should be an UPPER_SNAKE env var name`);if(e.nativeCurrency){let o=e.nativeCurrency;(typeof o.symbol!="string"||!o.symbol)&&t.push("nativeCurrency.symbol is required when nativeCurrency is set"),Number.isInteger(o.decimals)||t.push("nativeCurrency.decimals must be an integer")}for(let[o,i]of(e.venues||[]).entries()){let s=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${s} must be an object`);continue}Z6.test(i.address||"")||t.push(`${s}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${s}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${s}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${s}.verified.method is required`),i.verified.source||t.push(`${s}.verified.source is required`),i.verified.date||n.push(`${s}.verified.date missing -- add one so staleness is visible`)):t.push(`${s} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))Eu.includes(o)?typeof r[o]!="function"&&t.push(`capability "${o}" must be a function`):t.push(`unknown capability "${o}"`);return Object.keys(r).length===0&&n.push("scanner implements no capabilities -- it can only be registered, not used"),r.prepareUnsignedTx&&!r.quote&&n.push("prepareUnsignedTx without quote: no priced expectation to validate the built tx against"),r.prepareUnsignedTx&&!r.sellSimulation&&n.push("prepareUnsignedTx without sellSimulation: cannot prove an asset is exitable before buying"),{ok:t.length===0,errors:t,warnings:n}}function t5(e){let{ok:t,errors:n,warnings:r}=e5(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
5
|
+
- ${n.join(`
|
|
6
|
+
- `)}`);let o=e.capabilities||{},i=Eu.filter(a=>typeof o[a]=="function"),s={key:e.key,chainId:e.chainId,name:e.name,rpcEnv:[...e.rpcEnv],nativeCurrency:e.nativeCurrency?{...e.nativeCurrency}:null,wrappedNative:e.wrappedNative||null,explorer:e.explorer||null,venues:(e.venues||[]).map(a=>({...a})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Eu.filter(a=>!i.includes(a))}},supports(a){return i.includes(a)}};for(let a of Eu)i.includes(a)?s[a]=async(...c)=>o[a](...c,{scanner:s}):s[a]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${a}". Supported: ${i.join(", ")||"none"}. An unimplemented capability is absent, not assumed -- implement it or treat this chain as fail-closed for that operation.`)};return Object.freeze(s)}function Eh(e){let t=t5(e);return vh.set(t.chainId,t),t}function Ix(e){return vh.get(Number(e))||null}function kx(){return[...vh.values()]}var Eu,se,te,Z6,vh,jo=_(()=>{Eu=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),se=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),te=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),Z6=/^0x[0-9a-fA-F]{40}$/;vh=new Map});function _x(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,feeIncludedInAmountOut:s=!1,oracleFeeBps:a=0,estimatedGas:c=null,liquidityUsd:l=null,error:u=null,executionReady:d=!1,meta:p={}}=e||{};if(u||n==null)return{source:t,quality:dn.FAILED,amountOut:null,error:u||"no amountOut returned"};let m=Aa(n);if(m==null||m<=0n)return{source:t,quality:dn.FAILED,amountOut:null,error:"non-positive amountOut"};let f=Number(a);return{source:t,quality:o==null?dn.NO_GAS:dn.FULL,amountOut:m.toString(),minOut:Aa(r)?.toString()??null,gasUsd:o,feeUsd:i,feeIncludedInAmountOut:s===!0,oracleFeeBps:Number.isFinite(f)&&f>0?Math.floor(f):0,estimatedGas:c==null?null:String(c),liquidityUsd:l==null?null:Number(l),executionReady:d,meta:p}}async function Nx(e,t,{divisor:n=1000n}={}){let r=Aa(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,s;try{[i,s]=await Promise.all([e(o),e(r)])}catch{return null}let a=Aa(i),c=Aa(s);if(a==null||c==null||a<=0n)return null;let l=Number(a)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:a.toString(),fullAmountOut:c.toString()}}function Tx(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(a=>{let c=t?.[a.source];return c?c.impactPct>n?(r.push({source:a.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(a.source),!0)}),s=[...e.warnings??[]];return r.length&&s.push(`dropped ${r.length} route(s) on price impact: `+r.map(a=>`${a.source} (${a.impactPct}%)`).join(", ")),o.length&&s.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:s}}function xh(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:s=null}={}){let a=e.filter(k=>k.quality!==dn.FAILED),c=e.filter(k=>k.quality===dn.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(s),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=a.map(k=>{let O=BigInt(k.amountOut),T=0n,D=!1,X=!1,H=BigInt(k.oracleFeeBps??0),$=H>0n?O*H/10000n:0n;if(l){let B=k.gasUsd,V=Number(k.meta?.gasUnits??k.estimatedGas);if(B==null&&p&&Number.isFinite(V)&&V>0){let Oe=V*u/1e18*d;Number.isFinite(Oe)&&Oe>=0&&(B=Oe,X=!0)}let K=(B??0)+(k.feeIncludedInAmountOut?0:k.feeUsd??0);if(K>0){let Oe=K/t*10**n;Number.isFinite(Oe)&&Oe>=0&&(T=BigInt(Math.floor(Oe)),D=!0)}else B===0&&(D=!0)}let j=T+$,C=O>j?O-j:0n;return{...k,grossOut:O.toString(),netOut:C.toString(),costInDest:T.toString(),oracleFeeInDest:$.toString(),costAccounted:D,gasEstimated:X}}),f=Number(o)>0?Number(o):0,h=m.reduce((k,O)=>BigInt(O.netOut)>k?BigInt(O.netOut):k,0n),g=k=>h>0n?Number((h-BigInt(k))*10000n/h):0,y=[],b=(k,O)=>{let T=BigInt(k.netOut),D=BigInt(O.netOut);return T!==D?D>T?1:-1:String(k.source).localeCompare(String(O.source))},w=m.slice().sort(b)[0]??null;m.sort((k,O)=>{let T=g(k.netOut)<=f?0:1,D=g(O.netOut)<=f?0:1;if(r&&f>0&&T!==D)return T-D;if(r&&f>0){let X=k.liquidityUsd??-1,H=O.liquidityUsd??-1;if(X!==H)return H-X}return b(k,O)}),r&&f>0&&w&&m[0]&&m[0].source!==w.source&&y.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${w.source} within ${f} bps`);let S=m.filter(k=>!k.costAccounted).map(k=>k.source);l?S.length&&y.push(`gas not reported by: ${S.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):y.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let v=m[0];if(l&&v&&v.costAccounted===!1){let k=m.find(O=>O.costAccounted&&g(O.netOut)<=f);k&&y.push(`winner ${v.source} has UNMEASURED gas; gas-measured ${k.source} is within ${f} bps and may net more once ${v.source}'s real gas is paid \u2014 prefer it if unsure.`)}let I=m.filter(k=>k.gasEstimated).map(k=>k.source);I.length&&y.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${I.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let A=null,E=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let k=BigInt(m[0].netOut),O=BigInt(m[1].netOut);O>0n&&(A=Number((k-O)*10000n/O),E=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:A,spreadBasis:E,rankedOn:l?"net-of-cost":"gross",warnings:y}}async function xu(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>{let s;return Promise.race([o,new Promise((a,c)=>{s=setTimeout(()=>c(new Error(`${i}: timeout`)),t)})]).finally(()=>clearTimeout(s))};return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let s=e[i].source;return o.status==="rejected"?_x({source:s,error:String(o.reason?.message||o.reason)}):_x({source:s,...o.value})})}var dn,Ox,Aa,Ah=_(()=>{jo();dn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),Ox={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},Aa=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}}});function Ih(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Ur}var Ur,Au=_(()=>{Ur="0x000000000000000000000000000000000000dEaD"});import{Contract as n5,JsonRpcProvider as r5}from"ethers";function l5(e){return c5.test(String(e||""))}async function Iu(e,{contract:t=o5,rpc:n=s5,chainId:r=i5,balanceOf:o}={}){if(!l5(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new r5(n,r,{staticNetwork:!0}),s=new n5(t,a5,i);return BigInt(await s.balanceOf(e))}var o5,i5,s5,a5,c5,kh=_(()=>{o5="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",i5=999,s5="https://rpc.hyperliquid.xyz/evm",a5=["function balanceOf(address owner) view returns (uint256)"],c5=/^0x[a-fA-F0-9]{40}$/});import{existsSync as u5,readFileSync as d5,lstatSync as p5}from"node:fs";import{homedir as Cx}from"node:os";import{join as _h}from"node:path";function h5(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Px,t)?Px[t]:m5}function S5(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Rx])return String(e[Rx]);let t=e.ORACLE_CONFIG_DIR||_h(Cx(),".config","oracle");return _h(t,"fee-recipient")}return _h(Cx(),".config","oracle","fee-recipient")}function Oh(e=process.env){try{let t=S5(e);if(!u5(t)||p5(t).isSymbolicLink())return"";let n=d5(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function v5(e,{fallback:t=0}={}){if(e==null)return t;if(String(e).trim()==="")return 0;let n=Number(e);return!Number.isFinite(n)||n<=0?0:Math.min(Math.floor(n),f5)}function E5({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[y5]||"").trim(),o=String(e[b5]||w5).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=h5(t),s=v5(e[g5],{fallback:r?i:0}),a=Math.min(s,i);if(!a)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"not-configured"};if(!/^0x[a-fA-F0-9]{40}$/.test(r))return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"no-recipient"};let c=Oh(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:a,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function ku({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=E5({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let s=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(s))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await Iu(s,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Lx(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function Mx(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function $x(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var f5,m5,Px,g5,y5,b5,Rx,w5,Ia=_(()=>{kh();f5=100,m5=5,Px=Object.freeze({swap:5,bridge:5,perps:0,nft:0});g5="ORACLE_INTEGRATOR_FEE_BPS",y5="ORACLE_INTEGRATOR_FEE_RECIPIENT",b5="ORACLE_INTEGRATOR_ID",Rx="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",w5="oracle"});var Lh={};ht(Lh,{LIFI_API:()=>Bx,lifiChains:()=>Rh,lifiHealth:()=>Ch,lifiPrepare:()=>Ph,lifiQuote:()=>ir});function Th(e={}){return(e.baseUrl||process.env.LIFI_API_URL||Bx).replace(/\/$/,"")}function A5(e){let t=String(e||Nh).toLowerCase();return t===Nh.toLowerCase()||t===x5}function Fi(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`lifi: ${t} must be a 20-byte address`);return n.toLowerCase()}async function Ch(e={}){let t=await x(`${Th(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t.length:t?.chains?.length||0;return{ok:n>0,chainCount:n}}async function ir(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Nh,toToken:i,fromAmount:s,fromAddress:a=Ur}=e;if(n==null||!i||!s)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(s),fromAddress:a}),l=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`lifi: route requires ${l.requiredBps} bps above cap ${l.capBps}`);c.set("slippage",String(l.selectedBps/1e4));let u=await ku({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,y]of Object.entries(Mx(u)))c.set(g,y);let d=await x(`${Th(t)}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.estimate?.toAmount||d?.toAmount;if(!p)return{...d,autoSlippagePolicy:l,oracleFee:u};let m=d?.transactionRequest?.to||d?.estimate?.approvalAddress||"lifi",f=we(d,{chainId:Number(n),venue:m,amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(n),requestedCapBps:e.maxSlippageBps??e.slippageBps}),h=d?.estimate?.toAmountMin||d?.toAmountMin;if(h!=null&&BigInt(h)<BigInt(f.amountOutMinimum))throw new Error("lifi: provider transaction is under-protected versus bounded auto-slippage floor");return{...f,oracleFee:u}}async function Ph(e={},t={}){let n=await ir(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");if(["nonce","authorizationList","maxFeePerBlobGas","blobVersionedHashes","blobs","kzg","signature","rawTransaction","signedTransaction","r","s","v"].find(d=>r[d]!=null))throw new Error("lifi: unsupported transaction authority");if(r.type!=null){let d=String(r.type).trim().toLowerCase();if(!/^(?:0x[0-9a-f]+|\d+)$/.test(d)||BigInt(d)>2n)throw new Error("lifi: unsupported transaction authority")}let i=Number(e.fromChain);if(r.chainId==null)throw new Error("lifi: transaction missing chain authority");if(Number(r.chainId)!==i)throw new Error("lifi: transaction chain mismatch");let s=e.fromAddress?Fi(e.fromAddress,"transaction sender"):r.from?Fi(r.from,"transaction sender"):null;if(!s)throw new Error("lifi: transaction missing sender authority");if(r.from&&Fi(r.from,"transaction sender")!==s)throw new Error("lifi: transaction sender mismatch");let a=Fi(r.to,"transaction target"),c=String(r.data);if(!/^0x(?:[0-9a-fA-F]{2})+$/.test(c))throw new Error("lifi: transaction calldata must be non-empty hex bytes");let l=String(r.value??"0x0");if(!/^(?:0x[0-9a-fA-F]+|\d+)$/.test(l))throw new Error("lifi: transaction value must be an unsigned integer string");let u=null;if(!A5(e.fromToken)){let d=n?.estimate?.approvalAddress||n?.approvalAddress;if(!d)throw new Error("lifi: ERC20 route missing approvalAddress");let p=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;u={token:Fi(p,"approval token"),spender:Fi(d,"approval spender"),amount:String(e.fromAmount)}}return U({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:i,quote:n,autoSlippage:n.autoSlippage,requiresApproval:u,transaction:{chainId:i,from:s,to:a,data:c,value:l,...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:De(n.autoSlippage,{chainId:i,venue:a,data:c})}},{provider:"lifi",kind:"lifi-tx",env:t.env,nowMs:t.nowMs,expiresAtMs:t.expiresAtMs})}async function Rh(e={}){return x(`${Th(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var Bx,Nh,x5,ka=_(()=>{q();Ot();Au();oe();Ia();Bx="https://li.quest/v1";Nh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",x5="0x0000000000000000000000000000000000000000"});var Dh={};ht(Dh,{PARASWAP_API:()=>Dx,paraswapHealth:()=>Bh,paraswapPrepare:()=>$h,paraswapPrice:()=>sr,paraswapTokens:()=>_u});function qi(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`${t} must be a 20-byte token address`);return n.toLowerCase()}async function _u(e={},t={}){let n=Number(e.chainId||1);return x(`${Mh(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:qi(e.srcToken,"srcToken"),destToken:qi(e.destToken,"destToken"),amount:String(e.amount),srcDecimals:String(Number(e.srcDecimals)),destDecimals:String(Number(e.destDecimals)),side:String(e.side||"SELL").toUpperCase(),network:String(n),version:String(e.version||"6.2")});e.includeDEXS&&r.set("includeDEXS",String(e.includeDEXS)),e.excludeDEXS&&r.set("excludeDEXS",String(e.excludeDEXS));let o=await ku({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[a,c]of Object.entries($x(o)))r.set(a,c);let i=await x(`${Mh(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.priceRoute?.destAmount;return s?{...we(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:s,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,quoteAgeMs:0,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to bind the price route to a validated transaction",oracleFee:o}:{...i,executionReady:!1,oracleFee:o}}async function $h(e={},t={}){if(String(e.side||"SELL").toUpperCase()!=="SELL")throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");let n=Number(e.chainId||e.network||1),r=qi(e.userAddress,"userAddress"),o=await sr(e,t),i=o?.priceRoute,s=String(i?.contractAddress||"").toLowerCase();if(!s)throw new Error("paraswap: price route missing contractAddress");let a={srcToken:qi(e.srcToken,"srcToken"),destToken:qi(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(a.receiver=qi(e.receiver,"receiver"));let c=await x(`${Mh(t)}/transactions/${n}`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3});if(Number(c.chainId??n)!==n)throw new Error("paraswap: transaction chain mismatch");if(String(c.to||"").toLowerCase()!==s)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return U({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:a.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:a.srcToken,spender:i.tokenTransferProxy||s,amount:a.srcAmount}:null,transaction:{chainId:n,from:c.from||r,to:c.to,data:c.data,value:c.value??"0x0",...c.gas!=null?{gasLimit:c.gas}:{},slippageGuard:De(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Bh(e={}){let t=await _u({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var Dx,Mh,_a=_(()=>{q();Ot();oe();Ia();Dx="https://api.paraswap.io",Mh=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||Dx).replace(/\/$/,"")});function Me({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let s=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(s===String(t).replace(/\/$/,""))return{baseUrl:s,trusted:!0,host:Fx(t)};let a;try{a=new URL(s)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(a.protocol!=="http:"&&a.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=a.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([Fx(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return a.protocol==="http:"&&!u?{baseUrl:s,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:s,trusted:!0,host:c}}if(String(process.env[Ux]||"")==="1")return{baseUrl:s,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Ux}=1 to permit it)`);return{baseUrl:s,trusted:!1,host:c}}function Fx(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function pn(e){return typeof e=="string"&&e.length>0&&e.length<=4096&&!/[\s"\\[\]{},:]/u.test(e)?e:""}function Ue(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var Ux,vt=_(()=>{Ux="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});var qh={};ht(qh,{ZEROX_API:()=>qx,zeroxHealth:()=>Uh,zeroxPrepare:()=>Fh,zeroxPrice:()=>Nu,zeroxQuote:()=>Fr});function jx(e={}){return Me({provider:"zerox",defaultUrl:qx,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Hx(e={}){return jx(e).baseUrl}function Ou(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function zx(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Ou(e)},jx(e).trusted)}async function Uh(e={}){if(!Ou(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Nu({chainId:8453,sellToken:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",buyToken:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",sellAmount:"1000000000000000"},e);return{ok:!0,configured:!0,buyAmount:t.buyAmount||t.grossBuyAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Nu(e={},t={}){if(!Ou(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let a=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return s&&a.set("taker",s),x(`${Hx(t)}/swap/allowance-holder/price?${a}`,{headers:zx(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Fr(e={},t={}){if(!Ou(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:s}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`0x: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(a.selectedBps)});s&&c.set("taker",s);let l=await x(`${Hx(t)}/swap/allowance-holder/quote?${c}`,{headers:zx(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?we(l,{chainId:n,venue:l?.transaction?.to||l?.to||"0x",amountOut:u,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):{...l,autoSlippagePolicy:a}}async function Fh(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Fr(e,t),r=n?.transaction;if(!r?.to||!r?.data)throw new Error("0x: firm quote returned no transaction");let o=Number(e.chainId??8453),i=n?.issues?.allowance?.spender||n?.allowanceTarget;return U({provider:"zerox",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:n?.issues?.allowance?.actual!=null&&BigInt(n.issues.allowance.actual)<BigInt(e.sellAmount)?{token:e.sellToken,spender:i,amount:String(e.sellAmount)}:null,transaction:{chainId:o,from:e.taker,to:r.to,data:r.data,value:r.value??"0x0",...r.gas!=null?{gasLimit:r.gas}:{},slippageGuard:De(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var qx,Oa=_(()=>{q();Ot();vt();oe();qx="https://api.0x.org"});function Vx(e={}){return Me({provider:"oneinch",defaultUrl:I5,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function jh(e={}){return Vx(e).baseUrl}function Na(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Hh(e={}){let t=Na(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Vx(e).trusted)}async function Wx(e={}){if(!Na(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Ta({chainId:8453,src:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dst:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",amount:"1000000000000000"},e)).dstAmount}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function Ta(e={},t={}){if(!Na(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e;if(!r||!o||!i)throw new Error("oneinchQuote requires src, dst, amount");let s=new URLSearchParams({src:r,dst:o,amount:String(i)}),a=await x(`${jh(t)}/${n}/quote?${s}`,{headers:Hh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return a?.dstAmount?we(a,{chainId:n,venue:"1inch-quote",amountOut:a.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):a}function k5(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function zh(e={},t={}){if(!Na(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return x(`${jh(t)}/${n}/approve/spender`,{headers:Hh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Gx(e={},t={}){if(!Na(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,s=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!s)throw new Error("oneinchPrepare requires src, dst, amount, from");let a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!a.executable)throw new Error(`1inch: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:s,slippage:String(a.selectedBps/100)});e.receiver&&c.set("receiver",e.receiver),e.referrer&&c.set("referrer",e.referrer),e.disableEstimate!=null&&c.set("disableEstimate",String(!!e.disableEstimate)),e.allowPartialFill!=null&&c.set("allowPartialFill",String(!!e.allowPartialFill)),e.includeProtocols&&c.set("includeProtocols",String(e.includeProtocols)),e.excludeProtocols&&c.set("excludeProtocols",String(e.excludeProtocols));let l=await x(`${jh(t)}/${n}/swap?${c}`,{headers:Hh(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),u=l?.tx;if(!u?.to||!u?.data)throw new Error("1inch: swap returned no executable tx");if(u.from&&String(u.from).toLowerCase()!==String(s).toLowerCase())throw new Error("1inch: transaction sender mismatch");let d=l?.dstAmount||l?.toTokenAmount||l?.buyAmount;if(!d)throw new Error("1inch: swap response missing dstAmount");let p=we(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!k5(r)){let f=l?.spender||l?.approvalAddress||(await zh({chainId:n},t))?.address;if(!f)throw new Error("1inch: ERC-20 route missing approval spender");m={token:r,spender:f,amount:String(i)}}return U({provider:"oneinch",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:p,autoSlippage:p.autoSlippage,requiresApproval:m,transaction:{chainId:n,from:u.from||s,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:De(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var I5,Vh=_(()=>{q();Ot();vt();oe();I5="https://api.1inch.dev/swap/v6.0"});function Wh(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Kx(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var Hce,Tu=_(()=>{Hce=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Cu from"node:fs";import O5 from"node:os";import Hi from"node:path";import{fileURLToPath as N5}from"node:url";function Yx(){return process.env.ORACLE_FAKE_HOME||O5.homedir()}function C5(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Pu(){return C5()?process.env.ORACLE_CONFIG_DIR||Hi.join(Yx(),".config","oracle"):Hi.join(Yx(),".config","oracle")}function P5(){return Hi.join(Pu(),"desk.json")}function R5(){return Hi.join(Pu(),"env")}function ji({force:e=!1}={}){if(ji._done&&!e)return ji._result||null;ji._done=!0;let t={},n=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,t[o]=s))};try{let o=R5();if(Cu.existsSync(o))for(let i of Cu.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(s[1],a)}}catch{}try{let o=P5();if(Cu.existsSync(o)){let i=JSON.parse(Cu.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),ji._result=Object.keys(t).length?t:null,ji._result}var T5,Yce,Xx=_(()=>{T5=Hi.dirname(N5(import.meta.url)),Yce=Hi.resolve(T5,"../..");try{ji()}catch{}});var Jx=_(()=>{});import{createHash as L5}from"node:crypto";function Qx(e,t){if(e==null||typeof e!="object"||Array.isArray(e))throw new TypeError(`prepare verification: ${t} must be an object`);return e}function Kh(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Kh).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Kh(e[n])}`).join(",")}}`}function F5(e){return L5("sha256").update(Kh(e),"utf8").digest("hex")}function Gh(e){let t=String(e||"").trim().toLowerCase().replace(/^0x/,"");return B5.test(t)?t:""}function q5(e,t="prepare verification"){if(Qx(e,"prepared"),e.signed===!0)throw new Error(`${t}: prepared fact is signed`);if(e.broadcast===!0)throw new Error(`${t}: prepared fact claims broadcast`);for(let n of D5)if(e[n])throw new Error(`${t}: prepared fact carries ${n}`);for(let n of U5)if(e[n])throw new Error(`${t}: prepared fact claims executed ${n}`);return!0}function j5(e,t={}){let n=t.label||"prepare verification";if(Qx(e,"artifact"),Number(e.version)!==M5)throw new Error(`${n}: unsupported verification artifact version`);if(e.kind!==$5)throw new Error(`${n}: verification artifact kind required`);if(e.custody!=="none")throw new Error(`${n}: verification artifact custody must be none`);if(e.execution!=="prepare-only")throw new Error(`${n}: verification artifact must stay prepare-only`);if(e.signingReady===!0||e.broadcastReady===!0||e.executionReady===!0)throw new Error(`${n}: verification artifact must not claim a ready execution flag`);if(e.attestation?.teeAttested===!0)throw new Error(`${n}: TEE attestation is not claimed or accepted`);if(!["ok","success","failed","error","unavailable","unknown"].includes(String(e.simulation?.status||"")))throw new Error(`${n}: simulation status required`);if(typeof e.intentSummary!="string"||!e.intentSummary.trim())throw new Error(`${n}: human-readable intent summary required`);if(!e.attestation||typeof e.attestation!="object")throw new Error(`${n}: attestation record required`);if(!Array.isArray(e.attestation.notClaimed)||!e.attestation.notClaimed.includes("tee-attestation"))throw new Error(`${n}: attestation must honestly exclude TEE claims`);let{artifactHash:r,...o}=e;if(Gh(r)!==F5(o))throw new Error(`${n}: artifactHash mismatch \u2014 verification artifact was altered`);if(t.prepareHash){let i=Gh(t.prepareHash),s=Gh(e.prepareHash);if(!i||i!==s)throw new Error(`${n}: verification artifact does not bind this prepare`)}return e}function Zx(e,t={}){let n=t.label||"armPreparedAction";if(!e||typeof e!="object")throw new Error(`${n}: prepared object required`);let r=e.prepareVerification||e.verificationArtifact||e.deskCheckpoint?.prepareVerification||t.checkpoint?.prepareVerification;if(!r)throw new Error(`${n}: prepare verification artifact required before arm`);return j5(r,{label:n,...e.prepareHash?{prepareHash:e.prepareHash}:{}}),q5(e,n),r}var M5,$5,nle,B5,D5,U5,rle,eA=_(()=>{Jx();oe();M5=1,$5="prepare-verification",nle=Object.freeze({NONE:"none",PREPARE_CHECKSUM:"prepare-checksum",PREPARE_HMAC:"prepare-hmac"}),B5=/^(?:0x)?[0-9a-f]{64}$/i,D5=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),U5=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),rle=Object.freeze(["tee-attestation","remote-attestation","hardware-enclave","trusted-execution-environment","execution-authorization","signature","broadcast"])});var Ru={};ht(Ru,{armPreparedAction:()=>X5,callSigner:()=>tA,queueOwnerAction:()=>nA});import{existsSync as H5,readFileSync as z5}from"node:fs";import{request as V5}from"node:http";import W5 from"node:path";function K5(e=process.env){let t=String(e.ORACLE_SIGNER_URL||G5).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function Y5(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=W5.join(Pu(),"signer","signer-token");return H5(t)?z5(t,"utf8").trim():null}function tA(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=K5(r),s=Y5(r);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let c=new URL(e,i),l=n?Buffer.from(JSON.stringify(n)):null,u=V5({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...l?{"content-type":"application/json","content-length":l.length}:{}}},d=>{let p=[];d.on("data",m=>p.push(m)),d.on("end",()=>{let m=Buffer.concat(p).toString("utf8"),f={};try{f=m?JSON.parse(m):{}}catch{f={error:"signer refused"}}a({httpStatus:d.statusCode,...f})})});u.on("timeout",()=>{u.destroy(),a({ok:!1,error:"local signer timed out"})}),u.on("error",()=>a({ok:!1,error:"local signer is not running"})),l&&u.write(l),u.end()})}async function nA(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return tA("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function X5(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return Zx(e,{env:t,label:"armPreparedAction"}),nA(n,t)}var G5,Lu=_(()=>{Xx();eA();G5="http://127.0.0.1:9462"});var ng={};ht(ng,{COW_CANCEL_TYPES:()=>sA,COW_HOSTS:()=>$u,COW_ORDER_TYPES:()=>Mu,COW_SETTLEMENT:()=>rA,COW_VAULT_RELAYER:()=>oA,armCowOrder:()=>t3,buildArmedCowOrder:()=>eg,cowCancelOrders:()=>a3,cowChains:()=>tg,cowHealth:()=>Qh,cowOrder:()=>Uu,cowOrderStatus:()=>Du,cowOrderUid:()=>n3,cowPrepareCancel:()=>i3,cowPrepareOrder:()=>Zh,cowQuote:()=>cr,cowSignCancel:()=>s3,cowSignOrder:()=>r3,cowSubmitSignedOrder:()=>o3,cowVerifyOrderFill:()=>l3});import{TypedDataEncoder as Xh,getAddress as Ca,isAddress as J5}from"ethers";function Bu(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=$u[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Q5(e,t="v1",n={}){let r=Bu(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function ar(e,t){let n=String(e||"").trim();if(!J5(n))throw new Error(`cowswap: ${t} must be an address`);return Ca(n).toLowerCase()}function zi(e,t){try{let n=BigInt(String(e));if(n<0n)throw new Error("negative");return n.toString()}catch{throw new Error(`cowswap: ${t} must be a non-negative integer string`)}}function aA(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(n))throw new Error(`cowswap: ${t} must be bytes32 hex`);return n.toLowerCase()}function cA(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function Z5({digest:e,owner:t,validTo:n}={}){let r=aA(e,"order digest").slice(2),o=ar(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function Jh(e){let t=rA[Number(e)];if(!t)throw new Error(`cowswap: settlement contract not registered for chain ${e}`);return{name:"Gnosis Protocol",version:"v2",chainId:Number(e),verifyingContract:Ca(t)}}function e3(e={},t,n){let r=ar(e.sellToken,"sellToken"),o=ar(e.buyToken,"buyToken"),i=ar(e.receiver||n,"receiver"),s=Number(e.validTo);if(!Number.isInteger(s)||s<=0)throw new Error("cowswap: quote.validTo required");let a=aA(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:zi(e.sellAmount,"sellAmount"),buyAmount:zi(e.buyAmount,"buyAmount"),validTo:s,appData:a,feeAmount:zi(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Qh(e={}){try{let t=await cr({chainId:1,sellToken:Yh[1],buyToken:iA[1],sellAmountBeforeFee:"1000000000000000",from:Ur},e);return{ok:!0,buyAmount:t.quote?.buyAmount||t.buyAmount}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function cr(e={},t={}){let n=Number(e.chainId??1),r=Ih(e.from||e.owner),o=e.sellToken||Yh[n],i=e.buyToken||iA[n],s=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||s==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Yh[n],!o))throw new Error("no WETH mapping for chain");let a={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:s,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await x(`${Bu(n,t)}/quote`,{method:"POST",body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?we(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Zh(e={},t={}){let n=Number(e.chainId??1),r=ar(Ih(e.from||e.owner||e.signer),"owner"),o=await cr({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=e3(o?.quote||o,n,r),s=Jh(n),a={domain:s,types:Mu,primaryType:"Order",message:i},c=Xh.hash(s,Mu,i),l=oA[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return U({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Ca(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:a,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:s.verifyingContract.toLowerCase(),vaultRelayer:Ca(l).toLowerCase(),sellToken:i.sellToken,buyToken:i.buyToken,sellAmount:i.sellAmount,buyAmount:i.buyAmount,validTo:i.validTo,quoteId:o?.id??e.quoteId??null,typedDataHash:c,issuedAtMs:Date.now(),expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)},requiresApproval:{token:i.sellToken,spender:Ca(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:eg({chainId:n,owner:r,typedData:a,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function eg(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=$u[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=ar(e.owner,"owner"),s=Number(t.nowMs??Date.now()),a=Xh.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??s+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function t3(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Lu(),Ru)),r=e.localSignerEnvelope||eg(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function Du(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return x(`${Bu(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Uu(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return x(`${Bu(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function n3(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||Xh.hash(Jh(n),Mu,r),i=e.owner||e.from||e.signer||r.receiver;return Z5({digest:o,owner:i,validTo:r.validTo})}async function r3(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function o3(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function i3(e={}){let t=Number(e.chainId??1),n=ar(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((s,a)=>cA(s,`orderUids[${a}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=Jh(t);return U({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:sA,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function s3(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function a3(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function c3(e={}){return zi(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function l3(e={},t={}){let n=Number(e.chainId??1),r=cA(e.uid||e.orderUid),o=t.order||await Uu({chainId:n,uid:r},t),i=t.status||o.status||await Du({chainId:n,uid:r},t).catch(()=>null),s=t.trades||await x(`${Q5(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=Array.isArray(s)?s:[],c=e.expectedOwner?ar(e.expectedOwner,"expectedOwner"):null;if(c&&ar(o.owner||a[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:a};let l=0n;for(let p of a.filter(m=>String(m.orderUid||"").toLowerCase()===r))l+=BigInt(c3(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(zi(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(zi(e.minBuyAmount,"minBuyAmount")):0n,d=l>=u&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:l.toString(),minBuyAmount:e.minBuyAmount??null,trades:a,settlementTxs:[...new Set(a.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function tg(){return Object.keys($u).map(Number)}var $u,rA,oA,Yh,iA,Mu,sA,Pa=_(()=>{q();Ot();Tu();Au();oe();$u={1:"https://api.cow.fi/mainnet/api/v1",100:"https://api.cow.fi/xdai/api/v1",42161:"https://api.cow.fi/arbitrum_one/api/v1",8453:"https://api.cow.fi/base/api/v1"},rA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),oA=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Yh={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},iA={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Mu=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),sA=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});function m3(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||u3).replace(/\/$/,"")}function lA(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||d3).replace(/\/$/,"")}async function Kt(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return x(`${m3(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function uA(e={}){let n=(await Kt(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Fu(e={}){return x(`${lA(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function dA(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||p3).replace(/\/$/,""),r=await x(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(s=>String(s.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(s=>String(s.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(s=>!!s.stablecoin==!!e.stablecoin)),o.sort((s,a)=>Number(a.tvlUsd||0)-Number(s.tvlUsd||0));let i=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...r,data:o.slice(0,i)}}async function qu(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||f3).replace(/\/$/,""),r=e.includePrices!==!1;return x(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function pA(e={},t={}){let n=encodeURIComponent(String(e.chain||"Ethereum")),r=new URLSearchParams({excludeTotalDataChart:String(e.includeChart!==!0),excludeTotalDataChartBreakdown:String(e.includeBreakdown!==!0),dataType:"dailyVolume"});return x(`${lA(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function fA(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Kt(n,t),o={};for(let i of e){let s=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[s]||null}return o}var u3,d3,p3,f3,Ho=_(()=>{q();u3="https://coins.llama.fi",d3="https://api.llama.fi",p3="https://yields.llama.fi",f3="https://stablecoins.llama.fi"});var zu={};ht(zu,{ACROSS_API:()=>mA,HOP_API:()=>hA,RANGO_API:()=>yA,RELAY_API:()=>gA,acrossHealth:()=>rg,acrossSuggestedFees:()=>ju,hopHealth:()=>og,hopQuote:()=>Hu,rangoQuote:()=>S3,relayHealth:()=>sg,relayPrepare:()=>ag,relayQuote:()=>Ra});async function rg(e={}){try{return{ok:!0,estimatedFillTimeSec:(await ju({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function ju(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:s}=e;if(!n||o==null||i==null||!s)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let a=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(s)}),c=(t.baseUrl||process.env.ACROSS_API_URL||mA).replace(/\/$/,"");return x(`${c}/suggested-fees?${a}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function og(e={}){try{let t=await Hu({amount:"1000000000000000",token:"ETH",fromChain:"ethereum",toChain:"arbitrum",slippage:.5},e);return{ok:!0,estimatedRecieved:t.estimatedRecieved||t.estimatedReceived}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Hu(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let s=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),a=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s});if(!a.executable)throw new Error(`hop: route requires ${a.requiredBps} bps above cap ${a.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(a.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||hA).replace(/\/$/,""),u=await x(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?we(u,{chainId:Number(e.originChainId||e.chainId||g3[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??s}):{...u,autoSlippagePolicy:a}}function bA(e){return(e?.steps||[]).flatMap(t=>(t?.items||[]).filter(n=>n?.data?.to&&n?.data?.data).map(n=>({stepId:t.id,...n.data})))}function b3(e){let t=String(e?.data??"").toLowerCase();if(!t.startsWith(ig))return null;if(!/^0x[0-9a-f]{136}$/.test(t))throw new Error("relay: malformed ERC20 approval calldata");return{spender:`0x${t.slice(34,74)}`,amount:BigInt(`0x${t.slice(74,138)}`).toString()}}function w3(e){return bA(e).find(t=>!String(t.data).toLowerCase().startsWith(ig))??null}async function sg(e={}){try{let t=await Ra({user:Ur,originChainId:1,destinationChainId:8453,originCurrency:"0x0000000000000000000000000000000000000000",destinationCurrency:"0x0000000000000000000000000000000000000000",amount:"1000000000000000",tradeType:"EXACT_INPUT"},e);return{ok:!0,hasSteps:Array.isArray(t.steps),stepCount:t.steps?.length||0}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ra(e={},t={}){let{user:n=Ur,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:s="0x0000000000000000000000000000000000000000",amount:a,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!a)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!l.executable)throw new Error(`relay: route requires ${l.requiredBps} bps above cap ${l.capBps}`);let u=(t.baseUrl||process.env.RELAY_API_URL||gA).replace(/\/$/,""),d=await x(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:s,amount:String(a),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;if(!p||!/^\d+$/.test(String(p)))return{...d,autoSlippagePolicy:l};let m=w3(d);return we(d,{chainId:Number(r),venue:m?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ag(e={},t={}){let n=await Ra(e,t),r=Number(e.originChainId),o=bA(n);if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase(),s=[],a=[];for(let u of o){if(u.chainId!=null&&Number(u.chainId)!==r)throw new Error("relay: transaction chain mismatch");if(e.user&&u.from&&String(u.from).toLowerCase()!==String(e.user).toLowerCase())throw new Error("relay: transaction sender mismatch");let d=b3(u);d?s.push({tx:u,approval:d}):a.push(u)}if(!a.length)throw new Error("relay: quote returned no bridge deposit transaction");if(a.some(u=>String(u.to).toLowerCase()!==i))throw new Error("relay: route execution target is not safely bound");if(s.length>1)throw new Error("relay: multiple token approvals are not supported");let c=null;if(s.length===1){let{tx:u,approval:d}=s[0],p=String(e.originCurrency||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(p)||p===y3)throw new Error("relay: native route returned an ERC20 approval");if(String(u.to).toLowerCase()!==p)throw new Error("relay: approval token mismatch");if(d.amount!==String(e.amount))throw new Error("relay: approval amount must equal the exact input amount");if(!a.some(m=>String(m.to).toLowerCase()===d.spender))throw new Error("relay: approval spender does not match the bridge target");c={token:p,spender:d.spender,amount:String(e.amount)}}let l=o.map(u=>({chainId:r,from:u.from||e.user,to:u.to,data:u.data,value:u.value??"0x0",...u.gasLimit!=null||u.gas!=null?{gasLimit:u.gasLimit??u.gas}:{},...String(u.data).toLowerCase().startsWith(ig)?{}:{slippageGuard:De(n.autoSlippage,{chainId:r,venue:u.to,data:u.data})}}));return U({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,requiresApproval:c,destination:i,transactions:l},{provider:"relay",kind:"relay-tx",env:t.env,nowMs:t.nowMs,expiresAtMs:t.expiresAtMs})}async function S3({from:e,to:t,amount:n,slippage:r=1,enableCentralizedSwappers:o=!1}={},i={}){if(!e||!t||!n)throw new Error("rangoQuote requires from, to, amount");let s=i.env??process.env,a=i.rangoApiKey||s.RANGO_API_KEY;if(!a)throw new Error("rango: RANGO_API_KEY is required");let c=new URLSearchParams({from:e,to:t,amount:String(n),slippage:String(r),enableCentralizedSwappers:o?"true":"false",apiKey:a}),l=(i.rangoBaseUrl||process.env.RANGO_API_URL||yA).replace(/\/$/,""),u;try{u=await x(`${l}/basic/quote?${c}`,{fetchImpl:i.fetchImpl,timeoutMs:i.timeoutMs??2e4,retries:i.retries})}catch(d){let p=Number.isInteger(d?.status)?` (HTTP ${d.status})`:"";throw new Error(`rango: request failed${p}`)}if(u?.error||u?.resultType&&u.resultType!=="OK"){let d=String(u?.error||u.resultType).split(a).join("[redacted]").split(encodeURIComponent(a)).join("[redacted]").slice(0,160);throw new Error(`rango: ${d}`)}return{amountOut:u?.route?.outputAmount,feeUsd:u?.route?.feeUsd??null,estimatedTime:u?.route?.estimatedTimeInSeconds}}var mA,hA,gA,yA,g3,ig,y3,Vu=_(()=>{q();Ot();Au();oe();mA="https://across.to/api",hA="https://api.hop.exchange/v1",gA="https://api.relay.link",yA="https://api.rango.exchange",g3={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};ig="0x095ea7b3",y3="0x0000000000000000000000000000000000000000"});function Wu(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Ut(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}function wA(e){return Array.isArray(e)?e.flatMap((t,n)=>{let r=String(t?.amountUSD??"").trim();return/^\d+(?:\.\d+)?$/.test(r)?[{name:String(t?.name??t?.type??`cost-${n+1}`),amountUsd:r}]:[]}):[]}async function vA(e,t={}){let n=Ox[Number(e)];if(!n)return null;try{let r=await Kt([n],t);return Ut(r?.coins?.[n]?.price)}catch{return null}}async function v3(e={}){try{let t=await Fu({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function E3(e,t={}){let n=qr(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...SA[n]||[n]),r.push(...SA[qr(e)]||[e]),r}function x3(e,t,n={}){let r=Array.isArray(e)?e:[],o=E3(t,n).map(qr).filter(Boolean);for(let i of o){let s=r.find(c=>qr(c?.slug)===i||qr(c?.name)===i),a=Ut(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}for(let i of o){let s=r.find(c=>{let l=qr(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:qr(c?.slug).includes(i)||qr(c?.name).includes(i)}),a=Ut(s?.tvl);if(a!=null)return{liquidityUsd:a,protocol:s?.name??s?.slug??i}}return null}function cg({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:s,decimalsOut:a,nativePriceUsd:c=null,destDecimalsPromise:l=null,v4PoolKey:u=null,v4PoolId:d=null,v4LiquidityUsd:p=null,opts:m={}}){let f=[];return f.push({source:"lifi",run:async()=>{let h=await ir({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},m),g=h?.estimate??h?.[0]?.estimate;return{amountOut:g?.toAmount,minOut:g?.toAmountMin,gasUsd:Wu(g?.gasCosts),feeUsd:Wu(g?.feeCosts),oracleFeeBps:h?.oracleFee?.applies?h.oracleFee.bps:0,meta:{tool:h?.tool??h?.toolDetails?.name,oracleFee:h?.oracleFee??null}}}}),s!=null&&f.push({source:"paraswap",run:async()=>{let h=a??(await Promise.resolve(l))?.decimals;if(h==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let g=await sr({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:s,destDecimals:h},m),y=g?.priceRoute;return{amountOut:y?.destAmount,gasUsd:Ut(y?.gasCostUSD),oracleFeeBps:g?.oracleFee?.applies?g.oracleFee.bps:0,meta:{bestRoute:y?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:g?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&f.push({source:"0x",run:async()=>{let h=await Fr({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},m),g=null,y=h?.totalNetworkFee,b=await Promise.resolve(c);return y!=null&&b&&(g=Number(y)/1e18*b),{amountOut:h?.buyAmount,minOut:h?.minBuyAmount,gasUsd:g,meta:{source:h?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&f.push({source:"1inch",run:async()=>{let h=await Ta({chainId:e,src:t,dst:n,amount:r},m),g=null;return h?.gas!=null&&c&&(g=null),{amountOut:h?.dstAmount,gasUsd:g,meta:{gasUnits:h?.gas}}}}),f.push({source:"cow",run:async()=>{let h=await cr({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},m),g=h?.quote??h,y=g?.feeAmount;return{amountOut:g?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:y,settlement:"solver-executed"}}}}),Gt[Number(e)]&&f.push({source:"uniswap-v4",run:async()=>{let h=u&&typeof u=="object"?{fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks,poolKey:u,poolId:d,liquidityUsd:p}:{},g=await Dr({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,...h},m);return{amountOut:g?.amountOut,minOut:g?.minOut??g?.amountOutMinimum??null,gasUsd:null,liquidityUsd:g?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:g?.fee,tickSpacing:g?.tickSpacing,poolId:g?.poolId,hooks:g?.hooks,gasUnits:g?.gasEstimate,quoter:g?.quoter,poolManager:g?.poolManager,prepareReady:g?.prepareReady===!0,executionReady:!1}}}}),wt[Number(e)]&&f.push({source:"uniswap-v3",run:async()=>{let h=await or({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},m);return{amountOut:h?.amountOut,minOut:h?.minOut??h?.amountOutMinimum??null,gasUsd:null,liquidityUsd:h?.liquidityUsd??null,meta:{onchain:!0,fee:h?.fee,gasUnits:h?.gasEstimate,quoter:h?.quoter}}}}),f}function EA({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,slippageBps:s,allowedSources:a,opts:c={}}){let l=[],u=null,d=async(m,f={})=>(u||=v3(c),x3(await u,m,f));if(l.push({source:"lifi",run:async()=>{let m=await ir({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o,fromAddress:i,slippageBps:s},c),f=m?.estimate??m?.[0]?.estimate,h=(m?.includedSteps??m?.steps??[]).map((b,w)=>({id:String(b?.id??`step-${w+1}`),type:String(b?.type??"route"),tool:String(b?.tool??b?.toolDetails?.name??"LI.FI"),fromChainId:Number(b?.action?.fromChainId??e),toChainId:Number(b?.action?.toChainId??t)})),g={tool:m?.tool??m?.toolDetails?.name,durationSeconds:Ut(f?.executionDuration),destinationDecimals:Ut(m?.action?.toToken?.decimals),routeSteps:h,feeCosts:wA(f?.feeCosts),gasCosts:wA(f?.gasCosts)},y=await d("lifi",g);return{amountOut:f?.toAmount,minOut:f?.toAmountMin,gasUsd:Wu(f?.gasCosts),feeUsd:Wu(f?.feeCosts),feeIncludedInAmountOut:!0,oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,liquidityUsd:y?.liquidityUsd??null,meta:{...g,liquidityProtocol:y?.protocol,oracleFee:m?.oracleFee??null}}}}),l.push({source:"relay",run:async()=>{let{relayQuote:m}=await Promise.resolve().then(()=>(Vu(),zu)),f=await m({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o),slippageBps:s},c),h=f?.details,g=(f?.steps??[]).map((I,A)=>({id:String(I?.id??`step-${A+1}`),type:String(I?.kind??"transaction"),tool:"Relay",label:String(I?.description??I?.action??I?.id??`Step ${A+1}`),fromChainId:Number(e),toChainId:Number(t)})),y=String(f?.fees?.relayer?.amountUsd??"").trim(),b=String(f?.fees?.gas?.amountUsd??"").trim(),w=String(h?.totalImpact?.usd??"").trim(),S={durationSeconds:Ut(h?.timeEstimate),rate:h?.rate,destinationDecimals:Ut(h?.currencyOut?.currency?.decimals),routeSteps:g,feeCosts:[.../^\d+(?:\.\d+)?$/.test(y)?[{name:"relayer",amountUsd:y}]:[],.../^-?\d+(?:\.\d+)?$/.test(w)?[{name:"total-impact",amountUsd:w}]:[]],gasCosts:/^\d+(?:\.\d+)?$/.test(b)?[{name:"origin-gas",amountUsd:b}]:[]},v=await d("relay",S);return{amountOut:h?.currencyOut?.amount,minOut:h?.currencyOut?.minimumAmount,gasUsd:Ut(f?.fees?.gas?.amountUsd),feeUsd:Ut(f?.fees?.relayer?.amountUsd)??(Ut(h?.totalImpact?.usd)!=null?Math.abs(Ut(h.totalImpact.usd)):null),feeIncludedInAmountOut:!0,liquidityUsd:v?.liquidityUsd??null,meta:{...S,liquidityProtocol:v?.protocol}}}}),l.push({source:"across",run:async()=>{let{acrossSuggestedFees:m}=await Promise.resolve().then(()=>(Vu(),zu)),f=await m({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},c),h=f?.totalRelayFee?.total,g=null;if(h!=null)try{let b=BigInt(String(o))-BigInt(String(h));b>0n&&(g=b.toString())}catch{}let y=await d("across");return{amountOut:g,gasUsd:null,liquidityUsd:y?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Ut(f?.estimatedFillTimeSec),limits:f?.limits?{min:f.limits.minDeposit,max:f.limits.maxDeposit}:void 0,liquidityProtocol:y?.protocol}}}}),!Array.isArray(a))return l;let p=new Set(a.map(m=>String(m).toLowerCase()));return l.filter(m=>p.has(m.source))}var Ut,qr,SA,xA=_(()=>{ka();_a();Oa();Vh();Pa();Mi();Ui();Ho();Ah();Ut=e=>{let t=Number(e);return Number.isFinite(t)?t:null};qr=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),SA=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]})});var kA={};ht(kA,{BRIDGE_REVIEW_SOURCES:()=>lg,QUALITY:()=>dn,bestBridgeRoute:()=>k3,bestSwapRoute:()=>ug,formatComparisonNote:()=>Gu,normalizeBridgeRouteOptions:()=>AA});function I3(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new Error("slippageBps must be an integer from 1 through 100");return t}function AA(e,t=lg){let n=new Set((Array.isArray(t)?t:lg).map(s=>String(s).toLowerCase())),r=(e?.routes??[]).filter(s=>n.has(s.source)),o=new Set(r.map(s=>s.source)),i=(e?.failed??[]).filter(s=>n.has(s.source)&&!o.has(s.source));return[...r,...i].map(s=>({provider:s.source,status:s.quality===dn.FAILED?"unavailable":"quoted",amountOut:s.amountOut??null,minAmountOut:s.minOut??null,netAmountOut:s.netOut??null,feeUsd:s.feeUsd??null,gasUsd:s.gasUsd??null,etaSeconds:s.meta?.durationSeconds??null,decimalsOut:s.meta?.destinationDecimals??null,routeSteps:Array.isArray(s.meta?.routeSteps)?s.meta.routeSteps:[],feeCosts:Array.isArray(s.meta?.feeCosts)?s.meta.feeCosts:[],gasCosts:Array.isArray(s.meta?.gasCosts)?s.meta.gasCosts:[],selected:s.source===e?.best?.source,error:s.error??null}))}async function IA(e,t,n){let r=A3[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let s=(await Kt([o],n))?.coins?.[o],a=Number(s?.price),c=Number(s?.decimals);return{priceUsd:Number.isFinite(a)?a:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function ug(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let s=vA(n,t),a=IA(n,o,t),c=zm(n,t).catch(()=>null),l=cg({...e,nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}),[u,d,p]=await Promise.all([xu(l,{timeoutMs:t.timeoutMs??12e3}),a,c]);s.catch(()=>{});let m=await s.then(g=>g,()=>null),f=xh(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:m}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&f.best){let g=f.best.source,b=await Nx(async w=>{let S=cg({...e,amountIn:w.toString(),nativePriceUsd:s,decimalsOut:e.decimalsOut,destDecimalsPromise:a,opts:t}).filter(I=>I.source===g);return S.length?(await xu(S,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(b){let w=Tx(f,{[g]:b},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...w,sourcesTried:l.length,sourcesAnswered:u.filter(S=>S.quality!==dn.FAILED).length,note:Gu(w,l.length),priceImpact:{[g]:Number(b.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...f,sourcesTried:l.length,sourcesAnswered:u.filter(g=>g.quality!==dn.FAILED).length,note:Gu(f,l.length)}}async function k3(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:s}=e;if(n==null||r==null||!o||!i||s==null)throw new Error("bestBridgeRoute requires fromChainId, toChainId, tokenIn, tokenOut, amountIn");if(Number(n)===Number(r))throw new Error("bestBridgeRoute is for cross-chain; use bestSwapRoute for same-chain");let a=I3(e.slippageBps),c={...e,slippageBps:a},l=IA(r,i,t),u=EA({...c,opts:t}),[d,p]=await Promise.all([xu(u,{timeoutMs:t.timeoutMs??15e3}),l]),m=xh(d,{destPriceUsd:p.priceUsd,destDecimals:e.decimalsOut??p.decimals,liquidityFirst:!1,liquidityBandBps:0}),f=m.routes.map(h=>({source:h.source,seconds:h.meta?.durationSeconds??null})).filter(h=>h.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(s),slippageBps:a,...m,routeOptions:AA(m,e.allowedSources),durations:f,sourcesTried:u.length,sourcesAnswered:d.filter(h=>h.quality!==dn.FAILED).length,note:Gu(m,u.length)}}function _3(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Lx(t)}`:""}function Gu(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=_3(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let s=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${s} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}var A3,lg,dg=_(()=>{Ah();xA();Ia();Ho();Ne();A3={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"},lg=Object.freeze(["lifi","relay"])});async function _A(e,t={}){if(C3.some(g=>Object.hasOwn(e,g)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!T3.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(N3.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await ug(e,t);if(!r.best){let g=r.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let s=pg[o];if(!s){let g=r.routes.find(y=>pg[y.source]&&y.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let a;try{a=await s(e,t)}catch(g){let y=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",b=[String(g?.message||g),y].filter(Boolean).join(" :: "),w=/allowance/i.test(b),S=!w&&/not enough|insufficient|balance/i.test(b),v,I;w?(I="approval-required-first",v=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${b}`):S?(I="taker-not-funded",v=`${o} refused to build the transaction: ${b}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(I="provider-error",v=`${o} prepare failed: ${b}`);let A=r.routes.find(E=>pg[E.source]&&E.source!==o);return{ok:!1,reason:v,failureKind:I,...A?{alternative:A.source}:{},comparison:r}}let c=e.driftToleranceBps??O3,l=null,u=null;if(a.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),y=BigInt(a.amountOut);g>0n&&(l=Number((y-g)*10000n/g),l<-c&&(u=`route moved ${(l/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),m=r.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,y)=>Math.max(g,y.liquidityUsd??0),0)||null,f=i.liquidityUsd??null,h=f!=null&&m>0?Math.round(f/m*100):null;return U({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:f,maxUsd:m,sharePct:h},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...a,unsigned:!0,signedBy:"user-wallet",destination:a.artifactKind===jr.TRANSACTION?a.transaction?.to??null:a.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...a.artifactKind===jr.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}var jr,O3,pg,N3,T3,C3,OA=_(()=>{dg();oe();jr=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),O3=100,pg={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:s}=await Promise.resolve().then(()=>(Mi(),ch)),a=await s({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:jr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.amountOut??null,minOut:a.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Ui(),Sh)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:s,fee:a,tickSpacing:c,hooks:l},u);return{artifactKind:jr.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:s}=await Promise.resolve().then(()=>(ka(),Lh)),a=await s({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:jr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.estimate?.toAmount??null,minOut:a.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:s},a)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(_a(),Dh)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:s,userAddress:o,side:"SELL"},a);return{artifactKind:jr.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval??null,amountOut:l.quote?.priceRoute?.destAmount??null,minOut:l.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:s}=await Promise.resolve().then(()=>(Oa(),qh)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:jr.TRANSACTION,transaction:a.transaction,requiresApproval:a.requiresApproval??null,amountOut:a.quote?.buyAmount??null,minOut:a.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:s}=await Promise.resolve().then(()=>(Pa(),ng)),a=await s({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:jr.TYPED_DATA_ORDER,typedData:a.typedData,owner:a.owner,cowGuard:a.cowGuard,requiresApproval:{...a.requiresApproval,note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:a.settlement,vaultRelayer:a.vaultRelayer,amountOut:a.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}},N3=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),T3=/^0x[0-9a-fA-F]{40}$/,C3=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"])});import{Interface as PA,getAddress as Hr,id as P3,isAddress as R3}from"ethers";function Wi(e){let t=Number(e),n=Vi[t];if(!n)throw new Error(`lp-exit: unsupported chain ${e}; supported: ${Object.keys(Vi).join(", ")}`);return{chainId:t,...n}}function Vo(e,t){if(!R3(String(e||"")))throw new Error(`lp-exit: ${t} must be a valid address`);return Hr(String(e))}function RA(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`lp-exit: ${t} must be an unsigned integer`)}if(n<=0n)throw new Error(`lp-exit: ${t} must be positive`);return n}function B3(e){let t=Number(e??50);if(!Number.isInteger(t)||t<1||t>100)throw new Error("lp-exit: slippageBps must be an integer from 1 to 100");return t}function D3(e,t){let n=Number(e.deadlineSeconds??300);if(!Number.isInteger(n)||n<30||n>600)throw new Error("lp-exit: deadlineSeconds must be an integer from 30 to 600");let r=Number(t.nowSeconds??Math.floor(Date.now()/1e3));if(!Number.isInteger(r)||r<=0)throw new Error("lp-exit: invalid current time");return r+n}function TA(e,t){if(e===0n)return 0n;let n=e*BigInt(1e4-t)/10000n;return n>0n?n:1n}function LA(e,t){if(!M3.test(String(e||"")))throw new Error(`lp-exit: valid ${t} transaction hash required`);return String(e).toLowerCase()}async function fg(e,t,n,r){return(r.rpcCall||J)(e,t,n,r)}function zo(e,t){return String(e||"").toLowerCase()===String(t||"").toLowerCase()}async function MA(e,t,n,r,o){let[i,s]=await Promise.all([fg(e,"eth_getTransactionReceipt",[t],r),fg(e,"eth_getTransactionByHash",[t],r)]),a=i?.status===1||i?.status==="1"||i?.status==="0x1";if(!i||!s||!a||!zo(i.transactionHash,t)||!zo(s.hash,t))throw new Error(`lp-exit: live confirmed successful ${o} receipt and transaction required`);if(!zo(s.from,n.from)||!zo(s.to,n.to)||!zo(s.input??s.data,n.data))throw new Error(`lp-exit: ${o} transaction does not match prepared from/to/input`);return{receipt:i,txHash:t}}function $A(e,t,n){let r=new Set(t.map(s=>s.toLowerCase())),o=`0x${n.slice(2).toLowerCase().padStart(64,"0")}`,i=new Map(t.map(s=>[s.toLowerCase(),0n]));for(let s of e.logs||[]){let a=String(s.address||"").toLowerCase();if(!r.has(a)||!zo(s.topics?.[0],$3)||!zo(s.topics?.[2],o))continue;let c;try{c=BigInt(s.data)}catch{throw new Error("lp-exit: malformed ERC20 Transfer amount in receipt")}c>0n&&i.set(a,i.get(a)+c)}return i}function BA(e,t,n){if(th(e,{providers:["lp-exit"],label:"lp-exit continuation",nowMs:n.nowMs??(n.nowSeconds==null?Date.now():Number(n.nowSeconds)*1e3)}),e.phase!==t)throw new Error(`lp-exit: ${t} prepared artifact required`)}async function CA(e,t,n,r){return(r.rpcCall||J)(e,"eth_call",[{to:t,data:n},"latest"],r)}async function mg(e,t,n,r){let i=await(n.simulateTransaction||qo)({chainId:e,tx:t},n);if(i?.status==="unavailable"||i?.willRevert==null)throw new Error(`lp-exit: ${r} simulation unavailable; refusing unsigned transaction`);if(i?.status!=="ok"||i?.willRevert){let s=i?.revert?.reason||i?.error||"would revert";throw new Error(`lp-exit: ${r} simulation failed: ${s}`)}return i}async function hg(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=Wi(e.chainId),r=Vo(e.owner,"owner"),o=RA(e.tokenId,"tokenId"),i=Hr(n.positionManager),[s,a]=await Promise.all([CA(n.chainId,i,lr.encodeFunctionData("ownerOf",[o]),t),CA(n.chainId,i,lr.encodeFunctionData("positions",[o]),t)]),c=Hr(lr.decodeFunctionResult("ownerOf",s)[0]);if(c!==r)throw new Error(`lp-exit: owner mismatch; position ${o} belongs to ${c}`);let l=lr.decodeFunctionResult("positions",a);return Object.freeze({chainId:n.chainId,chain:n.name,venue:n.venue,positionManager:i,registrySource:n.source,tokenId:o.toString(),owner:r,operator:Hr(l[1]),token0:Hr(l[2]),token1:Hr(l[3]),fee:Number(l[4]),tickLower:Number(l[5]),tickUpper:Number(l[6]),liquidity:l[7].toString(),tokensOwed0:l[10].toString(),tokensOwed1:l[11].toString()})}async function DA(e={},t={}){if(Object.hasOwn(e,"positionManager"))throw new Error("lp-exit: positionManager is not accepted from callers; the reviewed registry is authoritative");let n=await hg(e,t),r=Wi(n.chainId),o=BigInt(n.liquidity);if(o<=0n)throw new Error("lp-exit: position has no active liquidity; collect-only exits are not yet supported");let i=e.liquidity==null?o:RA(e.liquidity,"liquidity");if(i>o)throw new Error("lp-exit: requested liquidity exceeds live position liquidity");let s=B3(e.slippageBps),a=D3(e,t),c=lr.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:0n,amount1Min:0n,deadline:a}]),l={chainId:n.chainId,from:n.owner,to:n.positionManager,data:c,value:"0"},u=await mg(n.chainId,l,t,"amount probe");if(!u.returnData||u.returnData==="0x")throw new Error("lp-exit: amount probe simulation returned no amounts");let d,p;try{[d,p]=lr.decodeFunctionResult("decreaseLiquidity",u.returnData)}catch{throw new Error("lp-exit: amount probe simulation returned malformed amounts")}if(d===0n&&p===0n)throw new Error("lp-exit: live removal currently returns zero assets");let m=TA(d,s),f=TA(p,s),h=lr.encodeFunctionData("decreaseLiquidity",[{tokenId:BigInt(n.tokenId),liquidity:i,amount0Min:m,amount1Min:f,deadline:a}]),g=lr.encodeFunctionData("collect",[{tokenId:BigInt(n.tokenId),recipient:n.owner,amount0Max:NA,amount1Max:NA}]),y=lr.encodeFunctionData("multicall",[[h,g]]),b={chainId:n.chainId,from:n.owner,to:n.positionManager,data:y,value:"0"},w=await mg(n.chainId,b,t,"guarded remove-and-collect");return U({provider:"lp-exit",phase:"remove-and-collect",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:a,position:n,liquidity:i.toString(),slippageBps:s,expected:{amount0:d.toString(),amount1:p.toString()},minimums:{amount0Min:m.toString(),amount1Min:f.toString()},transaction:b,simulation:w,continuation:{operation:"prepareLpSettlementToWrappedNative",requiresConfirmedReceipt:!0,requiresTransferProofFor:[n.token0,n.token1],note:"Re-read the mined transaction and receipt; only token Transfer logs to the bound owner are settlement evidence."}},{provider:"lp-exit",kind:"univ3-remove-and-collect",nowMs:t.nowMs??Number(t.nowSeconds??Math.floor(Date.now()/1e3))*1e3,expiresAtMs:a*1e3})}async function UA(e={},t={}){let n=e.removalPrepared;BA(n,"remove-and-collect",t);let r=Wi(n.chainId),o=Vo(n.position?.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared removal");if(e.owner!=null&&Vo(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared removal");let i=LA(e.removalTxHash,"removal"),{receipt:s}=await MA(r.chainId,i,n.transaction,t,"removal"),a=Hr(r.wrappedNative),c=[Vo(n.position.token0,"prepared token0"),Vo(n.position.token1,"prepared token1")],l=$A(s,c,o),u=c.map(f=>({token:f,amount:l.get(f.toLowerCase()).toString()})).filter(f=>BigInt(f.amount)>0n);if(u.length===0)throw new Error("lp-exit: removal receipt proves no token transfers to prepared owner");let d=0n,p=[],m=t.prepareBestRoute||_A;for(let f of u){if(f.token===a){d+=BigInt(f.amount);continue}let h=await m({chainId:r.chainId,tokenIn:f.token,tokenOut:a,amountIn:f.amount,taker:o,maxSlippageBps:e.maxSlippageBps??100},t);if(!h?.ok||!h?.transaction)throw new Error(`lp-exit: no preparable net route for ${f.token}: ${h?.reason||"unknown failure"}`);p.push(Object.freeze({tokenIn:f.token,amountIn:f.amount,...h}))}return U({provider:"lp-exit",phase:"settle-to-wrapped-native",chainId:r.chainId,owner:o,removalTxHash:i,removalPrepareHash:n.prepareHash,position:n.position,wrappedNative:a,alreadyWrappedNative:d.toString(),routes:Object.freeze(p),warnings:Object.freeze(p.filter(f=>f.comparison?.rankedOn==="gross").map(f=>`${f.tokenIn} route ranked on gross output; gas was not accounted for`)),continuation:Object.freeze({operation:"prepareLpUnwrapNative",requiresConfirmedSwapReceipts:p.length>0,requiresWrappedNativeTransferProof:p.length>0,note:"Match every mined swap to its prepared route and derive wrapped-native received from Transfer logs before unwrapping."})},{provider:"lp-exit",kind:"univ3-settlement-routes",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function FA(e={},t={}){let n=e.settlementPrepared;BA(n,"settle-to-wrapped-native",t);let r=Wi(n.chainId),o=Vo(n.owner,"prepared owner");if(e.chainId!=null&&Number(e.chainId)!==r.chainId)throw new Error("lp-exit: chainId does not match prepared settlement");if(e.owner!=null&&Vo(e.owner,"owner")!==o)throw new Error("lp-exit: owner does not match prepared settlement");let i=e.swapTxHashes??[];if(!Array.isArray(i)||i.length!==n.routes.length)throw new Error("lp-exit: one live swap transaction hash required for every prepared route");let s=Hr(r.wrappedNative),a=BigInt(n.alreadyWrappedNative),c=[];for(let p=0;p<n.routes.length;p+=1){let m=LA(i[p],"swap"),{receipt:f}=await MA(r.chainId,m,n.routes[p].transaction,t,`swap ${p+1}`),h=$A(f,[s],o).get(s.toLowerCase());if(h<=0n)throw new Error(`lp-exit: swap ${p+1} receipt proves no wrapped-native transfer to owner`);a+=h,c.push(m)}if(a<=0n)throw new Error("lp-exit: no receipt-proven wrapped-native amount to unwrap");let l=L3.encodeFunctionData("withdraw",[a]),u={chainId:r.chainId,from:o,to:s,data:l,value:"0"},d=await mg(r.chainId,u,t,"wrapped-native unwrap");return U({provider:"lp-exit",phase:"unwrap-native",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r.chainId,owner:o,swapTxHashes:c,settlementPrepareHash:n.prepareHash,nativeAmount:a.toString(),transaction:u,simulation:d,note:"UNSIGNED. The user's wallet must sign; Oracle does not broadcast or custody the native asset."},{provider:"lp-exit",kind:"wrapped-native-withdraw",nowMs:t.nowMs??Date.now(),expiresAtMs:n.expiresAt})}async function qA(){return Object.entries(Vi).map(([e,t])=>({chainId:Number(e),...t}))}async function jA(e={},t={}){let n=e.chainId==null?Object.keys(Vi).map(o=>Wi(o)):[Wi(e.chainId)],r=await Promise.all(n.map(async o=>{try{let i=await fg(o.chainId,"eth_getCode",[o.positionManager,"latest"],t),s=typeof i=="string"&&/^0x[0-9a-fA-F]+$/.test(i)&&i!=="0x";return{chainId:o.chainId,positionManager:o.positionManager,ok:s}}catch(i){return{chainId:o.chainId,positionManager:o.positionManager,ok:!1,error:String(i?.message||i)}}}));return{ok:r.every(o=>o.ok),chains:r}}var Vi,lr,L3,NA,M3,$3,gg=_(()=>{Ne();vu();OA();oe();Vi=Object.freeze({1:Object.freeze({name:"ethereum",positionManager:"0xC36442b4a4522E871399CD717aBDD847Ab11FE88",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/ethereum-deployments"}),8453:Object.freeze({name:"base",positionManager:"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1",wrappedNative:"0x4200000000000000000000000000000000000006",venue:"uniswap-v3",source:"https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments"})}),lr=new PA(["function ownerOf(uint256 tokenId) view returns (address)","function positions(uint256 tokenId) view returns (uint96 nonce,address operator,address token0,address token1,uint24 fee,int24 tickLower,int24 tickUpper,uint128 liquidity,uint256 feeGrowthInside0LastX128,uint256 feeGrowthInside1LastX128,uint128 tokensOwed0,uint128 tokensOwed1)","function decreaseLiquidity((uint256 tokenId,uint128 liquidity,uint256 amount0Min,uint256 amount1Min,uint256 deadline) params) payable returns (uint256 amount0,uint256 amount1)","function collect((uint256 tokenId,address recipient,uint128 amount0Max,uint128 amount1Max) params) payable returns (uint256 amount0,uint256 amount1)","function multicall(bytes[] data) payable returns (bytes[] results)"]),L3=new PA(["function withdraw(uint256 wad)"]),NA=(1n<<128n)-1n,M3=/^0x[0-9a-fA-F]{64}$/,$3=P3("Transfer(address,address,uint256)").toLowerCase()});function Wo(e,t,{required:n=!0,allowZero:r=!1}={}){if(e==null||e===""){if(n)throw new Error(`${t} required`);return null}let o;if(typeof e=="bigint")o=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new Error(`${t} must be a safe integer`);o=BigInt(e)}else if(typeof e=="string"){let i=e.trim();if(i.startsWith("0x")||i.startsWith("0X"))o=BigInt(i);else{if(!F3.test(i))throw new Error(`${t} must be an integer wei string`);o=BigInt(i)}}else throw new Error(`${t} must be bigint, number, or integer string`);if(o<0n||!r&&o===0n)throw new Error(`${t} must be ${r?"non-negative":"positive"}`);return o}function q3(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function j3(e={}){return e.maxFeePerGas!=null?Wo(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Wo(e.gasPrice,"gasPrice"):null}function bg(e={}){try{let t=q3(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Wo(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),s=Wo(n.gasLimit??n.gas,"gasLimit"),a=j3(n);if(a==null)throw new Error("maxFeePerGas or gasPrice required");let c=Wo(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Wo(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Wo(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=s*a;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&a>c?{ok:!1,status:"BLOCK",reason:`unit fee ${a} exceeds cap ${c}`,chainId:t,unitFeeWei:a.toString(),maxFeePerGasWei:c.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:u!=null&&l!=null&&u>l?{ok:!1,status:"BLOCK",reason:`priority fee ${u} exceeds cap ${l}`,chainId:t,priorityFeeWei:u.toString(),maxPriorityFeePerGasWei:l.toString(),totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:{ok:!0,status:"PASS",reason:"gas envelope within NFT mint gas-war caps",chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString(),unitFeeWei:a.toString(),maxFeePerGasWei:c?.toString()??null,priorityFeeWei:u?.toString()??null,maxPriorityFeePerGasWei:l?.toString()??null}}catch(t){return{ok:!1,status:"BLOCK",reason:String(t?.message||t)}}}function HA(e={}){let t=bg(e);if(!t.ok)throw new yg(t);return t}var F3,yg,wg=_(()=>{F3=/^(0|[1-9][0-9]*)$/,yg=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}}});import{readFileSync as H3,existsSync as z3}from"node:fs";import{getAddress as V3,Interface as Yu,TypedDataEncoder as vg,parseUnits as W3}from"ethers";function Q3(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!z3(e))return"";try{for(let t of H3(e,"utf8").split(`
|
|
7
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Hn(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||Q3()}function XA(e={}){return Me({provider:"opensea",defaultUrl:G3,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function zr(e={}){return XA(e).baseUrl}function Vr(e={}){return Ue({accept:"application/json"},{"x-api-key":Hn(e)},XA(e).trusted)}function JA(e){let t=String(e||"ethereum").trim().toLowerCase();if(!J3.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ce(e,t="address"){try{return V3(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function QA(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!YA.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ce(n,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(n))throw new Error("opensea: invalid account address");return n}function Z3(e,t){let n=String(e??"").trim();if(!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(n)||Number(n)<=0)throw new Error(`opensea: ${t} must be a positive plain decimal`);return n}function ej(e,t){let n=Number(e);if(!Number.isSafeInteger(n)||n<=0)throw new Error(`opensea: ${t} must be a positive integer`);return n}function zA(e,t){let n=String(e||"").trim(),r=Date.parse(n);if(!n||!Number.isFinite(r))throw new Error(`opensea: ${t} must be an ISO 8601 timestamp`);return{text:new Date(r).toISOString(),ms:r}}function tj(e={},t,n){return{chain:t,owner:n,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,quantity:e.quantity==null&&e.balance==null?null:String(e.quantity??e.balance),collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function ZA(e={}){if(!Hn(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await $a("boredapeyachtclub",e);return{ok:!0,configured:!0,name:t.name||t.collection}}catch(t){return{ok:!1,configured:!0,error:String(t.message||t).slice(0,160)}}}async function $a(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${zr(t)}/collections/${encodeURIComponent(e)}`,{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function nj(e,t={}){if(!e)throw new Error("collection slug required");if(!Hn(t))throw new Error("OPENSEA_API_KEY required");return x(`${zr(t)}/collections/${encodeURIComponent(e)}/stats`,{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function eI(e,t={}){let n=await $a(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;if(o==null){let d=await nj(e,t);r=d?.total||d?.stats||d||{},o=r.floor_price??r.floorPrice??null}let i=(Array.isArray(n.contracts)?n.contracts:[]).map(d=>({chain:String(d?.chain||d?.chain_identifier||n.chain||"").trim().toLowerCase(),address:String(d?.address||d?.contract_address||d?.contract||"").trim()})).filter(d=>d.chain&&d.address),s=String(t.expectedChain||"").trim().toLowerCase(),a=String(t.expectedContract||"").trim(),c=null;if(s&&a){let d=p=>s==="solana"?p:p.toLowerCase();if(c=i.find(p=>p.chain===s&&d(p.address)===d(a))||null,!c)throw new Error("opensea: collection identity does not match held contract")}let l=c?.chain||String(n.chain||"").trim().toLowerCase()||i[0]?.chain||"",u=String(n.floor_price_symbol||n.floorPriceSymbol||r.floor_price_symbol||r.floorPriceSymbol||"").trim().toUpperCase()||null;return{slug:n.collection||e,name:n.name||null,floor:o,chain:l||null,contracts:i,currency:u,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:i,fees:n.fees,category:n.category}}}async function Ba(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=JA(e.chain),r=QA(e.address||e.owner,n),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let l=new URL(`${zr(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),a&&l.searchParams.set("next",a);let u=await x(l.toString(),{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])s.push(tj(d,n,r));a=u?.next?String(u.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function Xu(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=QA(e.address||e.owner),r=await x(`${zr(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}function Da(e){let t=String(e||"").trim().toLowerCase(),n=Ju[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ft(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`opensea: ${t} must be an unsigned integer`);let o=BigInt(r);if(n&&o<=0n)throw new Error(`opensea: ${t} must be positive`);return o}function rj(e,t="transaction value"){let n;try{let r=String(e??"0").trim();if(!/^(?:0x[0-9a-fA-F]+|\d+)$/.test(r))throw new Error("invalid");n=BigInt(r)}catch{throw new Error(`opensea: ${t} must be a non-negative integer quantity`)}if(n<0n)throw new Error(`opensea: ${t} must be non-negative`);return{amount:n,hex:`0x${n.toString(16)}`}}function Ma(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function tI(e,t=10){let n=Number(e??1);if(!Number.isSafeInteger(n)||n<1||n>t)throw new Error(`opensea: quantity must be an integer from 1 through ${t}`);return n}function nI(e,t,n="listing expiry"){let r=e==null?"":String(e).trim(),o;if(/^\d+$/.test(r)){let i=Number(r);o=r.length<=10?i*1e3:i}else o=Date.parse(r);if(!r||!Number.isFinite(o))throw new Error(`opensea: ${n} missing or invalid`);if(o<=t)throw new Error(`opensea: ${n} is expired or stale`);return new Date(o).toISOString()}function oj(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function ij(e,t){let n=Number(e?.itemType);if(![0,1].includes(n))throw new Error(`opensea: ${t} is not a native or ERC20 payment item`);let r=ce(e?.token,t);if(n===0&&r!==La)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===La)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function sj(e,t){let n=Ft(e?.startAmount,`${t} startAmount`),r=Ft(e?.endAmount??e?.startAmount,`${t} endAmount`);if(n!==r)throw new Error(`opensea: ${t} must be a fixed amount, not a decaying range`);return n}function Sg(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(oj);if(!r.length){if(n)throw new Error(`opensea: ${t} contains no native or ERC20 payment item`);return{paymentToken:null,totalWei:0n,count:0}}let o=null,i=0n;for(let s of r){let a=ij(s,`${t} payment token`);if(o==null)o=a;else if(a!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=sj(s,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}function Yt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function VA(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(n))throw new Error(`opensea: ${t} must be a 32-byte hex value`);return n}function rI(e,t){return{itemType:Number(Yt(e?.itemType,`${t} itemType`)),token:ce(e?.token,`${t} token`),identifierOrCriteria:Yt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Yt(e?.startAmount,`${t} startAmount`),endAmount:Yt(e?.endAmount,`${t} endAmount`)}}function cj(e,t){return{...rI(e,t),recipient:ce(e?.recipient,`${t} recipient`)}}function lj(e,t){if(!e||typeof e!="object")throw new Error(`opensea: ${t} has no canonical Seaport protocol parameters`);let n=Array.isArray(e.offer)?e.offer:null,r=Array.isArray(e.consideration)?e.consideration:null;if(!n||!n.length)throw new Error(`opensea: ${t} canonical offer array is missing`);if(!r||!r.length)throw new Error(`opensea: ${t} canonical consideration array is missing`);return{offerer:ce(e.offerer,`${t} offerer`),zone:ce(e.zone,`${t} zone`),offer:n.map((o,i)=>rI(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>cj(o,`${t} consideration[${i}]`)),orderType:Number(Yt(e.orderType,`${t} orderType`)),startTime:Yt(e.startTime,`${t} startTime`),endTime:Yt(e.endTime,`${t} endTime`),zoneHash:VA(e.zoneHash,`${t} zoneHash`),salt:Yt(e.salt,`${t} salt`),conduitKey:VA(e.conduitKey,`${t} conduitKey`),counter:Yt(e.counter,`${t} counter`)}}function oI(e,t,n){let r=String(e?.order_hash??e?.orderHash??"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(r))throw new Error(`opensea: invalid ${n} order hash`);let o=lj(t,n);if(vg.hashStruct("OrderComponents",aj,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function iI(e,t){let n=Number(e?.itemType);if([4,5].includes(n))throw new Error(`opensea: ${t} is a criteria item, not a fixed token`);if(![2,3].includes(n))throw new Error(`opensea: ${t} must be an ERC-721 or ERC-1155 item`);let r=ce(e?.token,`${t} contract`),o=Ma(e?.identifierOrCriteria),i=Ft(e?.startAmount,`${t} startAmount`,{positive:!0}),s=Ft(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==s)throw new Error(`opensea: ${t} must be a fixed quantity, not a decaying range`);if(n===2&&i!==1n)throw new Error(`opensea: ${t} ERC-721 quantity must be exactly 1`);if(i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`opensea: ${t} quantity exceeds safe integer range`);return{itemType:n,contract:r,tokenId:o,quantity:Number(i)}}function uj(e,t){let n=Array.isArray(e?.offer)?e.offer:[];if(n.some(o=>[4,5].includes(Number(o?.itemType))))throw new Error(`opensea: ${t} uses a criteria offer item, not a fixed token`);let r=n.filter(o=>[2,3].includes(Number(o?.itemType)));if(r.length!==1||n.length!==1)throw new Error(`opensea: ${t} must offer exactly one fixed ERC-721 or ERC-1155 item`);return iI(r[0],`${t} offer NFT`)}function dj(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(s=>[4,5].includes(Number(s?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(s=>[2,3].includes(Number(s?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=iI(o[0],`${n} consideration NFT`);if(i.tokenId!==t)throw new Error(`opensea: ${n} consideration token does not match the requested token`);return i}function pj(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ce(e.contract,`${r} display contract`)!==t)throw new Error(`opensea: ${r} display asset contract disagrees with the canonical Seaport offer`);if(e.identifier!=null&&String(e.identifier).trim()!==""&&String(e.identifier).trim()!==n)throw new Error(`opensea: ${r} display asset token disagrees with the canonical Seaport offer`)}}function fj(e){let t=String(e??"").trim();return/^\d+$/.test(t)?t.length<=10?Number(t):Math.floor(Number(t)/1e3):Math.floor(Date.parse(t)/1e3)}function sI(e,t,n,r){let o=Yt(t?.startTime,`${r} startTime`),i=Yt(t?.endTime,`${r} endTime`),s=BigInt(Math.floor(n/1e3));if(BigInt(o)>s)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=s)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let a=nI(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&fj(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return a}function mj(e,t,n){if(!e||typeof e!="object")throw new Error("opensea: invalid best listing");let r=String(e.chain||"").trim().toLowerCase();if(r!==t.chain)throw new Error("opensea: OpenSea returned a listing for the wrong chain");if(Ju[r]!==t.chainId)throw new Error("opensea: OpenSea listing chain id mismatch");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active listing");let i=e.protocol_data?.parameters,s=uj(i,"listing"),a=s.contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=s.tokenId;pj(e.asset,a,c,"listing");let l=Ft(e.price?.current?.value,"listing price",{positive:!0}),u=oI(e,i,"listing"),d=Sg(i?.consideration,"listing consideration");if(d.totalWei!==l)throw new Error("opensea: listing consideration total does not equal the quoted listing price");return{orderHash:u,chain:t.chain,chainId:t.chainId,protocolAddress:ce(e.protocol_address,"listing protocol address"),contract:a,tokenId:c,quantity:s.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:sI(e,i,n,"listing"),counter:Yt(i?.counter,"listing counter")}}async function Eg(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Da(e.chain);n.contract=e.contract?ce(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Number(e.limit??12);if(!Number.isSafeInteger(o)||o<1||o>50)throw new Error("opensea: listing limit must be 1 through 50");let i=new URL(`${zr(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let s=await x(i.toString(),{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=Array.isArray(s?.listings)?s.listings:[];if(!a.length)throw new Error("opensea: no active best listings returned");let c=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return{provider:"opensea-nft",source:"opensea-best-listings",chain:n.chain,chainId:n.chainId,slug:r,contract:n.contract,listings:a.map(l=>mj(l,n,c)),next:s?.next?String(s.next):null,exec:!1,readOnly:!0}}async function Qu(e={},t={}){let n=Ma(e.tokenId),r=Math.min(Math.max(Number(e.maxPages??20)||20,1),25),o=e.next?String(e.next):null,i=new Set;for(let s=1;s<=r;s+=1){let a=await Eg({...e,tokenId:void 0,limit:50,next:o},t),c=a.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:s,exact:!0,exec:!1,readOnly:!0};if(!a.next||i.has(a.next))break;i.add(a.next),o=a.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function hj(e,t,n,r){if(!e||typeof e!="object")throw new Error("opensea: invalid best offer");if(String(e.chain||"").trim().toLowerCase()!==t.chain)throw new Error("opensea: OpenSea returned an offer for the wrong chain");if(String(e.status||"").toUpperCase()!=="ACTIVE")throw new Error("opensea: OpenSea returned a non-active offer");let i=e.protocol_data?.parameters||{},a=dj(i,n,"offer").contract;if(t.contract&&a!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ft(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Sg(i.offer,"offer payment"),u=l.paymentToken;if(l.totalWei!==c)throw new Error("opensea: offer payment total does not equal the quoted gross offer");let d=Sg(i.consideration,"offer fee",{required:!1});if(d.count&&d.paymentToken!==u)throw new Error("opensea: offer fee consideration uses a different token than the offer payment");if(d.totalWei>c)throw new Error("opensea: offer fee consideration exceeds the gross offer");let p=d.totalWei.toString(),m=(c-d.totalWei).toString();return{provider:"opensea-nft",source:"opensea-best-exact-offer",orderHash:oI(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ce(e.protocol_address,"offer protocol address"),contract:a,tokenId:n,grossOfferWei:c.toString(),sellerNetWei:m,feeWei:p,paymentToken:u,currency:String(e.price?.current?.currency||e.price?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??e.price?.decimals??18),expiry:sI(e,i,r,"offer"),counter:Yt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Zu(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");let n=Da(e.chain);n.contract=e.contract?ce(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Ma(e.tokenId),i=await x(`${zr(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:Vr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!s)throw new Error("opensea: no active exact NFT offer returned");let a=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return hj(s,n,o,a)}function gj(e){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after buyer, chain, contract, token, quantity, price cap, total cap, and expiry review")}function aI(e){if(!e||typeof e!="object")return!1;let t=String(e.action??e.type??e.method??"");return/approv|setapprovalforall|permit/i.test(t)?!0:Object.values(e).some(n=>n&&typeof n=="object"&&aI(n))}function cI(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function lI(e){return!e||typeof e!="object"?!1:cI(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&lI(t))}function uI(e,t=[],n=new Set){if(!e||typeof e!="object"||n.has(e))return t;n.add(e),e.transaction&&typeof e.transaction=="object"?t.push(e.transaction):e.tx&&typeof e.tx=="object"&&t.push(e.tx);for(let[r,o]of Object.entries(e))(r==="transaction"||r==="tx")&&o&&typeof o=="object"||o&&typeof o=="object"&&uI(o,t,n);return t}function WA(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function dI(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(cI(e))throw new Error("opensea: signed transaction material refused");if((e.from?ce(WA(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ce(WA(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let s=e.data??e.calldata,a=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(s==null&&a){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");s=Y3.encodeFunctionData("fulfillAdvancedOrder",[a.advancedOrder,a.criteriaResolvers,a.fulfillerConduitKey,a.recipient])}let c=String(s??"").trim().toLowerCase();if(!/^0x(?:[0-9a-f]{2})+$/.test(c))throw new Error("opensea: OpenSea returned invalid transaction calldata");let l=e.calldata_suffix==null?"":String(e.calldata_suffix).trim().toLowerCase();if(l){if(!/^0x[0-9a-f]{8}$/.test(l))throw new Error("opensea: invalid OpenSea calldata suffix");c.endsWith(l.slice(2))||(c+=l.slice(2))}let u=e.chainId??e.chain_id??e.chainIdentifier?.chainId;if(u!=null&&Number(u)!==n)throw new Error("opensea: OpenSea returned a transaction for the wrong chain");let d=rj(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function ed(e){return{from:e.from,to:e.to,data:e.data,value:e.value,chainId:e.chainId,...e.gasLimit==null?{}:{gasLimit:e.gasLimit},...e.maxFeePerGas==null?{}:{maxFeePerGas:e.maxFeePerGas},...e.maxPriorityFeePerGas==null?{}:{maxPriorityFeePerGas:e.maxPriorityFeePerGas},...e.worstCaseFeeWei==null?{}:{worstCaseFeeWei:e.worstCaseFeeWei}}}async function xg(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await Ge(e,4,async c=>{let{chainId:l,...u}=ed(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(Ne(),lu)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),s=null,a=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();a=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),s=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(Ne(),lu)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{a=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{a=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+a;s=u>m?u:m}return s!=null&&a!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=a.toString(),c.maxFeePerGas=s.toString(),c.worstCaseFeeWei=(d*s).toString()}),{simulated:!0,gasEstimates:i}}function yj(e,t){if(aI(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(lI(e))throw new Error("opensea: signed transaction material refused");let n=uI(e);if(!n.length&&e&&typeof e=="object"&&(e.to||e.target)&&n.push(e),!n.length)throw new Error("opensea: OpenSea returned no transaction action");return n.map(r=>dI(r,t))}function bj(e,t,n={}){return U({...e,provider:"opensea-nft",kind:t,marketplace:"opensea",prepareReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,note:"Unsigned OpenSea EVM NFT transaction preparation only. The private signer must revalidate every bound field before the user signs or broadcasts."},n)}async function pI(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function fI(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function wj(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(s=>String(s?.chain||t).toLowerCase()===t&&s?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=ce(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function td(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");gj(e);let{chain:n,chainId:r}=Da(e.chain),o=ce(e.buyer||e.minter||e.address,"buyer"),i=ce(e.contract,"NFT contract"),s=tI(e.quantity),a=Ft(e.priceWei,"priceWei"),c=Ft(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=nI(e.expiry,l,"mint expiry");if(e.tokenId!=null)throw new Error("opensea: SeaDrop mint tokenId is unknown until the mined receipt and must not be caller supplied");let d=String(e.slug||"").trim();if(!d)throw new Error("opensea: collection slug required");let p=await $a(d,t),m=wj(p,n,i),f=a*BigInt(s);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await x(`${zr(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:Vr(t),body:{minter:o,quantity:s},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,y=Array.isArray(g)?g:g?[g]:[];if(!y.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let b=new Set(y.map($=>ce($,"SeaDrop mint target"))),w=yj(h,{buyer:o,chainId:r,targets:b});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let S,v,I=null,A;try{S=Ku.decodeFunctionData("mintPublic",w[0].data),v="public",A=Ku.encodeFunctionData("mintPublic",[S[0],S[1],S[2],S[3]])}catch{try{S=Ku.decodeFunctionData("mintAllowList",w[0].data),v="allowlist";let $=S[4],j=[...S[5]].map(String);if(j.length<1||j.length>64||j.some(K=>!/^0x[0-9a-fA-F]{64}$/.test(K)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let C=BigInt($.startTime),B=BigInt($.endTime),V=BigInt(Math.floor(l/1e3));if(C>V||B<=V)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==a)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(s))throw new Error("opensea: allowlist wallet cap is below requested quantity");A=Ku.encodeFunctionData("mintAllowList",[S[0],S[1],S[2],S[3],$,j]),I={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:C.toString(),endTime:B.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:j}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=ce(S[0],"mint NFT contract"),k=ce(S[1],"mint fee recipient"),O=ce(S[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(O!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(S[3])!==BigInt(s))throw new Error("opensea: mint calldata quantity mismatch");if(A.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=w.reduce(($,j)=>$+j.valueWei,0n);if(T!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let D=await xg(w,r,{...t,provider:e.provider||t.provider});if(D.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let X=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=HA({chainId:r,tx:w[0],policy:X});return bj({action:"mint",mintType:v,...I?{stage:I}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:s,priceWei:a.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:w[0].to,feeRecipient:k,expiry:u,transactions:w.map(ed),gasWar:H,...D},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Li,Date.parse(u),I?Number(BigInt(I.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function Sj(e={}){let t=JA(e.chain);if(YA.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?zA(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=zA(e.endTime||e.end_time,"endTime");if(r.ms<=n.ms)throw new Error("opensea: endTime must be after startTime");let o=String(e.tokenId??e.token_id??"").trim();if(!/^\d+$/.test(o))throw new Error("opensea: tokenId must be an unsigned integer string");return{chain:t,contract:ce(e.contract,"NFT contract"),token_id:o,quantity:ej(e.quantity??1,"quantity"),price:{amount:Z3(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ce(e.price?.currency??e.currency??La,"price currency")},start_time:n.text,end_time:r.text}}function KA(e,t){return e?.[t]||(e?.action===t?e:null)}function Ej(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>KA(w,"createListingsAction")).find(Boolean)||o.find(w=>/createListings/i.test(String(w?.action||""))),s=i?.signatureRequest?.message??i?.typedData,a;try{a=typeof s=="string"?JSON.parse(s):s}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!a||a.primaryType!=="OrderComponents"||!a.domain||!a.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=a.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=ce(c.verifyingContract,"listing protocol"),u=a.message;if(ce(u.offerer,"listing seller")!==t)throw new Error("opensea: listing seller mismatch");if(!Array.isArray(u.offer)||u.offer.length!==1)throw new Error("opensea: executable listing requires exactly one NFT offer");let d=u.offer[0];if(![2,3].includes(Number(d.itemType)))throw new Error("opensea: listing offer must be ERC721 or ERC1155");if(ce(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let w of u.consideration){if(Number(w.itemType)!==0||ce(w.token,"listing payment token")!==La)throw new Error("opensea: executable listings currently require native fixed-price consideration");let S=BigInt(w.startAmount),v=BigInt(w.endAmount);if(S<=0n||S!==v)throw new Error("opensea: listing consideration must be fixed and positive");ce(w.recipient,"listing consideration recipient"),p+=S}let m=W3(n.price.amount,18);if(p!==m)throw new Error("opensea: listing price mismatch");let f=BigInt(Math.floor(Date.parse(n.start_time)/1e3)),h=BigInt(Math.floor(Date.parse(n.end_time)/1e3));if(BigInt(u.startTime)!==f||BigInt(u.endTime)!==h)throw new Error("opensea: listing time bounds mismatch");let g=vg.hashStruct("OrderComponents",Gi,u),y=o.map(w=>KA(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),b=null;if(y){let w=y.transaction||y.itemApprovalAction?.transaction,S=dI(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=GA.decodeFunctionData("setApprovalForAll",S.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let I=ce(v[0],"listing approval operator");if(v[1]!==!0||S.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(GA.encodeFunctionData("setApprovalForAll",[I,!0]).toLowerCase()!==S.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");b={...S,operator:I}}return{protocolAddress:l,typedData:{domain:c,types:Gi,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:b}}async function nd(e={},t={}){if(!Hn(t))throw new Error("OPENSEA_API_KEY required");if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required after NFT, marketplace, price, currency, and expiry review");let n=ce(e.seller||e.address||e.owner,"seller"),r=Array.isArray(e.items)&&e.items.length?e.items:[e];if(r.length!==1)throw new Error("opensea: executable listing preparation supports exactly one NFT per envelope");let o=r.map(Sj);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let s=e.useCreatorFee!==!1,a={address:n,items:o,use_creator_fee:s};e.taker&&(a.taker=ce(e.taker,"taker"));let c=await x(`${zr(t)}/listings/actions`,{method:"POST",headers:Vr(t),body:a,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Da(o[0].chain),u=Ej(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await xg(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return U({provider:"opensea-nft",marketplace:"opensea",chain:o[0].chain,chainId:l,kind:"nft-list",action:"list",prepareReady:!0,executionReady:p.simulated===!0,signingReady:p.simulated===!0,broadcastReady:p.simulated===!0,requiresUserSignature:!0,requiresSeparateApproval:d.length>0,seller:n,contract:o[0].contract,tokenId:o[0].token_id,quantity:o[0].quantity,priceWei:u.priceWei.toString(),typedData:u.typedData,orderHash:u.orderHash,submission:{chain:o[0].chain,protocol:"seaport",protocolAddress:u.protocolAddress},transactions:d.map(ed),useCreatorFee:s,taker:a.taker||null,feeDisclosure:s?"Creator fees requested and bound into exact Seaport consideration recipients.":"Creator fees disabled by explicit request; every remaining consideration recipient is still bound.",...p})}async function mI(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Da(e.chain),o=ce(e.seller||e.address||e.owner,"seller"),i=ce(e.protocolAddress,"reviewed Seaport protocol address"),s=ce(e.contract,"NFT contract"),a=Ma(e.tokenId),c=tI(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[E,k]of Object.entries(Gi)){let O=l.types?.[E];if(!Array.isArray(O)||O.length!==k.length||O.some((T,D)=>T?.name!==k[D].name||T?.type!==k[D].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Gi).sort().join(","))throw new Error("opensea: cancellation requires canonical Seaport types");let d=l.domain;if(d.name!=="Seaport"||d.version!=="1.6"||Number(d.chainId)!==r)throw new Error("opensea: cancellation domain mismatch");let p=ce(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ce(m.offerer,"listing seller")!==o)throw new Error("opensea: cancellation seller mismatch");if(!Array.isArray(m.offer)||m.offer.length!==1||!Array.isArray(m.consideration)||!m.consideration.length)throw new Error("opensea: cancellation requires one exact previously prepared listing order");if(Number(m.orderType)!==2)throw new Error("opensea: cancellation requires a FULL_RESTRICTED listing order");let f=m.offer[0];if(![2,3].includes(Number(f.itemType)))throw new Error("opensea: cancellation offer must be ERC721 or ERC1155");if(ce(f.token,"cancellation NFT contract")!==s)throw new Error("opensea: cancellation NFT contract mismatch");if(Ma(f.identifierOrCriteria)!==a)throw new Error("opensea: cancellation tokenId mismatch");let h=Ft(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ft(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let E of m.consideration){if(Number(E.itemType)!==0||ce(E.token,"cancellation payment token")!==La)throw new Error("opensea: cancellation requires native fixed-price consideration");let k=Ft(E.startAmount,"cancellation consideration startAmount",{positive:!0}),O=Ft(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(k!==O)throw new Error("opensea: cancellation consideration must be fixed and positive");ce(E.recipient,"cancellation consideration recipient")}let y=Ft(m.startTime,"cancellation startTime");if(Ft(m.endTime,"cancellation endTime",{positive:!0})<=y)throw new Error("opensea: cancellation listing time bounds invalid");let w=vg.hashStruct("OrderComponents",Gi,m),S=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(S)||S!==w.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=vj.encodeFunctionData("cancel",[[m]]),I=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],A=await xg(I,r,{...t,provider:e.provider||t.provider});if(A.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return U({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:s,tokenId:a,quantity:c,protocolAddress:p,orderHash:w,typedData:{domain:d,types:Gi,primaryType:"OrderComponents",message:m},transactions:I.map(ed),...A,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}var G3,K3,Y3,Ku,X3,J3,YA,La,Ju,aj,Gi,GA,vj,Ki=_(()=>{q();vt();oe();wg();G3="https://api.opensea.io/api/v2",K3="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",Y3=new Yu([`function ${K3}`]),Ku=new Yu(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),X3=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),J3=new Set(X3),YA=new Set(["solana","flow"]),La="0x0000000000000000000000000000000000000000";Ju=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988});aj=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]});Gi={OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]},GA=new Yu(["function setApprovalForAll(address operator,bool approved)"]),vj=new Yu(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"])});function Aj(e,t){return`0x${Ig.getAmountsOut}`+fn(e)+fn(64)+fn(t.length)+t.map(Ua).join("")}function Ij(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length<128)return null;let n=Number(BigInt(`0x${t.slice(64,128)}`));if(!Number.isFinite(n)||n<1||n>16)return null;let r=[];for(let o=0;o<n;o++){let i=128+o*64;if(t.length<i+64)return null;r.push(BigInt(`0x${t.slice(i,i+64)}`))}return r}function Ag(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}function kj(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>kg)throw new Error(`slippageBps ${n} exceeds the ${kg} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function hI(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,s,a){let c=await J(t,"eth_call",[{to:o,data:Aj(i,s)},"latest"],a);return Ij(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:s,path:a},c={}){let l=Ag(c.scanner);if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=a||[o,i];if(u.some(p=>!/^0x[0-9a-fA-F]{40}$/.test(p||"")))throw new Error("quote requires valid 20-byte addresses");let d=await r(l,s,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(s),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:se.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:se.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:s},a={}){let c=Ag(a.scanner),l=s||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:te.UNKNOWN,evidence:se.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!c||!l)return{chainId:t,token:o,verdict:te.UNKNOWN,evidence:se.UNAVAILABLE,reason:c?"no wrappedNative configured for this chain, so no base asset to round-trip against":"no verified router configured for this chain"};let u=await r(c,i,[l,o],a);if(!u)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"buy leg returned no amounts -- no route in"};let d=u[u.length-1];if(d===0n)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],a);if(!p)return{chainId:t,token:o,verdict:te.FAIL,evidence:se.LIVE,leg:"sell",bought:d.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p[p.length-1],f=Number(m*10000n/BigInt(i)),h=te.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=te.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=te.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,token:o,base:l,router:c,verdict:h,reason:g,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:s,recipient:a,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=Ag(p);if(!m)throw new Error(`chain ${t} has no verified router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!/^0x[0-9a-fA-F]{40}$/.test(a||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:s,path:f},d);if(h.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=kj(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=BigInt(Math.floor(Date.now()/1e3)+Number(l)),b=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=b?`0x${Ig.swapExactETHForTokens}`+fn(g)+fn(128)+Ua(a)+fn(y)+fn(f.length)+f.map(Ua).join(""):`0x${Ig.swapExactTokensForTokens}`+fn(s)+fn(g)+fn(160)+Ua(a)+fn(y)+fn(f.length)+f.map(Ua).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:b?`0x${BigInt(s).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:kg,deadline:y.toString()},requires:b?[]:[{step:"approve",token:f[0],spender:m,amount:String(s)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var Ig,fn,Ua,kg,gI=_(()=>{Ne();jo();Ig={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},fn=e=>BigInt(e).toString(16).padStart(64,"0"),Ua=e=>e.slice(2).toLowerCase().padStart(64,"0");kg=100});function Oj(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Og)throw new Error(`slippageBps ${n} exceeds the ${Og} bps ceiling. Block and requote or split the order -- do not widen the guard to force a fill.`);return BigInt(e)*BigInt(1e4-Math.floor(n))/10000n}function _g(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function wI(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:l},u){let d=`0x${yI.quoteExactInputSingle}`+Fa(s)+Fa(a)+Go(c)+Go(l)+Go(0),p=await J(t,"eth_call",[{to:i,data:d},"latest"],u).catch(()=>null),m=p?.result??p;if(!m||m==="0x"||m.length<66)return null;let f=BigInt(`0x${m.slice(2,66)}`);return f>0n?f:null}async function o({quoter:i,tokenIn:s,tokenOut:a,amountIn:c},l){let u=await Promise.all(_j.map(async p=>{let m=await r({quoter:i,tokenIn:s,tokenOut:a,amountIn:c,fee:p},l);return{fee:p,amountOut:m?m.toString():null,out:m}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:m})=>({fee:p,amountOut:m}))}}return{async quote({tokenIn:i,tokenOut:s,amountIn:a},c={}){let l=_g(c.scanner,"quoter");if(!l)return{chainId:t,evidence:se.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,s])if(!bI.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:s,amountIn:a},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:s,amountIn:String(a),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:se.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:s,triedFeeTiers:d,evidence:se.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:s,base:a},c={}){let l=_g(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!a&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),m=String(n||"").toLowerCase();if(m&&p===m)return{chainId:t,token:i,verdict:te.UNKNOWN,evidence:se.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let f=a||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:te.UNKNOWN,evidence:se.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!f)return{chainId:t,token:i,verdict:te.UNKNOWN,evidence:se.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let h=await o({quoter:l,tokenIn:f,tokenOut:i,amountIn:s},c);if(!h.best){let v=u.find(I=>I&&I!==String(f).toLowerCase()&&I!==String(i).toLowerCase());if(v){let I=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c);if(I.best){let A=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:I.best.amountOut},c);if(A.best){let E=A.best.amountOut,k=Number(E*10000n/BigInt(s)),O=te.PASS,T="round trip vs dollar book completes with expected fee/impact loss";return k<5e3?(O=te.FAIL,T=`round trip vs dollar book returns only ${(k/100).toFixed(2)}% -- punitive tax or no real liquidity`):k<9e3&&(O=te.CAUTION,T=`round trip vs dollar book returns ${(k/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:O,reason:T,amountIn:String(s),bought:I.best.amountOut.toString(),returned:E.toString(),retentionBps:k,buyFee:I.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!g.best){let v=u.find(I=>I&&I!==String(f).toLowerCase()&&I!==String(i).toLowerCase());if(v){let I=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:s},c),A=I.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:I.best.amountOut},c):{best:null};if(I.best&&A.best){let E=A.best.amountOut,k=Number(E*10000n/BigInt(s)),O=te.PASS,T="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return k<5e3?(O=te.FAIL,T=`dollar-book round trip returns only ${(k/100).toFixed(2)}%`):k<9e3&&(O=te.CAUTION,T=`dollar-book round trip returns ${(k/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:O,reason:T,amountIn:String(s),bought:I.best.amountOut.toString(),returned:E.toString(),retentionBps:k,buyFee:I.best.fee,sellFee:A.best.fee,evidence:se.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:te.FAIL,evidence:se.LIVE,leg:"sell",bought:h.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let y=g.best.amountOut,b=Number(y*10000n/BigInt(s)),w=te.PASS,S="round trip completes with expected fee/impact loss";return b<5e3?(w=te.FAIL,S=`round trip returns only ${(b/100).toFixed(2)}% -- punitive tax or no real liquidity`):b<9e3&&(w=te.CAUTION,S=`round trip returns ${(b/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:w,reason:S,amountIn:String(s),bought:h.best.amountOut.toString(),returned:y.toString(),retentionBps:b,buyFee:h.best.fee,sellFee:g.best.fee,evidence:se.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:s,amountIn:a,recipient:c,slippageBps:l=50,fee:u},d={}){let p=_g(d.scanner,"router");if(!p)throw new Error(`chain ${t} has no verified V3 router; preparing a swap stays fail-closed. Add a venue with recorded provenance first (see docs/adding-a-chain.md).`);if(!bI.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:s,amountIn:a},d);if(m.evidence!==se.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=Oj(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let g=!!(d.useNative||m.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),y=`0x${yI.exactInputSingle}`+Fa(i)+Fa(s)+Go(f)+Fa(c)+Go(a)+Go(h)+Go(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:y,value:g?String(a):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Og,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,amount:String(a)}],note:"UNSIGNED. Re-verify the guard against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."}}}}var _j,yI,Go,Fa,bI,Og,SI=_(()=>{Ne();jo();_j=[100,500,3e3,1e4],yI={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Go=e=>BigInt(e).toString(16).padStart(64,"0"),Fa=e=>e.slice(2).toLowerCase().padStart(64,"0"),bI=/^0x[0-9a-fA-F]{40}$/,Og=100});function vI(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function EI(e){if(!e||e==="0x")return null;let t=e.slice(2);if(t.length>=128){let r=Number(BigInt(`0x${t.slice(64,128)}`));if(r>0&&r<=256&&t.length>=128+r*2){let o=t.slice(128,128+r*2),i=Buffer.from(o,"hex").toString("utf8").replace(/\0+$/,"");if(i)return i}}return Buffer.from(t.slice(0,64),"hex").toString("utf8").replace(/\0+$/,"")||null}function Nj(e){let{chainId:t}=e;async function n(r,o,i){return J(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await ga(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:se.LIVE}},async nativeBalance(r,o={}){let i=await Do(t,r,o);return{chainId:t,address:r,wei:i?.wei??i?.balance??null,symbol:e.nativeCurrency?.symbol??null,decimals:e.nativeCurrency?.decimals??18,evidence:se.LIVE}},async tokenBalance({token:r,owner:o},i={}){let s=await ya({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:s?.balance??s,evidence:se.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:se.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,s,a,c]=await Promise.all([n(r,rd.decimals,o).catch(()=>null),n(r,rd.symbol,o).catch(()=>null),n(r,rd.name,o).catch(()=>null),n(r,rd.totalSupply,o).catch(()=>null)]),l=vI(i?.result??i),u=l!==null||s?.result||a?.result,d={chainId:t,address:r,decimals:l===null?null:Number(l),symbol:EI(s?.result??s),name:EI(a?.result??a),totalSupply:(vI(c?.result??c)??null)?.toString()??null,evidence:u?se.LIVE:se.UNKNOWN};return u||(d.warning="no ERC-20 metadata returned -- may not be a token contract"),d},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:se.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let s=await jn(r,o).catch(()=>null),c=(s?.pairs||s?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=Gm(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:FE(r,l),evidence:l.length?se.LIVE:se.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:s,chunkSize:a=2e3}={},c={}){if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("scanBlocks requires integer fromBlock and toBlock");if(o<r)throw new Error("toBlock must be >= fromBlock");let l=[],u=[];for(let p=r;p<=o;p+=a){let m=Math.min(p+a-1,o);u.push([p,m])}let d=await Ge(u,4,async([p,m])=>{let f={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${m.toString(16)}`};i&&(f.address=i),s&&(f.topics=s);let h=await J(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));return{start:p,end:m,res:h}});for(let{start:p,end:m,res:f}of d){if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,m],error:f.error,evidence:se.UNKNOWN};for(let h of f?.result??f??[])l.push(h)}return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!0,chunks:u.length,evidence:se.LIVE}},async scoreRisk(r,o={}){let i=[],s=te.PASS,a=u=>{let d={[te.PASS]:0,[te.CAUTION]:1,[te.UNKNOWN]:2,[te.FAIL]:3};d[u]>d[s]&&(s=u)},[c,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==se.LIVE?(i.push({check:"erc20-metadata",result:te.UNKNOWN,detail:c.warning}),a(te.UNKNOWN)):i.push({check:"erc20-metadata",result:te.PASS,detail:`${c.symbol} / ${c.decimals}d`}),l.evidence===se.UNAVAILABLE)i.push({check:"liquidity",result:te.UNKNOWN,detail:l.reason}),a(te.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:te.FAIL,detail:"no pool with liquidity found"}),a(te.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:te.CAUTION,detail:`top pool only $${d}`}),a(te.CAUTION)):i.push({check:"liquidity",result:te.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:te.CAUTION,detail:"pool under 24h old"}),a(te.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:te.UNKNOWN,reason:String(d?.message||d)}));i.push({check:"sellability",result:u.verdict,detail:u.retentionBps!=null?`round trip returns ${(u.retentionBps/100).toFixed(2)}% -- ${u.reason}`:u.reason}),a(u.verdict)}else i.push({check:"sellability",result:te.UNKNOWN,detail:"no verified router on this chain, so a round-trip sell simulation cannot run. Treat as unproven -- a buy path is not an exit path."}),a(te.UNKNOWN);return{chainId:t,token:r,verdict:s,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function Ng(e){let n={...Nj(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,wI({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,s)=>(await n.resolvePools(i,s)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,hI({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,s]of Object.entries(n))o[i]=s.bind(n);return{key:e.key,chainId:e.chainId,name:e.name,rpcEnv:e.rpcEnv,nativeCurrency:e.nativeCurrency,explorer:e.explorer,venues:e.venues||[],capabilities:o}}var rd,xI=_(()=>{Ne();nr();q();jo();gI();SI();Km();rd={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"}});var Tg={};ht(Tg,{CHAIN_CONFIGS:()=>Ko,registerBuiltinScanners:()=>od,registerCustomChain:()=>Tj});function od(){return Ko.map(e=>Eh(Ng(e)))}function Tj(e){return Eh(Ng(e))}var Ko,Yi=_(()=>{xI();jo();Ko=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}])});var kI={};ht(kI,{clearProvidersForTest:()=>Mj,getProvider:()=>Ji,listProviders:()=>qa,registerProvider:()=>P});function II(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))II(t);return Object.freeze(e)}function P(e){if(!e?.id)throw new Error("registerProvider requires id");if(!e.venue)throw new Error("registerProvider requires venue");if(!Array.isArray(e.ops))throw new Error("registerProvider requires ops[]");let t=String(e.id);if(AI&&Cg.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Xi.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Xi.get(t)}function Ji(e){return Xi.get(e)||null}function qa({venue:e,op:t}={}){let n=[...Xi.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function Mj(){Xi.clear()}function $j(){Cg.clear();for(let[e,t]of Xi)Cg.add(e),II(t);AI=!0}var Xi,Cj,Pj,Rj,Pg,Lj,Cg,AI,Rg=_(()=>{Mi();Ui();gg();Ki();Yi();Xi=new Map,Cj=Object.keys(wt).map(Number),Pj=Object.keys(Gt).map(Number),Rj=Object.keys(Vi).map(Number),Pg=Ko.map(e=>e.chainId),Lj=[...new Set(Object.values(Ju))],Cg=new Set,AI=!1;P({id:"hl-info",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","outcomeMeta","clearinghouse","userFills","meta","metaAndAssetCtxs","candleSnapshot","openOrders","frontendOpenOrders","userState","spotMeta"],baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Hyperliquid public /info"});P({id:"hl-vaults",venue:"hyperliquid-vaults",chainIds:[],auth:"none",ops:["health","summaries","details","userEquities","tracker"],execution:"read-only",baseEnv:["HL_INFO_URL","HL_API_URL"],description:"Read-only Hyperliquid vault summaries, vault details, user vault equities, and HLP tracking."});P({id:"hl-precompiles",venue:"hyperliquid",chainIds:[999],auth:"none",ops:["health","read","l1BlockNumber","markPx","oraclePx","spotPx","position","spotBalance","vaultEquity","withdrawable"],execution:"read-only",baseEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],description:"HyperEVM L1Read precompiles (0x800-0x809). eth_call only. Includes HLP vault equity. No CoreWriter."});P({id:"protocol-templates",venue:"protocol-builder",chainIds:[],auth:"none",ops:["health","list","listNative","gate","prepareDeploy","buildNative","eval"],description:"Gated EVM templates plus deterministic Solana program and Bitcoin policy scaffolds. Native bundles require chain-specific compile, tests, and simulation before any unsigned deploy/funding prepare. NOT a firm audit."});P({id:"poly-public",venue:"poly",chainIds:[137],auth:"none",ops:["health","time","markets","book","midpoint","spread","price","events"],execution:"read-only",baseEnv:["POLY_CLOB_URL","POLY_GAMMA_URL"],description:"Polymarket CLOB + Gamma public REST"});P({id:"poly-clob",venue:"poly",chainIds:[137],auth:"none",ops:["health","prepareOrder"],execution:"prepare",localSignerSurfaces:["poly"],description:"Polymarket CLOB unsigned EIP-712 order prepare plus owner-operated local-signer submit. Hosted/keyless remains prepare-only."});P({id:"hl-delta-neutral",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["hl"],description:"Hyperliquid funding carry. Armed through the existing hl signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"lighter-delta-neutral",venue:"lighter",chainIds:[],auth:"none",ops:["health","scan","quote","prepare","loop"],execution:"prepare",localSignerSurfaces:["lighter"],description:"Lighter.xyz funding carry. Armed through the official sendTx local-signer. Hosted/keyless remains prepare-only. Not automated."});P({id:"portfolio",venue:"multichain-wallet",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","balances","snapshot","history","valueGraph"],execution:"read-only",description:"Read-only balance aggregation across configured EVM chains, Solana, Bitcoin, and Hyperliquid, plus profile-local observation snapshots, history, and value graphs with explicit partial coverage."});P({id:"nft-portfolio",venue:"multichain-nft-wallet",chainIds:[1,10,137,988,999,2741,4663,8453,42161,43114],auth:"optionalApiKey",ops:["health","inventory","gallery","pnl","prepareList","traitSnipe"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Normalized EVM, Solana, and Bitcoin NFT inventory, static contact-sheet galleries, explicit PnL coverage, user-confirmed unsigned listing preparation, and evidence-gated trait-snipe buy intents."});P({id:"evm-simulate",venue:"onchain-simulation",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","simulate"],execution:"read",baseEnv:[],description:"Pre-sign EVM transaction simulation: eth_call at pending state to catch reverts, decoded revert reasons (Error(string), Panic codes, custom-error selectors), and a buffered gas estimate. Distinguishes a genuine revert from an unreachable node \u2014 an infra failure is never reported as 'would fail'. A pass reflects current chain state and is explicitly not a guarantee."});P({id:"bitcoin-mint-funding",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","annotateOutpoints","selectFundingInputs","liveFeeRate","planInscriptionFunding"],execution:"read",baseEnv:[],description:"Bitcoin/Ordinals mint funding safety. btcUtxos returns every UTXO an address owns and prepareOrdinalsMint validates PSBT structure but never checks whether an input holds an inscription \u2014 this is the missing step between them. Classifies outpoints against an ordinals index and EXCLUDES before selecting, so an inscription is never spent as fee-paying change and burned. An unreachable index degrades to 'nothing is provably safe' rather than 'everything looks clean'. Prices fees from the marginal rate of a projected block, and refuses an inscription too heavy to relay before any UTXO is touched."});P({id:"solana-mint-submit",venue:"onchain-mint",chainIds:[],auth:"none",ops:["health","freshBlockhash","deriveComputeUnitPrice","planMintFee","measureComputeUnits","constraints","planRpcEnvelope","planBundleEnvelope","planRetryEnvelope","bundleStatus"],execution:"read",baseEnv:[],description:"Solana mint submission adapter. Prepare-only: builds sendTransaction and Jito sendBundle requests for already-signed bytes and never broadcasts, because solanaRpc refuses every send* method by design. Derives the compute-unit price from live getRecentPrioritizationFees samples rather than any hardcoded figure, pins blockhash fetches to 'confirmed' (the 'finalized' default silently burns ~21% of the ~60s window), and refuses a re-signed retry \u2014 Solana has no nonce, so a re-signed transaction can land alongside the original and mint twice."});P({id:"mint-race",venue:"onchain-mint",chainIds:[1,10,56,137,8453,42161,81457,7777777],auth:"none",ops:["health","probeOpen","measureLatency","inclusionStrategy","raceIntel"],execution:"read",baseEnv:[],description:"Mint race intelligence: probe every sale-state flag in one concurrent round trip instead of five sequential ones, measure RPC round-trip latency against a contested-mint threshold, and classify whether a chain's inclusion is won by priority fee (builder auction) or by raw latency (centralized sequencer). Read-only: never prepares, signs, or broadcasts."});P({id:"nft-mint",venue:"onchain-mint",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","discover","prepare","priceGas","createTrigger","checkOpen","evaluateTrigger"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:[],description:"EVM NFT mints: discover the collection's mint entrypoint from bytecode, price a competitive EIP-1559 bid from fee-history percentiles, enforce gas-war caps, surface contract risk, and hand execution to the local signer after explicit arming and bounded grant."});P({id:"universal-mint-router",venue:"universal-nft-mint",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","prepare"],execution:"prepare",baseEnv:["OPENSEA_API_KEY"],description:"Prepare-only exact universal mint routing across reviewed EVM and Ordinals adapters. Universal Solana mint is RESEARCH_ONLY and disabled until canonical serialized-message decoding ships; the separate Magic Eden marketplace provider is unchanged. It never signs or broadcasts."});P({id:"universal-nft-lifecycle",venue:"universal-nft-lifecycle",chainIds:[],auth:"optionalApiKey",ops:["health","capabilities","route"],execution:"read",baseEnv:["OPENSEA_API_KEY","MAGICEDEN_API_KEY","SATFLOW_API_KEY"],description:"Read-only NFT lifecycle route discovery. It does not prepare, sign, or broadcast artifacts; callers must invoke and review the selected provider operation separately."});for(let[e,t,n]of[["universal-evm-nft-transfer","evm-nft-transfer","Exact unsigned ERC-721/ERC-1155 safeTransferFrom preparation."],["universal-solana-nft-transfer","solana-nft-transfer","Exact unsigned verified Metaplex NFT/Core transfer preparation."],["universal-ordinals-transfer","bitcoin-nft-transfer","Exact unsigned Ordinals PSBT transfer-plan preparation."]])P({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});P({id:"contract-risk",venue:"onchain-bytecode",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","scan"],execution:"read",baseEnv:[],description:"Structural contract risk from on-chain bytecode: retained owner powers (mint, blacklist, pause, fee changes) and upgradeability across EIP-1967, legacy zeppelinos, and EIP-1822 proxy slots. Complements behavioural sell simulation. Never reports 'safe' \u2014 a clean scan is weak evidence, not a guarantee."});P({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:Pg,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Ko.flatMap(e=>e.rpcEnv),description:"One generic EVM token-sniping path across every configured EVM chain: live identity, pools, structural risk, sell simulation, quote, guarded transaction preparation, and local-signer execution handoff. Robinhood Chain is the default, not a special implementation."});P({id:"evm-rpc",venue:"evm",chainIds:[1,137,42161,8453,10,4663,999],auth:"none",ops:["health","healthAll","blockNumber","chainId","getBalance","call","erc20Allowance","erc20Balance","transactionReceipt"],baseEnv:["ETH_RPC_URL","POLYGON_RPC_URL","RH_CHAIN_RPC","BASE_RPC_URL","ARBITRUM_RPC_URL"],description:"EVM JSON-RPC multi-chain (env RPC or public fallbacks)"});P({id:"solana-rpc",venue:"solana",chainIds:[],auth:"none",ops:["health","latestBlockhash","getBalance","tokenAccounts","simulate"],baseEnv:["SOLANA_RPC_URL"],description:"Solana mainnet JSON-RPC read/prepare surface (no key, no signing, no broadcast)"});P({id:"bitcoin-esplora",venue:"bitcoin",chainIds:[],auth:"none",ops:["health","tipHeight","fees","address","utxos","tx","decode"],execution:"read-only",baseEnv:["BTC_ESPLORA_URL","BTC_NETWORK"],description:"Bitcoin L1 via Esplora (mempool.space/Blockstream). Reads only on data plane. User-signed broadcast is bitcoin_send on exec MCP. No Core RPC, no house keys. Wallets: Xverse/UniSat/Leather/OKX/Phantom"});P({id:"bitcoin-meta",venue:"bitcoin-metaprotocol",chainIds:[],auth:"optionalApiKey",ops:["health","runeBalances","inscriptions","inscriptionInfo","inscriptionChildren","ordBlockInfo"],execution:"read-only",baseEnv:["BTC_META_API_URL","UNISAT_API_KEY","BESTINSLOT_API_KEY"],description:"Bitcoin ordinals/runes reads. Keyless tier via ordinals.com recursive (inscriptionInfo/children/blockInfo); address-indexed ops (inscriptions, runeBalances) need a keyed indexer. Hiro is deprecated (410) and Magic Eden BTC is dead \u2014 use satflow for market."});P({id:"satflow",venue:"bitcoin-marketplace",chainIds:[],auth:"apiKey",ops:["health","collectionFloors","collectionStats","item","walletContents","floorListings","preparePurchase","prepareList"],execution:"prepare",localSignerSurfaces:["btc"],baseEnv:["SATFLOW_API_KEY","SATFLOW_API_URL"],description:"Satflow ordinals+runes marketplace (api.satflow.com). Primary BTC NFT market after Magic Eden BTC sunset. PSBT intents for buy/list; key via x-api-key."});P({id:"jupiter",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","venues","quote","prepare"],execution:"prepare",localSignerSurfaces:["sol"],baseEnv:["JUPITER_SWAP_API_URL","SOLANA_RPC_URL"],description:"Jupiter Swap API quote + unsigned Solana swap prepare, routed through `oracle route swap solana`"});P({id:"hl-perps",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","assetInfo","prepareOrder","prepareCancel","prepareLeverage","prepareIsolatedMargin","prepareBracket","prepareBuilderApproval"],execution:"prepare",localSignerSurfaces:["hl"],notes:"Hyperliquid perp, HIP-3, and HIP-4 outcome orders through local-signer L1 action handoff."});P({id:"hl-markets",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","markets","leaderboards","coin","spot"],notes:"Joined Hyperliquid market datapoints for the Hyperliquid agent. Read-only."});P({id:"hl-entry-state",venue:"hyperliquid",chainIds:[],auth:"none",ops:["health","see","qualify","lock","list","watch"],execution:"read-only",description:"SEE/ENTER/MANAGE for discretionary HL perps: compose sourced /info fields, qualify a side, lock the state only after a fill receipt, and alert_only-diff live vs that lock. Never signs."});P({id:"hl-staking",venue:"hypercore-staking",chainIds:[],auth:"none",ops:["health","validators","delegatorSummary","delegations","rewards","history","preflight","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate"],execution:"prepare",localSignerSurfaces:["hl"],baseEnv:["HL_INFO_URL","HL_EXCHANGE_URL","HL_TESTNET"],description:"Hyperliquid HyperCore HYPE staking. Public reads plus local-signer EIP-712 execution for cDeposit / cWithdraw / tokenDelegate after arming. Hosted/keyless remains prepare-only."});P({id:"magiceden-sol",venue:"solana-nft",chainIds:[],auth:"optionalApiKey",ops:["health","stats","listings","tokenListings","prepareBuy","prepareList","prepareMint"],execution:"prepare",baseEnv:["MAGICEDEN_API_KEY","MAGICEDEN_API_URL"],description:"Magic Eden Solana NFT market. Reads (stats/listings) are keyless; buy/list/mint instruction builders need MAGICEDEN_API_KEY and return an unsigned base64 transaction for the user's Solana wallet. Never signs or broadcasts."});P({id:"defillama",venue:"prices",chainIds:[],auth:"none",ops:["health","prices","pricesBySymbol","protocols","yields","stablecoins","dexVolumes"],baseEnv:["DEFILLAMA_COINS_URL","DEFILLAMA_API_URL"],description:"DeFiLlama public prices + protocols TVL"});P({id:"lifi",venue:"dex",chainIds:[1,10,56,137,988,999,2741,4663,8453,42161,43114],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",baseEnv:["LIFI_API_URL"],description:"LI.FI public cross-chain / DEX aggregator quotes (no key)"});P({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair","latestTokenProfiles","communityTakeovers","latestTokenBoosts","topTokenBoosts","tokenPairs","batchTokens"],execution:"read-only",baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener keyless read-only token profiles, community takeovers, boosts, and token/pair discovery"});P({id:"bubblemaps",venue:"token-intelligence",chainIds:[1,56,137,999,4663,8453,42161,43114],auth:"apiKey",ops:["health","chains","search","metadata","holders","metrics","map"],execution:"read-only",baseEnv:["BUBBLEMAPS_API_KEY"],description:"Official Bubblemaps Data API v0 token-holder maps, clusters, concentration metrics, and source-backed interactive artifacts."});P({id:"uniswap-v3",venue:"dex",chainIds:Cj,auth:"none",ops:["health","quote","prepare","quotePath","ethUsdc","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V3 QuoterV2 exact-in quotes via eth_call across official deployments plus Robinhood Chain, no key"});P({id:"lp-exit",venue:"dex",chainIds:Rj,auth:"none",ops:["health","inspect","prepareRemove","prepareSettlement","prepareUnwrap","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL"],description:"Receipt-gated Uniswap V3 LP exit into native asset: remove/collect, net-route token legs, then unwrap. Unsigned only."});P({id:"lp-liquidity-ranker",venue:"dex",chainIds:Pg,auth:"none",ops:["health","rank"],execution:"read-only",description:"Cross-chain LP destination analysis: deepest liquidity and net-best migration are separate, exact canonical mappings required."});P({id:"lp-destination-discovery",venue:"dex",chainIds:Pg,auth:"none",ops:["health","discover"],execution:"read-only",description:"Live exact-address LP pool discovery across configured chains; reports deepest liquidity separately from cost-qualified migration evidence."});P({id:"uniswap-v4",venue:"dex",chainIds:Pj,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});P({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});P({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});P({id:"aerodrome",venue:"dex",chainIds:[8453],auth:"none",ops:["health","quote","prepare","chains"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:["BASE_RPC_URL"],description:"Aerodrome Slipstream CL on Base \u2014 QuoterV2 + SwapRouter exact-input via eth_call (tickSpacing, no key)"});P({id:"zerox",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","price","quote","prepare"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ZEROX_API_URL"],description:"0x Swap API v2 price/quote/prepare \u2014 requires ZEROX_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"across",venue:"bridge",chainIds:[1,10,137,42161,8453],auth:"none",ops:["health","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge suggested-fees (public)"});P({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});P({id:"relay",venue:"bridge",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","quote","prepare"],execution:"prepare",baseEnv:["RELAY_API_URL"],description:"Relay.link bridge/swap quotes (public)"});P({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});P({id:"oneinch",venue:"dex",chainIds:[1,10,137,8453,42161],auth:"apiKey",ops:["health","quote","prepare","approveSpender"],execution:"prepare",baseEnv:["ONEINCH_API_KEY","ONEINCH_API_URL"],description:"1inch Swap API v6 quote/prepare \u2014 requires ONEINCH_API_KEY (unconfigured without key; no Oracle key shipped)"});P({id:"hl-ws",venue:"hl",chainIds:[],auth:"none",ops:["health","allMids","l2Book","snapshot"],baseEnv:["HL_WS_URL"],description:"Hyperliquid short-lived WS snapshots (allMids/l2Book)"});P({id:"poly-ws",venue:"poly",chainIds:[137],auth:"none",ops:["health","book","snapshot"],baseEnv:["POLY_WS_URL"],description:"Polymarket CLOB short-lived WS market snapshots"});P({id:"anvil-nft",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","markets","quoteSpecificBuy","quoteSell","scanCollection","scanAllMarkets","scanCrossVenueArb","scanAllMarketsArb","prepareSpecificBuy","prepareSell"],execution:"prepare",localSignerSurfaces:["evm-nft"],baseEnv:["RH_CHAIN_RPC","OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"All-market Anvil discovery and exact-token arbitrage, with exact buy and sell execution through the armed owner-local signer after human confirmation"});P({id:"stonkbrokers",venue:"robinhood-nft",chainIds:[4663],auth:"optionalApiKey",ops:["health","quoteBrokerBuy","scanBrokerLoot","prepareBrokerBuy","brokerDesk","clockInStatus","prepareClockIn"],execution:"prepare",baseEnv:["RH_CHAIN_RPC"],description:"Unsigned StonkBrokers Broker Desk discovery, nested-loot verification, and bounded local-only preparations"});P({id:"opensea-nft",venue:"nft",chainIds:Lj,auth:"apiKey",ops:["health","collection","floor","bestListings","bestListing","bestOffer","accountNfts","accountPnl","prepareMint","prepareList","prepareCancel"],execution:"prepare",baseEnv:["OPENSEA_API_KEY","OPENSEA_ENV_FILE"],description:"OpenSea multichain NFT inventory, floors, and unsigned bounded mint, listing, and listing-cancellation preparations; opaque buy/sweep fulfillment is disabled"});P({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});P({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});P({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});P({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});P({id:"hyperevm-dex",venue:"hyperevm",chainIds:[999],auth:"none",ops:["health","search","token"],baseEnv:["HYPEREVM_RPC_URL"],description:"HyperEVM pair discovery via DexScreener + optional RPC"});P({id:"geckoterminal",venue:"dex-data",chainIds:[],auth:"none",ops:["health","networks","pool","token","ohlcv"],baseEnv:["GECKOTERMINAL_API_URL"],description:"GeckoTerminal public networks, pools, tokens, and OHLCV"});P({id:"curve",venue:"dex",chainIds:[1,10,56,137,988,999,4663,8453,42161,43114],auth:"none",ops:["health","openapi","pools","quote","prepare"],execution:"prepare",baseEnv:["CURVE_API_URL"],description:"Curve public pool registry API + RouterNG validated single-hop prepare"});P({id:"gmx",venue:"perps-data",chainIds:[42161,43114],auth:"none",ops:["health","tickers","markets","marketsInfo","tokens","prepareOrder","positions","orderStatus","verifyOrder"],execution:"intent",baseEnv:[],description:"GMX v2 public oracle/markets plus guarded async order intents on Arbitrum and Avalanche"});P({id:"morpho",venue:"lending-data",chainIds:[1,10,137,2741,8453,42161,4663,999,988],auth:"none",ops:["health","markets","vaults","prepareVault"],execution:"intent",baseEnv:["MORPHO_API_URL"],description:"Morpho public GraphQL markets/vaults + guarded ERC-4626 vault intents"});P({id:"balancer",venue:"dex",chainIds:[1,10,137,42161,43114,8453],auth:"none",ops:["health","pools","quote","prepare"],execution:"prepare",baseEnv:["BALANCER_API_URL"],description:"Balancer public GraphQL pool data + v3 Router exact-input prepare (Polygon read-only)"});P({id:"pendle",venue:"yield",chainIds:[1,10,56,8453,42161,999],auth:"none",ops:["health","markets","quote","prepare"],execution:"prepare",baseEnv:["PENDLE_API_URL"],description:"Pendle public yield-market API + Hosted SDK direct Convert prepare"});P({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-07-30",reason:"Odos sunset the public SOR API; /sor/quote/v2 and v3 both return 410 Gone",evidence:"sunset: Thu, 30 Jul 2026 12:00:00 GMT response header"},baseEnv:["ODOS_API_URL"],description:"Odos public SOR (DEPRECATED upstream 2026-07-30 -- endpoint returns 410)"});P({id:"blockscout",venue:"explorer",chainIds:[1,10,137,8453,42161],auth:"none",ops:["health","stats","address","token"],baseEnv:[],description:"Verified public Blockscout REST v2 instances"});P({id:"paraswap",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","tokens","price","quote","prepare"],execution:"prepare",baseEnv:["PARASWAP_API_URL"],description:"ParaSwap/Velora public price routes + validated transaction builder"});P({id:"rfq",venue:"intent-rfq",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","intent","quote"],execution:"prepare",baseEnv:["ZEROX_API_KEY","ONEINCH_API_KEY"],description:"Cross-chain RFQ intent normalizer and firm-quote fanout over reviewed venues. Prepares artifacts only, never signs or broadcasts."});P({id:"execution-strategies",venue:"oracle-native",chainIds:[],auth:"none",ops:["health","plan"],execution:"plan-only",baseEnv:[],description:"Oracle-native TWAP, VWAP, POV, iceberg, and implementation-shortfall planners. No Tread.fi/API dependency. Plans never sign or broadcast; every slice requires a fresh best-execution quote, policy check, simulation, confirmation, wallet signature, and receipt."});P({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});P({id:"babylon-staking",venue:"btc-staking",chainIds:[],auth:"none",ops:["health","stats","finalityProviders","delegations"],execution:"read-only",baseEnv:["BABYLON_STAKING_API_URL"],description:"Babylon native BTC staking (staking-api.babylonlabs.io v2). Keyless per-staker positions from a PUBLIC key alone \u2014 APR, TVL, finality-provider roster, and delegations. Read-only; staking/unbonding is user-wallet."});P({id:"mempool-mining",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","difficulty","poolShare","hashrate","rewardStats"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Bitcoin mining + network security telemetry via mempool.space /api/v1/mining. Difficulty retarget, pool concentration (top-1/top-3 share), hashrate trend, subsidy-vs-fee split."});P({id:"liquid-esplora",venue:"liquid",chainIds:[],auth:"none",ops:["health","tipHeight","addressInfo","assetInfo"],execution:"read-only",baseEnv:["LIQUID_ESPLORA_URL"],description:"Liquid Network (Blockstream sidechain) via Esplora. Same schema as bitcoin-esplora plus multi-asset issuance/peg stats. Address state exposes transaction counts; per-asset sums can be absent for unconfidential multi-asset addresses and are blinded for confidential addresses."});P({id:"hiro-stacks",venue:"stacks",chainIds:[],auth:"none",ops:["health","networkInfo","stackingInfo","poxCycles","blocks"],execution:"read-only",baseEnv:["HIRO_API_URL","HIRO_API_KEY"],description:"Stacks (Bitcoin L2) via Hiro public API. Network tip, PoX stacking state (the BTC-yield mechanism), and historical reward cycles. Keyless tier is ~20 rps; HIRO_API_KEY is optional and never required."});P({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});P({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});P({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});P({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"Sui public fullnodes return JSON-RPC -32601 because the JSON-RPC surface is deprecated",evidence:"Migrate the provider to Sui GraphQL or gRPC before restoring it to the live roster"},localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"QUARANTINED: Sui public JSON-RPC is deprecated. A GraphQL or gRPC replacement has not shipped."});P({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, type-specific 0x1::coin::balance views, and legacy CoinStore enumeration. Generic enumeration does not cover newer Fungible Asset stores. Read-only; the transaction submit door is never called."});P({id:"canton-scan",venue:"canton",chainIds:[],auth:"none",ops:["health","guide","dso","party","holdings","rounds"],execution:"read-only",localSignerSurfaces:[],baseEnv:["CANTON_SCAN_URL","CANTON_NETWORK","CANTON_MIGRATION_ID"],description:"Canton Network Scan reads for Canton Coin (CC / Amulet) plus static onboarding steps. Not EVM: no chainId, no JSON-RPC, no ERC-20, no Uniswap. Scan sees CC and DSO/governance only. Quote/prepare/sign stay unimplemented."});P({id:"ordinals-runes",venue:"btc-runes",chainIds:[],auth:"none",ops:["health","blockHeight","blockInfo","satInfo","runeInfo"],execution:"read-only",baseEnv:["ORDINALS_BASE_URL"],description:"Runes + sat/block index via a public ord server (ordinals.com). /r/blockheight is PLAIN TEXT; the /runes listing is 406 'JSON API disabled' so only per-rune lookup exists; rune names must drop the bullet spacer (UNCOMMONGOODS)."});P({id:"mempool-lightning",venue:"btc-lightning",chainIds:[],auth:"none",ops:["health","statistics","nodeRankings","nodeCountries"],execution:"read-only",baseEnv:["MEMPOOL_API_URL"],description:"Lightning Network topology via mempool.space. Capacity/channel/node aggregates, node rankings, country distribution. STALE-PRONE: the crawler snapshot has been observed weeks behind, so every response carries ageDays + a stale flag."});P({id:"bob-rootstock",venue:"btc-l2",chainIds:[60808,30],auth:"none",ops:["health","stats","addressInfo","tokenBalances"],execution:"read-only",baseEnv:["BOB_EXPLORER_URL","ROOTSTOCK_EXPLORER_URL"],description:"BOB (60808) and Rootstock (30) \u2014 the EVM Bitcoin L2s \u2014 via their Blockscout v2 instances (identical schema, one code path). Chain stats, gas prices, native balances, token holdings. Pass chainId 'all' to fan out."});P({id:"bisq-markets",venue:"bisq",chainIds:[],auth:"none",ops:["health","markets","ticker","trades"],execution:"read-only",baseEnv:["BISQ_MARKETS_URL"],description:"Bisq non-KYC P2P BTC price discovery (markets.bisq.network). Value is the BASIS against centralized spot, not the absolute print: volume is thin and the last trade can be hours old, so trade age is always reported."});P({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});P({id:"magiceden-ordinals",venue:"btc-ordinals-market",chainIds:[],auth:"none",ops:["health","collectionStat"],execution:"read-only",baseEnv:["MAGICEDEN_ORD_API_URL","MAGICEDEN_API_KEY","MAGICEDEN_PROBE_COLLECTION"],description:"Magic Eden ordinals collection stats. DEGRADED UPSTREAM: /v2/ord/btc/* returned 503 'no healthy upstream' on every verification attempt. health() reports ok:false while it is down and collectionStat() returns upstreamDown:true with fallback 'satflow' instead of throwing. Only /stat is wired; 600 req/min documented."});P({id:"braiins-insights",venue:"btc-mining",chainIds:[],auth:"none",ops:["health","priceStats","poolStats"],execution:"read-only",baseEnv:["BRAIINS_INSIGHTS_URL"],description:"Braiins mining insights \u2014 BTC price tick + per-pool block/hashrate distribution. Use insights.braiins.com (302s to learn.braiins.com, followed transparently); pool.braiins.com/api is 403 and is NOT the public API."});P({id:"pyth-price-feeds",venue:"solana-oracle",chainIds:[],auth:"none",ops:["health","latestPrice","latestPrices","feedDirectory"],baseEnv:["PYTH_HERMES_URL"],description:"Pyth Network: Solana price feeds with confidence intervals, real-time updates, zero auth"});P({id:"solend-lending",venue:"solana-lending",chainIds:[],auth:"none",ops:["health","markets","reserves"],baseEnv:["SAVE_API_URL"],description:"Solend/Save lending: markets + per-reserve supply/borrow APY, Solana's Aave equivalent (keyless)"});P({id:"jito-mev",venue:"solana-mev",chainIds:[],auth:"none",ops:["health","recentBundles","tipFloor"],baseEnv:["JITO_API_URL"],description:"Jito MEV: recent bundles, tippers, tip floor \u2014 real-time Solana MEV data (keyless)"});P({id:"sanctum-lst",venue:"solana-staking",chainIds:[],auth:"none",ops:["health","lstList","apyAll","apyIndividual"],baseEnv:["SANCTUM_API_URL"],description:"Sanctum LST: liquid staking tokens with per-token APY \u2014 JitoSOL, mSOL, bSOL, compSOL, pathSOL, etc. (keyless)"});P({id:"kamino-strategies",venue:"solana-yield",chainIds:[],auth:"none",ops:["health","strategies","strategyMetrics"],baseEnv:["KAMINO_API_URL"],description:"Kamino: live yield strategies with APY, TVL, vault balances (keyless)"});P({id:"meteora-dlmm",venue:"solana-dex",chainIds:[],auth:"none",ops:["health","pools","poolSearch"],baseEnv:["METEORA_API_URL"],description:"Meteora DLMM: concentrated liquidity pools via amm-v2 API, distinct from Jupiter DEX routes (keyless)"});P({id:"aave-v3",venue:"evm-lending",chainIds:[1,10,56,137,59144,1088,534352,8453,42161,43114,5e3,1868],auth:"none",ops:["health","markets","marketReserves","chains"],baseEnv:["AAVE_V3_API_URL"],description:"Aave V3 GraphQL: multi-chain lending, full market + reserve schema with supplyInfo/borrowInfo (keyless)"});P({id:"cow-protocol",venue:"evm-intent",chainIds:[1,100,42161],auth:"none",ops:["health","auction","openOrders","recentTrades"],baseEnv:["COW_API_URL"],description:"CoW Protocol: intent/solver auction data, open orders, trades \u2014 intent-based DEX not covered by existing providers (keyless)"});P({id:"relayscan-mev",venue:"evm-mev",chainIds:[1],auth:"none",ops:["health","overview","builderProfit","dailyStats"],baseEnv:["RELAYSCAN_API_URL"],description:"Relayscan: MEV relay overview, builder profit rankings, daily block stats (keyless)"});P({id:"birdeye-tokens",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","tokenList"],baseEnv:["BIRDEYE_API_URL"],description:"Birdeye public token list: Solana tokens ranked by 24h volume, market cap (keyless)"});P({id:"das-assets",venue:"solana-nft",chainIds:[],auth:"none",ops:["health","assetsByOwner","searchAssets","assetProof"],baseEnv:["SOLANA_RPC_URL"],description:"Digital Asset Standard (DAS): compressed NFT reads via public Solana RPC \u2014 getAssetsByOwner, searchAssets, assetProof. No Helius key needed."});P({id:"symbiotic-restaking",venue:"evm-restaking",chainIds:[1],auth:"none",ops:["health","vaults","vaultDetail"],baseEnv:["SYMBIOTIC_API_URL"],description:"Symbiotic restaking: vaults with collateral data, approved status, operator metadata (keyless)"});P({id:"beefy-yields",venue:"evm-yield",chainIds:[1,10,56,137,8453,42161,43114,250,1088],auth:"none",ops:["health","apy","apyBreakdown"],baseEnv:["BEEFY_API_URL"],description:"Beefy Finance: cross-chain yield aggregator vaults with APY breakdowns (keyless)"});P({id:"across-bridge",venue:"evm-bridge",chainIds:[1,10,42161,8453,324,59144],auth:"none",ops:["health","pools","suggestedFees"],baseEnv:["ACROSS_API_URL"],description:"Across bridge: pool liquidity + APY per bridge pool with suggested fees (keyless)"});P({id:"spark-lend",venue:"evm-lending",chainIds:[1],auth:"none",ops:["health","markets"],baseEnv:["SPARK_API_URL"],description:"Spark Lend / Sky Savings: ERC-4626 vault APY + TVL + user count (keyless)"});P({id:"solana-token-risk",venue:"solana-tokens",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",baseEnv:[],description:"GoPlus official Solana token security: mint/freeze authority, transfer hooks, metadata mutability, holder concentration (keyless read-only)"});P({id:"robinhood-wallet-history",venue:"explorer",chainIds:[4663],auth:"none",ops:["health","transactions","tokenBalances","history"],execution:"read-only",baseEnv:[],description:"Robinhood Chain (4663) wallet transaction history and token balances via the official Blockscout explorer (keyless read-only)"});P({id:"l2beat-tvl",venue:"evm-l2",chainIds:[],auth:"none",ops:["health","tvl","activity"],baseEnv:["L2BEAT_API_URL"],description:"L2Beat: L2 scaling TVL, project-level breakdowns, activity metrics (keyless)"});P({id:"celestia-da",venue:"evm-da",chainIds:[],auth:"none",ops:["health","stats","blockStats"],baseEnv:["CELENIUM_API_URL"],description:"Celestia DA via Celenium: blob stats, block-level blob counts, network metrics (keyless)"});P({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});P({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});P({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});P({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});P({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});P({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});P({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});P({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});P({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"},description:"UNAVAILABLE: Derive execution has no pinned official domain. Use onchain-options for local ranking."});P({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});P({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health"],execution:"unavailable",deprecated:{since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"},description:"UNAVAILABLE: the reviewed DOV vault registry is empty and every read fails closed."});P({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});P({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});P({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});P({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});P({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});P({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});P({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});P({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});P({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});P({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});P({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});P({id:"launch-radar",venue:"launch-radar",chainIds:[],auth:"none",ops:["health","status","snapshot","candidates","rpcHealth","evaluateStrategy"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_CONFIG_DIR","LAUNCH_RADAR_STORE_PATH"],description:"Read-only Launch Radar data plane: durable shadow-cycle status/snapshot from local disk, plus pure candidate normalization, RPC-sample ranking, and strategy-policy evaluation over caller-supplied inputs. Shadow-only, unfunded, no signer, no broadcast."});P({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});P({id:"news-rss",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Curated official crypto news wires (CoinDesk, The Block, Decrypt, Blockworks, Bankless, DL News, Hyperliquid blog) parsed from RSS/Atom with no npm dependency. Curated roster, NOT a firehose: feed URLs are fixed and SSRF-guarded, and every response grades each feed ok/degraded/unavailable so a dead wire never reads as no news. Items cap at 200 with complete:false and rowsOmitted."});P({id:"social-farcaster",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","channel","search","user"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Keyless Farcaster read through the public Warpcast API (api.farcaster.xyz). Probed live: Neynar free and the Neynar hub both answer 402, so the Warpcast public endpoints are used. No keyless channel timeline exists, so channel is a channel-scoped search. Unauthenticated endpoint with an undocumented rate limit; failures return unavailable with zero rows, never a quiet feed."});P({id:"social-x-public",venue:"oracle-social",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"search",type:"bearerToken",env:"ORACLE_X_BEARER_TOKEN"},ops:["health","search"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_X_BEARER_TOKEN"],description:"Capability-honest X reader. X has no keyless read tier and this never scrapes: without ORACLE_X_BEARER_TOKEN every op returns ok:false with the unset reason and makes NO network call. With a token it calls /2/tweets/search/recent. The token is read only from the caller-supplied env object, never from disk, and never when allowAmbientCredentials is false."});P({id:"news-digest",venue:"oracle-news",chainIds:[],auth:"none",ops:["health","latest"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Cross-plane news digest: fans out to news-rss, social-farcaster, and social-x-public, dedupes by normalized URL, filters by entity match, sorts by publishedAt desc, and reports per-source ok/degraded/unavailable. A blind source is reported as unavailable, never as an absence of news; when every plane is blind the digest returns ok:false."});P({id:"onchain-investigator",venue:"oracle-intel",chainIds:[],auth:"optionalApiKey",optionalAuth:{operation:"wallet",optInField:"includeOpenSea",type:"apiKey",env:"OPENSEA_API_KEY"},ops:["health","capabilities","wallet","analyze","nftOverlap"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRONGRID_API_KEY","TRON_PRO_API_KEY","TONCENTER_API_KEY","TON_API_KEY","APTOS_API_KEY","OPENSEA_API_KEY"],allowCallerOptions:!1,opPolicies:{health:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},capabilities:{argsSensitivity:"none",resultSensitivity:"public",cache:!0},wallet:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},analyze:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1},nftOverlap:{argsSensitivity:"sensitive",resultSensitivity:"sensitive",cache:!1}},description:"Bounded, report-only on-chain evidence collection through fixed family/network endpoints, literal-opt-in one-page OpenSea v2 enrichment, and deterministic offline coordination/NFT-overlap analysis. Optional ambient keys only raise trusted-provider rate limits. Wallet addresses, snapshots, and evidence reports are sensitive and never cacheable. OpenSea reads only OPENSEA_API_KEY after opt-in and has no inventory cursor. No caller URL, RPC, transport, signer, prepare, broadcast, scam claim, or identity claim surface."});$j()});var NI={};ht(NI,{READ_ONLY_DATA_OPS:()=>Fj,STATE_CREATING_DATA_OPS:()=>Uj,classifyDataOp:()=>ja,isPrepareDataOp:()=>qj,isReadOnlyDataOp:()=>jj,isStateCreatingDataOp:()=>Hj});function qj(e){return String(e||"").toLowerCase().startsWith("prepare")}function ja(e){let t=String(e||"").trim().toLowerCase();return t?Bj.has(t)?"state":Dj.has(t)?"read":"unknown":"unknown"}function jj(e){return ja(e)==="read"}function Hj(e){return ja(e)!=="read"}var _I,OI,Bj,Dj,Uj,Fj,Lg=_(()=>{_I=["approveSpender","arm","armFill","armPayment","buildNative","cancelIntent","cancelListing","cancelOrder","createIntent","createListing","createOffer","createOrder","createTrigger","evaluateTrigger","lock","loop","prepare","prepareAgentURIUpdate","prepareBracket","prepareBrokerBuy","prepareBuilderApproval","prepareBuy","prepareCancel","prepareClockIn","prepareDelegate","prepareDeploy","prepareIdentityRegistration","prepareIsolatedMargin","prepareLeverage","prepareList","prepareMint","prepareOrder","preparePurchase","prepareRemove","prepareSell","prepareSettlement","prepareSpecificBuy","prepareStakeDeposit","prepareStakeWithdraw","prepareSwap","prepareTransfer","prepareUnwrap","prepareVault","registerPack","revokePack"],OI=["account","accountNfts","accountPnl","accountState","activeProposals","activity","address","addressInfo","allMids","analyze","annotateOutpoints","apy","apyAll","apyBreakdown","apyIndividual","assetInfo","assetProof","assetsByOwner","auction","balances","basis","batchTokens","bestListing","bestListings","bestOffer","blockHeight","blockInfo","blockNumber","blockStats","blocks","book","brokerDesk","builderProfit","bundleStatus","call","candidates","candleSnapshot","capabilities","chainId","chainParameters","chains","channel","checkOpen","clearinghouse","clockInStatus","coin","coinBalances","collection","collectionFloors","collectionStat","collectionStats","communityTakeovers","constraints","dailyStats","decode","delegations","delegatorSummary","denomTrace","depeg","deriveComputeUnitPrice","details","dexVolumes","difficulty","discover","dso","erc20Allowance","erc20Balance","ethUsdc","eval","evaluateStrategy","events","exploitFeed","feedDirectory","fees","finalityProviders","floor","floorListings","freshBlockhash","frontendOpenOrders","funding","fundingAll","fundingHistory","fundingSpread","gallery","gate","getBalance","goplus","governors","guide","hashrate","health","healthAll","history","holders","holdings","inclusionStrategy","info","inscriptionChildren","inscriptionInfo","inscriptions","inspect","inspectHook","inspectIdentity","intent","inventory","item","jettonBalances","keywordMentions","l1BlockNumber","l2Book","latest","latestBlockhash","latestPrice","latestPrices","latestTokenBoosts","latestTokenProfiles","leaderboards","legs","liquidationLadder","list","listIntents","listListings","listNative","listPacks","listings","liveFeeRate","lstList","map","markPrice","markPx","marketReserves","markets","marketsInfo","match","measureLatency","meta","metaAndAssetCtxs","metadata","metrics","midpoint","narratives","networkInfo","networks","nftOverlap","nodeCountries","nodeRankings","normalize","ohlcv","openInterest","openOrders","openapi","oracleDeviation","oraclePx","ordBlockInfo","order","orderStatus","orderbook","outcomeMeta","overview","pair","party","plan","planBundleEnvelope","planInscriptionFunding","planMintFee","measureComputeUnits","planRetryEnvelope","planRpcEnvelope","pnl","pool","poolSearch","poolShare","poolStats","pools","portfolio","position","positions","poxCycles","preflight","price","priceGas","priceStats","prices","pricesBySymbol","probeOpen","proposal","proposals","protocols","qualify","quote","quoteBrokerBuy","quotePath","quoteSell","quoteSpecificBuy","raceIntel","rank","read","recentBundles","recentTrades","reserves","resources","rewardStats","rewards","rounds","route","rpcHealth","runeBalances","runeInfo","satInfo","scan","scanAllMarkets","scanAllMarketsArb","scanBrokerLoot","scanCollection","scanCrossVenueArb","score","search","searchAssets","see","selectFundingInputs","simulate","smartAccounts","snapshot","spaces","spot","spotBalance","spotMeta","spotPx","spread","stablecoins","stackingInfo","statistics","stats","status","strategies","strategyMetrics","suggestedFees","summaries","swapQuote","tallyProposals","ticker","tickers","time","tipFloor","tipHeight","token","tokenAccounts","tokenBalances","tokenList","tokenListings","tokenPairs","tokens","topTokenBoosts","tracker","trades","traitSnipe","transactionReceipt","transactions","trc20Balances","trc20Transfers","trendingCas","trendingTokens","tvl","tx","user","userEquities","userFills","userState","utxos","validatorDetail","validators","valueGraph","vaultDetail","vaultEquity","vaults","venues","verify","verifyOrder","voterStatus","votes","votingPower","wallet","walletContents","watch","withdrawable","yields"],Bj=new Set(_I.map(e=>e.toLowerCase())),Dj=new Set(OI.map(e=>e.toLowerCase())),Uj=Object.freeze([..._I]),Fj=Object.freeze([...OI])});function id(e={}){return e.execution==="unavailable"||!!e.deprecated}var Sue,TI=_(()=>{Sue=Object.freeze(["live","needs_key","deprecated","soft_fail","hard_down"])});import{types as Qi}from"node:util";function qt(e){if(!e||typeof e!="object"||Qi.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Nt(e,t){if(e==null||(typeof e=="object"||typeof e=="function")&&Qi.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 ur(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 i=r??{nodes:0,active:new Set};if(i.nodes+=1,i.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"||Qi.isProxy(e)||i.active.has(e))throw new Error(`${n} is not credential-guardable own-data JSON`);i.active.add(e);try{if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){let a=Object.getOwnPropertyDescriptor(e,String(s));if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);ur(a.value,t,n,i,o+1)}return e}if(!qt(e))throw new Error(`${n} is not credential-guardable own-data JSON`);for(let s of Object.keys(e)){if(s.includes(t))throw new Error(`${n} reflected an attached credential`);let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!Object.hasOwn(a,"value"))throw new Error(`${n} is not credential-guardable own-data JSON`);ur(a.value,t,n,i,o+1)}return e}finally{i.active.delete(e)}}function Fe(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(Qi.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=Fe(s.value,t,n+1)}return o}if(!qt(e))throw new Error(`${t} contains a non-JSON value`);let r=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);r[o]=Fe(i.value,t,n+1)}return r}function Zi(e,t){let n=t&&typeof t=="object"&&!Qi.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,i=a=>{if(!n)return;let c=Object.getOwnPropertyDescriptor(n,a);return c&&Object.hasOwn(c,"value")?c.value:void 0},s=i("oversize")===!0?"provider-response-too-large":i("oracleTimeout")===!0||i("name")==="AbortError"||i("name")==="TimeoutError"?"provider-timeout":null;return(o!==null||s!==null)&&Object.defineProperty(e,CI,{value:Object.freeze({status:o,code:s}),enumerable:!1,configurable:!1,writable:!1}),e}function PI(e){if(!e||typeof e!="object"||Qi.isProxy(e))return null;let t=Object.getOwnPropertyDescriptor(e,CI);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=zj.has(t.value.code)?t.value.code:null;return n===null&&r===null?null:Object.freeze({status:n,code:r})}var CI,zj,mn=_(()=>{CI=Symbol("oracle.provider-failure-metadata"),zj=new Set(["provider-response-too-large","provider-timeout"])});function Vj({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"?$g:Mg}async function Te(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Vj(t);return Fe(await x(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function RI(e={}){let t=await Te({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function _n(e={}){return Te({type:"allMids"},e)}async function es(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return Te({type:"l2Book",coin:String(e)},t)}async function Ha(e={}){return Te({type:"outcomeMeta"},e)}async function sd(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return Te({type:"spotClearinghouseState",user:e},t)}async function ad(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return Te({type:"userFills",user:e},t)}async function LI(e={}){return Te({type:"meta"},e)}async function jt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Te(t,e)}async function cd({coin:e,interval:t="1h",startTime:n,endTime:r},o={}){if(!e)throw new Error("hlCandleSnapshot requires coin");let i={type:"candleSnapshot",req:{coin:String(e),interval:t,startTime:n??Date.now()-24*3600*1e3,endTime:r??Date.now()}};return Te(i,o)}async function MI({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return Te({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function $I(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return Te({type:"openOrders",user:e},t)}async function BI(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return Te({type:"frontendOpenOrders",user:e},t)}async function ts(e,t={}){if(!e)throw new Error("hlUserState requires user");return Te({type:"clearinghouseState",user:e},t)}async function ld(e={}){return Te({type:"spotMeta"},e)}var Mg,$g,Xt=_(()=>{q();mn();Mg="https://api.hyperliquid.xyz/info",$g="https://api.hyperliquid-testnet.xyz/info"});function Bg(e,t){let n=String(e||"").trim();if(!Gj.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function DI(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function UI(e={}){let t=Array.isArray(e.portfolio)?e.portfolio:[],n=t.find(([i])=>i==="day")?.[1]||null,r=Array.isArray(n?.accountValueHistory)?n.accountValueHistory:[],o=Array.isArray(n?.pnlHistory)?n.pnlHistory:[];return{name:e.name??null,vaultAddress:e.vaultAddress??e.address??null,leader:e.leader??null,description:e.description??null,tvl:e.tvl??r.at(-1)?.[1]??null,apr:e.apr??null,pnl:e.pnl??o.at(-1)?.[1]??null,isClosed:e.isClosed??null,allowDeposits:e.allowDeposits??null,maxDistributable:e.maxDistributable??null,followers:e.followers??null,portfolio:t}}function Kj(e){return[...e].sort((t,n)=>(DI(n.tvl)??-1)-(DI(t.tvl)??-1))}function Dg(e){return e.hlInfo||Te}function Ug(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Fg(e={},t={}){let n=await Dg(t)({type:"vaultSummaries"},t),r=Kj((Array.isArray(n)?n:[]).map(UI));return Ug({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function ud(e={},t={}){let r={type:"vaultDetails",vaultAddress:Bg(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Bg(e.user,"user"));let o=await Dg(t)(r,t);return Ug({provider:"hl-vaults",vault:UI(o||{}),raw:o})}async function Va(e={},t={}){let n=Bg(e.user||e.address,"user"),r=await Dg(t)({type:"userVaultEquities",user:n},t),o=(Array.isArray(r)?r:[]).map(i=>({vaultAddress:i.vaultAddress??i.address??null,equity:i.equity??i.vaultEquity??null}));return Ug({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function qg(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return ud({...e,vaultAddress:za},t);if(n==="summaries")return Fg(e,t);if(n==="details")return ud(e,t);if(n==="mine")return Va(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function FI(e={}){try{let t=await qg({mode:"hlp"},e);return{ok:t.vault.vaultAddress===za&&!!t.vault.name,provider:"hl-vaults",hlp:{name:t.vault.name,vaultAddress:t.vault.vaultAddress,tvl:t.vault.tvl,apr:t.vault.apr,allowDeposits:t.vault.allowDeposits},exec:!1,execution:"read-only",armed:!1}}catch(t){return{ok:!1,provider:"hl-vaults",error:String(t?.message||t).slice(0,160),exec:!1,execution:"read-only",armed:!1}}}var Gj,za,dd=_(()=>{Xt();Gj=/^0x[0-9a-fA-F]{40}$/,za="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"});import{AbiCoder as Xj}from"ethers";function Wa(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-precompiles: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Ga(e,t,n){let r=Number(e);if(!Number.isInteger(r)||r<0||r>=2**n)throw new Error(`hl-precompiles: ${t} must fit uint${n}`);return r}function Yo(e,t){return e.length?Jj.encode(e,t):"0x"}function dr(e,t=0){let r=String(e||"").replace(/^0x/i,"").slice(t*64,t*64+64);if(r.length!==64)throw new Error("hl-precompiles: malformed precompile result");return BigInt(`0x${r}`)}function Qj(e,t=0){let n=dr(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Wr(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:jg});let r=await J(jg,"eth_call",[{to:e,data:t},"latest"],n);if(typeof r!="string"||!/^0x[0-9a-fA-F]*$/.test(r))throw new Error("hl-precompiles: eth_call did not return hex");return r}function Gr(e){return{provider:"hl-precompiles",chainId:jg,...Hg,...e}}async function pd(e={}){let t=await Wr(gt.l1BlockNumber,"0x",e);return Gr({op:"l1BlockNumber",precompile:gt.l1BlockNumber,l1BlockNumber:dr(t).toString(),raw:t})}async function zg(e={},t={}){let n=Ga(e.index??e.assetId??0,"index",32),r=await Wr(gt.markPx,Yo(["uint32"],[n]),t);return Gr({op:"markPx",precompile:gt.markPx,index:n,markPx:dr(r).toString(),raw:r})}async function Vg(e={},t={}){let n=Ga(e.index??e.assetId??0,"index",32),r=await Wr(gt.oraclePx,Yo(["uint32"],[n]),t);return Gr({op:"oraclePx",precompile:gt.oraclePx,index:n,oraclePx:dr(r).toString(),raw:r})}async function Wg(e={},t={}){let n=Ga(e.index??e.assetId??0,"index",32),r=await Wr(gt.spotPx,Yo(["uint32"],[n]),t);return Gr({op:"spotPx",precompile:gt.spotPx,index:n,spotPx:dr(r).toString(),raw:r})}async function Gg(e={},t={}){let n=Wa(e.user,"user"),r=Ga(e.perp??e.assetId??0,"perp",16),o=await Wr(gt.position,Yo(["address","uint16"],[n,r]),t);return Gr({op:"position",precompile:gt.position,user:n,perp:r,szi:Qj(o,0),raw:o})}async function Kg(e={},t={}){let n=Wa(e.user,"user"),r=Ga(e.token??0,"token",64),o=await Wr(gt.spotBalance,Yo(["address","uint64"],[n,r]),t);return Gr({op:"spotBalance",precompile:gt.spotBalance,user:n,token:r,total:dr(o,0).toString(),hold:dr(o,1).toString(),raw:o})}async function Yg(e={},t={}){let n=Wa(e.user,"user"),r=Wa(e.vaultAddress??e.vault??za,"vault"),o=await Wr(gt.vaultEquity,Yo(["address","address"],[n,r]),t);return Gr({op:"vaultEquity",precompile:gt.vaultEquity,user:n,vaultAddress:r,hlp:r===za,equity:dr(o,0).toString(),raw:o})}async function Xg(e={},t={}){let n=Wa(e.user,"user"),r=await Wr(gt.withdrawable,Yo(["address"],[n]),t);return Gr({op:"withdrawable",precompile:gt.withdrawable,user:n,withdrawable:dr(r).toString(),raw:r})}async function qI(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return pd(t);if(n==="markPx")return zg(e,t);if(n==="oraclePx")return Vg(e,t);if(n==="spotPx")return Wg(e,t);if(n==="position")return Gg(e,t);if(n==="spotBalance")return Kg(e,t);if(n==="vaultEquity"||n==="hlp")return Yg(e,t);if(n==="withdrawable")return Xg(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function jI(e={}){try{let t=await pd(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Hg,l1BlockNumber:t.l1BlockNumber,precompiles:gt}}catch(t){return{ok:!1,provider:"hl-precompiles",...Hg,error:String(t?.message||t).slice(0,160)}}}var jg,gt,Hg,Jj,HI=_(()=>{Ne();dd();jg=999,gt=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Hg=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),Jj=Xj.defaultAbiCoder()});function zI(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function md(e={},t,n){let r=String(t||""),o=zI(e);if(o){let s=Ka(o[r]);if(s==null)throw new Error(`${n}: held spot required for ${r}`);return s}let i=Ka(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function hd(e={},t=[],n){let r=zI(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Ka(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&Ka(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(Ka(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}function Ka(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Jg?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>fd.length||t.length===fd.length&&t>fd||t===fd&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Jg?r:null}var Jg,fd,Qg=_(()=>{Jg=Number.MAX_SAFE_INTEGER,fd=String(Jg)});async function WI(e={}){let t=Date.now();if(Ya.dexs&&t-Ya.at<6e4&&!e.fetchImpl)return Ya.dexs;let n=await Te({type:"perpDexs"},e);return Ya={at:t,dexs:Array.isArray(n)?n:[]},Ya.dexs}async function GI(e="",t={}){let n=e||"",r=Date.now(),o=VI.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await Te({type:"metaAndAssetCtxs",dex:e},t):await jt(t),s=i?.[0]?.universe??i?.universe??[],a=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:s,ctxs:a};return VI.set(n,c),c}function nH(e){let t=String(e??"").trim();if(!t)return t;let n=t.toLowerCase().replace(/[\s._-]+/g,"");return tH[n]??t}function Yr(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let n=t%10;if(n!==0&&n!==1)return null;let r=Math.floor(t/10),o=KI+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Kr(e,t){let n=Zg(e),r=Zg(t);if(n==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(r!==0&&r!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*n+r;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=KI+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:n,side:r,coin:`#${o}`,assetId:i}}function Zg(e){if(typeof e=="number")return Number.isSafeInteger(e)&&e>=0?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}async function ey(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Yr(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Kr(e.outcome,0).outcome;if(u!=null&&l&&l.outcome!==u)throw new Error("hl-assets: coin does not match outcome");let d=e.outcomeSide==null?null:rH(e.outcomeSide,"outcomeSide"),p=u??l?.outcome;if(e.outcome!=null&&e.coin==null&&d==null)throw new Error("hl-assets: outcomeSide required");let m=d??l?.side;if(m==null)throw new Error("hl-assets: outcomeSide required");if(p==null)throw new Error("hl-assets: outcome identity required");let f=Kr(p,m);if(l&&(l.outcome!==f.outcome||l.side!==f.side))throw new Error("hl-assets: coin does not match outcome side");let h=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:f.coin,assetId:f.assetId,encoding:f.encoding,outcome:f.outcome,side:f.side,szDecimals:h,maxLeverage:1,dex:null,markPx:null}}let n=String(e.coin||e.symbol||e.name||"").trim();if(!n)throw new Error("hl-assets: coin required");if(n.includes(":")){let[l,...u]=n.split(":"),d=u.join(":");if(!l||!d)throw new Error(`hl-assets: bad builder coin ${n}`);let p=nH(l),m=await WI(t),f=m.findIndex(v=>v&&v.name===p);if(f<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:h,ctxs:g}=await GI(p,t),y=h.findIndex(v=>v.name===`${p}:${d}`);if(y<0)throw new Error(`hl-assets: ${n} not in dex ${p} meta`);let b=h[y];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let w=eH+f*1e4+y,S=g[y]||{};return{kind:"hip3",coin:b.name||n,assetId:w,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:p,dexName:m[f]?.fullName||p,dexIndex:f,indexInMeta:y,markPx:S.markPx??null}}let{universe:r,ctxs:o}=await GI("",t),i=n.toUpperCase(),s=r.findIndex(l=>l.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let l=await WI(t);for(let u=1;u<l.length;u++){let d=l[u];if(!d?.name)continue;let p=`${d.name}:${i}`;try{return await ey({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let a=r[s];if(a.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[s]||{};return{kind:"main",coin:a.name,assetId:s,szDecimals:a.szDecimals??0,maxLeverage:a.maxLeverage??null,dex:"",markPx:c.markPx??null}}function rH(e,t){let n=Zg(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var KI,eH,Ya,VI,tH,gd=_(()=>{Xt();KI=1e8,eH=1e5,Ya={at:0,dexs:null},VI=new Map;tH=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});function lt(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function hn(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Xo(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let n=lt(e,t);if(n==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(n)&&!/^0x[0-9a-fA-F]+$/.test(n))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(n)}`);try{return BigInt(n)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(n)}`)}}function gn(e,t="amount"){let n=Xo(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function rt(e,t,n="amount"){let r=lt(e,n);if(!/^-?\d*(\.\d+)?$/.test(r)||r===""||r==="."||r==="-")throw new Error(`${n} must be a decimal number, got ${JSON.stringify(r)}`);let o=r.startsWith("-"),i=o?r.slice(1):r,[s="0",a=""]=i.split(".");if(a.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((s||"0")+a.padEnd(t,"0"));return o?-c:c}var ns=_(()=>{});function cH(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function YI(e,t){let n=lt(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(n))throw new Error(`hl: ${t} must be a positive decimal`);let[r,o=""]=n.split("."),i=BigInt(r+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function zn(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(r=>zn(r,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${zn(e[r],t)}`).join(",")}}`}function lH(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,n=e.orderWire;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("hl: declared order wire required");if(t==="limit"){let i=n.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||zn(n,"declared order type")!==zn({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(zn(n,"declared order type")!==zn({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let r={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!r)throw new Error("hl: unsupported declared order type");let o=n.trigger?.triggerPx;if(o==null||zn(n,"declared order type")!==zn({trigger:{isMarket:r.isMarket,triggerPx:o,tpsl:r.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function uH(e,t,n){let r=YI(e.s,"signed size"),o=YI(e.p,"signed price"),i=r.decimals+o.decimals,s=r.raw*o.raw,a=rt(t.notionalUsd,i,"hl: notionalUsd");if(a<=0n||s!==a)throw new Error("hl: signed notional must match");let c=rt(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>c)throw new Error("hl: notional exceeds cap")}function dH(e,t){let n=e.action.builder;if(n==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!n||typeof n!="object"||Array.isArray(n))throw new Error("hl: signed order builder must be structured");let r=Xr(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(hn(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(a=>String(a).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=Xo(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=rt(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function XI(e,t,n){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(lt(e.s,"hl: signed size")!==lt(t.size,"hl: size"))throw new Error("hl: signed size must match");if(lt(e.p,"hl: signed price")!==lt(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(zn(e.t,"signed order type")!==zn(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let r=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(r)throw new Error("hl: undeclared signed client order id")}else if(!r||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function JI(e,t,n,r,o){if(!Number.isSafeInteger(e.a)||e.a!==n)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(lt(e.s,"hl: bracket protection size")!==lt(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(lt(e.p,"hl: bracket protection price")!==lt(r,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(lt(i.triggerPx,"hl: triggerPx")!==lt(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function pH(e){let t=String(e||"").replace(/\/$/,"");if(!oH.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function ty(e){return Yr(e)!=null}function fH(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(ty(n)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(r.includes(n)||r.includes("#*")||r.includes("*")||r.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(r.length&&!r.includes(n)&&!r.includes("*"))throw new Error("hl: coin not allowed");return!0}function mH(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(s=>{if(typeof s=="string"){let[a,c]=String(s).split(":");return a===e&&Number(c)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(ty(e)){let i=Array.isArray(n.coins)?n.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(n.coins)?n.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function QI(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("hl: structured artifact required");let r=Xr(n.kind,"kind",48),o=sH[r];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=pH(n.submitTo);if(Object.prototype.hasOwnProperty.call(n,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(n.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!n.action||typeof n.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(n.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(n.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(n.action.type!==aH[r])throw new Error("hl: action type must match kind");let a=n.notionalUsd??0;if(iH.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Xr(n.coin,"coin",64),l=n.assetId??n.assetIndex;if(!Number.isSafeInteger(l)||l<0)throw new Error("hl: assetId required");if(r==="hip4-order"||l>=1e8){let u=Yr(c);if(!u||u.coin!==c)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(u.assetId!==l)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(fH(c,t),mH(c,l,t),r==="hip4-order"&&!ty(c))throw new Error("hl: HIP-4 orders must use an outcome coin");if(r==="perp-order"||r==="hip3-order"||r==="hip4-order"||r==="perp-bracket"){if(n.side!=="buy"&&n.side!=="sell")throw new Error("hl: side must be buy or sell");if(n.action.type!=="order"||!Array.isArray(n.action.orders))throw new Error("hl: signed orders are required");lH(n);let u=n.action.orders;if(r==="perp-bracket"){let d=n.takeProfitPx,p=n.stopLossPx,m=1+(d==null?0:1)+(p==null?0:1);if(m<2||u.length!==m||n.grouping!=="normalTpsl"||n.action.grouping!==n.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");XI(u[0],n,l);let f=1;d!=null&&JI(u[f++],n,l,d,"tp"),p!=null&&JI(u[f],n,l,p,"sl")}else{if(u.length!==1)throw new Error("hl: exactly one signed order is required");if(n.grouping!=="na"||n.action.grouping!==n.grouping)throw new Error("hl: signed grouping must match declared grouping");XI(u[0],n,l)}uH(u[0],n,t),dH(n,t),a=lt(n.notionalUsd,"hl: notionalUsd")}if(r==="perp-leverage"){let u=n.leverage;if(!Number.isSafeInteger(u)||u<1)throw new Error("hl: leverage must be a positive integer");let d=t.maxLeverage==null?50:t.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(u>d)throw new Error("hl: leverage exceeds cap")}if(r==="perp-cancel"){let u=n.action.cancels;if(!Array.isArray(u)||u.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(u[0].a)||u[0].a!==l)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(n.orderId)||n.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(u[0].o)||u[0].o!==n.orderId)throw new Error("hl: signed cancel order id must match")}if(r==="perp-leverage"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(n.action.leverage)||n.action.leverage!==n.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(n.marginMode))throw new Error("hl: declared margin mode required");let u=n.marginMode==="cross";if(typeof n.action.isCross!="boolean"||n.action.isCross!==u)throw new Error("hl: signed isCross must match declared margin mode")}if(r==="perp-isolated-margin"){if(!Number.isSafeInteger(n.action.asset)||n.action.asset!==l)throw new Error("hl: signed margin asset must match assetId");let u=Xr(n.usd,"margin usd",64),d=rt(u,6,"hl: margin usd");if(Xo(n.action.ntli,"hl: signed margin ntli")!==d)throw new Error("hl: signed margin amount must match usd");if(typeof n.isBuy!="boolean"||n.action.isBuy!==n.isBuy)throw new Error("hl: signed margin isBuy must match");let m=rt(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");a=cH(f,6)}}if(r==="builder-fee-approval"){let c=Xr(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Xr(n.action.builder,"signed builder",42).toLowerCase()!==c)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(f=>String(f).toLowerCase()):[]).includes(c))throw new Error("hl: builder not allowed");let u=Xr(n.maxFeeRate,"maxFeeRate",32);if(Xr(n.action.maxFeeRate,"signed maxFeeRate",32)!==u)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(u))throw new Error("hl: builder fee rate must be a percent");let d=rt(u.slice(0,-1),12,"hl: builder fee percent"),p=rt(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let m=i.includes("testnet")?"Testnet":"Mainnet";if(n.hyperliquidChain!==m||n.action.hyperliquidChain!==n.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(n.signatureChainId!=="0x66eee"||n.action.signatureChainId!==n.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(r.startsWith("hype-stake")||r==="hype-delegate"||r==="hype-undelegate"){if(r==="hype-delegate"||r==="hype-undelegate"){let c=r==="hype-undelegate";if(typeof n.action.isUndelegate!="boolean"||n.action.isUndelegate!==c)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(n.action.wei??n.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(a??n.action.wei??0),notional:String(a??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??a??0),coin:n.coin||null,submitTo:i})}var oH,iH,sH,aH,Xr,ZI=_(()=>{ns();gd();oH=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),iH=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),sH=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),aH=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"}),Xr=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function gH(e){let t=e.owner||e.user||e.from||e.recipient;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("hl: owner/user address required for local-signer envelope");return String(t).toLowerCase()}function yd(e,t={},n={}){let r=String(e?.kind||""),o=hH[r];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(n.nowMs??Date.now()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),a=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:gH(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+s,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:r,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:a,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return QI(c,{coins:t.coins||["*"],hip4:!0,maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,maxLeverage:t.maxLeverage??50,hlBuilders:t.hlBuilders||(e.builderFee?.address?[e.builderFee.address]:[]),maxBuilderFeeBps:t.maxBuilderFeeBps??e.builderFee?.bps}),c}var hH,ny=_(()=>{ZI();hH=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});var py={};ht(py,{HL_BUILDER_ADDRESS_ENV:()=>bd,HL_BUILDER_DEFAULT_FEE_BPS:()=>yH,HL_BUILDER_FEE_ENV:()=>oy,HL_BUILDER_FEE_TIERS:()=>Xa,HL_BUILDER_MAX_FEE_BPS:()=>ry,HL_PERP_MAX_SIG_FIGS:()=>ek,HL_PERP_PRICE_DECIMALS:()=>tk,HL_SIGNATURE_CHAIN_ID:()=>wd,MARGIN_MODE:()=>Ja,ORDER_TYPES:()=>Ht,TIF:()=>Qa,formatPerpPrice:()=>pr,formatPerpSize:()=>ik,hlBuilderFeeBpsForKind:()=>ok,hlPerpAssetInfo:()=>Jr,hlPrepareApproveAgent:()=>AH,hlPrepareBracketOrder:()=>dy,hlPrepareBuilderApproval:()=>cy,hlPrepareCancelOrder:()=>Za,hlPreparePerpOrder:()=>Qr,hlPrepareUpdateIsolatedMargin:()=>uy,hlPrepareUpdateLeverage:()=>ly,resolveBuilderFee:()=>sy});function nk(e,t){if(typeof e=="number"){if(Number.isSafeInteger(e)&&e>=0)return e}else if(typeof e=="string"&&/^(?:0|[1-9]\d*)$/.test(e)){let n=Number(e);if(Number.isSafeInteger(n))return n}throw new Error(`hl-perps: ${t} must be a non-negative safe integer`)}function bH(e,t){let n=nk(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function wH(e={}){let t={...e};if(t.side==null)return t;if(t.side===0||t.side===1){if(t.outcomeSide!=null&&t.outcomeSide!==t.side)throw new Error("hl-perps: side conflict with outcomeSide");return t.outcomeSide=t.side,delete t.side,t}throw new Error("hl-assets: side must be 0 or 1")}function rk(e,{defaultBuy:t=!1}={}){if(e.side!=null){if(typeof e.side!="string")throw new Error("hl-perps: side must be buy or sell");let n=e.side.toLowerCase();if(n!=="buy"&&n!=="sell")throw new Error("hl-perps: side must be buy or sell");let r=n==="buy";if(e.isBuy!=null&&(typeof e.isBuy!="boolean"||e.isBuy!==r))throw new Error("hl-perps: side and isBuy conflict");return r}if(e.isBuy==null&&t)return!0;if(typeof e.isBuy!="boolean")throw new Error("hl-perps: isBuy must be boolean when side is omitted");return e.isBuy}function ok(e="perp"){if(e==="perp"||e==="main")return Xa.perp;if(e==="spot")return Xa.spot;if(e==="hip3")return Xa.hip3;if(e==="outcome"||e==="hip4")return Xa.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function sy({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[bd]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${bd} must be an EVM address`);let o=Oh(e);if(!o||o!==r)return null;let i=e?.[oy],s=ok(n),a=i==null?s:Number(i);if(!Number.isFinite(a)||a<=0||Math.abs(a*10-Math.round(a*10))>1e-9)throw new Error(`hl-perps: ${oy} must be a positive number in 0.1 bps increments`);if(a>ry)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${ry} bps cap`);if(a>s)throw new Error(`hl-perps: builder fee ${a} bps exceeds the ${s} bps product tier for ${n}`);let c=Math.round(a*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:a,percent:`${l}%`}}}async function SH(e,t={},n={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await Te({type:"maxBuilderFee",user:r,builder:e.disclosure.address},n));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function vH(e,t={},n={}){if(!e)return{exempt:!1,status:"not-configured"};let r=String(t.user||n.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(r))return{exempt:!1,status:"wallet-required"};try{let o=n.holderBalance||Iu;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ay(e,t,{roundDown:n=null}={}){let r=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof r!="string"||!/^-?\d+(\.\d+)?$/.test(r))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=r.startsWith("-"),[i,s=""]=r.replace(/^-/,"").split(".");if(s.length<=t){let f=s.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let a=s.slice(0,t),c=Number(s[t]),l=BigInt(i+a),u=s.slice(t).replace(/0+$/,"")!=="";n===!0||(n===!1?u&&(l+=1n):c>=5&&(l+=1n));let d=l.toString().padStart(t+1,"0"),m=(t===0?d:`${d.slice(0,-t)}.${d.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+m}function EH(e,t,n={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let r=typeof e=="number"?String(e):e;if(!r.includes("."))return r;let o=Number(r);if(!Number.isFinite(o)||o===0)return r;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return ay(r,s,n)}function pr(e,t,n={}){let r=tk-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return ay(EH(e,ek,n),r,n)}function ik(e,t){let n=ay(e,Number(t??0));if(BigInt(n.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(n)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return n}function xH(e,t){let n=(u,d)=>{let p=String(u).trim();if(!/^\d+(?:\.\d+)?$/.test(p))throw new Error(`hl-perps: ${d} must be a positive decimal`);let[m,f=""]=p.split(".");return{raw:BigInt(m+f),decimals:f.length}},r=n(e,"size"),o=n(t,"price"),i=r.raw*o.raw,s=r.decimals+o.decimals,a=i.toString().padStart(s+1,"0");if(s===0)return a;let c=a.slice(0,-s),l=a.slice(-s).replace(/0+$/,"");return l?`${c}.${l}`:c}async function Jr(e={},t={}){let n=await ey(e,t);return{coin:n.coin,assetId:n.assetId,szDecimals:n.szDecimals,maxLeverage:n.maxLeverage,markPx:n.markPx,kind:n.kind,dex:n.dex??null,dexName:n.dexName??null,outcome:n.outcome??null,side:n.side??null}}function iy(e,{tif:t=Qa.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Ht.LIMIT:return{limit:{tif:t}};case Ht.MARKET:return{limit:{tif:Qa.IOC}};case Ht.STOP_MARKET:case Ht.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:pr(n,o),tpsl:e===Ht.STOP_MARKET?"sl":"tp"}};case Ht.STOP_LIMIT:case Ht.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:pr(n,o),tpsl:e===Ht.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Jo(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:wd,submitTo:r?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange",note:"Sign locally via Oracle local-signer or a wallet. Hosted Oracle does not submit."}}function rs(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=yd(r,t,n),r.prepared=!0,r.signing="awaiting-hl-signer"}catch(o){r.prepared=!1,r.localSignerEnvelope=null,r.localSignerBlockedReason=String(o?.message||o).slice(0,200),r.signing="blocked"}return r.oraclePrepared=!!r.localSignerEnvelope,U(r,{provider:e.provider||"hl-perps",kind:e.kind})}function cy(e={},t={}){let n=sy({env:t.env});if(!n)throw new Error(`hl-perps: ${bd} is required`);let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:wd,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return rs({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Jo(o,r,t)},e,t)}function AH(e={},t={}){let n=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("hl-perps: agentAddress required");let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:wd,agentAddress:n.toLowerCase(),agentName:o,nonce:r};return U({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:n.toLowerCase(),agentName:o,...Jo(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function Qr(e={},t={}){let n=await Jr(e,t);if(e.type!=null&&(typeof e.type!="string"||!e.type))throw new Error("hl-perps: order type must be a string");let r=e.type??Ht.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=rk(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=ik(e.size??e.sz,n.szDecimals),a;if(r===Ht.MARKET){let b=Number(n.markPx);if(!Number.isFinite(b)){let I=await _n(t);b=Number(I?.[n.coin]??I?.[String(n.assetId)]??NaN)}if(!Number.isFinite(b))throw new Error("hl-perps: no mark price available for a market order");let w=Number(e.maxSlippageBps??50);if(!Number.isInteger(w)||w<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(w>100)throw new Error(`hl-perps: maxSlippageBps ${w} exceeds the hard 100 bps cap`);let S=o?b*(1+w/1e4):b*(1-w/1e4);a=pr(S,n.szDecimals,{roundDown:o});let v=Math.abs(Number(a)/b-1)*1e4;if(v>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${w} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");a=pr(e.price??e.limitPx,n.szDecimals)}let c=iy(r,{tif:e.tif??(r===Ht.MARKET?Qa.IOC:Qa.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:a,s,r:i,t:c};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");l.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let u={type:"order",orders:[l],grouping:e.grouping??"na"},d=sy({env:t.env,kind:n.kind}),p=await vH(d,e,t),m=p.exempt?null:d,f=await SH(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),y=xH(s,a);return rs({provider:"hl-perps",venue:"hyperliquid",kind:n.kind==="outcome"?"hip4-order":n.kind==="hip3"?"hip3-order":"perp-order",coin:n.coin,assetId:n.assetId,assetKind:n.kind,outcome:n.outcome??null,outcomeSide:n.side??null,dex:n.dex??null,dexName:n.dexName??null,side:o?"buy":"sell",orderType:r,price:a,size:s,reduceOnly:i,notionalUsd:y,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...Jo(u,g,t)},e,t)}async function Za(e={},t={}){let n=await Jr(wH(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=nk(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return rs({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Jo(i,Number(e.nonce??Date.now()),t)},e,t)}async function ly(e={},t={}){let n=await Jr(e,t),r=bH(e.leverage,"leverage");if(n.maxLeverage!=null&&r>n.maxLeverage)throw new Error(`hl-perps: ${n.coin} allows at most ${n.maxLeverage}x, requested ${r}x`);if(e.marginMode!=null&&typeof e.marginMode!="string")throw new Error("hl-perps: marginMode must be a string");let o=(e.marginMode||Ja.CROSS).toLowerCase();if(o!==Ja.CROSS&&o!==Ja.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Ja.CROSS,leverage:r};return rs({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:n.coin,assetId:n.assetId,leverage:r,marginMode:o,maxLeverage:n.maxLeverage,liquidationWarning:r>=20?`${r}x liquidates on roughly a ${(100/r).toFixed(2)}% adverse move before fees`:null,...Jo(i,Number(e.nonce??Date.now()),t)},e,t)}async function uy(e={},t={}){let n=await Jr(e,t),r=e.usd??e.amountUsd;if(r==null)throw new Error("hl-perps: usd amount required");if(typeof r!="number"&&typeof r!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof r=="number"?String(r):r;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=rt(o,6,"hl-perps: usd"),s=rk(e,{defaultBuy:!0}),a={type:"updateIsolatedMargin",asset:n.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return rs({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:s,usd:o,...Jo(a,Number(e.nonce??Date.now()),t)},e,t)}async function dy(e={},t={}){let n=await Qr(e,t),r=await Jr(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:pr(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:iy(Ht.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:pr(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:iy(Ht.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return rs({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:r.coin,assetId:r.assetId,side:n.side,price:n.price,size:n.size,reduceOnly:n.reduceOnly,orderType:n.orderType,notionalUsd:n.notionalUsd,legs:i.length,entry:{side:n.side,price:n.price,size:n.size},takeProfitPx:e.takeProfitPx==null?null:pr(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:pr(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Jo(s,Number(e.nonce??Date.now()),t)},e,t)}var ek,tk,wd,yH,ry,bd,oy,Xa,Ht,Qa,Ja,ec=_(()=>{Xt();gd();ns();oe();ny();kh();Ia();ek=5,tk=6,wd="0x66eee",yH=2,ry=10,bd="ORACLE_HL_BUILDER_ADDRESS",oy="ORACLE_HL_BUILDER_FEE_BPS",Xa=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Ht=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Qa=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Ja=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function sk(){return{ok:!0,provider:"hl-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated hl signer. Not automated."}}function fr(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function ak(e){let t=fr(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function IH(e,t,n=4){let r=fr(e),o=fr(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");if(!(o>0))throw new Error("hl-delta-neutral: markPx must be > 0");let s=10**i;return String(Math.floor(r/o*s+1e-12)/s)}function ck(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=t[o]||{},s=n[o]||{},a=String(i.name||"").trim(),c=fr(s.funding),l=fr(s.markPx??s.oraclePx),u=fr(s.openInterest)??0;!a||c==null||!(l>0)||r.push({coin:a,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:fr(s.oraclePx),openInterest:u,fundingAprPct:ak(c)})}return r}function lk(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=fr(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=ak(n),o=n>0,i={coin:e.coin,notionalUsd:fr(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",perpSize:o?IH(t,e.markPx,e.szDecimals):"0",verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry. A farm tick may prepare the perp hedge unsigned. Hosted stays prepare-only."};if(!(i.notionalUsd>0))throw new Error("hl-delta-neutral: notionalUsd must be > 0");return i}async function fy(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await jt(t),i=ck(o).filter(s=>s.funding>0&&s.openInterest>=r).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,n);return{live:!0,source:"Hyperliquid metaAndAssetCtxs",considered:Array.isArray(o?.[0]?.universe)?o[0].universe.length:0,candidates:i,posture:"read-only funding scan. Positive funding only. No signing."}}async function my(e={},t={}){let n=String(e.coin||"").trim();if(!n)throw new Error("hl-delta-neutral: coin required");let r=Number(e.notionalUsd??e.notional??1e3),o=await jt(t),i=ck(o).find(s=>s.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return lk(i,r)}async function hy(e={},t={}){dk(e,t,"hl-delta-neutral");let n=pk(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await my(e,t);if(r.verdict==="skip")return U({...r,prepared:!1,oraclePrepared:!1,surface:"hl",reason:"negative funding is outside the light hold-spot path"},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"});let o=md(e,r.coin,"hl-delta-neutral");if(!uk.test(String(e.owner||"")))throw new Error("hl-delta-neutral: prepare requires owner");if(Number(r.perpSize)-o>1e-12)throw new Error("hl-delta-neutral: hedge cannot exceed held spot");let{hlPreparePerpOrder:i}=await Promise.resolve().then(()=>(ec(),py)),s=await i({coin:r.coin,side:r.perpSide,size:r.perpSize,type:e.orderType||"limit",price:e.price??r.markPx,owner:e.owner,maxNotionalUsd:n},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});if(s?.signed===!0||s?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let a=s?.localSignerEnvelope||null,c=s?.localSignerBlockedReason||null;return U({...r,prepared:!!a,surface:"hl",hedge:s,localSignerEnvelope:a,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:a?"awaiting-hl-signer":"blocked",oraclePrepared:!!a},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}function dk(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function kH(e,t,n){dk(e,t,n)}function _H(e={}){if(e.halted===!0)throw new Error("hl-delta-neutral: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("hl-delta-neutral: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("hl-delta-neutral: maxCoins must be an integer");if(o<1||o>8)throw new Error("hl-delta-neutral: maxCoins must be between 1 and 8");let i=pk(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&n.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&hd(e,n,"hl-delta-neutral"),t==="live"&&!uk.test(String(e.owner||"")))throw new Error("hl-delta-neutral: live loop requires owner");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,intervalMs:Math.max(3e4,Number(e.intervalMs??3e5)||3e5)}}function pk(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function fk(e={},t={}){kH(e,t,"hl-delta-neutral");let n=_H(e),r=await fy({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.coin))continue;let c=lk(a,s);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await hy({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:s,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var uk,mk=_(()=>{Xt();oe();Qg();uk=/^0x[0-9a-fA-F]{40}$/});function os(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function gy(e){let t=String(e||"").replace(/\/$/,"");if(!NH.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function gk(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("lighter: structured artifact required");let r=hk(n.kind,"kind",48);if(r!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=gy(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(Xo(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let a=Number(Xo(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: clientOrderIndex required");os(n.orderType,0,"orderType"),os(n.timeInForce,1,"timeInForce"),os(n.reduceOnly,0,"reduceOnly"),os(n.triggerPrice,0,"triggerPrice"),os(n.orderExpiry,-1,"orderExpiry");let c=hk(n.symbol||n.coin,"symbol",32),l=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(l.length&&!l.includes(c)&&!l.includes(String(i))&&!l.includes("*"))throw new Error("lighter: market not allowed");if(n.side!=="buy"&&n.side!=="sell")throw new Error("lighter: side must be buy or sell");let u=gn(n.baseAmount,"lighter: baseAmount"),d=gn(n.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let p=Number(u),m=Number(d),f=Number(n.sizeDecimals??0),h=Number(n.priceDecimals??0);if(!Number.isInteger(f)||f<0||f>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(h)||h<0||h>12)throw new Error("lighter: priceDecimals required");let g=f+h,y=u*d,b=rt(n.notionalUsd,g,"lighter: notionalUsd");if(b<=0n)throw new Error("lighter: notionalUsd required");if(y!==b)throw new Error("lighter: notionalUsd must match size and price");let w=rt(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(y>w)throw new Error("lighter: notional exceeds cap");let S=lt(n.notionalUsd,"lighter: notionalUsd");return os(n.txType,tc,"txType"),Object.freeze({unit:"usd",value:String(S),notional:String(S),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(S)})}var NH,tc,hk,yy=_(()=>{ns();NH=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),tc=14,hk=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e}});function TH(e){let t=e.owner||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("lighter: owner address required for local-signer envelope");return String(t).toLowerCase()}function yk(e,t={},n={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=gy(e.submitTo),s={version:1,surface:"lighter",action:"order",owner:TH(t),destination:"lighter",tradeId:String(t.tradeId||`lighter:${e.symbol}:${e.marketIndex}:${e.clientOrderIndex}`),expiresAtMs:r+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"lighter-delta-neutral",artifact:{kind:"lighter-order",symbol:e.symbol,marketIndex:e.marketIndex,side:e.side,baseAmount:e.baseAmount,price:e.price,notionalUsd:e.notionalUsd,sizeDecimals:e.sizeDecimals??0,priceDecimals:e.priceDecimals??0,clientOrderIndex:e.clientOrderIndex,txType:e.txType??tc,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return gk(s,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),s}var bk=_(()=>{yy()});function CH(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?vk:Sk}function Ek(){return{ok:!0,provider:"lighter-delta-neutral",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Scan/quote/prepare are public. Sign/submit stay on the owner-operated lighter signer. Not automated."}}function Zr(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function PH(e,t){let n=e.toString().padStart(t+1,"0");if(t===0)return n;let r=n.slice(0,-t),o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}function xk(e){let t=Zr(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function RH(e,t,n=4){let r=Zr(e),o=Zr(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("lighter: notionalUsd must be > 0");if(!(o>0))throw new Error("lighter: markPx must be > 0");let s=10**i;return Math.floor(r/o*s+1e-12)}function wk(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function by(e,t){let n=Array.isArray(e?.funding_rates)?e.funding_rates:[],r=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let s of r){let a=wk(s.market_id);a!=null&&o.set(a,s)}let i=[];for(let s of n){if(String(s.exchange||"")!=="lighter")continue;let a=wk(s.market_id);if(a==null)continue;let c=o.get(a),l=Zr(c?.mark_price??c?.index_price),u=Zr(s.rate),d=String(s.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:a,funding:u,markPx:l,openInterest:Zr(c?.open_interest)??0,sizeDecimals:Number(c?.supported_size_decimals??c?.size_decimals??4),priceDecimals:Number(c?.supported_price_decimals??c?.price_decimals??2),fundingAprPct:xk(u)})}return i}function Ak(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Zr(e.funding);if(n==null)throw new Error("lighter: funding required");let r=xk(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Zr(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?RH(t,e.markPx,e.sizeDecimals):0,price:Math.round(Number(e.markPx)*10**Number(e.priceDecimals||0)),sizeDecimals:e.sizeDecimals,priceDecimals:e.priceDecimals,verdict:o?r>=5?"carry":"watch":"skip",posture:"light hold-spot / short-perp carry on Lighter. Armed via official sendTx. Not automated."};if(!(i.notionalUsd>0))throw new Error("lighter: notionalUsd must be > 0");return i}async function wy(e={}){let t=CH(e),n=new AbortController,r={fetchImpl:e.fetchImpl,retries:0,signal:n.signal};try{let[o,i]=await Promise.all([x(`${t}/api/v1/funding-rates`,r),x(`${t}/api/v1/orderBookDetails`,r)]);return{funding:o,books:i}}catch(o){throw n.abort(o),o}}async function Ik(e={}){let{funding:t,books:n}=await wy(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:by(t,n)}}async function Sy(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await wy(t),i=by(r,o).filter(s=>s.funding>0).sort((s,a)=>a.funding-s.funding||a.openInterest-s.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(s=>s.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function vy(e={},t={}){let n=String(e.coin||e.symbol||"").trim();if(!n)throw new Error("lighter: coin required");let r=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await wy(t),s=by(o,i).find(a=>a.symbol===n);if(!s)throw new Error(`lighter: ${n} not in Lighter funding`);return Ak(s,r)}async function Ey(e={},t={}){_k(e,t,"lighter");let n=Ok(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let r=e.accountIndex,o=await vy(e,t);if(o.verdict==="skip")return U({...o,prepared:!1,oraclePrepared:!1,surface:"lighter",reason:"negative funding is outside the light hold-spot path"},{provider:"lighter-delta-neutral",kind:"lighter-order"});let i=md(e,o.coin,"lighter");if(!kk.test(String(e.owner||"")))throw new Error("lighter: prepare requires owner");if(o.baseAmount/10**Number(o.sizeDecimals||0)-i>1e-12)throw new Error("lighter: hedge cannot exceed held spot");let a=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=PH(BigInt(o.baseAmount)*BigInt(o.price),c);if(e.clientOrderIndex!=null&&(typeof e.clientOrderIndex!="number"||!Number.isSafeInteger(e.clientOrderIndex)||e.clientOrderIndex<0))throw new Error("lighter: clientOrderIndex must be a safe integer");let u={...o,targetNotionalUsd:o.notionalUsd,notionalUsd:l,kind:"lighter-order",surface:"lighter",side:o.perpSide,clientOrderIndex:e.clientOrderIndex??Date.now()%1e9,accountIndex:r,orderType:0,timeInForce:1,reduceOnly:0,triggerPrice:0,orderExpiry:-1,txType:tc,submitTo:`${a?vk:Sk}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=yk(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return U({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}function _k(e,t,n){if((t.hosted===!0||t.keyless===!0)&&(e.farming===!0||typeof t.signImpl=="function"))throw new Error(`${n}: hosted/keyless cannot sign`);if(e.farming===!0||typeof t.signImpl=="function"||typeof t.prepareImpl=="function")throw new Error(`${n}: farm cannot sign; use oracle signer`)}function LH(e,t,n){_k(e,t,n)}function MH(e={}){if(e.halted===!0)throw new Error("lighter: loop is halted");let t=e.mode==="live"?"live":"shadow",n=Array.isArray(e.coins||e.allowlist)?(e.coins||e.allowlist).map(String):[],r=e.maxCoins??1;if(typeof r!="number"&&!(typeof r=="string"&&/^(?:0|[1-9]\d*)$/.test(r)))throw new Error("lighter: maxCoins must be an integer");let o=Number(r);if(!Number.isSafeInteger(o))throw new Error("lighter: maxCoins must be an integer");if(o<1||o>8)throw new Error("lighter: maxCoins must be between 1 and 8");let i=Ok(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&n.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&hd(e,n,"lighter"),t==="live"&&!kk.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let s=e.accountIndex;if(t==="live"&&(typeof s!="number"||!Number.isSafeInteger(s)||s<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:s}}function Ok(e,t){let n=typeof e=="string"&&e===e.trim()&&/^(?:0\.\d+|[1-9]\d*(?:\.\d+)?)$/.test(e);if(typeof e!="number"&&!n)throw new Error(`${t}: maxNotionalUsd out of bounds`);let r=Number(e);if(!(r>0)||r>25e3)throw new Error(`${t}: maxNotionalUsd out of bounds`);return r}async function Nk(e={},t={}){LH(e,t,"lighter");let n=MH(e),r=await Sy({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],s=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let a of r.candidates){if(o.size&&!o.has(a.symbol)&&!o.has(a.coin))continue;let c=Ak(a,s);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"lighter",prepared:!1,signed:!1,broadcast:!1});continue}let l=await Ey({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:s,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(a=>a.signed===!0),broadcast:i.some(a=>a.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}var Sk,vk,kk,xy=_(()=>{q();oe();bk();yy();Qg();Sk="https://mainnet.zklighter.elliot.ai",vk="https://testnet.zklighter.elliot.ai";kk=/^0x[0-9a-fA-F]{40}$/});function nc(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||BH).replace(/\/$/,"")}function Tk(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||DH).replace(/\/$/,"")}async function Ay(e={}){return x(`${nc(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ck(e={}){let t=await Ay(e);return{ok:t!=null&&t!=="",time:t}}async function Pk({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return x(`${Tk(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Rk(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${nc(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Lk(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${nc(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Mk(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return x(`${nc(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $k(e,{side:t="buy"}={},n={}){if(!e)throw new Error("polyPrice requires tokenId");let r=new URLSearchParams({token_id:String(e),side:String(t)});return x(`${nc(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Bk({limit:e=5,offset:t=0,...n}={},r={}){let o=new URLSearchParams({limit:String(e),offset:String(t),...Object.fromEntries(Object.entries(n).filter(([,i])=>i!=null).map(([i,s])=>[i,String(s)]))});return x(`${Tk(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}var BH,DH,Dk=_(()=>{q();BH="https://clob.polymarket.com",DH="https://gamma-api.polymarket.com"});import{createHash as Uk}from"node:crypto";function FH(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||Iy).trim()}function Ce(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}function qH(e,t){return t?[...e,{commitment:t}]:e}async function mr(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=Fe(await x(FH(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(!qt(o))throw new Error(`solana-rpc ${e}: invalid response envelope`);let i=Nt(o,"error");if(i)throw new Error(`solana-rpc ${e}: ${Nt(i,"message")||JSON.stringify(i)}`);if(!Object.hasOwn(o,"result"))throw new Error(`solana-rpc ${e}: missing result`);return Nt(o,"result")}async function rc(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await mr("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Qo,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Fk(e={}){try{let[t,n]=await Promise.all([mr("getHealth",[],e),rc({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Qo,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Qo,error:String(t?.message||t),exec:!1}}}async function Sd(e={},t={}){let n=Ce(e.address||e.owner,"address"),r=await mr("getBalance",qH([n],e.commitment),t);return{provider:"solana-rpc",cluster:Qo,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function jH(e={}){let t=e.account?.data?.parsed?.info||{},n=t.tokenAmount||{};return{pubkey:e.pubkey,mint:t.mint||null,owner:t.owner||null,amount:String(n.amount??"0"),decimals:n.decimals??null,uiAmount:n.uiAmount??null,uiAmountString:n.uiAmountString??null,raw:e}}async function oc(e={},t={}){let n=Ce(e.owner||e.address,"owner"),r=e.mint?{mint:Ce(e.mint,"mint")}:{programId:Ce(e.programId||ky,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await mr("getTokenAccountsByOwner",[n,r,o],t),s=Array.isArray(i?.value)?i.value.map(jH):[];return{provider:"solana-rpc",cluster:Qo,owner:n,filter:r,slot:i?.context?.slot??null,accounts:s,raw:i}}async function qk(e={},t={}){let n=Ce(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 i=await mr("getSignaturesForAddress",[n,o],t);if(!Array.isArray(i))throw new Error("solana-rpc getSignaturesForAddress returned an invalid response");let s=i.slice(0,r);return{provider:"solana-rpc",cluster:Qo,address:n,limit:r,cursor:e.before?String(e.before):null,nextCursor:s.length===r?s[s.length-1]?.signature??null:null,pageComplete:i.length<r,count:s.length,truncated:i.length>s.length,signatures:s,raw:s}}function HH(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("solana-rpc: transaction must be base64");return t}function zH(e,t){let n=0,r=0,o=t;for(let i=0;i<3;i++){if(o>=e.length)throw new Error("solana-rpc: transaction shortvec truncated");let s=e[o++];if(n|=(s&127)<<r,(s&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function VH(e){let t=Buffer.from(e,"base64");try{let n=zH(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Uk("sha256").update(t.subarray(r)).digest("hex")}catch{return Uk("sha256").update(t).digest("hex")}}async function jk(e={},t={}){let n=HH(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await mr("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Qo,ok:i.err==null,transactionHash:VH(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}var Qo,Iy,ky,Zo=_(()=>{q();mn();Qo="mainnet-beta",Iy="https://api.mainnet-beta.solana.com",ky="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"});function On(e={}){return String(e.network||process.env.BTC_NETWORK||GH).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function vd(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):On(e)==="testnet"?Ny:Oy}function _y(e){let t=String(e||"");try{let n=new URL(t);(n.username||n.password)&&(n.username="[REDACTED]",n.password="");for(let r of[...n.searchParams.keys()])/^(key|api[_-]?key|token|secret|password|auth|bearer)$/i.test(r)&&n.searchParams.set(r,"[REDACTED]");t=n.toString().replace(/\/$/,"")}catch{}return t.replace(/(https?:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1[REDACTED]@").replace(/([?&](?:key|api[_-]?key|token|secret|password|auth|bearer)=)[^&\s]+/gi,"$1[REDACTED]")}function yn(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}function KH(e,t="txHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n)||n.length<20||n.length%2!==0)throw new Error(`bitcoin-esplora: ${t} must be even-length hex`);return n}async function Hk(e,t={}){let n=`${vd(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`bitcoin-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function ic(e,t={}){let n=`${vd(t)}${e.startsWith("/")?e:`/${e}`}`;return Fe(await x(n,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"bitcoin-esplora response")}async function zk(e={}){try{let t=await Hk("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:On(e),baseUrl:_y(vd(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:On(e),baseUrl:_y(vd(e)),error:_y(t?.message||t),exec:!1}}}async function Vk(e={}){let t=await Hk("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:On(e),tipHeight:Number(t)}}async function Wk(e={}){try{let t=await ic("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:On(e),fastestFee:t.fastestFee??null,halfHourFee:t.halfHourFee??null,hourFee:t.hourFee??null,economyFee:t.economyFee??null,minimumFee:t.minimumFee??null,raw:t}}catch{return{provider:"bitcoin-esplora",network:On(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ed(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await ic(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),a=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:On(t),address:n,balanceSats:String(s-a),chainStats:o,mempoolStats:i,raw:r}}async function Gk(e={},t={}){let n=yn(e.address||e.addr,"address"),r=await ic(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:On(t),address:n,count:o.length,totalSats:String(o.reduce((i,s)=>i+Number(s.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Kk(e={},t={}){let n=yn(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 i=o?`/address/${n}/txs/chain/${String(o).toLowerCase()}`:`/address/${n}/txs`,s=await ic(i,t);if(!Array.isArray(s))throw new Error("bitcoin-esplora address history returned an invalid response");let a=s.slice(0,r),c=s.length>a.length,l=!c&&s.length===25?a[a.length-1]?.txid??null:null;return{provider:"bitcoin-esplora",network:On(t),address:n,limit:r,cursor:o==null?null:String(o).toLowerCase(),nextCursor:l,pageComplete:!c&&s.length<25,count:a.length,truncated:c,transactions:a,raw:a}}async function Yk(e={},t={}){let n=String(e.txid||e.txId||"").trim().toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error("bitcoin-esplora: txid must be 64-char hex");let r=await ic(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:On(t),txid:n,confirmed:!!r.status?.confirmed,fee:r.fee??null,size:r.size??null,weight:r.weight??null,vinCount:Array.isArray(r.vin)?r.vin.length:null,voutCount:Array.isArray(r.vout)?r.vout.length:null,raw:r}}async function Xk(e={},t={}){let n=KH(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:On(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}var GH,Oy,Ny,is=_(()=>{q();mn();GH="mainnet",Oy="https://mempool.space/api",Ny="https://mempool.space/testnet/api"});function xd(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}function Jk(e={}){let t=e.apiKey||process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY||"",n=!1;try{let r=xd(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,s=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=XH.includes(o)&&(i==="https:"||s)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function ss(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Jk(t),signal:AbortSignal.timeout(t.timeoutMs??12e3)}),o=await r.text(),i;try{i=JSON.parse(o)}catch{i=o}if(!r.ok)throw new Error(`bitcoin-meta GET ${e}: HTTP ${r.status} ${String(o).slice(0,160)}`);return i}async function Qk(e={}){let t=xd(e),n=null;try{let i=await(e.fetchImpl||fetch)("https://ordinals.com/r/blockheight",{signal:AbortSignal.timeout(8e3)});n=Number(await i.text())}catch{n=null}if(!t)return{ok:n!=null,provider:"bitcoin-meta",indexerConfigured:!1,ordinalsComTip:n,note:"Set BTC_META_API_URL and/or UNISAT_API_KEY / BESTINSLOT_API_KEY for balances. Marketplace = Satflow (SATFLOW_API_KEY). Magic Eden BTC is dead.",capabilities:{tip:n!=null,runeBalances:!1,inscriptions:!1,marketplace:!1}};let r={ok:!1,path:null,status:null};for(let o of["/v1/indexer/brc20/best-height","/v1/health","/health","/"])try{let s=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Jk(e),signal:AbortSignal.timeout(8e3)});if(r={ok:s.status>0&&s.status<500,path:o,status:s.status},s.ok)break}catch{}return{ok:r.ok||n!=null,provider:"bitcoin-meta",indexerConfigured:!0,baseUrl:t,probe:r,ordinalsComTip:n,apiKeyPresent:!!(process.env.UNISAT_API_KEY||process.env.BESTINSLOT_API_KEY||process.env.BTC_META_API_KEY),capabilities:{tip:n!=null,runeBalances:!0,inscriptions:!0,marketplace:!!process.env.SATFLOW_API_KEY}}}async function Ad(e={},t={}){let n=yn(e.address||e.addr,"address"),r=xd(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:"no indexer configured (set BTC_META_API_URL or vendor API key env)"};let o=[`${r}/v1/indexer/address/${n}/runes/balance-list?start=0&limit=100`,`${r}/v1/runes/address/${n}`,`${r}/runes/balance/${n}`,`${r}/address/${n}/runes`],i=null;for(let s of o)try{let a=await ss(s,t),c=JH(a);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:s}}catch(a){i=a}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function JH(e){let t=e?.data?.detail||e?.data?.list||e?.data||e?.balances||e?.results||e?.runes||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({rune:r.rune||r.runeid||r.runeId||r.spacedRune||r.name||r.ticker||null,runeId:r.runeid||r.runeId||r.id||null,amount:String(r.amount??r.balance??r.total??r.qty??"0"),symbol:r.symbol||null,divisibility:r.divisibility??r.div??null,raw:r}))}async function as(e={},t={}){let n=yn(e.address||e.addr,"address"),r=xd(t);if(!r)return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:"no indexer configured \u2014 address-indexed lookups need a keyed indexer (BTC_META_API_URL + UNISAT_API_KEY / BESTINSLOT_API_KEY). ordinals.com recursive is keyless but has no address index.",unknownNotEmpty:!0,keylessAlternatives:["btc_inscription_info (by inscription id)","btc_meta_health"]};let o=Math.min(Number(e.limit||50),200),i=[`${r}/v1/indexer/address/${n}/inscription-data?cursor=0&size=${o}`,`${r}/v1/inscriptions/address/${n}?limit=${o}`,`${r}/address/${n}/inscriptions?limit=${o}`],s=null;for(let a of i)try{let c=await ss(a,t),l=QH(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:a}}catch(c){s=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(s?.message||s||"all indexer paths failed")}}async function Zk(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||Ty,o=await ss(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function e_(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!/^[0-9a-f]{64}i\d+$/i.test(n))throw new Error("bitcoin-meta: inscriptionId must look like <64-hex-txid>i<index>");let r=t.ordinalsBase||Ty,o=Number(e.page||0),i=await ss(`${r}/r/children/${n}${o?`/${o}`:""}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,page:o,children:Array.isArray(i?.ids)?i.ids:[],more:!!i?.more}}async function t_(e={},t={}){let n=t.ordinalsBase||Ty,r=e.height??await ss(`${n}/r/blockheight`,t),o=await ss(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function QH(e){let t=e?.data?.inscription||e?.data?.detail||e?.data?.list||e?.data||e?.inscriptions||e?.results||(Array.isArray(e)?e:[]);return(Array.isArray(t)?t:[]).map(r=>({id:r.inscriptionId||r.id||r.inscription_id||null,number:r.inscriptionNumber??r.number??null,sat:r.sat||r.satoshi||null,contentType:r.contentType||r.content_type||null,utxo:r.utxo||r.output||(r.txid!=null?`${r.txid}:${r.vout??r.n}`:null),raw:r}))}var Ty,XH,Id=_(()=>{is();vt();Ty="https://ordinals.com";XH=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"]});function Cy(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function r8(e){return e8.some(t=>e.startsWith(t))||t8.has(e)}function o8(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Cy(t);return r8(n)?!1:n8.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function i8(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function Py(e,t=0,n=new Set,r={nodes:0}){if(e==null||typeof e!="object")return[];if(t>16)return["<max-depth>"];if(n.has(e))return[];if(r.nodes+=1,r.nodes>2048)return["<max-nodes>"];if(n.add(e),Array.isArray(e))return e.flatMap(c=>Py(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(o8(c)){o.push(c);continue}o.push(...Py(l,t+1,n,r))}let s=Object.keys(e).map(Cy).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),a=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Cy(c))&&l===!0);return s&&a&&o.push("psbt(complete)"),i8(e)&&o.push("v/r/s"),o}function hr(e,t){let n=Py(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var e8,t8,n8,kd=_(()=>{e8=["unsigned","notsigned","tosign","signable"],t8=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),n8=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"])});function n_(e={}){return Me({provider:"satflow",defaultUrl:s8,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function _d(e={}){return n_(e).baseUrl}function Ly(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function a8(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Ly(e)},n_(e).trusted)}async function eo(e,{method:t="GET",body:n,opts:r={}}={}){if(!Ly(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${_d(r)}${e.startsWith("/")?e:`/${e}`}`,a=await(r.fetchImpl||fetch)(i,{method:t,headers:a8(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await a.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return l}async function r_(e={}){if(!!!Ly(e))return{ok:!1,provider:"satflow",baseUrl:_d(e),apiKeyPresent:!1,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",note:"Set SATFLOW_API_KEY. Magic Eden BTC ordinals marketplace is shut down \u2014 do not use ME."};try{return await eo("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:_d(e),apiKeyPresent:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",capabilities:{floors:!0,walletContents:!0,purchaseIntent:!0,listIntent:!0,bidIntent:!0}}}catch(n){return{ok:!1,provider:"satflow",baseUrl:_d(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function o_(e={},t={}){let n=String(e.type||"ordinals").toLowerCase();if(!["ordinals","runes"].includes(n))throw new Error("satflow: type must be ordinals|runes");let r=new URLSearchParams({type:n});e.ids&&r.set("ids",Array.isArray(e.ids)?e.ids.join(","):String(e.ids));let o=await eo(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function i_(e={},t={}){let n=String(e.collectionId||e.id||e.slug||"").trim();if(!n)throw new Error("satflow: collectionId required");let r=new URLSearchParams({id:n});e.type&&r.set("type",e.type);let o=await eo(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function s_(e={},t={}){let n=String(e.inscriptionId||e.id||"").trim();if(!n)throw new Error("satflow: inscriptionId required");let r=new URLSearchParams({id:n});return{provider:"satflow",item:await eo(`/item?${r}`,{opts:t})}}async function Od(e={},t={}){let n=yn(e.address||e.addr,"address"),r=new URLSearchParams({address:n});e.type&&r.set("type",e.type),e.limit!=null&&r.set("limit",String(e.limit)),e.offset!=null&&r.set("offset",String(e.offset));let o=await eo(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function a_(e={},t={}){let n=e.collectionIds||e.ids||e.collectionId;if(!n)throw new Error("satflow: collectionIds required");let r=new URLSearchParams({ids:Array.isArray(n)?n.join(","):String(n)});return e.limit!=null&&r.set("limit",String(e.limit)),{provider:"satflow",listings:await eo(`/orders/floor?${r}`,{opts:t})}}function c_(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))c8.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}function Ry(e){if(!e||typeof e!="object")return null;let t=[e.price,e.priceSats,e.price_sats,e.totalSats,e.total_sats,e.amount,e.satoshis];for(let n of t){if(n==null)continue;let r=String(n).trim();if(/^\d+$/.test(r))return BigInt(r)}return null}function d8(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=yn(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=yn(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),s=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(s))throw new Error("satflow: unsupported Bitcoin network");return{version:1,surface:"btc",action:"transfer",owner:o,destination:i,tradeId:e.tradeId||`satflow-${e.listing_id||e.listingId||e.inscription_id||e.inscriptionId||"purchase"}`,slippageBps:0,expiresAtMs:Number(r)+Math.min(Math.max(Number(e.ttlMs??e.expiresInMs??3e4)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{network:s,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function l_(e={},t={}){let n=c_(e,l8);if(!n||Object.keys(n).length===0)throw new Error("satflow: purchase body required (see docs.satflow.com intent/satflow-purchase)");let r=e.maxSats??e.body?.maxSats;if(r==null)throw new Error("satflow: maxSats is required to prepare a purchase \u2014 an uncapped buy has no spend ceiling");let o=BigInt(String(r).trim());if(o<=0n)throw new Error("satflow: maxSats must be a positive integer sat amount");let i=Ry(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let s=await eo("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),a=Ry(s)??Ry(s?.intent);if(a==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(a>o)throw new Error(`satflow: purchase price ${a} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);hr("satflow",s);let c=s?.unsignedPSBTBase64||s?.unsignedPsbtBase64||s?.unsigned_psbt||null,l=null,u=null;try{l=d8(e,{psbt:c,priceSats:a,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return U({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:a.toString(),maxSats:o.toString(),intent:s,unsignedPsbt:c,localSignerEnvelope:l,localSignerBlockedReason:u,note:"Sign PSBT in a Bitcoin wallet. Broadcast only through the user's wallet or an explicitly armed Bitcoin execution plane."})}async function Nd(e={},t={}){let n=c_(e,u8);if(!n.inscription_id&&!n.runes_output&&!n.inscriptionId&&!n.runesOutput)throw new Error("satflow: list requires inscription_id or runes_output");let r=await eo("/intent/sell",{method:"POST",body:n,opts:t});return hr("satflow",r),U({provider:"satflow",kind:"list-intent",requiresUserSignature:!0,marketplace:"satflow",listingRequest:n,intent:r,unsignedPsbt:r?.unsignedListingPSBTBase64||r?.unsigned_psbt||null,note:"Sign listing PSBTs in a Bitcoin wallet; listing broadcast is outside the data plane."})}var s8,c8,l8,u8,My=_(()=>{is();vt();oe();kd();s8="https://api.satflow.com/v1";c8=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);l8=new Set(["listing_id","listingId","inscription_id","inscriptionId","runes_output","runesOutput","buyer_address","buyerAddress","ord_address","receive_address","payment_address","pay_address","tap_key","public_key","publicKey","fee_rate","feeRate","price","quantity","slug","collection_slug"]),u8=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"])});function f_(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Cd).replace(/\/$/,"")}function sc(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`jupiter: ${t} must be a positive integer string`)}}function m_(e){let t=e==null?50:Number(e);if(!Number.isInteger(t)||t<0)throw new Error("jupiter: slippageBps must be a non-negative integer");if(t>f8)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Td(e,t){return e==null?t:!!e}function m8(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9+/]+={0,2}$/.test(t)||t.length%4!==0)throw new Error("jupiter: swapTransaction must be base64");return t}function h8(e,t=0){let n=0,r=0,o=t;for(;o<e.length&&o-t<3;){let i=e[o++];if(n|=(i&127)<<r,(i&128)===0)return{value:n,offset:o};r+=7}return null}function h_(e){let t=Buffer.from(e,"base64"),n=h8(t,0);if(!n||n.value!==1)throw new Error("jupiter: unsigned swapTransaction must declare exactly one signature slot");let r=n.offset+n.value*64;if(r>=t.length)throw new Error("jupiter: Solana transaction missing message bytes");if(t.subarray(n.offset,r).some(i=>i!==0))throw new Error("jupiter: swapTransaction already contains signature material");return t.subarray(r).toString("base64")}function ac(e={},{quotedAtMs:t=Date.now(),ttlMs:n=u_}={}){let r=Ce(e.inputMint,"inputMint"),o=Ce(e.outputMint,"outputMint"),i=sc(e.inAmount,"inAmount"),s=sc(e.outAmount,"outAmount"),a=sc(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=m_(e.slippageBps??50),l=(BigInt(s)-BigInt(s)*BigInt(c)/10000n).toString();if(a!==l)throw new Error("jupiter: otherAmountThreshold does not match serialized min-out");return{mode:"solana-jupiter-quote",provider:"jupiter",venue:"jupiter-swap-v1",inputMint:r,outputMint:o,inAmount:i,outAmount:s,otherAmountThreshold:a,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||u_,1e3),3e4)}}function By({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==$y)throw new Error("jupiter: local signer supports native SOL input only");if(BigInt(o?.prioritizationFeeLamports??0)!==0n)throw new Error("jupiter: local signer requires zero priority fee until exact fee accounting is supplied");let i=h_(n),s=sc(r.exactFeeLamports??o.exactFeeLamports??"5000","exactFeeLamports");return{version:1,surface:"sol",action:"swap",owner:e,destination:t.outputMint,tradeId:r.tradeId||`jupiter-${t.inputMint.slice(0,6)}-${t.outputMint.slice(0,6)}-${t.inAmount}`,slippageBps:t.slippageBps,expiresAtMs:t.expiresAtMs,fee:{oracleFeeBps:5},artifact:{cluster:r.cluster||"mainnet",provider:"jupiter",inputMint:t.inputMint,outputMint:t.outputMint,inAmount:t.inAmount,outAmount:t.outAmount,otherAmountThreshold:t.otherAmountThreshold,slippageBps:t.slippageBps,jupiterProgram:r.jupiterProgram||o.jupiterProgram||"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",messageBase64:i,exactFeeLamports:s}}}function d_(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=y8.indexOf(o);if(i<0)return!1;t=t*58n+BigInt(i)}let n=t.toString(16);n.length%2&&(n="0"+n);let r=n.length/2;for(let o of e)if(o==="1")r++;else break;return r===32}async function g_(e={},t={}){let n=e.rpc||t.solanaRpc||process.env.SOLANA_RPC||"https://api.mainnet-beta.solana.com",r=t.fetchImpl||fetch,o=await r(`${Cd}/program-id-to-label`,{signal:AbortSignal.timeout(Number(t.timeoutMs)||15e3)});if(!o.ok)throw new Error(`jupiter venue map failed: HTTP ${o.status}`);let i=await o.json(),s=Object.entries(i),a=s.filter(([p])=>d_(p)),c=[],l=s.filter(([p])=>!d_(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Cd}/program-id-to-label`,verified:a.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:s.length,verified:a.length}};let u=async p=>{let f=await(await r(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(p),signal:AbortSignal.timeout(Number(t.timeoutMs)||2e4)})).json();if(f.error)throw new Error(f.error.message);return f.result};for(let p=0;p<a.length;p+=90){let m=a.slice(p,p+90),f=null;for(let h=0;h<3&&!f;h++)try{f=await u({jsonrpc:"2.0",id:1,method:"getMultipleAccounts",params:[m.map(([g])=>g),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(g=>setTimeout(g,2e3*(h+1)))}if(!f){for(let[h,g]of m)l.push({programId:h,label:g,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,g)=>{let[y,b]=m[g];h&&h.executable===!0&&g8.has(h.owner)?c.push({programId:y,label:b,owner:h.owner}):l.push({programId:y,label:b,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<a.length&&await new Promise(h=>setTimeout(h,700))}let d=new Set(c.map(p=>p.label.replace(/\s+(CLMM|CP|V\d+|Launchlab|DLMM|Pools?)$/i,"").trim()));return{source:`${Cd}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:s.length,verified:c.length,unresolved:l.length,distinctLabels:new Set(c.map(p=>p.label)).size,distinctBrands:d.size},verified:c.sort((p,m)=>p.label.localeCompare(m.label)),unresolved:l}}async function y_(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Pd({inputMint:$y,outputMint:p_,amount:"1000000",slippageBps:50},e)).quote.outAmount,exec:!1}}catch(t){return{ok:!1,provider:"jupiter",error:String(t?.message||t),exec:!1}}}async function Pd(e={},t={}){let n=Ce(e.inputMint||e.fromMint||$y,"inputMint"),r=Ce(e.outputMint||e.toMint||p_,"outputMint"),o=sc(e.amount||e.inAmount,"amount"),i=m_(e.slippageBps??e.maxSlippageBps??50),s=new URL(`${f_(t)}/quote`);s.searchParams.set("inputMint",n),s.searchParams.set("outputMint",r),s.searchParams.set("amount",o),s.searchParams.set("slippageBps",String(i)),s.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&s.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&s.searchParams.set("platformFeeBps",String(e.platformFeeBps));let a=await x(s.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=ac({...a,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:a,solanaGuard:c}}function b8(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function b_(e={},t={}){let n=Ce(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:ac(e.quoteResponse,t)}:await Pd(e,t),o=r.quote,i=r.solanaGuard||ac(o,t);if(Td(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let s=await x(`${f_(t)}/swap`,{method:"POST",body:b8({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Td(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Td(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Td(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=m8(s?.swapTransaction);h_(a),hr("jupiter",s);let c=s?.quoteResponse??s?.quote??null,l=["inAmount","outAmount","otherAmountThreshold","inputMint","outputMint"],u=!1;if(c&&typeof c=="object"){for(let m of l){let f=o?.[m],h=c?.[m];if(f==null||h==null)throw new Error(`jupiter: echoed quote is incomplete \u2014 missing ${m}`);if(String(f)!==String(h))throw new Error(`jupiter: swap response ${m} (${h}) does not match the quoted ${m} (${f}) \u2014 refusing to prepare`)}u=!0}let d=null,p=null;try{d=By({userPublicKey:n,guard:i,swapTransaction:a,args:e,response:s})}catch(m){p=String(m?.message||m).slice(0,200)}return U({provider:"jupiter",chain:"solana-mainnet-beta",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,verifiedAgainstQuote:u,userPublicKey:n,quote:o,solanaGuard:i,swapTransaction:a,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:s?.lastValidBlockHeight??null,prioritizationFeeLamports:s?.prioritizationFeeLamports??null,computeUnitLimit:s?.computeUnitLimit??null,raw:s},{provider:"jupiter",kind:"jupiter-swap"})}var Cd,$y,p_,f8,u_,g8,y8,Dy=_(()=>{q();Zo();oe();kd();Cd="https://lite-api.jup.ag/swap/v1",$y="So11111111111111111111111111111111111111112",p_="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",f8=100,u_=2e4;g8=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),y8="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"});function v8(e=80){let t=v_(e,1,500,80);return Math.min(t*8,4e3)}function v_(e,t,n,r){let o=Number(e);return Number.isFinite(o)?Math.min(n,Math.max(t,Math.trunc(o))):r}function Pe(e){if(typeof e=="boolean"||e===null||e===void 0||e===""||typeof e!="number"&&typeof e!="string")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ei(e){return typeof e=="boolean"?e:null}function Tt(e,t=128){if(typeof e!="string")return null;let n=e.replace(/[\u0000-\u001f\u007f-\u009f]/gu," ").trim();return n?n.length>t?n.slice(0,t):n:null}function Y(e,t){if(e===null||typeof e!="object")return;let n=Object.getOwnPropertyDescriptor(e,t);return n&&Object.hasOwn(n,"value")?n.value:void 0}function cs(e,t){return Array.isArray(e)?e.length>t?e.slice(0,t):e:[]}function ls(e,t){let n=Tt(e,128);return n?E8(n,t)?n.toLowerCase():n:null}function E8(e,t){if(/^0x[0-9a-fA-F]+$/.test(e))return!0;let n=typeof t=="string"?t.trim().toLowerCase():"";return n!==""&&x8.has(n)}function w_(e,t){let n=t>>>0;for(let r=0;r<e.length;r+=1){let o=e.charCodeAt(r);n=Math.imul(n^o&255,16777619)>>>0,n=Math.imul(n^o>>>8&255,16777619)>>>0}return n>>>0}function Uy(e){let t=e.map(n=>`${String(n).length}:${String(n)}`).join("|");return`${w_(t,2166136261).toString(16).padStart(8,"0")}${w_(t,2654435761).toString(16).padStart(8,"0")}`}function Rd(e,t){let n=ls(t,e);return n?`n-${Uy([String(e??""),n])}`:null}function A8(e,t){let n=[...new Set((t||[]).filter(r=>typeof r=="string"&&r))].sort();return n.length?`c-${Uy([String(e??""),...n])}`:null}function I8(e,t,n,r,o){return`e-${Uy([String(e??""),t,n,String(r??""),String(o??"")])}`}function E_(e){if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))E_(e[t]);return e}function k8({chain:e,address:t,name:n,symbol:r,decimals:o,isIndexed:i}){return{chain:Tt(e,32),address:Tt(t,128),name:Tt(n),symbol:Tt(r,32),decimals:Pe(o),isIndexed:i==null?null:ei(i)}}function Fy(e){let t=Y(e,"scores"),n=Y(e,"supply_stats");return{bubblemapsScore:Pe(Y(t,"bubblemaps_score")),giniIndex:Pe(Y(t,"gini_index")),herfindahlHirschmanIndex:Pe(Y(t,"herfindahl_hirschman_index")),nakamotoCoefficient:Pe(Y(t,"nakamoto_coefficient")),supplyShares:{cexs:Pe(Y(n,"cexs")),dexs:Pe(Y(n,"dexs")),contracts:Pe(Y(n,"contracts")),freshWallets:Pe(Y(n,"fresh_wallets")),top10Adjusted:Pe(Y(n,"top_10_adjusted")),bundles:Pe(Y(n,"bundles"))}}}function S_(e,t,n){let r=Y(t,"address"),o=Rd(e,r);if(!o)return null;let i=Y(t,"address_details"),s=Y(t,"holder_data");return{id:o,address:Tt(r,128),label:Tt(Y(i,"label")),kind:n,share:Pe(Y(s,"share")),amount:Pe(Y(s,"amount")),rank:Pe(Y(s,"rank")),degree:Pe(Y(i,"degree")),clusterId:null,flags:{isContract:ei(Y(i,"is_contract")),isCex:ei(Y(i,"is_cex")),isDex:ei(Y(i,"is_dex")),isSupernode:ei(Y(i,"is_supernode")),isPaidLabel:ei(Y(i,"is_paid_label")),isShownOnMap:Y(t,"is_shown_on_map")===void 0?!0:ei(Y(t,"is_shown_on_map"))},relations:{inward:Pe(Y(i,"inward_relations")),outward:Pe(Y(i,"outward_relations"))}}}function _8(e,t,n){let r=Rd(e,Y(t,"from_address")),o=Rd(e,Y(t,"to_address"));if(!r||!o||!n.has(r)||!n.has(o)||r===o)return null;let i=Y(t,"data"),s=Y(i,"token_key"),a=Tt(Y(s,"chain"),32),c=Tt(Y(s,"address"),128),l=Tt(Y(t,"rel_type"),64)||"GROUPED_TRANSFER";return{id:I8(e,r,o,l,`${a??""}:${c??""}`),source:r,target:o,type:l,value:Pe(Y(i,"total_value")),count:Pe(Y(i,"total_transfers")),firstAt:Pe(Y(i,"first_date")),lastAt:Pe(Y(i,"last_date")),token:a||c?{chain:a,address:c}:null}}function O8(e,t,n){let r=[];for(let s of cs(t,500)){let a=cs(Y(s,"holders"),500),c=[],l=new Set;for(let d of a){let p=Rd(e,d);!p||l.has(p)||!n.has(p)||(l.add(p),c.push(p))}if(!c.length)continue;let u=A8(e,c);u&&r.push({id:u,share:Pe(Y(s,"share")),amount:Pe(Y(s,"amount")),holderCount:Pe(Y(s,"holder_count")),memberCount:c.length,members:c})}r.sort((s,a)=>(a.share??-1)-(s.share??-1)||(s.id<a.id?-1:s.id>a.id?1:0));let o=[],i=new Set;for(let s of r)i.has(s.id)||(i.add(s.id),o.push(s));for(let s of o)for(let a of s.members){let c=n.get(a);c&&c.clusterId===null&&(c.clusterId=s.id)}return o}function x_(e={}){let t=Tt(Y(e,"chain"),32),n=Tt(Y(e,"tokenAddress"),128),r=Y(e,"payload"),o=v_(Y(e,"maxNodes"),1,500,80),i=v8(o),s=Y(e,"token")||{},a=Y(r,"metadata"),c=Y(r,"nodes"),l=Fy(Y(r,"metrics")),u=[],d=new Map,p=A=>{!A||d.has(A.id)||u.length>=o||(d.set(A.id,A),u.push(A))};for(let A of cs(Y(c,"top_holders"),500))p(S_(t,A,"holder"));for(let A of cs(Y(c,"magic_nodes"),500))p(S_(t,A,"magic"));let m=new Set(d.keys()),f=cs(Y(r,"relationships"),4e3),h=[],g=new Set,y=0;for(let A of f){if(h.length>=i){y+=1;continue}let E=_8(t,A,m);if(!E){y+=1;continue}g.has(E.id)||(g.add(E.id),h.push(E))}let b=O8(t,Y(r,"clusters"),d),w=Tt(Y(a,"dt_update"),64),S=Pe(Y(a,"ts_update")),v=Pe(Y(e,"limit")),I=u.length>=o&&cs(Y(c,"top_holders"),500).length>o;return E_({kind:S8,version:1,token:k8({chain:t,address:n,name:Y(s,"name"),symbol:Y(s,"symbol"),decimals:Y(s,"decimals"),isIndexed:Y(s,"isIndexed")}),metrics:l,nodes:u,edges:h,clusters:b,source:{provider:"bubblemaps",api:"data-api-v0",endpoint:Tt(Y(e,"endpoint"),256),updatedAt:w,updatedTs:S,fetchedAt:Tt(Y(e,"fetchedAt"),64),execution:"read-only"},coverage:{nodes:u.length,edges:h.length,clusters:b.length,maxNodes:o,maxEdges:i,requestedLimit:v,droppedEdges:y,truncated:I,interactive:u.length>0,reason:u.length>0?null:"no holders returned"}})}var S8,x8,A_=_(()=>{S8="bubble-map";x8=new Set(["eth","ethereum","bsc","poly","polygon","matic","arbi","arbitrum","avax","avalanche","base","op","optimism","ftm","fantom","cro","cronos","linea","scroll","zksync","blast","mantle","sonic","hyper","hyperevm","sei","berachain","bera"])});function bn(e,t){let n=String(e?.message??e??"unknown error");return typeof t=="string"&&t.length>=4&&(n=n.split(t).join("[redacted]")),n=n.replace(B8," ").replace(T8,"//[redacted]@").replace(C8,"[redacted]").replace(P8,"[redacted]").replace(N8,"?[redacted]").replace(R8,"[redacted]").replace($8,"[redacted]").replace(L8,"[redacted]").replace(M8,"[redacted]"),n.trim().slice(0,200)}var N8,T8,C8,P8,R8,L8,M8,$8,B8,Ld=_(()=>{N8=/\?[^\s]*/gu,T8=/\/\/[^\s/@:]+:[^\s/@]+@/gu,C8=/\b(?:authorization|proxy-authorization)\s*[:=]\s*(?:bearer|basic|token)?\s*\S+/giu,P8=/\b(?:bearer|basic|token)\s+[A-Za-z0-9._~+/=-]{8,}/giu,R8=/\b(?:sk|pk|api|key|token|secret|auth|access|private)[-_][A-Za-z0-9._-]{8,}/giu,L8=/\b[A-Fa-f0-9]{24,}\b/gu,M8=/\b[A-Za-z0-9+/]{40,}={0,2}\b/gu,$8=/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/giu,B8=/[\u0000-\u001f\u007f]/gu});function C_(e,t,n){let r=ge(n?.chain),o=ge(n?.address);return r&&r!==e?!0:!o||o===t?!1:F8.has(e)?!0:o.toLowerCase()!==t.toLowerCase()}function P_(e,t){let r=(e&&typeof e=="object"&&e.env&&typeof e.env=="object"?e.env:process.env)?.[t];return typeof r=="string"?r:""}function R_(e={}){let t=typeof e.apiKey=="string"?e.apiKey:"";return pn(t||P_(e,jy))}function W8(e={}){return Me({provider:us,defaultUrl:D8,hosts:["api.bubblemaps.io"],url:P_(e,j8)})}function Md(e){let t=typeof e=="string"?e.trim().toLowerCase():"";if(!T_.has(t))throw new Error(`bubblemaps: unsupported chain "${String(e).slice(0,32)}" (supported: ${O_.join(", ")})`);return t}function $d(e){let t=typeof e=="string"?e.trim():"";if(!t||t.length>H8||/[\s/?#%\\]/u.test(t))throw new Error("bubblemaps: tokenAddress must be a bounded address string");if(t==="."||t==="..")throw new Error("bubblemaps: tokenAddress must be a bounded address string");return t}function L_(e){if(e==null||e==="")return U8;let t=Number(e);if(!q8.has(t))throw new Error(`bubblemaps: limit must be one of ${N_.join(", ")}`);return t}function G8(e){if(!e)throw new Error(`bubblemaps: ${jy} is not set`);return e}function qy(e){return typeof e=="boolean"?e:null}function cc(e){if(typeof e!="number"&&typeof e!="string"||typeof e=="string"&&e.trim()==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ge(e){return typeof e!="string"||e.trim()===""?null:e}function K8(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=e.nodes;if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r.top_holders;if(!Array.isArray(o)||o.length>0&&!o.some(s=>ge(s?.address)!==null))return!1;let i=Y8(e,t,n);return!(!I_(e.relationships,s=>X8(s,i,n))||!I_(e.clusters,s=>J8(s,i,n)))}function Y8(e,t,n){let r=Number.isInteger(t)&&t>0?Math.min(t,500):80,o=e?.nodes,i=new Set;for(let s of["top_holders","magic_nodes"]){let a=Array.isArray(o?.[s])?o[s]:[];for(let c of a){if(i.size>=r)return i;let l=ls(ge(c?.address),n);l!==null&&i.add(l)}}return i}function I_(e,t){return Array.isArray(e)?e.length===0||e.some(t):!1}function X8(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return!1;let r=ls(ge(e.from_address),n),o=ls(ge(e.to_address),n);return r===null||o===null||r===o?!1:t.has(r)&&t.has(o)}function J8(e,t,n){return!e||typeof e!="object"||Array.isArray(e)||!Array.isArray(e.holders)?!1:e.holders.some(r=>{let o=ls(ge(r),n);return o!==null&&t.has(o)})}function t9(e){return Number.isInteger(e)?Math.min(Math.max(e,Q8),Z8):e9}async function ti(e,t,n={}){let r=G8(R_(n)),o=W8(n),i=new URLSearchParams;for(let[l,u]of Object.entries(t||{}))u!=null&&i.set(l,String(u));let s=i.toString(),a=`${o.baseUrl}${e}${s?`?${s}`:""}`,c=Ue({Accept:"application/json"},{"X-ApiKey":r},o.trusted);if(!o.trusted)throw new Error(`bubblemaps: refusing to send credentials to non-official host ${o.host}`);try{return await x(a,{method:"GET",headers:c,fetchImpl:n.fetchImpl,timeoutMs:t9(n.timeoutMs),maxResponseBytes:V8})}catch(l){throw new Error(`bubblemaps: ${bn(l,r)}`)}}async function M_(e={}){let t=R_(e);if(!t)return{ok:!1,provider:us,configured:!1,execution:"read-only",error:`${jy} not set \u2014 get a key at https://pro.bubblemaps.io`};try{let n=await ti("/v0/chains",{},e);if(!Array.isArray(n))return{ok:!1,provider:us,configured:!0,execution:"read-only",api:"data-api-v0",error:"bubblemaps: chains response was not a list"};let r=n.filter(o=>ge(o?.id)!==null).length;return{ok:r>0,provider:us,configured:!0,execution:"read-only",api:"data-api-v0",chains:r}}catch(n){return{ok:!1,provider:us,configured:!0,execution:"read-only",error:bn(n,t)}}}async function $_(e={},t={}){let n=await ti("/v0/chains",{},t);if(!Array.isArray(n))throw new Error("bubblemaps: chains response was not a list");return n.filter(r=>ge(r?.id)!==null).map(r=>{let o=ge(r?.id);return{id:o,name:ge(r?.name),supported:o===null?null:T_.has(o)}})}async function B_(e={},t={}){let n=typeof e.query=="string"?e.query.trim():"";if(n.length<2||n.length>z8)throw new Error("bubblemaps: query must be 2-128 characters");let r=await ti("/v0/tokens/search",{query:n},t);if(!Array.isArray(r))throw new Error("bubblemaps: search response was not a list");let o=r.filter(i=>ge(i?.token_key?.address)!==null);if(r.length>0&&o.length===0)throw new Error("bubblemaps: search response carried no readable token rows");return o.map(i=>({chain:ge(i?.token_key?.chain),address:ge(i?.token_key?.address),name:ge(i?.metadata?.name),symbol:ge(i?.metadata?.symbol),indexed:typeof i?.metadata?.is_indexed=="boolean"?i.metadata.is_indexed:null}))}async function D_(e={},t={}){let n=Md(e.chain),r=$d(e.tokenAddress),o=await ti(`/v0/tokens/metadata/${n}/${encodeURIComponent(r)}`,{return_token_stats:e.includeStats===!0?"true":"false"},t),i=ge(o?.token_key?.chain)!==null||ge(o?.token_key?.address)!==null||ge(o?.metadata?.name)!==null||ge(o?.metadata?.symbol)!==null||typeof o?.metadata?.is_indexed=="boolean"||cc(o?.stats?.transfers_count)!==null||ge(o?.stats?.min_date)!==null||ge(o?.stats?.max_date)!==null;if(!o||typeof o!="object"||Array.isArray(o)||!i)throw new Error("bubblemaps: metadata response carried no readable token evidence");if(C_(n,r,o.token_key))throw new Error("bubblemaps: metadata response describes a different token");return{chain:ge(o?.token_key?.chain)??n,address:ge(o?.token_key?.address)??r,name:ge(o?.metadata?.name),symbol:ge(o?.metadata?.symbol),indexed:typeof o?.metadata?.is_indexed=="boolean"?o.metadata.is_indexed:null,stats:o?.stats?{transfersCount:cc(o.stats.transfers_count),firstTransferAt:ge(o.stats.min_date),lastTransferAt:ge(o.stats.max_date)}:null}}async function U_(e={},t={}){let n=Md(e.chain),r=$d(e.tokenAddress),o=L_(e.limit),i=await ti(`/v0/tokens/holders/${n}/${encodeURIComponent(r)}`,{limit:o,return_metadata:e.includeMetadata===!1?"false":"true"},t);if(!Array.isArray(i))throw new Error("bubblemaps: holders response was not a list");let s=i.filter(a=>ge(a?.address)!==null);if(i.length>0&&s.length===0)throw new Error("bubblemaps: holder response carried no readable holder rows");return s.slice(0,o).map(a=>({address:ge(a?.address),label:ge(a?.address_details?.label),rank:cc(a?.holder_data?.rank),share:cc(a?.holder_data?.share),amount:cc(a?.holder_data?.amount),isContract:qy(a?.address_details?.is_contract),isCex:qy(a?.address_details?.is_cex),isDex:qy(a?.address_details?.is_dex)})).map(n9)}function n9(e){return Object.freeze(e)}async function F_(e={},t={}){let n=Md(e.chain),r=$d(e.tokenAddress),o=await ti(`/v0/tokens/metrics/${n}/${encodeURIComponent(r)}`,{},t),i=Fy(o);if(![i.bubblemapsScore,i.giniIndex,i.herfindahlHirschmanIndex,i.nakamotoCoefficient,...Object.values(i.supplyShares||{})].some(a=>a!==null))throw new Error("bubblemaps: metrics response carried no readable metric");return{chain:n,address:r,provider:us,execution:"read-only",metrics:i}}async function q_(e={},t={}){let n=Md(e.chain),r=$d(e.tokenAddress),o=L_(e.limit),i=e.maxNodes===void 0?Math.min(o,80):Math.min(Math.max(1,Math.trunc(Number(e.maxNodes)||0)),500,o),s=`/v0/tokens/map/${n}/${encodeURIComponent(r)}`,a=await ti(s,{limit:o,return_nodes:"true",return_relationships:"true",return_clusters:"true",use_magic_nodes:e.magicNodes===!1?"false":"true",use_time_nodes:e.timeNodes===!1?"false":"true"},t);if(C_(n,r,a?.token_key))throw new Error("bubblemaps: map response describes a different token");if(!K8(a,i,n))throw new Error("bubblemaps: map response carried no readable holder collection");return x_({chain:n,tokenAddress:r,payload:a,token:e.token,maxNodes:i,limit:o,endpoint:s,fetchedAt:new Date().toISOString()})}var D8,us,O_,N_,U8,T_,F8,q8,jy,j8,H8,z8,V8,Q8,Z8,e9,j_=_(()=>{q();vt();A_();Ld();D8="https://api.bubblemaps.io",us="bubblemaps",O_=Object.freeze(["eth","base","solana","tron","bsc","sonic","ton","avalanche","polygon","monad","hyperevm","arbitrum","robinhood"]),N_=Object.freeze([80,250,500]),U8=80,T_=new Set(O_),F8=new Set(["solana","tron","ton"]);q8=new Set(N_),jy="BUBBLEMAPS_API_KEY",j8="BUBBLEMAPS_API_URL",H8=128,z8=128,V8=8*1024*1024;Q8=1e3,Z8=6e4,e9=3e4});import{getAddress as o9}from"ethers";function lc(e,t){let n=String(e??"").trim();if(!n)throw new Error(`${t} is required`);if(V_.test(n))try{return o9(n)}catch{throw new Error(`${t} is not a valid EVM address`)}return n}function Dd(e,t){let n=e?.[t];if(typeof n!="function")throw new Error(`lp-liquidity-ranker: opts.${t} must be a function`);return n}function s9(e){if(!e||typeof e!="object")throw new Error("candidate must be an object");let t=Number(e.chainId);if(!Number.isInteger(t)||t<=0)throw new Error("chainId must be a positive integer");let n=String(e.venue??"").trim().toLowerCase();if(!n)throw new Error("venue is required");let r=lc(e.poolAddress,"poolAddress"),o=e.token;if(!o||typeof o!="object")throw new Error("token is required");let i=String(o.symbol??"").trim();if(!i)throw new Error("token.symbol is required");let s=lc(o.address,"token.address"),a=null;if(o.decimals!=null&&(a=Number(o.decimals),!Number.isInteger(a)||a<0||a>255))throw new Error("token.decimals must be a uint8 when provided");let c=Number(e.liquidityUsd);if(!Number.isFinite(c)||c<0)throw new Error("liquidityUsd must be a non-negative finite number");let l=n==="uniswap-v4"||e.isV4===!0,u=null;if(e.hook!=null){if(typeof e.hook!="object")throw new Error("hook must be an object when provided");u=Object.freeze({address:e.hook.address!=null?lc(e.hook.address,"hook.address"):z_,dynamicFee:e.hook.dynamicFee===!0,reviewed:e.hook.reviewed===!0})}let d=e.id!=null?String(e.id):`${n}:${t}:${r}`;return Object.freeze({id:d,chainId:t,venue:n,poolAddress:r,token:Object.freeze({symbol:i,address:s,decimals:a}),liquidityUsd:c,isV4:l,hook:u})}function a9(e){if(!zy.includes(e.venue))return`unsupported venue "${e.venue}"; supported: ${zy.join(", ")}`;if(e.isV4){if(!e.hook)return"uniswap-v4 candidate is missing hook disclosure; failing closed";if(e.hook.dynamicFee)return"uniswap-v4 pool uses a dynamic fee; fee is not knowable in advance, failing closed";if(e.hook.address!==z_&&!e.hook.reviewed)return`uniswap-v4 pool has an unreviewed hook (${e.hook.address}); failing closed`}return null}async function c9(e,t,n){let r=Dd(n,"resolveTokenIdentity"),o;try{o=await r({chainId:e.chainId,address:e.token.address,symbol:e.token.symbol})}catch(l){return{ok:!1,reason:`identity resolution failed: ${l?.message??l}`}}if(!o||typeof o!="object")return{ok:!1,reason:"identity unresolved"};if(o.ambiguous)return{ok:!1,reason:o.reason??"ambiguous token identity"};if(!o.canonicalId)return{ok:!1,reason:"identity resolver returned no canonicalId"};if(o.canonicalId!==t.canonicalId)return{ok:!1,reason:`token resolves to canonical id "${o.canonicalId}", expected "${t.canonicalId}"`};let i=Number(o.homeChainId);if(!Number.isInteger(i)||i<=0)return{ok:!1,reason:"identity resolver returned no homeChainId"};let s;try{s=lc(o.canonicalAddress,"identity resolver canonicalAddress")}catch(l){return{ok:!1,reason:l.message}}let a=e.token.address;return(V_.test(s)?s===a:s.toLowerCase()===String(a).toLowerCase())?{ok:!0,canonicalId:o.canonicalId,homeChainId:i,canonicalAddress:s,decimals:o.decimals??e.token.decimals??null}:{ok:!1,reason:`token address ${e.token.address} on chain ${e.chainId} does not match the canonical address ${s}; possible wrapped variant or spoof`}}async function l9(e,t,n){let r={},o=[];for(let[a,c]of Bd){let l=Dd(n,c),u;try{u=await l(e,t)}catch(p){return{ok:!1,reason:`${c} failed for ${e.id}: ${p?.message??p}`}}if(u==null||!Number.isFinite(Number(u))){r[a]=null,o.push(a);continue}let d=Number(u);if(d<0)return{ok:!1,reason:`${c} returned a negative cost for ${e.id}`};r[a]=d}let i=Bd.reduce((a,[c])=>a+(r[c]??0),0),s=o.length===0;return{ok:!0,costs:Object.freeze(r),missingLegs:Object.freeze(o),grossOnly:!s,measuredCostUsd:i,totalCostUsd:s?i:null,netUsd:s?t.amountUsd-i:null}}function Hy(e){return Object.freeze({id:e.id,chainId:e.chainId,venue:e.venue,poolAddress:e.poolAddress,token:e.token,liquidityUsd:e.liquidityUsd,canonicalId:e.identity.canonicalId,homeChainId:e.identity.homeChainId})}function H_(e,t){let n=null;for(let r of e){if(!n){n=r;continue}let o=t(r),i=t(n);(o>i||o===i&&r.id<n.id)&&(n=r)}return n}async function u9(e={},t={}){let n=String(e.canonicalId??"").trim();if(!n)throw new Error("lp-liquidity-ranker: canonicalId is required");let r=Number(e.amountUsd);if(!Number.isFinite(r)||r<=0)throw new Error("lp-liquidity-ranker: amountUsd must be a positive finite number");if(!Array.isArray(e.candidates)||e.candidates.length===0)throw new Error("lp-liquidity-ranker: candidates must be a non-empty array");let o=e.materialityThresholdBps??i9;if(!Number.isInteger(o)||o<0)throw new Error("lp-liquidity-ranker: materialityThresholdBps must be a non-negative integer");Dd(t,"resolveTokenIdentity");for(let[,h]of Bd)Dd(t,h);let i=Object.freeze({canonicalId:n,amountUsd:r,materialityThresholdBps:o}),s=[],a=[],c=new Set,l=null;for(let h=0;h<e.candidates.length;h+=1){let g=e.candidates[h],y=g?.id!=null?String(g.id):`candidates[${h}]`,b;try{b=s9(g)}catch(I){s.push({id:y,reason:I.message});continue}if(c.has(b.id)){s.push({id:b.id,reason:"duplicate candidate id"});continue}c.add(b.id);let w=a9(b);if(w){s.push({id:b.id,reason:w});continue}let S=await c9(b,i,t);if(!S.ok){s.push({id:b.id,reason:S.reason});continue}if(l==null)l=S.homeChainId;else if(S.homeChainId!==l){s.push({id:b.id,reason:`ambiguous home chain for canonical token "${n}": got ${S.homeChainId}, expected ${l}`});continue}let v=await l9(b,i,t);if(!v.ok){s.push({id:b.id,reason:v.reason});continue}a.push({...b,identity:S,...v})}let u=[];if(a.length===0)return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:0,rejected:Object.freeze(s),deepestLiquidity:null,netBest:null,netRankingComplete:!1,preparationEligible:!1,runnersUp:Object.freeze([]),warnings:Object.freeze(["no candidate passed identity, venue, or cost validation"])});let d=H_(a,h=>h.liquidityUsd),p=a.filter(h=>!h.grossOnly&&h.netUsd!=null),m=H_(p,h=>h.netUsd);for(let h of a)h.grossOnly&&u.push(`${h.id}: gas/fees not fully accounted (missing: ${h.missingLegs.join(", ")}); missing costs were not treated as zero`);m?d.id!==m.id&&u.push(`${d.id} has the deepest liquidity ($${d.liquidityUsd}) but ${m.id} nets more after costs; these are intentionally different answers`):u.push("net-best migration is unavailable until every ranking cost leg is measured; missing gas is never treated as zero and deepest liquidity is not claimed as net-best"),p.length<a.length&&u.push("partial-cost candidates were excluded from net ranking; missing gas was not treated as zero");let f=a.filter(h=>h.id!==m?.id).sort((h,g)=>h.netUsd==null&&g.netUsd==null?h.id<g.id?-1:1:h.netUsd==null?1:g.netUsd==null?-1:g.netUsd-h.netUsd||(h.id<g.id?-1:1)).map(h=>{let g=m!=null&&h.netUsd!=null,y=g?m.netUsd-h.netUsd:null,b=g?Math.round(y/r*1e4):null;return Object.freeze({...Hy(h),netUsd:h.netUsd,totalCostUsd:h.totalCostUsd,grossOnly:h.grossOnly,missingLegs:h.missingLegs,marginUsd:y,marginBps:b,material:b!=null&&b>o})});return Object.freeze({ok:!0,canonicalId:n,homeChainId:l,amountUsd:r,evaluated:e.candidates.length,accepted:a.length,rejected:Object.freeze(s),deepestLiquidity:Hy(d),netBest:m?Object.freeze({...Hy(m),netUsd:m.netUsd,totalCostUsd:m.totalCostUsd,costs:m.costs,grossOnly:!1,missingLegs:m.missingLegs}):null,netRankingComplete:!!m&&p.length===a.length,preparationEligible:!1,runnersUp:Object.freeze(f),warnings:Object.freeze(u)})}async function W_(e={}){let t=String(e.canonicalId??"").trim(),n=Number(e.homeChainId);if(!t)throw new Error("lp-liquidity-ranker: canonicalId is required");if(!Number.isInteger(n)||n<=0)throw new Error("lp-liquidity-ranker: homeChainId must be a positive integer");if(!Array.isArray(e.canonicalAssets)||e.canonicalAssets.length===0)throw new Error("lp-liquidity-ranker: canonicalAssets must be a non-empty array");let r=new Map;for(let c of e.canonicalAssets){let l=Number(c?.chainId);if(!Number.isInteger(l)||l<=0)throw new Error("lp-liquidity-ranker: canonical asset chainId must be positive");if(r.has(l))throw new Error(`lp-liquidity-ranker: duplicate canonical asset for chain ${l}`);let u=lc(c?.address,"canonical asset address"),d=c?.decimals==null?null:Number(c.decimals);if(d!=null&&(!Number.isInteger(d)||d<0||d>255))throw new Error("lp-liquidity-ranker: canonical asset decimals must be a uint8");r.set(l,Object.freeze({canonicalAddress:u,decimals:d}))}let o={resolveTokenIdentity:async({chainId:c})=>{let l=r.get(Number(c));return l?{canonicalId:t,homeChainId:n,...l}:{ambiguous:!0,reason:`no exact canonical asset mapping for chain ${c}`}}},i=(e.candidates??[]).map(c=>({...c,costs:c?.costs&&typeof c.costs=="object"?{...c.costs}:{}})),s=new Map(i.map(c=>[String(c?.id??`${String(c?.venue??"").toLowerCase()}:${Number(c?.chainId)}:${String(c?.poolAddress??"")}`),c.costs]));for(let[c,l]of Bd)o[l]=async u=>s.get(u.id)?.[c]??null;let a=await u9({...e,canonicalId:t,candidates:i},o);return Object.freeze({...a,evidenceMode:"caller-supplied",warnings:Object.freeze(["canonical mappings, pool liquidity, and migration costs were caller-supplied and not independently live-verified",...a.warnings])})}async function G_(){return Object.freeze({ok:!0,execution:"analysis-only",supportedVenues:zy,note:"Deepest liquidity and net-best migration are reported separately; no signing or broadcasting."})}var zy,z_,V_,i9,Bd,K_=_(()=>{zy=Object.freeze(["uniswap-v2","uniswap-v3","uniswap-v4","aerodrome","curve","balancer","meteora-dlmm","pancakeswap","sushiswap"]),z_="0x0000000000000000000000000000000000000000",V_=/^0x[0-9a-fA-F]{40}$/,i9=25,Bd=Object.freeze([["removalGasUsd","estimateRemovalGasUsd"],["swapCostUsd","estimateSwapCostUsd"],["bridgeCostUsd","estimateBridgeCostUsd"],["addLiquidityGasUsd","estimateAddLiquidityGasUsd"],["priceImpactUsd","estimatePriceImpactUsd"]])});function h9(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function g9(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=h9(n);if(f9.has(r)||m9.some(o=>r.includes(o)))return!0}return!1}function Y_(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}function b9(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function w9(e){let t=e.match(y9)||[];for(let n of t){let r=b9(n),o=Y_(r),i=o?Y_(o):null;for(let s of[r,o,i])if(s&&g9(s))return!0}return!1}function to(e){return typeof e=="string"&&/^(?:xprv|sk[-+]|gh[pousr][_/]|github[_/]pat[_/]|AKIA|ASIA)/iu.test(e)}function no(e){if(!ArrayBuffer.isView(e)||e.BYTES_PER_ELEMENT!==1)return!1;for(let t of S9){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 je(e){return typeof e!="string"||e.length===0?!1:p9.some(t=>t.test(e))?!0:w9(e)}var p9,f9,m9,y9,S9,ro=_(()=>{p9=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])/]),f9=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),m9=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);y9=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;S9=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 x9(e,t){if(!e||typeof e!="object"||!String(e.source??"").trim())throw new Error(`lp-destination-discovery: ${t}.provenance.source is required`);if(Object.keys(e).filter(a=>!v9.has(a)).length)throw new Error(`lp-destination-discovery: ${t}.provenance contains unsupported fields`);let r=String(e.source).trim();if(r.length>512||je(r))throw new Error(`lp-destination-discovery: ${t}.provenance.source is unsafe`);let o=e.evidenceHash==null?null:String(e.evidenceHash).trim();if(o!=null&&!/^[0-9a-f]{64}$/i.test(o))throw new Error(`lp-destination-discovery: ${t}.provenance.evidenceHash must be a sha256 digest`);let i=e.txHash==null?null:String(e.txHash).trim();if(i!=null&&!/^0x[0-9a-f]{64}$/i.test(i))throw new Error(`lp-destination-discovery: ${t}.provenance.txHash must be an EVM transaction hash`);let s=e.reviewedAt==null?null:String(e.reviewedAt).trim();if(s!=null&&!Number.isFinite(Date.parse(s)))throw new Error(`lp-destination-discovery: ${t}.provenance.reviewedAt must be ISO time`);return Object.freeze({source:r,reviewedAt:s,evidenceHash:o,txHash:i})}function J_(e,t){if(!e||typeof e!="object")throw new Error(`lp-destination-discovery: ${t} is required`);let n=Number(e.chainId),r=String(e.token0??"").trim(),o=String(e.token1??"").trim();if(!Number.isInteger(n)||n<=0)throw new Error(`lp-destination-discovery: ${t}.chainId must be positive`);if(!X_.test(r)||!X_.test(o)||gr(r)===gr(o))throw new Error(`lp-destination-discovery: ${t} requires distinct exact token0/token1 addresses`);return Object.freeze({...e,chainId:n,token0:r,token1:o,provenance:x9(e.provenance,t)})}function A9(e,t){if(!String(e.dexId??"").toLowerCase().includes("v4"))return{eligible:!0,reason:null};let n=t.v4;if(!n)return{eligible:!1,reason:"Uniswap V4 metadata is unreviewed"};if(n.dynamicFee===!0)return{eligible:!1,reason:"Uniswap V4 dynamic fee is not preparation-eligible"};let r=gr(n.hook);return r&&r!=="0x0000000000000000000000000000000000000000"&&n.reviewed!==!0?{eligible:!1,reason:"Uniswap V4 hook is unreviewed"}:{eligible:!0,reason:null}}function I9(e){let t=e?.best;if(!t||t.quality!=="FULL")return null;let n=Number(t.gasUsd),r=Number(t.feeUsd);return t.gasUsd==null||t.feeUsd==null||!Number.isFinite(n)||!Number.isFinite(r)?null:n+r}async function Q_({source:e,destination:t,amountIn:n,index:r},o,i){if(n==null)return{requested:!1,measured:!1,costUsd:null,quote:null};let s=e[`token${r}`],a=t[`token${r}`];if(e.chainId===t.chainId&&gr(s)===gr(a))return{requested:!0,measured:!0,costUsd:0,quote:null,kind:"none",amountIn:String(n)};let c=e.chainId===t.chainId?{chainId:e.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)}:{fromChainId:e.chainId,toChainId:t.chainId,tokenIn:s,tokenOut:a,amountIn:String(n)},l=e.chainId===t.chainId?"swap":"bridge";try{let u=l==="swap"?await o.bestSwapRoute(c,i):await o.bestBridgeRoute(c,i),d=I9(u);return{requested:!0,measured:d!=null,costUsd:d,quote:u,kind:l,amountIn:String(n)}}catch(u){return{requested:!0,measured:!1,costUsd:null,quote:null,kind:l,amountIn:String(n),error:u?.message??String(u)}}}function k9(e){let t=e.minLiquidityBpsOfDeepest??E9;if(!Number.isInteger(t)||t<1||t>1e4)throw new Error("lp-destination-discovery: minLiquidityBpsOfDeepest must be an integer from 1 to 10000");if(e.minLiquidityUsd==null)return{bps:t,minLiquidityUsd:null};let n=Number(e.minLiquidityUsd);if(!Number.isFinite(n)||n<0)throw new Error("lp-destination-discovery: minLiquidityUsd must be a non-negative number");return{bps:t,minLiquidityUsd:n}}function _9(e,t,n){if(e.venueReviewEligible===!1)return{destinationEligible:!1,destinationIneligibleReason:e.ineligibleReason};if(e.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is unknown"};let r=Number(e.liquidityUsd);if(!Number.isFinite(r)||r<=0)return{destinationEligible:!1,destinationIneligibleReason:"reported USD liquidity is not positive"};if(n.minLiquidityUsd!=null&&r<n.minLiquidityUsd)return{destinationEligible:!1,destinationIneligibleReason:`liquidity $${r} is below the $${n.minLiquidityUsd} floor`};if(!t||t.liquidityUsd==null)return{destinationEligible:!1,destinationIneligibleReason:"no eligible deepest pool"};let o=Number(t.liquidityUsd)*n.bps/1e4;return r<o?{destinationEligible:!1,destinationIneligibleReason:`shallower than the deepest eligible pool ($${r} < $${o} required)`}:{destinationEligible:!0,destinationIneligibleReason:null}}function Z_(e,t,n="max"){return[...e].sort((r,o)=>(n==="max"?t(o)-t(r):t(r)-t(o))||String(r.poolAddress).localeCompare(String(o.poolAddress)))[0]??null}async function eO(e={},t={}){let n=J_(e.sourcePair,"sourcePair");if(!Array.isArray(e.destinationPairs))throw new Error("lp-destination-discovery: destinationPairs must be an array");let r=e.destinationPairs.map((E,k)=>J_(E,`destinationPairs[${k}]`)),o=new Map;for(let E of r){if(o.has(E.chainId))throw new Error(`lp-destination-discovery: duplicate destination mapping for chain ${E.chainId}`);o.set(E.chainId,E)}let i=k9(e),s=t.chainConfigs??(await Promise.resolve().then(()=>(Yi(),Tg))).CHAIN_CONFIGS,a=e.amounts?.token0!=null||e.amounts?.token1!=null,c=a&&r.some(E=>E.chainId===n.chainId&&(gr(E.token0)!==gr(n.token0)||gr(E.token1)!==gr(n.token1))),l=a&&r.some(E=>E.chainId!==n.chainId),u=c&&!t.bestSwapRoute||l&&!t.bestBridgeRoute?await Promise.resolve().then(()=>(dg(),kA)):null,d={discoverExactPairPools:t.discoverExactPairPools??nx,bestSwapRoute:t.bestSwapRoute??u?.bestSwapRoute,bestBridgeRoute:t.bestBridgeRoute??u?.bestBridgeRoute},p=e.limit??10,m=await Promise.all(s.map(async E=>{let k=o.get(Number(E.chainId));if(!E.dexscreenerSlug)return{chainId:E.chainId,chain:E.name??E.key??null,status:"unavailable",reason:"DexScreener coverage slug is not configured",pools:[]};if(!k)return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:"no explicit provenanced destination token0/token1 mapping",pools:[]};try{let O=await d.discoverExactPairPools({chainSlug:E.dexscreenerSlug,token0:k.token0,token1:k.token1,limit:p,dexIds:k.dexIds},t);return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"available",mapping:k,pools:O}}catch(O){return{chainId:E.chainId,chain:E.name??E.key??null,chainSlug:E.dexscreenerSlug,status:"unavailable",reason:O?.message??String(O),mapping:k,pools:[]}}})),f=m.flatMap(E=>E.pools.map(k=>({...k,chainId:Number(E.chainId),mapping:E.mapping}))),h=e.amounts??{},g=await Promise.all(f.map(async E=>{let[k,O]=await Promise.all([Q_({source:n,destination:E.mapping,amountIn:h.token0,index:0},d,t),Q_({source:n,destination:E.mapping,amountIn:h.token1,index:1},d,t)]),D=!(k.requested||O.requested)||[k,O].filter($=>$.requested).every($=>$.measured),X=D?[k,O].reduce(($,j)=>$+(j.costUsd??0),0):null,H=A9(E,E.mapping);return Object.freeze({...E,mappingProvenance:E.mapping.provenance,legs:Object.freeze([k,O]),fullyMeasured:D,costUsd:X,preparationEligible:!1,venueReviewEligible:H.eligible,ineligibleReason:H.reason})})),y=Z_(g.filter(E=>E.liquidityUsd!=null),E=>Number(E.liquidityUsd)),b=g.map(E=>Object.freeze({...E,..._9(E,y,i)})),w=b.find(E=>E.destinationEligible&&y&&E.poolAddress===y.poolAddress&&E.chainId===y.chainId)??null,S=b.filter(E=>E.fullyMeasured&&E.destinationEligible),v=Z_(S,E=>E.costUsd,"min"),I=b.filter(E=>E.destinationEligible===!1&&E.destinationIneligibleReason?.includes("shallower")),A=y&&b.some(E=>E.poolAddress===y.poolAddress&&E.chainId===y.chainId&&E.destinationEligible===!1);return Object.freeze({ok:!0,analysisOnly:!0,sourcePair:n,coverage:Object.freeze(m),routes:Object.freeze(b),deepestLiquidity:y,recommendedDestination:w,migrationCostBest:v,netBest:null,rankedOn:"liquidity",netRankingComplete:!1,preparationEligible:!1,liquidityFloor:Object.freeze(i),warnings:Object.freeze([...S.length<b.filter(E=>E.fullyMeasured).length?["partial-cost or thin-book routes were excluded from migration-cost comparison; missing gas was not treated as zero and thinner pools are not destinations"]:[],...I.length?[`${I.length} shallower pool(s) are not destination-eligible; a thinner V3 book is never recommended over a deeper V4 book`]:[],...A?["deepest book is not destination-eligible (unreviewed/dynamic-fee V4 or liquidity floor); thinner pools are still not recommended"]:[],"net-best migration is unavailable until destination token values and final add-liquidity gas/impact are measured; deepest liquidity is not claimed as net-best"])})}async function tO(){let{CHAIN_CONFIGS:e}=await Promise.resolve().then(()=>(Yi(),Tg));return{ok:!0,execution:"analysis-only",configuredChains:e.length}}var X_,v9,E9,gr,nO=_(()=>{nr();ro();X_=/^0x[0-9a-fA-F]{40}$/,v9=new Set(["source","reviewedAt","evidenceHash","txHash"]),E9=1e4,gr=e=>String(e??"").trim().toLowerCase()});import{Interface as iO,getAddress as uc,isAddress as N9}from"ethers";function cO(e){let t=Number(e),n=oo[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(oo).join(", ")})`);return{chainId:t,...n}}function oO(e,t){let n=oo[Number(t)];if(!e||e===sO||e===aO||/^eth$/i.test(String(e)))return uc(n.weth);let r=String(e);if(/^weth$/i.test(r))return uc(n.weth);if(/^usdc$/i.test(r))return uc(n.usdc);if(!N9(r))throw new Error(`invalid token address: ${e}`);return uc(r)}async function Ud(e={},t={}){let{chainId:n,quoter:r,router:o}=cO(e.chainId??8453),i=oO(e.tokenIn||"WETH",n),s=oO(e.tokenOut||oo[n].usdc,n),a=BigInt(e.amountIn??0);if(a<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...T9],u=await Promise.all(c.map(async p=>{let m=rO.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:s,amountIn:a,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await J(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=rO.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return we({venue:"aerodrome",chainId:n,chain:oo[n].name,quoter:r,router:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function lO(e={},t={}){let n=Number(e.chainId??8453),r=cO(n),o=uc(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),s=!e.tokenIn||i===sO||i===aO||/^eth$/i.test(i),a=await Ud(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=C9.encodeFunctionData("exactInputSingle",[{tokenIn:a.tokenIn,tokenOut:a.tokenOut,tickSpacing:a.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(a.amountIn),amountOutMinimum:BigInt(a.amountOutMinimum),sqrtPriceLimitX96:0n}]);return U({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:a,autoSlippage:a.autoSlippage,requiresApproval:s?null:{token:a.tokenIn,spender:r.router,amount:a.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:s?a.amountIn:"0",slippageGuard:De(a.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function uO(e={}){let t=Number(e.chainId??8453);try{let n=await Ud({chainId:t,tokenIn:"WETH",tokenOut:"USDC",amountIn:"1000000000000000"},e),r=Number(n.amountOut)/1e6;return{ok:!0,chainId:t,tickSpacing:n.tickSpacing,amountOutUsdc:r,midPxHint:r/.001,router:oo[t]?.router,quoter:oo[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function dO(){return Object.entries(oo).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}var oo,T9,rO,C9,sO,aO,pO=_(()=>{Ne();Ot();oe();oo={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},T9=[1,50,100,200,2e3],rO=new iO(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),C9=new iO(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),sO="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",aO="0x0000000000000000000000000000000000000000"});function L9(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>R9)throw new Error("x402: invalid PAYMENT-REQUIRED payload");if(t.startsWith("{"))try{return JSON.parse(t)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED JSON")}if(!/^[A-Za-z0-9+/_-]+={0,2}$/.test(t)||t.length%4===1)throw new Error("x402: invalid PAYMENT-REQUIRED Base64");let n=t.replace(/-/g,"+").replace(/_/g,"/"),r=n+"=".repeat((4-n.length%4)%4);try{let o=Buffer.from(r,"base64").toString("utf8");if(!o.trim().startsWith("{"))throw new Error("shape");return JSON.parse(o)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED Base64 JSON")}}function yr(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function hO(e,t){let n=yr(e,t);if(!/^\d+$/.test(n))throw new Error(`x402: ${t} must be atomic units`);let r=BigInt(n);if(r<=0n)throw new Error(`x402: ${t} must be positive`);return r.toString()}function M9(e){if(!e||typeof e!="object"||Array.isArray(e))return Object.freeze({});let t={};for(let n of["name","version"])typeof e[n]=="string"&&e[n].trim()&&(t[n]=e[n].trim());return Object.freeze(t)}function $9(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=yr(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:yr(e.network,`accepts[${t}].network`),amount:hO(e.amount,`accepts[${t}].amount`),asset:yr(e.asset,`accepts[${t}].asset`),payTo:yr(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:M9(e.extra)})}function Vy(e){let t=L9(e);if(t.x402Version!==2)throw new Error("x402: only x402Version 2 is supported");if(!Array.isArray(t.accepts)||t.accepts.length===0||t.accepts.length>fO)throw new Error(`x402: accepts must contain 1-${fO} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:yr(t.resource.url,"resource.url"),description:String(t.resource.description||""),mimeType:String(t.resource.mimeType||"")}):null;if(!n)throw new Error("x402: resource required");let r=Object.freeze(t.accepts.map($9));for(let o of r)if(!Number.isInteger(o.maxTimeoutSeconds)||o.maxTimeoutSeconds<=0)throw new Error("x402: maxTimeoutSeconds must be a positive integer");return Object.freeze({x402Version:2,resource:n,accepts:r})}function mO(e,t){return String(e)===String(t)}function B9(e,t={}){let n=Vy(e),r=yr(t.network,"network"),o=yr(t.asset,"asset"),i=yr(t.payTo,"payTo"),s=BigInt(hO(t.maxAmount,"maxAmount")),a=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&mO(l.asset,o)&&mO(l.payTo,i));if(a.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=a.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>s)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${s}`);return c}function gO(e={}){return e.paymentRequired??e.header??e.body}function yO(e={}){return Vy(gO(e))}function bO(e={},t={}){let n=Vy(gO(e)),r=B9(n,e);return U({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function wO(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}var R9,fO,SO=_(()=>{oe();R9=96*1024,fO=50});function Wy(e={}){return Me({provider:"bankr",defaultUrl:U9,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function vO(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function F9(e={}){let t=vO(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function EO(e={},t=!1){let n=F9(e),r=Wy(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function xO(e,t={}){return x(`${Wy(t).baseUrl}${e}`,{headers:EO(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function Gy(e={}){return xO("/wallet/me",e)}async function AO(e={}){return xO("/wallet/portfolio",e)}function dc(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function q9(e){let t=dc(e,"amount");if(!/^\d+(?:\.\d+)?$/.test(t)||Number(t)<=0)throw new Error("bankr: amount must be a positive decimal string");return t}async function IO(e={},t={}){let n={fromChain:dc(e.fromChain,"fromChain"),fromToken:dc(e.fromToken,"fromToken"),toChain:dc(e.toChain,"toChain"),toToken:dc(e.toToken,"toToken"),amount:q9(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return x(`${Wy(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:EO(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function kO(e={}){if(!vO(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await Gy(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var U9,_O=_(()=>{q();vt();U9="https://api.bankr.bot"});async function pc(e,t={}){if(!e?.type)throw new Error("hlWsSnapshot requires subscription.type");let n=t.timeoutMs??8e3,r=t.maxMessages??1,o=t.WebSocket||globalThis.WebSocket;if(!o)throw new Error("WebSocket not available in this runtime");let i=t.url||H9,s=Date.now();return new Promise((a,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?a({ok:!0,partial:!0,ms:Date.now()-s,messages:u}):c(new Error(`hl ws timeout after ${n}ms`)))},n);function f(){clearTimeout(m);try{p.close()}catch{}}p.addEventListener("open",()=>{p.send(JSON.stringify({method:"subscribe",subscription:e}))}),p.addEventListener("message",h=>{let g;try{g=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{g={raw:String(h.data).slice(0,200)}}u.push(g),g.channel&&g.channel!=="subscriptionResponse"?d+=1:g.data&&g.channel==="subscriptionResponse"||g.channel||(d+=1),d>=r&&(f(),l||(l=!0,a({ok:!0,ms:Date.now()-s,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function OO(e={}){try{let t=await pc({type:"allMids"},{...e,maxMessages:1}),n=t.last||{},r=n.data?.mids||n.data||{},o=typeof r=="object"?Object.keys(r).length:0;return{ok:!0,ms:t.ms,midCount:o,channel:n.channel||null}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function NO(e={}){let t=await pc({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function TO(e,t={}){if(!e)throw new Error("coin required");let n=await pc({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var H9,CO=_(()=>{H9=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws"});async function Fd(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let s=t.url||V9,a=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(s),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-a,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let y;try{y=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{y={raw:String(g.data).slice(0,300)}}d.push(y),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-a,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function PO(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Fd([t],{...e,maxMessages:1});return{ok:!0,ms:n.ms,got:!!n.last,partial:n.partial||!1}}catch(n){return{ok:!1,error:String(n.message||n).slice(0,160)}}}async function RO(e,t={}){if(!e)throw new Error("assetId required");let n=await Fd([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}var V9,LO=_(()=>{V9=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market"});function Ky(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||G9).replace(/\/$/,"")}function qd(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||K9).replace(/\/$/,"")}function fc(e){return{error:String(e.message||e).slice(0,200)}}function Jt(e){let t=Number(e);return Number.isFinite(t)?t:null}function mc(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function jd(e={}){try{let t=await x(`${Ky(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function Hd(e={},t={}){let n=mc(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await x(`${Ky(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Jt(o?.price??o?.lastPrice),volume24h:Jt(o?.volume),quoteVolume24h:Jt(o?.quoteVolume),raw:o}}catch(r){return fc(r)}}async function MO(e={},t={}){let n=mc(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${qd(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${Ky(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,s=await x(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return gc({venue:"binance",market:o?"perp":"spot",symbol:n,bids:s?.bids,asks:s?.asks,raw:s})}catch(i){return fc(i)}}async function hc(e={},t={}){let n=mc(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await x(`${qd(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||Y9,s=Jt(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Jt(o?.markPrice),indexPrice:Jt(o?.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:Jt(o?.nextFundingTime),raw:o??null}}catch(r){return fc(r)}}async function $O(e={},t={}){let n=await hc(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function BO(e={},t={}){let n=mc(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await x(`${qd(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Jt(r?.openInterest),time:Jt(r?.time),raw:r??null}}catch(r){return fc(r)}}async function DO(e={},t={}){let n=mc(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await x(`${qd(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(s=>({fundingTime:Jt(s?.fundingTime),fundingRate:Jt(s?.fundingRate)}))}}catch(o){return fc(o)}}function gc({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let s=m=>(Array.isArray(m)?m:[]).map(f=>{let h=Jt(Array.isArray(f)?f[0]:f?.price),g=Jt(Array.isArray(f)?f[1]:f?.size);return h==null||g==null?null:{price:h,size:g}}).filter(Boolean),a=s(r),c=s(o),l=a[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:a,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}var G9,K9,Y9,yc=_(()=>{q();G9="https://api.binance.com",K9="https://fapi.binance.com",Y9=8});function ds(e={}){return(e.baseUrl||process.env.OKX_API_URL||X9).replace(/\/$/,"")}function bc(e){return{error:String(e.message||e).slice(0,200)}}function zt(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function wc(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function ps(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function zd(e={}){try{let t=await x(`${ds(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:ps(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function Vd(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=wc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await x(`${ds(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ps(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:zt(i.last),bestBid:zt(i.bidPx),bestAsk:zt(i.askPx),volume24h:zt(i.vol24h),quoteVolume24h:zt(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return bc(o)}}async function FO(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=wc(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await x(`${ds(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=ps(i)[0];return s?gc({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:s.bids,asks:s.asks,raw:s}):{error:`okx books empty for ${r}`}}catch(i){return bc(i)}}async function Wd(e={},t={}){let n=wc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await x(`${ds(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=ps(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||J9,s=zt(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:s,nextFundingRate:zt(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:zt(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return bc(r)}}async function Gd(e={},t={}){let n=wc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${ds(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ps(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:zt(i.markPx),time:zt(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return bc(o)}}async function qO(e={},t={}){let n=wc(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await x(`${ds(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ps(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:zt(i.oiCcy??i.oi),openInterestContracts:zt(i.oi),openInterestUsd:zt(i.oiUsd),time:zt(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return bc(o)}}var X9,J9,Yy=_(()=>{q();yc();X9="https://www.okx.com",J9=8});function Sc(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||Q9).replace(/\/$/,"")}function vc(e){return{error:String(e.message||e).slice(0,200)}}function ut(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Kd(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function Xy(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function Ec(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function Yd(e={}){try{let t=await x(`${Sc(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!Ec(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function HO(e,t){let n=Xy(e.market),r=Kd(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await x(`${Sc(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ec(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function Xd(e={},t={}){try{let n=await HO(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:ut(r.lastPrice),bestBid:ut(r.bid1Price),bestAsk:ut(r.ask1Price),markPrice:ut(r.markPrice),indexPrice:ut(r.indexPrice),volume24h:ut(r.volume24h),quoteVolume24h:ut(r.turnover24h),raw:r}}catch(n){return vc(n)}}async function zO(e={},t={}){let n=Xy(e.market),r=Kd(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await x(`${Sc(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=Ec(i);return s?gc({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:s.b,asks:s.a,raw:s}):{error:`bybit orderbook empty for ${r}`}}catch(i){return vc(i)}}async function xc(e={},t={}){try{let n=await HO({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||Z9,s=ut(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:ut(r.markPrice),indexPrice:ut(r.indexPrice),fundingRate:s,fundingIntervalHours:i,fundingAprPct:s==null?null:s*(8760/i)*100,nextFundingTime:ut(r.nextFundingTime),openInterest:ut(r.openInterest),raw:r}}catch(n){return vc(n)}}async function VO(e={},t={}){let n=await xc(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function WO(e={},t={}){let n=Kd(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=Xy(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let s=await x(`${Sc(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=Ec(s)?.list,c=Array.isArray(a)?a[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:ut(c.openInterest),time:ut(c.timestamp),history:(Array.isArray(a)?a:[]).map(l=>({openInterest:ut(l?.openInterest),timestamp:ut(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(s){return vc(s)}}async function GO(e={},t={}){let n=Kd(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await x(`${Sc(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Ec(o)?.list,s=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:s.length,history:s.map(a=>({fundingRate:ut(a?.fundingRate),fundingTime:ut(a?.fundingRateTimestamp)}))}}catch(o){return vc(o)}}var Q9,Z9,Jy=_(()=>{q();yc();Q9="https://api.bybit.com",Z9=8});function Ac(e){return{error:String(e.message||e).slice(0,200)}}function Et(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ez(e,t){return e==null||!t?null:e*(8760/t)*100}function Zy(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function tz(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):Qy,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=Qy.filter(i=>r.has(i));return o.length?o:Qy}async function nz(e={},t={}){let n=Zy(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await jt(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let s=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(s<0)return{error:`hyperliquid has no perp for ${n}`};let a=i[s]||{},c=Et(a.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Et(a.markPx),indexPrice:Et(a.oraclePx),midPrice:Et(a.midPx),fundingRate:c,fundingIntervalHours:YO,fundingAprPct:ez(c,YO),openInterest:Et(a.openInterest)}}catch(r){return Ac(r)}}async function rz(e={},t={}){let n=Zy(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await _n(t),o=Et(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return Ac(r)}}async function oz(e={},t={}){let[n,r]=await Promise.all([Wd(e,t).catch(Ac),Gd(e,t).catch(Ac)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Et(r.markPrice),...r?.error?{markError:r.error}:{}}}async function io(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,Ac(n)]}}async function eb(e={},t={}){let n=Zy(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=tz(e),i=[];o.includes("binance")&&(i.push(io("binance:perp",hc({coin:n,quote:r},t))),i.push(io("binance:spot",Hd({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(io("okx:perp",oz({coin:n,quote:r},t))),i.push(io("okx:spot",Vd({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(io("bybit:perp",xc({coin:n,quote:r},t))),i.push(io("bybit:spot",Xd({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(io("hyperliquid:perp",nz({coin:n},t))),i.push(io("hyperliquid:spot",rz({coin:n},t))));let s=await Promise.all(i),a={};for(let[c,l]of s){let[u,d]=c.split(":");a[u]=a[u]||{},a[u][d]=l}return{coin:n,quote:r,venues:o,legs:a}}function XO(e){return!e||e.error?null:Et(e.price)??Et(e.mid)??null}function iz(e){return!e||e.error?null:Et(e.markPrice)??Et(e.midPrice)??null}async function tb(e={},t={}){let n=await eb(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:s}=n,a=[];for(let f of i){let h=XO(s[f]?.spot);h!=null&&h>0&&a.push(h)}let c=[...a].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=s[f]?.perp,g=s[f]?.spot,y=iz(h),b=XO(g),w=b??l,S=y!=null&&w?(y-w)/w*1e4:null;u.push({venue:f,symbol:h?.symbol??g?.symbol??r,markPrice:y,spotPrice:b,spotSource:b!=null?f:l!=null?"cross-venue-median":null,basisBps:S,fundingRate:h&&!h.error?Et(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Et(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Et(h.fundingAprPct):null,openInterest:h&&!h.error?Et(h.openInterest):null,errors:[h?.error,g?.error].filter(Boolean)})}let d=sz(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function sz(e=[]){let t=e.filter(r=>Et(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],s=t[o],a=i.fundingAprPct-s.fundingAprPct,c=a>0?s.venue:i.venue,l=a>0?i.venue:s.venue;n.push({pair:`${i.venue}/${s.venue}`,aprSpreadPct:Math.abs(a),signedAprSpreadPct:a,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function JO(e={},t={}){let n=await tb(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function QO(e={}){try{let t=await Promise.all([jd(e).catch(()=>({ok:!1})),zd(e).catch(()=>({ok:!1})),Yd(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}var Qy,YO,ZO=_(()=>{yc();Yy();Jy();Xt();Qy=["binance","okx","bybit","hyperliquid"],YO=1});import ke from"node:fs";import Jd from"node:path";import{createHash as cz,randomUUID as eN}from"node:crypto";function so(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(so).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${so(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function tN(e){return cz("sha256").update(so(e)).digest("hex")}function Qd(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Zd(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function nN(e){ke.mkdirSync(e,{recursive:!0,mode:448});try{ke.chmodSync(e,448)}catch{}}function rb(e){try{let t=ke.statSync(e);return{...JSON.parse(ke.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function fs({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:s=3e4,lockWaitMs:a=2e3,lockIdFactory:c=()=>eN()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(s)||s<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(a)||a<0||a>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let w=n();return r(w),{schemaVersion:nb,kind:t,generation:0,data:w}}function d(w){let S;try{S=JSON.parse(w)}catch(A){throw new Nn(`corrupt ${t} snapshot: invalid JSON (${A.message})`,"STORE_CORRUPT")}if(!S||typeof S!="object"||Array.isArray(S))throw new Nn(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(S.schemaVersion!==nb)throw new Nn(`unsupported ${t} schemaVersion ${String(S.schemaVersion)}`,"STORE_SCHEMA");if(S.kind!==t||!Number.isSafeInteger(S.generation)||S.generation<0)throw new Nn(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...I}=S;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||tN(I)!==v)throw new Nn(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(S.data)}catch(A){throw new Nn(`corrupt ${t} snapshot: ${A.message}`,"STORE_CORRUPT")}return I}function p(){if(!ke.existsSync(e))return u();let w=ke.statSync(e);if(!w.isFile()||w.size>i)throw new Nn(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ke.chmodSync(e,384)}catch{}return d(ke.readFileSync(e,"utf8"))}function m(){nN(Jd.dirname(e));let w=Qd(o),S=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:S,pid:process.pid,acquiredAt:w})}
|
|
8
|
+
`,I=()=>{let O;try{return O=ke.openSync(l,"wx",384),ke.writeFileSync(O,v,"utf8"),ke.fsyncSync(O),ke.closeSync(O),{lockId:S}}catch(T){let D=O!==void 0;if(D)try{ke.closeSync(O)}catch{}if(D)try{ke.unlinkSync(l)}catch{}if(T?.code!=="EEXIST")throw T;return null}},E=Qd(o)+a,k=new Int32Array(new SharedArrayBuffer(4));for(;;){let O=I();if(O)return O;let T=Qd(o),D=rb(l),X=!1;if(D){let $=T-Number(D.acquiredAt??D.mtimeMs);X=Number.isFinite($)&&$>=s}else try{X=T-ke.statSync(l).mtimeMs>=s}catch{X=!1}if(X){let $=rb(l);if(D?$?.lockId===D.lockId:$===null){try{ke.unlinkSync(l)}catch(C){if(C?.code!=="ENOENT")throw C}continue}}let H=E-T;if(H<=0)throw new Nn(`${t} store is busy`,"STORE_BUSY");Atomics.wait(k,0,0,Math.min(10,H))}}function f(w){if(rb(l)?.lockId===w.lockId)try{ke.unlinkSync(l)}catch(v){if(v?.code!=="ENOENT")throw v}}function h(w){r(w.data);let S={...w,integrity:tN(w)},v=`${so(S)}
|
|
9
|
+
`;if(Buffer.byteLength(v)>i)throw new Nn(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let I=Jd.dirname(e);nN(I);let A=Jd.join(I,`.${Jd.basename(e)}.${process.pid}.${eN()}.tmp`),E;try{E=ke.openSync(A,"wx",384),ke.writeFileSync(E,v,"utf8"),ke.fsyncSync(E),ke.closeSync(E),E=void 0,ke.renameSync(A,e);try{ke.chmodSync(e,384)}catch{}try{let k=ke.openSync(I,"r");try{ke.fsyncSync(k)}finally{ke.closeSync(k)}}catch{}}finally{if(E!==void 0)try{ke.closeSync(E)}catch{}try{ke.unlinkSync(A)}catch(k){if(k?.code!=="ENOENT")throw k}}}function g(){return Zd(p().data)}function y(){let w=p();return{schemaVersion:w.schemaVersion,kind:w.kind,generation:w.generation,data:Zd(w.data)}}function b(w){if(typeof w!="function")throw new TypeError("mutator must be a function");let S=m();try{let v=p(),I=Zd(v.data),A=w(I,{generation:v.generation,now:Qd(o)});return r(I),h({schemaVersion:nb,kind:t,generation:v.generation+1,data:I}),Zd(A)}finally{f(S)}}return Object.freeze({filePath:e,read:g,inspect:y,mutate:b})}var nb,Nn,ep=_(()=>{nb=1,Nn=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}}});import{wordlists as lz}from"ethers";function fz(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return pz.has(t.length)&&t.every(n=>lz.en.getWordIndex(n)>=0)}function yz(e){let t=rN(e);return gz.has(t)||hz.test(t)}function rN(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function bz(e){let t=rN(e);return[...uz].some(n=>t.includes(n))}function wz(e,t,n){if(typeof t=="string"){if(dz.some(r=>r.test(t))||fz(t))throw new Ic(n);if(mz.test(t)&&!yz(e))throw new Ic(n)}}function ob(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return wz(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>ob(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(bz(o))throw new Ic(i);e[o]!==void 0&&(r[o]=ob(e[o],i,o))}return r}function br(e){return ob(e)}var uz,dz,pz,mz,hz,gz,Ic,kc=_(()=>{uz=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),dz=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],pz=new Set([12,15,18,21,24]);mz=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,hz=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,gz=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);Ic=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import oN from"node:path";import{homedir as Sz}from"node:os";import{createHash as vz,randomUUID as Ez}from"node:crypto";function ie(e,t){throw new ab(e,t)}function oi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))oi(t);Object.freeze(e)}return e}function Oc(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&ie(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||Nz.test(o))&&ie(`${t} is invalid`),r?o.toLowerCase():o}function Ct(e,t){let n=Oc(e,t,{max:128});return kz.test(n)||ie(`${t} must be a bounded id`),n}function _c(e,t,{positive:n=!1}={}){typeof e=="number"&&ie(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return Iz.test(r)||ie(`${t} must be a canonical integer string`),n&&r==="0"&&ie(`${t} must be positive`),r}function ri(e,t){let n=Oc(e,t,{max:42,lower:!0});return _z.test(n)||ie(`${t} must be a 20-byte EVM address`),n}function sN(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ie(`${t} must be a plain object`),e}function ni(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ie("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function ib(e){return new Date(e).toISOString()}function Cz(e){return vz("sha256").update(so(e),"utf8").digest("hex")}function Pz(e=process.env){let t=e.ORACLE_CONFIG_DIR||oN.join(Sz(),".config","oracle");return oN.join(t,"local-marketplace.v1.json")}function tp(e){let t=e.status==="submitted";return oi({schemaVersion:np,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:Tz.has(e.status)?e.status:ie("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>oi({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:iN,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function Rz(e){(!e||e.schemaVersion!==np||!Array.isArray(e.listings))&&ie("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&ie("marketplace capacity exceeded","STORE_LIMIT")}function sb(e,t){return oi({schemaVersion:np,recordType:"local-marketplace-armed",listingId:e.listingId,offerId:t.offerId,tenantId:e.tenantId,seller:e.seller,buyer:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId,listingHash:e.listingHash,unsigned:{kind:"local-p2-fill",from:e.seller,to:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId},review:`Local P2 fill ${e.listingId} is armed for the owner-local signer: seller ${e.seller} transfers ${t.amount} ${e.asset} to ${t.buyer} at ${e.price} on chain ${e.chainId}. Sign and broadcast still require an explicit instruction.`,label:iN,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function Lz(e,t,n){typeof e=="string"&&ie("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=sN(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&ie("generic signHash is refused","SIGNHASH_REFUSED");let o=ri(r.from??r.offerer??t.seller,"artifact.from"),i=ri(r.to??r.recipient??n.buyer,"artifact.to"),s=_c(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&ie("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&ie("artifact.to must match the buyer","ARTIFACT_MISMATCH"),s!==t.chainId&&ie("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&ie("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function Mz(e,t){if(e==null)return{action:"arm"};let n=sN(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ie("generic signHash is refused","SIGNHASH_REFUSED");let r=Oc(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ie("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ie("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&ie("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&ie("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&ie("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&ie("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function aN({filePath:e=Pz(),clock:t=()=>Date.now(),idFactory:n=()=>Ez()}={}){let r=fs({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:np,listings:[]}),validateData:Rz});function o(h,g){return h.tenantId===g}function i(h,g){return h.status==="open"&&Date.parse(h.expiresAt)<=g&&(h.status="expired"),h}function s(h={}){br(h);let g=Ct(h.tenantId,"tenantId"),y=ri(h.seller,"seller"),b=Oc(h.asset,"asset",{max:128}),w=_c(h.amount,"amount",{positive:!0}),S=_c(h.price,"price",{positive:!0}),v=_c(h.chainId,"chainId",{positive:!0}),I=ni(t),A=ib(I),E=h.expiresAt==null?ib(I+864e5):Oc(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(E))||Date.parse(E)<=I)&&ie("expiresAt must be after now");let k=Ct(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(O=>{O.listings.some(X=>X.listingId===k)&&ie("listingId already exists","DUPLICATE");let T={listingId:k,tenantId:g,seller:y,asset:b,amount:w,price:S,chainId:v,status:"open",createdAt:A,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},D={...T,listingHash:Cz(T)};return O.listings.push(D),tp(D)})}function a({tenantId:h}={}){let g=Ct(h,"tenantId"),y=ni(t);return oi(r.read().listings.filter(b=>o(b,g)).map(b=>tp(i({...b,offers:b.offers.map(w=>({...w}))},y))))}function c({tenantId:h,listingId:g,actor:y}={}){let b=Ct(h,"tenantId"),w=Ct(g,"listingId"),S=ri(y,"actor"),v=ni(t);return r.mutate(I=>{let A=I.listings.find(E=>o(E,b)&&E.listingId===w);return A||ie("listing not found","NOT_FOUND"),i(A,v),A.seller!==S&&ie("only the seller can cancel","FORBIDDEN"),A.status!=="open"&&ie("listing is not open","NOT_OPEN"),A.status="cancelled",tp(A)})}function l(h={}){br(h);let g=Ct(h.tenantId,"tenantId"),y=Ct(h.listingId,"listingId"),b=ri(h.buyer,"buyer"),w=_c(h.amount,"amount",{positive:!0}),S=ni(t),v=Ct(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(I=>{let A=I.listings.find(E=>o(E,g)&&E.listingId===y);return A||ie("listing not found","NOT_FOUND"),i(A,S),A.status!=="open"&&ie("listing is not open","NOT_OPEN"),A.seller===b&&ie("seller cannot offer on their own listing","FORBIDDEN"),A.offers.some(E=>E.offerId===v)&&ie("offerId already exists","DUPLICATE"),A.offers.push({offerId:v,buyer:b,amount:w,status:"open",createdAt:ib(S)}),tp(A)})}function u(h,{tenantId:g,listingId:y,offerId:b,actor:w,now:S,allowed:v=["open","armed"]}){let I=h.listings.find(E=>o(E,g)&&E.listingId===y);I||ie("listing not found","NOT_FOUND"),i(I,S),v.includes(I.status)||ie("listing is not open","NOT_OPEN"),I.seller!==w&&ie("only the seller can arm a fill","FORBIDDEN");let A=I.offers.find(E=>E.offerId===b);return(!A||!["open","armed"].includes(A.status))&&ie("offer not found","NOT_FOUND"),{row:I,offer:A}}function d({tenantId:h,listingId:g,offerId:y,actor:b}={}){let w=Ct(h,"tenantId"),S=Ct(g,"listingId"),v=Ct(y,"offerId"),I=ri(b,"actor"),A=ni(t);return r.mutate(E=>{let{row:k,offer:O}=u(E,{tenantId:w,listingId:S,offerId:v,actor:I,now:A});return k.status="armed",O.status="armed",sb(k,O)})}async function p({tenantId:h,listingId:g,offerId:y,actor:b,instruction:w,executor:S}={}){let v=Ct(h,"tenantId"),I=Ct(g,"listingId"),A=Ct(y,"offerId"),E=ri(b,"actor"),k=ni(t),O=r.mutate(C=>{let{row:B,offer:V}=u(C,{tenantId:v,listingId:I,offerId:A,actor:E,now:k,allowed:["open","armed"]}),K=Mz(w,B);return B.status="armed",V.status="armed",{armed:sb(B,V),instruction:K,listingHash:B.listingHash}});if(O.instruction.action==="arm")return O.armed;let T=r.read().listings.find(C=>C.listingId===I&&C.tenantId===v),D=T?.offers.find(C=>C.offerId===A),X=Lz(O.instruction.artifact,T,D);(!S||typeof S.executeConfirmedArtifact!="function")&&ie("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof S.signHash=="function"&&ie("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await S.executeConfirmedArtifact(X,O.instruction.nonce,S),$=H?.receipt?.transactionHash??H?.transactionHash;(typeof $!="string"||!Oz.test($))&&ie("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let j=H?.receipt?.status??H?.status;return j!==1&&j!=="0x1"&&ie("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(C=>{let{row:B,offer:V}=u(C,{tenantId:v,listingId:I,offerId:A,actor:E,now:ni(t),allowed:["armed"]});return B.status="submitted",V.status="submitted",B.transactionHash=$.toLowerCase(),oi({...sb(B,V),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:B.transactionHash,review:`Local P2 fill ${B.listingId} signed and broadcast through the instructed local signer. transactionHash=${B.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Ct(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&ie("consult text required"),oi({accepted:!1,reason:"untrusted consult text cannot create, fill, or cancel listings",custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1})}function f(){return Az}return Object.freeze({createListing:s,listListings:a,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}var np,iN,npe,xz,rpe,Az,Iz,kz,_z,Oz,Nz,Tz,ab,cN=_(()=>{ep();kc();np=1,iN="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",npe=Object.freeze(["listing","offer","arm","instruct"]),xz=Object.freeze(["open","cancelled","expired","armed","submitted"]),rpe=Object.freeze(["arm","sign-and-broadcast"]),Az=Object.freeze({protocol:"oracle-a2a/1",name:"oracle-local-marketplace",brand:"Oracle",publisher:"Oracle",product:"Oracle",role:"Oracle owner-local P2 catalog",consultOnly:!0,remoteDelegation:!1,pluginExecution:!1,refusesSignHash:!0,skills:Object.freeze(["list-local-listings"]),note:"Oracle consult-only local Agent Card. Untrusted A2A text cannot create, fill, cancel, sign, or broadcast listings. Existing marketplace providers are unchanged. No plugin pack loader."}),Iz=/^(?:0|[1-9][0-9]*)$/,kz=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,_z=/^0x[a-fA-F0-9]{40}$/,Oz=/^0x[a-fA-F0-9]{64}$/,Nz=/[\u0000-\u001f\u007f]/,Tz=new Set(xz),ab=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}}});import lN from"node:path";import{homedir as $z}from"node:os";import{createHash as Bz,randomUUID as Dz}from"node:crypto";function ae(e,t){throw new ub(e,t)}function Nc(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Nc(t);Object.freeze(e)}return e}function Tc(e,t,{max:n=256}={}){typeof e!="string"&&ae(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||Hz.test(r))&&ae(`${t} is invalid`),r}function wr(e,t){let n=Tc(e,t,{max:128});return Fz.test(n)||ae(`${t} must be a bounded id`),n}function rp(e,t,{positive:n=!1}={}){typeof e=="number"&&ae(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return Uz.test(r)||ae(`${t} must be a canonical integer string`),n&&r==="0"&&ae(`${t} must be positive`),r}function ii(e,t){let n=Tc(e,t,{max:42}).toLowerCase();return qz.test(n)||ae(`${t} must be a 20-byte EVM address`),n}function zz(e){let t=Tc(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{ae("resource must be an https URL")}return n.protocol!=="https:"&&ae("resource must be https"),(n.username||n.password)&&ae("resource must not contain credentials"),n.toString()}function dN(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ae(`${t} must be a plain object`),e}function Vz(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ae("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Wz(e){return new Date(e).toISOString()}function Gz(e=process.env){let t=e.ORACLE_CONFIG_DIR||lN.join($z(),".config","oracle");return lN.join(t,"local-x402.v1.json")}function cb(e){let t=e.status==="submitted";return Nc({schemaVersion:op,intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,maxBudget:e.maxBudget,asset:e.asset,chainId:e.chainId,status:e.status,createdAt:e.createdAt,intentHash:e.intentHash,transactionHash:e.transactionHash||null,label:uN,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function Kz(e){(!e||e.schemaVersion!==op||!Array.isArray(e.intents))&&ae("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&ae("x402 capacity exceeded","STORE_LIMIT")}function lb(e){return Nc({schemaVersion:op,recordType:"local-x402-armed",intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,asset:e.asset,chainId:e.chainId,intentHash:e.intentHash,unsigned:{kind:"local-x402-pay",from:e.payer,to:e.payTo,amount:e.amount,asset:e.asset,chainId:e.chainId,resource:e.resource},review:`Oracle local x402 ${e.intentId} is armed: pay ${e.amount} ${e.asset} to ${e.payTo} for ${e.resource}. Sign and broadcast still require an explicit instruction.`,label:uN,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function Yz(e,t){typeof e=="string"&&ae("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=dN(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&ae("generic signHash is refused","SIGNHASH_REFUSED");let r=ii(n.from??t.payer,"artifact.from"),o=ii(n.to??t.payTo,"artifact.to"),i=rp(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&ae("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&ae("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&ae("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let s=BigInt(t.maxBudget);return BigInt(i)>s&&ae("amount exceeds maxBudget","BUDGET"),n}function Xz(e,t){if(e==null)return{action:"arm"};let n=dN(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ae("generic signHash is refused","SIGNHASH_REFUSED");let r=Tc(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ae("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ae("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&ae("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&ae("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function pN({filePath:e=Gz(),clock:t=()=>Date.now(),idFactory:n=()=>Dz()}={}){let r=fs({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:op,intents:[]}),validateData:Kz});function o(l={}){br(l);let u=wr(l.tenantId,"tenantId"),d=ii(l.payer,"payer"),p=ii(l.payTo,"payTo"),m=zz(l.resource),f=rp(l.amount,"amount",{positive:!0}),h=rp(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&ae("amount exceeds maxBudget","BUDGET");let g=Tc(l.asset??"USDC","asset",{max:32}),y=rp(l.chainId,"chainId",{positive:!0}),b=Vz(t),w=wr(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(S=>{S.intents.some(A=>A.intentId===w)&&ae("intentId already exists","DUPLICATE");let v={intentId:w,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:y,status:"open",createdAt:Wz(b),custody:"none",execution:"armed-local"},I={...v,intentHash:Bz("sha256").update(so(v),"utf8").digest("hex")};return S.intents.push(I),cb(I)})}function i({tenantId:l}={}){let u=wr(l,"tenantId");return Nc(r.read().intents.filter(d=>d.tenantId===u).map(cb))}function s({tenantId:l,intentId:u,actor:d}={}){let p=wr(l,"tenantId"),m=wr(u,"intentId"),f=ii(d,"actor");return r.mutate(h=>{let g=h.intents.find(y=>y.tenantId===p&&y.intentId===m);return g||ae("intent not found","NOT_FOUND"),g.payer!==f&&ae("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&ae("intent is not open","NOT_OPEN"),g.status="cancelled",cb(g)})}function a({tenantId:l,intentId:u,actor:d}={}){let p=wr(l,"tenantId"),m=wr(u,"intentId"),f=ii(d,"actor");return r.mutate(h=>{let g=h.intents.find(y=>y.tenantId===p&&y.intentId===m);return g||ae("intent not found","NOT_FOUND"),g.payer!==f&&ae("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||ae("intent is not open","NOT_OPEN"),g.status="armed",lb(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=wr(l,"tenantId"),h=wr(u,"intentId"),g=ii(d,"actor"),y=r.mutate(A=>{let E=A.intents.find(O=>O.tenantId===f&&O.intentId===h);E||ae("intent not found","NOT_FOUND"),E.payer!==g&&ae("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||ae("intent is not open","NOT_OPEN");let k=Xz(p,E);return E.status="armed",{armed:lb(E),instruction:k}});if(y.instruction.action==="arm")return y.armed;let b=r.read().intents.find(A=>A.tenantId===f&&A.intentId===h),w=Yz(y.instruction.artifact,b);(!m||typeof m.executeConfirmedArtifact!="function")&&ae("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&ae("generic signHash executors are refused","SIGNHASH_REFUSED");let S=await m.executeConfirmedArtifact(w,y.instruction.nonce,m),v=S?.receipt?.transactionHash??S?.transactionHash;(typeof v!="string"||!jz.test(v))&&ae("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let I=S?.receipt?.status??S?.status;return I!==1&&I!=="0x1"&&ae("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(A=>{let E=A.intents.find(k=>k.tenantId===f&&k.intentId===h);return(!E||E.status!=="armed")&&ae("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=v.toLowerCase(),Nc({...lb(E),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:E.transactionHash,review:`Oracle local x402 ${E.intentId} signed and broadcast. transactionHash=${E.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:s,armPayment:a,instructPay:c})}var op,uN,upe,Uz,Fz,qz,jz,Hz,ub,fN=_(()=>{ep();kc();op=1,uN="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",upe=Object.freeze(["open","cancelled","armed","submitted"]),Uz=/^(?:0|[1-9][0-9]*)$/,Fz=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,qz=/^0x[a-fA-F0-9]{40}$/,jz=/^0x[a-fA-F0-9]{64}$/,Hz=/[\u0000-\u001f\u007f]/,ub=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}}});import mN from"node:path";import{homedir as Jz}from"node:os";import{randomUUID as Qz}from"node:crypto";function ot(e,t){throw new pb(e,t)}function mb(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))mb(t);Object.freeze(e)}return e}function ao(e,t,{max:n=256}={}){typeof e!="string"&&ot(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||tV.test(r))&&ot(`${t} is invalid`),r}function Cc(e,t){let n=ao(e,t,{max:128});return eV.test(n)||ot(`${t} must be a bounded id`),n}function hN(e,t){let n=ao(e,t,{max:64}).toLowerCase();return nV.test(n)||ot(`${t} must be 64 lowercase hex`),n}function iV(e,t){let n=ao(e,t,{max:2048}),r;try{r=new URL(n)}catch{ot(`${t} must be an https URL`)}return r.protocol!=="https:"&&ot(`${t} must be https`),(r.username||r.password)&&ot(`${t} must not contain credentials`),r.toString()}function sV(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&ot("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=ao(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!rV.test(r)||r==="0.0.0.0")&&ot(`outboundHosts[${n}] is not an allowlisted host`),r}))}function gN(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&ot("clock invalid","CLOCK_INVALID"),n}function yN(e){return new Date(e).toISOString()}function aV(e=process.env){let t=e.ORACLE_CONFIG_DIR||mN.join(Jz(),".config","oracle");return mN.join(t,"local-pack-registry.v1.json")}function db(e){return mb({schemaVersion:fb,packId:e.packId,tenantId:e.tenantId,name:e.name,version:e.version,publisher:e.publisher,manifestDigest:e.manifestDigest,sbomDigest:e.sbomDigest,homepage:e.homepage,outboundHosts:e.outboundHosts,spendScope:e.spendScope,status:e.status,createdAt:e.createdAt,revokedAt:e.revokedAt,label:Zz,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function cV(e){(!e||e.schemaVersion!==fb||!Array.isArray(e.packs))&&ot("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&ot("pack registry capacity exceeded","STORE_LIMIT")}function bN({filePath:e=aV(),clock:t=()=>Date.now(),idFactory:n=()=>Qz()}={}){let r=fs({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:fb,packs:[]}),validateData:cV});function o(l={}){br(l);let u=Cc(l.tenantId,"tenantId"),d=ao(l.name,"name",{max:128}),p=ao(l.version,"version",{max:64}),m=ao(l.publisher,"publisher",{max:128}),f=hN(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:hN(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:iV(l.homepage,"homepage"),y=sV(l.outboundHosts),b=ao(l.spendScope??"none","spendScope",{max:16});oV.has(b)||ot("spendScope must be read, prepare, or none"),b!=="none"&&b!=="read"&&ot("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let w=gN(t),S=Cc(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(A=>A.packId===S||A.tenantId===u&&A.name===d&&A.version===p&&A.status==="listed")&&ot("pack already listed","DUPLICATE");let I={packId:S,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:y,spendScope:b,status:"listed",createdAt:yN(w),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(I),db(I)})}function i({tenantId:l}={}){let u=Cc(l,"tenantId");return mb(r.read().packs.filter(d=>d.tenantId===u).map(db))}function s({tenantId:l,packId:u}={}){let d=Cc(l,"tenantId"),p=Cc(u,"packId"),m=gN(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||ot("pack not found","NOT_FOUND"),h.status!=="listed"&&ot("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=yN(m),db(h)})}function a(){ot("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){ot("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:s,loadPack:a,executePack:c})}var fb,Zz,wpe,eV,tV,nV,rV,oV,pb,wN=_(()=>{ep();kc();fb=1,Zz="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",wpe=Object.freeze(["listed","revoked"]),eV=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,tV=/[\u0000-\u001f\u007f]/,nV=/^[a-f0-9]{64}$/,rV=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,oV=new Set(["read","prepare","none"]),pb=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}}});import{Interface as EN,getAddress as hb,isAddress as lV}from"ethers";function fV(e){let t=Number(e??4663),n=xN[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function SN(e,t){if(/^weth$/i.test(String(e||"")))return hb(xN[t].weth);if(!lV(String(e||"")))throw new Error(`up33: invalid token ${e}`);return hb(e)}function mV(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function vN(e,t,n,r,o,i){let s=r.encodeFunctionData(o,i),a=await e(t,"eth_call",[{to:n,data:s},"latest"]);if(!a||a==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,a)}async function AN(e,t={},n={}){try{let r=fV(t.chainId),o=SN(t.tokenIn,r.chainId),i=SN(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let s=mV(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),a=Number(t.tickSpacing??2e3);if(!Number.isInteger(a)||a<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||J,l=await vN(c,r.chainId,r.factory,dV,"getPool",[o,i,a]),u=hb(l[0]);if(u.toLowerCase()===uV)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:s,tickSpacing:a,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:s,tickSpacing:a,sqrtPriceLimitX96:0n},m=await vN(c,r.chainId,r.quoter,pV,d,[p]),f={provider:"up33",venue:"up33-v3",chainId:r.chainId,chain:r.name,factory:r.factory,quoter:r.quoter,router:r.router,pool:u.toLowerCase(),tokenIn:o.toLowerCase(),tokenOut:i.toLowerCase(),tickSpacing:a,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:s.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:s.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function IN(e={},t={}){return AN("exact-input",e,t)}async function kN(e={},t={}){return AN("exact-output",e,t)}var uV,xN,dV,pV,_N=_(()=>{Ne();uV="0x0000000000000000000000000000000000000000",xN=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),dV=new EN(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),pV=new EN(["function quoteExactInputSingle((address tokenIn,address tokenOut,uint256 amountIn,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)","function quoteExactOutputSingle((address tokenIn,address tokenOut,uint256 amount,int24 tickSpacing,uint160 sqrtPriceLimitX96) params) returns (uint256 amountIn,uint160 sqrtPriceX96After,uint32 initializedTicksCrossed,uint256 gasEstimate)"])});import{getAddress as hV,Interface as hs,keccak256 as yb}from"ethers";import{createHash as bb,createHmac as gV,timingSafeEqual as MN}from"node:crypto";function ee(e,t){try{return hV(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function vr(e,t="tokenId"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return n}function Zt(e,t,n=null){let r=e==null&&n!=null?n:e,o=String(r??"").trim();if(!/^\d+$/.test(o))throw new Error(`stonkbrokers: ${t} must be an unsigned integer`);return BigInt(o)}async function de(e,t,n,r,o=[],i="latest"){let s=n.encodeFunctionData(r,o),a=await e(ne,"eth_call",[{to:ee(t,"contract"),data:s},i]);return n.decodeFunctionResult(r,a)}function BN(e,t){let n=BigInt(e).toString(),r=BigInt(t).toString(),o=(BigInt(e)+BigInt(t)).toString();return{anvilFeeRaw:n,protocolFeeRaw:r,totalFeeRaw:o}}function TN(e={}){let t;if(Array.isArray(e))t=e;else if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.data))t=e.data;else if(e&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.markets))t=e.markets;else throw new Error("stonkbrokers: Anvil snapshot shape requires a data array");if(t.length>ON)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${ON}`);return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("stonkbrokers: Anvil snapshot rows must be objects");if(Number(n.chainId)!==ne)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${ne}`);return{name:n.name||n.collectionName||null,chainId:ne,collection:ee(n.collection||n.collectionAddress,"Anvil collection"),market:ee(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?ee(n.tokenAddress,"Anvil payment token"):null,floorPrice:n.floorPrice??null,buyPrice:n.buyPrice??null,tokensPerNFT:n.tokensPerNFT??null,inventoryCount:Number(n.inventoryCount??n.inventoryLength??0),specificFeeBps:Number(n.specificFeeBps??0),source:"anvil-snapshot"}})}async function AV(e,t,n=[],r={}){if(Number(e)!==ne)throw new Error(`stonkbrokers: Anvil supports chain ${ne} only`);if(!wV.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await x(bV,{method:"POST",headers:{origin:ip,referer:`${ip}/`,"user-agent":"Mozilla/5.0"},body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??2e4,retries:0});if(o?.error)throw new Error(`stonkbrokers: Anvil RPC ${o.error.message||"failed"}`);if(o?.result==null)throw new Error("stonkbrokers: Anvil RPC returned no result");return o.result}function Tn(e={}){return e.rpcCall||((t,n,r)=>AV(t,n,r,e))}async function gs(e={},t={}){if(e.snapshot){let a=TN(e.snapshot),c={kind:"anvil-markets",chainId:ne,total:a.length,contentHash:bb("sha256").update(ms(a)).digest("hex")},l=Sb(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(a,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),a}let n=a=>{let c=String(a?.headers?.get?.("content-type")||"").split(";",1)[0].trim().toLowerCase();if(c!=="application/json"&&!c.endsWith("+json"))throw new Error("stonkbrokers: Anvil snapshot content-type must be JSON")},r=await x(yV,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:SV,retries:0});if(!r||typeof r!="object"||Array.isArray(r)||!Array.isArray(r.data))throw new Error("stonkbrokers: Anvil snapshot must be a JSON object with a data array");let o=TN(r),i={kind:"anvil-markets",chainId:ne,total:o.length,contentHash:bb("sha256").update(ms(o)).digest("hex")},s=Sb(e.snapshotCompletenessEvidence??r.completenessEvidence,i,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(o,"snapshotCoverage",{value:{complete:s.valid,evidence:s.evidence,error:s.error},enumerable:!1}),o}function sp(e){let t=String(e||"").toLowerCase();if(!/^0x(?:0|[1-9a-f][0-9a-f]*)$/.test(t))throw new Error("stonkbrokers: Anvil RPC returned an invalid block number");return t}async function DN({market:e,collection:t},n={}){let r=Number(n.nowMs??Date.now());if(!Number.isFinite(r))throw new Error("stonkbrokers: opts.nowMs must be finite");let i=(await gs({},n)).find(f=>f.market===e);if(!i)throw new Error("stonkbrokers: market is missing from the trusted Anvil snapshot");if(i.collection!==t)throw new Error("stonkbrokers: trusted Anvil snapshot collection mismatch");if(!i.tokenAddress)throw new Error("stonkbrokers: trusted Anvil snapshot payment token is missing");let s=EV[e];if(!s)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let a=Tn(n),c=sp(await a(ne,"eth_blockNumber",[])),l=await a(ne,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||sp(l?.number)!==c)throw new Error("stonkbrokers: Anvil RPC returned an invalid block attestation");let d=Object.freeze({blockHash:u,requireCanonical:!0}),p=String(await a(ne,"eth_getCode",[e,d])).toLowerCase();if(!/^0x[0-9a-f]+$/.test(p)||p==="0x")throw new Error("stonkbrokers: Anvil market runtime is empty");let m=yb(p).toLowerCase();if(m!==s)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:a,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+vV}}function UN(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:ne,market:e.record.market,collection:e.record.collection,paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r,snapshotFetchedAtMs:e.snapshotFetchedAtMs,snapshotExpiresAtMs:e.snapshotExpiresAtMs,blockNumber:BigInt(e.blockNumber).toString(),blockHash:e.blockHash,runtimeCodeHash:e.runtimeCodeHash})}async function Rc(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=vr(e.tokenId),i=await DN({market:n,collection:r},t),{rpc:s,blockRef:a}=i,[c,l,u,d,p,m]=await Promise.all([de(s,n,xt,"quoteSpecificBuy",[BigInt(o)],a),de(s,n,xt,"inventory",[BigInt(o)],a),de(s,r,Sn,"ownerOf",[BigInt(o)],a),de(s,n,xt,"collection",[],a),de(s,n,xt,"token",[],a),de(s,n,xt,"robinhoodSwapFeeWei",[],a)]),f=ee(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=ee(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await de(s,h,$N,"decimals",[],a))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let y=BigInt(m[0]).toString(),b=UN(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:y}),w=!!c[4],S=!!l[0],v=ee(u[0],"NFT owner")===n,I=w&&S&&v;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:ne,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:g,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:y,fees:BN(c[2],c[3]),available:I,evidence:{quoteAvailable:w,inventory:S,ownerIsMarket:v,marketCollection:f,attestation:b},reason:I?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function ap(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=await DN({market:n,collection:r},t),{rpc:i,blockRef:s}=o,[a,c,l,u]=await Promise.all([de(i,n,xt,"quoteSellNFT",[],s),de(i,n,xt,"collection",[],s),de(i,n,xt,"token",[],s),de(i,n,xt,"robinhoodSwapFeeWei",[],s)]),d=ee(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=ee(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await de(i,p,$N,"decimals",[],s))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=UN(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:ne,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(a[0]).toString(),grossPayoutRaw:BigInt(a[1]).toString(),nativeSwapFeeWei:f,fees:BN(a[2],a[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function FN(e){let t=String(e||"").trim();if(!/^[A-Za-z0-9._:-]{1,128}$/.test(t))throw new Error("stonkbrokers: bounded tradeId required");return t}function Sr(e,t){let n=Zt(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function qN({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:s,nonce:a}){let c={chainId:ne,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Sr(o,"gasLimit").toString(),maxFeePerGas:Sr(i,"maxFeePerGasWei").toString(),nonce:Number(a),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return s!=null&&s!==""&&(c.maxPriorityFeePerGas=Sr(s,"maxPriorityFeePerGasWei").toString()),c}function jN(e,t){return U({provider:"anvil-nft",kind:"anvil-nft-execution",execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:"pending-local-signer",broadcast:"pending-local-signer",simulation:"required-again-at-local-signer",localSignerEnvelope:e,quote:t},{provider:"anvil-nft",kind:"anvil-nft-execution"})}async function HN(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=ee(e.buyer,"buyer"),r=ee(e.market,"Anvil market"),o=ee(e.collection,"NFT collection"),i=vr(e.tokenId),s=Sr(e.maxTotalCostRaw,"maxTotalCostRaw"),a=Zt(e.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"),c=Number(e.actionNonce);if(!Number.isSafeInteger(c)||c<0)throw new Error("stonkbrokers: explicit non-negative actionNonce required");let l=await Rc({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>s||BigInt(l.nativeSwapFeeWei)>a)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=Sr(e.confirmedTotalCostRaw,"confirmedTotalCostRaw");if(d!==u)throw new Error("stonkbrokers: confirmed buy economics do not match the exact fresh quote");let p=Number(t.nowMs??Date.now()),m=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),f=ee(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,y={blockHash:g.blockHash,requireCanonical:!0},b=BigInt((await de(Tn(t),f,xV,"allowance",[n,r],y))[0]);if(b<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[qN({...w,to:r,data:xt.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],v={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},I={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:v,preconditions:{allowanceVerified:!0,allowanceRaw:b.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:FN(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:ne,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:v,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:S}};return jN(I,l)}async function zN(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Tn(t),r=ee(e.seller,"seller"),o=ee(e.market,"Anvil market"),i=ee(e.collection,"NFT collection"),s=vr(e.tokenId),a=Sr(e.minPayoutRaw,"minPayoutRaw"),c=Zt(e.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"),l=Number(e.actionNonce);if(!Number.isSafeInteger(l)||l<0)throw new Error("stonkbrokers: explicit non-negative actionNonce required");let u=await ap({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([de(n,i,Sn,"ownerOf",[BigInt(s)],p).then(O=>ee(O[0],"NFT owner")),de(n,i,Sn,"getApproved",[BigInt(s)],p).then(O=>ee(O[0],"NFT approval")),de(n,i,Sn,"isApprovedForAll",[r,o],p).then(O=>!!O[0])]);if(m!==r)throw new Error("stonkbrokers: seller does not own exact NFT");if(f!==o&&!h)throw new Error("stonkbrokers: pre-existing NFT approval is required");if(BigInt(u.netPayoutRaw)<a||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),y=Sr(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(y!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let b=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),S=ee(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),I={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},A=[qN({...I,to:o,data:xt.encodeFunctionData("sellNFT",[BigInt(s),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},k={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:s,paymentToken:S,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:E,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:y.toString()},tradeId:FN(e.tradeId),slippageBps:0,expiresAtMs:b+w,fee:{oracleFeeBps:0},artifact:{chainId:ne,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:s,paymentToken:S,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:A}};return jN(k,u)}async function IV(e={},t={}){if(Array.isArray(e.tokenIds)){let b=e.tokenIds.map(v=>vr(v)),w={kind:"anvil-inventory",chainId:ne,market:ee(e.market,"Anvil market"),collection:ee(e.collection,"NFT collection"),total:b.length,contentHash:bb("sha256").update(ms(b)).digest("hex")},S=Sb(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:b,total:b.length,scanned:b.length,complete:S.valid,continuation:S.valid?null:{offset:b.length,evidenceRequired:!0},completenessEvidence:S.evidence,completenessError:S.error}}let n=Tn(t),r=ee(e.market,"Anvil market"),o=sp(await n(ne,"eth_blockNumber",[])),i=await n(ne,"eth_getBlockByNumber",[o,!1]),s=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(s)||sp(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let a={blockHash:s,requireCanonical:!0},c=await de(n,r,xt,"inventoryLength",[],a),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>si)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${si}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>si))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${si}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:s,boundedMaximum:si};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await de(n,r,xt,"oldestTokenId",[],a))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let b=f.toString();g.add(b),h.push(b),f=BigInt((await de(n,r,xt,"getNextTokenId",[f],a))[0])}let y=h.length===l;return{ids:h,total:l,scanned:h.length,complete:y,continuation:y?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function kV(e){if(!String(e).startsWith("data:application/json"))return null;let t=String(e).indexOf(",");if(t<0)throw new Error("stonkbrokers: malformed metadata data URI");let n=String(e).slice(0,t),r=String(e).slice(t+1),o=/;base64/i.test(n)?Buffer.from(r,"base64").toString("utf8"):decodeURIComponent(r);if(Buffer.byteLength(o)>256e3)throw new Error("stonkbrokers: metadata exceeds 256KB");return JSON.parse(o)}async function _V(e,t,n){let r=Tn(n);try{let o=String((await de(r,e,Sn,"tokenURI",[BigInt(t)]))[0]),i=kV(o);if(i)return i;let s=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await x(s,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,lookupFn:n.lookupFn,untrustedUrl:!0,maxResponseBytes:256e3})}catch(o){if(n.allowRarityOfFallback===!1)throw o;let i=await de(r,e,Sn,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function VN(e,t){let n=String(t||"Stars").trim().toLowerCase(),r=(Array.isArray(e?.attributes)?e.attributes:[]).find(i=>String(i?.trait_type??i?.traitType??"").trim().toLowerCase()===n),o=Number(r?.value);return Number.isFinite(o)?o:null}function OV(e,t=[]){let n=Array.isArray(e?.attributes)?e.attributes:[];return t.every(r=>{let o=String(r?.traitType??r?.trait_type??"").trim().toLowerCase();if(!o)throw new Error("stonkbrokers: trait filter requires traitType");let i=n.find(u=>String(u?.trait_type??u?.traitType??"").trim().toLowerCase()===o),s=String(r?.op||"eq").trim().toLowerCase();if(s==="exists")return i!=null;if(i==null)return!1;let a=i.value;if(s==="eq")return String(a).toLowerCase()===String(r.value).toLowerCase();if(s==="in")return Array.isArray(r.values)&&r.values.some(u=>String(a).toLowerCase()===String(u).toLowerCase());let c=Number(a),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(s==="gte")return c>=l;if(s==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${s}`)})}async function cp(e={},t={}){let n=ee(e.market,"Anvil market"),r=ee(e.collection,"NFT collection"),o=await IV({...e,market:n},t),i=o.ids,s=Math.min(Math.max(Number(e.minStars??4)||4,1),5),a=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=Tn(t),p=(await Ge(i,a,async h=>{try{let g=await de(u,r,Sn,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(g[0])+1}}catch(g){return e.includeErrors?{tokenId:h,stars:null,error:String(g.message||g)}:null}})).filter(h=>h&&h.stars>=s),f=(await Ge(p,a,async h=>{try{let g=await Rc({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:g.available,quote:g,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(g){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(g.message||g)}:null}})).filter(Boolean).sort((h,g)=>Number(g.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(g.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:ne,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:f.length,candidates:f,exec:!1,readOnly:!0}}let l=(await Ge(i,a,async u=>{try{let[d,p]=await Promise.all([_V(r,u,t),Rc({market:n,collection:r,tokenId:u},t)]),m=VN(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?OV(d,f):e.includeAll===!0?!0:m!=null&&m>=s)?{tokenId:u,stars:m,traits:d.attributes||[],available:p.available,quote:p,decision:"WATCH",reason:"trait evidence is ranking-only until exact exit liquidity clears net-profit gates"}:null}catch(d){return e.includeErrors?{tokenId:u,available:!1,error:String(d.message||d)}:null}})).filter(Boolean).sort((u,d)=>Number(d.stars||0)-Number(u.stars||0)||(BigInt(u.tokenId)<BigInt(d.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-traits",chainId:ne,market:n,collection:r,scanned:i.length,inventoryTotal:o.total,inventoryScanned:o.scanned,complete:o.complete,truncated:!o.complete,continuation:o.continuation,completenessEvidence:o.completenessEvidence,completenessError:o.completenessError,count:l.length,candidates:l,exec:!1,readOnly:!0}}function WN(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function CN(e,t,n){if(!Object.hasOwn(e,t)||e[t]==null)return null;let r=Number(e[t]);if(!Number.isSafeInteger(r)||r<1||r>n)throw new Error(`stonkbrokers: ${t} must be an integer from 1 through ${n}`);return r}function GN(e={}){return{maxMarkets:CN(e,"maxMarkets",si),maxItemsPerMarket:CN(e,"maxItemsPerMarket",si)}}function KN(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Pc(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,s=Number.isSafeInteger(n)&&n>=0&&n===r,a=!!(s&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:s,complete:a,truncated:!a,continuation:a?null:t?.continuation??{offset:i}}}function YN(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(a=>a.complete===!0),s=t.filter(a=>a.complete!==!0).map(a=>({market:a.market,continuation:a.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?s.length?{markets:s}:null:{snapshotEvidenceRequired:!0,...s.length?{markets:s}:{}}:{marketOffset:n}}}async function XN(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=GN(e),o=await gs(e,t),i=KN(o,e,n),s=t.scanCollection||cp,a=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ge(i,a,async l=>{let u=WN(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await s(d,t);return{...l,status:"ok",scan:p,...Pc(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Pc(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:ne,marketCount:i.length,...YN(o,c),collectionCount:new Set(i.map(l=>l.collection)).size,scannedMarketCount:c.filter(l=>l.status==="ok").length,candidateCount:c.reduce((l,u)=>l+Number(u.scan?.count||0),0),markets:c,exec:!1,readOnly:!0}}async function JN(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=GN(e),o=await gs(e,t),i=o.snapshotCoverage?.complete===!0,s=KN(o,e,n),a=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||vb,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ge(s,l,async d=>{let p=WN(e,d.collection),m=String(p.slug||a[d.collection]||a[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Pc(d,null)};try{let f={...e,...p,market:d.market,collection:d.collection,slug:m,includeAll:p.includeAll??!p.raritySource};r!=null&&(f.maxItems=r);let h=await c(f,t),g=Pc(d,h);return{...d,decision:i&&g.complete&&h.arbCount>0?"ARB":"WATCH",slug:m,scan:h,...g}}catch(f){return{...d,decision:"WATCH",slug:m,reason:String(f.message||f).slice(0,240),...Pc(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:ne,marketCount:s.length,...YN(o,u),scannedMarketCount:u.filter(d=>d.scan).length,arbCount:i?u.reduce((d,p)=>d+(p.complete?Number(p.scan?.arbCount||0):0),0):0,markets:u,exec:!1,readOnly:!0}}function PN(e,t){return e>t?"ARB":"PASS"}async function NV(e={},t={}){let n=String(e.direction||""),r=Zt(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=ee(e.paymentToken,"Anvil payment token"),i={chainId:ne,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},s={...t,rpcCall:Tn(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||kN)({chainId:ne,tokenIn:Qt,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},s);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Qt,amountOutRaw:r.toString(),amountInWei:String(l.amountIn),source:`up33:${l.pool}`,venue:l.venue||"up33-v3",tickSpacing:l.tickSpacing,pool:l.pool,quoter:l.quoter,gasEstimate:l.gasEstimate};let u=await(t.uniV4QuoteExactOut||gh)({...i,tokenIn:Qt,tokenOut:o,amountOut:r.toString()},s);return{direction:n,paymentToken:o,quoteToken:Qt,amountOutRaw:r.toString(),amountInWei:String(u.amountIn),source:`uniswap-v4:${u.poolId}`,venue:u.venue||"uniswap-v4",fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks||null,poolId:u.poolId,gasEstimate:u.gasEstimate}}if(n!=="liquidate-exact-input")throw new Error("stonkbrokers: unsupported conversion direction");let a=await(t.up33QuoteExactIn||IN)({chainId:ne,tokenIn:o,tokenOut:Qt,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},s);if(!a?.error&&a?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Qt,amountInRaw:r.toString(),amountOutWei:String(a.amountOut),source:`up33:${a.pool}`,venue:a.venue||"up33-v3",tickSpacing:a.tickSpacing,pool:a.pool,quoter:a.quoter,gasEstimate:a.gasEstimate};let c=await(t.uniV4QuoteExactIn||Dr)({...i,tokenIn:o,tokenOut:Qt,amountIn:r.toString()},s);return{direction:n,paymentToken:o,quoteToken:Qt,amountInRaw:r.toString(),amountOutWei:String(c.amountOut),source:`uniswap-v4:${c.poolId}`,venue:c.venue||"uniswap-v4",fee:c.fee,tickSpacing:c.tickSpacing,hooks:c.hooks||null,poolId:c.poolId,gasEstimate:c.gasEstimate}}function RN(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=ee(e.quoteToken,"conversion quote token");if(n!==Qt)throw new Error("conversion quote token must be Robinhood WETH");if(!String(e.source||"").trim())throw new Error("conversion quote source required");if(t.direction==="acquire-exact-output"){if(String(e.amountOutRaw)!==t.amountRaw)throw new Error("conversion exact-output amount mismatch");let o=Zt(e.amountInWei,"conversion amountInWei");if(o<=0n)throw new Error("conversion amountInWei must be positive");return{...e,quoteToken:n,amountInWei:o.toString()}}if(String(e.amountInRaw)!==t.amountRaw)throw new Error("conversion exact-input amount mismatch");let r=Zt(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function TV(e,t){return Array.isArray(e)?e.find(n=>n?.route===t)||null:!e||typeof e!="object"?null:Object.hasOwn(e,"route")||Object.hasOwn(e,"chainId")?e:e[t]||e.routes?.[t]||null}function ms(e){return Array.isArray(e)?`[${e.map(ms).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ms(e[t])}`).join(",")}}`:JSON.stringify(e)}function QN(e,t){let n=String(t||"");if(n.length<16)throw new Error("stonkbrokers: gas evidence secret must be at least 16 characters");let r={...e};return delete r.mac,{...r,mac:gV("sha256",n).update(ms(r)).digest("hex")}}function CV(e,t){return QN(e,t)}function Sb(e,t,n,r){try{if(!e||typeof e!="object"||Array.isArray(e))throw new Error("completeness evidence is required");if(!r||String(r).length<16)throw new Error("trusted completeness attestation secret is unavailable");let o=String(e.mac||"").toLowerCase(),i=CV(e,r).mac,s=Buffer.from(o,"hex"),a=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||s.length!==a.length||!MN(s,a))throw new Error("completeness evidence authentication failed");for(let[u,d]of Object.entries(t))if(String(e[u])!==String(d))throw new Error(`completeness evidence ${u} mismatch`);let c=Number(e.quotedAtMs),l=Number(e.expiresAtMs);if(!Number.isFinite(c)||!Number.isFinite(l)||c>n||l<=n||l<=c)throw new Error("completeness evidence is stale or has invalid freshness bounds");if(!String(e.source||"").trim())throw new Error("completeness evidence source is required");return{valid:!0,evidence:e,error:null}}catch(o){return{valid:!1,evidence:null,error:String(o.message||o)}}}function PV(e,t,n,r){return Array.isArray(e)?e.find(o=>o?.route===t&&o?.leg===r&&(n==null||String(o?.calldataHash||"").toLowerCase()===n))||null:TV(e,t)}function gb(e,t,n,r,o,i){let s=PV(e,t,o.calldataHash,o.leg);try{if(!s||typeof s!="object")throw new Error(`${r} evidence is required`);if(Number(s.chainId)!==ne)throw new Error(`${r} evidence chainId mismatch`);if(String(s.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(s.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(s.source||"").trim())throw new Error(`${r} evidence source is required`);if(!i||String(i).length<16)throw new Error(`${r} trusted attestation secret is unavailable`);let a=String(s.mac||"").toLowerCase(),c=QN(s,i).mac,l=Buffer.from(a,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(a)||l.length!==u.length||!MN(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(s.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(s.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(s.blockHash||"").toLowerCase()!==o.blockHash||String(s.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(s.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&ee(s.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(s.quotedAtMs),p=Number(s.expiresAtMs);if(!Number.isFinite(d)||!Number.isFinite(p)||d>n||p<=n||p<=d)throw new Error(`${r} evidence is stale or has invalid freshness bounds`);let m=s.amountWei??s.amount??s.gasCostWei??s.gasPriceWei,f=Zt(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Sr(s.gasLimit,`${r} evidence gasLimit`),g=Sr(s.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let y=s.simulation;if(!y||typeof y!="object"||Array.isArray(y))throw new Error(`${r} simulation evidence is required`);if(Number(y.chainId)!==ne)throw new Error(`${r} simulation chainId mismatch`);if(String(y.route||"")!==t||String(y.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(y.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(y.blockHash||"").toLowerCase()!==o.blockHash||String(y.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(y.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(ee(y.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=ee(y.sender,`${r} simulation sender`),S=ee(y.owner,`${r} simulation owner`);if(!o.owner||w!==o.owner||S!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(Zt(y.valueWei,`${r} simulation valueWei`))!==String(Zt(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(y.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&ee(y.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(y.success!==!0||y.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(y.result??"")))throw new Error(`${r} simulation did not return a successful result`);let v=Number(y.quotedAtMs),I=Number(y.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(I)||v>n||I<=n||I<=v)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...s,amountWei:f.toString()},error:null}}catch(a){return{amount:null,evidence:null,error:String(a.message||a)}}}function LN(e){let t=ee(e,"OpenSea payment token");if(t!==wb&&t!==Qt)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function vb(e={},t={}){let n=await cp(e,t),r=Number(t.nowMs??Date.now());if(!Number.isFinite(r))throw new Error("stonkbrokers: opts.nowMs must be finite");let o=t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET,i=null;try{i=ee(e.owner,"execution owner")}catch{}let s=(y,b,w,S={})=>({calldataHash:y==null?null:String(y).toLowerCase(),blockNumber:String(b?.blockNumber??""),blockHash:String(b?.blockHash||"").toLowerCase(),leg:w,owner:i,...S}),a=(y,b,w,S,v)=>gb(e.gasEvidence??e.gasCostEvidence,y,r,`${b} gas`,s(w,S,b,v),o),c=(y,b)=>{let w=null;try{w=ee(y?.target,"conversion target")}catch{}let S=s(y?.calldataHash,y,"conversion",{target:w,valueWei:String(y?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(S.calldataHash)||!/^0x[0-9a-f]{64}$/.test(S.blockHash)||!/^\d+$/.test(S.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let v=gb(e.conversionGasEvidence??e.conversionGasCostEvidence,b,r,"conversion gas",S,o);if(v.amount!=null||y?.gasEstimate==null)return v;let I=gb(e.gasPriceEvidence,b,r,"gas price",{...S,leg:"conversion-gas-price"},o);if(I.amount==null)return{amount:null,evidence:null,error:I.error};let A=Zt(y.gasEstimate,"conversion gasEstimate");return{amount:A*I.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:b,leg:"conversion",gasEstimate:A.toString(),gasPriceEvidence:I.evidence},error:null}},l=(y,b,w,S,v)=>{try{let I=String(b?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(I))throw new Error("exact Seaport order hash is required");let A=ee(b?.protocolAddress,"Seaport protocol address"),E=String(b?.executionCalldataHash||"").toLowerCase(),k=/^0x[0-9a-f]{64}$/.test(E)?E:null,O=S==="seaport-fulfillment"&&v===wb?String(b?.priceWei??""):"0",T={orderHash:I,protocolAddress:A,target:A,valueWei:O},D=a(y,S,k,w,T);if(D.amount==null)throw new Error(D.error);if(D.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let X=D.evidence?.approvalRequired;if(typeof X!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof b?.approvalRequired=="boolean"&&b.approvalRequired!==X)throw new Error("Seaport approval requirement evidence mismatch");let H=[D];if(X){let j=String(b?.approvalCalldataHash||"").toLowerCase(),C=/^0x[0-9a-f]{64}$/.test(j)?j:null,B=S==="seaport-offer-acceptance"?n.collection:v;H.push(a(y,"seaport-approval",C,w,{...T,target:B,valueWei:"0"}))}if(v===wb){let j=y==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",C=String(b?.prerequisiteCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(C)?C:null,V=j==="wrap-native-to-weth"?String(b?.sellerNetWei??""):"0";H.push(a(y,j,B,w,{...T,target:Qt,valueWei:V}))}let $=H.find(j=>j.amount==null);if($)throw new Error($.error);return{amount:H.reduce((j,C)=>j+C.amount,0n),evidence:H.map(j=>j.evidence),error:null}}catch(I){return{amount:null,evidence:null,error:String(I.message||I)}}},u=Zt(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Qu,p=t.openSeaBestOffer||Zu,m=t.paymentTokenConversion||(y=>NV({...y,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await ap({market:n.market,collection:n.collection},t),h=[];for(let y of n.candidates){let b=null;try{b=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:y.tokenId},t)}catch{}let w=y.quote,S=yb(xt.encodeFunctionData("buySpecificNFT",[BigInt(y.tokenId),BigInt(w.totalCostRaw)])).toLowerCase(),v=a("anvil-to-opensea","anvil-call",S,w.evidence.attestation,{target:n.market,valueWei:w.nativeSwapFeeWei}),I=null,A=null;if(b)try{I=LN(b.paymentToken)}catch(C){A=String(C.message||C)}let E=A||!b?{amount:null,evidence:null,error:A||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",b,w.evidence.attestation,"seaport-offer-acceptance",I),k={route:"anvil-to-opensea",tokenId:y.tokenId,stars:y.stars,paymentToken:w.paymentToken,amountUnits:w.amountUnits,anvilTotalCostRaw:w.totalCostRaw,anvilBaseCostRaw:w.baseCostRaw,anvilFeeRaw:w.fees.totalFeeRaw,paymentTokenDecimals:w.paymentTokenDecimals,nativeSwapFeeWei:w.nativeSwapFeeWei,openSeaGrossOfferWei:b?.grossOfferWei==null?null:String(b.grossOfferWei),openSeaSellingValueWei:b?.sellerNetWei==null?null:String(b.sellerNetWei),openSeaFeeWei:b?.feeWei==null?null:String(b.feeWei),openSeaPaymentToken:I,gasCostWei:v.amount==null?null:v.amount.toString(),gasEvidence:v.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(b?.sellerNetWei==null||!w.available)h.push({...k,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(A)h.push({...k,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${A}`});else if(v.amount==null)h.push({...k,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${v.error}`});else if(E.amount==null)h.push({...k,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${E.error}`});else if(typeof m!="function")h.push({...k,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let C=RN(await m({chainId:ne,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:Qt}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),B=c(C,"anvil-to-opensea");if(B.amount==null)h.push({...k,conversion:C,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${B.error}`});else{let V=v.amount+E.amount+B.amount,K=BigInt(b.sellerNetWei)-BigInt(C.amountInWei)-BigInt(w.nativeSwapFeeWei)-V;h.push({...k,conversionGasCostWei:B.amount.toString(),conversionGasEvidence:B.evidence,totalExecutionGasWei:V.toString(),anvilCostInWethWei:C.amountInWei,conversion:C,netWei:K.toString(),decision:PN(K,u),reason:K>u?"exact inventory, exact conversion, native fee, gas, and exact OpenSea seller net clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(C){h.push({...k,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(C.message||C)}`})}let O=null;try{O=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:y.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!O)continue;let T=yb(xt.encodeFunctionData("sellNFT",[BigInt(y.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),D=a("opensea-to-anvil","anvil-call",T,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),X=null,H=null;try{X=LN(O.paymentToken)}catch(C){H=String(C.message||C)}let $=H?{amount:null,evidence:null,error:H}:l("opensea-to-anvil",O,f.evidence.attestation,"seaport-fulfillment",X),j={route:"opensea-to-anvil",tokenId:y.tokenId,stars:y.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(O.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:X,gasCostWei:D.amount==null?null:D.amount.toString(),gasEvidence:D.evidence,marketplaceGasCostWei:$.amount==null?null:$.amount.toString(),marketplaceGasEvidence:$.evidence,conversionGasCostWei:null};if(H){h.push({...j,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${H}`});continue}if(D.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${D.error}`});continue}if($.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${$.error}`});continue}if(typeof m!="function"){h.push({...j,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let C=RN(await m({chainId:ne,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:Qt}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),B=c(C,"opensea-to-anvil");if(B.amount==null)h.push({...j,conversion:C,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${B.error}`});else{let V=D.amount+$.amount+B.amount,K=BigInt(C.amountOutWei)-BigInt(O.priceWei)-BigInt(f.nativeSwapFeeWei)-V;h.push({...j,conversionGasCostWei:B.amount.toString(),conversionGasEvidence:B.evidence,totalExecutionGasWei:V.toString(),anvilPayoutInWethWei:C.amountOutWei,conversion:C,netWei:K.toString(),decision:PN(K,u),reason:K>u?"exact OpenSea listing, exact conversion, native fee, gas, and current Anvil payout clear the configured net-profit gate":"net does not clear configured minimum"})}}catch(C){h.push({...j,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(C.message||C)}`})}}let g=n.complete===!0?h:h.map(y=>y.decision==="ARB"?{...y,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:y);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:ne,collection:n.collection,market:n.market,slug:String(e.slug||""),gasCostWei:null,conversionGasCostWei:null,gasPriceWei:null,inventoryTotal:n.inventoryTotal,inventoryScanned:n.inventoryScanned,complete:n.complete,truncated:n.truncated,continuation:n.continuation,minNetWei:u.toString(),opportunities:g.sort((y,b)=>{let w=BigInt(y.netWei??"-1"),S=BigInt(b.netWei??"-1");return S>w?1:S<w?-1:0}),arbCount:g.filter(y=>y.decision==="ARB").length,exec:!1,readOnly:!0}}async function lp(e={},t={}){let n=Tn(t),r=vr(e.brokerTokenId,"brokerTokenId"),[o,i,s]=await Promise.all([de(n,wn.ammVault,NN,"quoteSpecificBuy",[BigInt(r)]),de(n,wn.ammVault,NN,"inventory",[BigInt(r)]),de(n,wn.nft,Sn,"ownerOf",[BigInt(r)])]),a={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:ee(s[0],"broker owner")===wn.ammVault},c=a.quoteAvailable&&a.inventory&&a.ownerIsAmm;return{provider:"stonkbrokers",chainId:ne,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:a,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function ZN(e,t){try{return ee((await de(t,wn.nft,Sn,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return ee((await de(t,wn.nft,Sn,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function eT(e={},t={}){let n=Tn(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ge(Array.isArray(e.candidates)?e.candidates:[],8,async s=>{let a=vr(s.brokerTokenId,"brokerTokenId"),c=vr(s.nestedTokenId,"nestedTokenId"),l=ee(s.tba,"TBA"),u=ee(s.nestedCollection,"nested collection"),d=VN({attributes:s.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([ZN(a,n),de(n,u,Sn,"ownerOf",[BigInt(c)]).then(g=>ee(g[0],"nested owner")),lp({brokerTokenId:a},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:a,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:s.traits||[],available:h,quote:f,decision:"WATCH",reason:h?"rarity is ranking-only until exit-liquidity evidence clears profit gates":"nested custody or parent availability is stale"}})).filter(Boolean).sort((s,a)=>a.stars-s.stars);return{provider:"stonkbrokers",chainId:ne,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function tT(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=ee(e.buyer,"buyer"),r=vr(e.brokerTokenId,"brokerTokenId"),o=Zt(e.maxTokenCostWei,"maxTokenCostWei"),i=Zt(e.maxEthFeeWei,"maxEthFeeWei"),s=await lp({brokerTokenId:r},t);if(!s.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(s.tokenCostWei)>o||BigInt(s.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return U({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:ne,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:wn.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:s.tokenCostWei,quotedEthFeeWei:s.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Lc(e={},t={}){let n=Tn(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?wn.overtimeBooster:wn.stockBooster,[i,s,a,c,l,u]=await Promise.all([de(n,o,co,"pendingEth"),de(n,o,co,"minDropWei"),de(n,o,co,"roundActive"),de(n,o,co,"currentRound"),de(n,o,co,"roundState").catch(()=>null),de(n,o,co,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(s[0]),m=!!a[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:ne,which:r,booster:o,pendingWei:d.toString(),minDropWei:p.toString(),roundActive:m,roundId:BigInt(c[0]).toString(),cursor:l?BigInt(l[2]).toString():null,remaining:l?BigInt(l[3]).toString():null,stockTokens:u?Array.from(u[0]).map(g=>ee(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function nT(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?wn.overtimeBooster:wn.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?co.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):co.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return U({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:ne,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:ne,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function rT(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(a=>vr(a,"brokerTokenId")):[],r=Tn(t),o=await Ge(n,8,async a=>{let[c,l]=await Promise.all([de(r,wn.nft,Sn,"ownerOf",[BigInt(a)]).then(u=>ee(u[0],"broker owner")),ZN(a,r)]);return{brokerTokenId:a,owner:c,tba:l}}),[i,s]=await Promise.all([Lc({which:"stock"},t),Lc({which:"overtime"},t).catch(a=>({error:String(a.message||a)}))]);return{provider:"stonkbrokers",chainId:ne,owner:e.owner?ee(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:s},exec:!1,readOnly:!0}}async function oT(e={},t={}){try{let n=await gs(e,t);return{ok:!0,chainId:ne,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:ne,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function iT(e={},t={}){try{let n=await Lc({which:"stock"},t);return{ok:!0,chainId:ne,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:ne,error:String(n.message||n).slice(0,180)}}}var ne,ip,yV,bV,wV,Qt,wb,si,SV,ON,vV,EV,wn,xt,xV,$N,NN,Sn,co,sT=_(()=>{q();Ki();Ui();_N();oe();ne=4663,ip="https://anvil.clutch.market",yV=`${ip}/api/markets/snapshot?chainId=${ne}`,bV=`${ip}/api/rpc?chainId=${ne}`,wV=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Qt="0x0bd7d308f8e1639fab988df18a8011f41eacad73",wb="0x0000000000000000000000000000000000000000",si=1e5,SV=256e3,ON=256,vV=3e4,EV=Object.freeze({"0x25482a6e453646f518c6194def85b0d477134f27":"0xdb1cb50fd93395644993895a2d1ee784973287453c16b1aa92716284fd265265","0x2554cad3d851381ec1a16b7bf7b4737ed46b40fe":"0x3a7563ef4a79e56aeab6e11b3fea2e319964a962379cb31beeedc4eaadf87cc1","0xd9206764cbc81c326ee6cace76c80089f6a0b360":"0x93cee896d680d2a0fb068413f39cf5b684dd70799dd9379f9ec35a2492d28b75","0x4e07aa3e0228cfe099462bc25f4789adb6038451":"0x04078324b6c9b861b6b59308c9327d73250992e1dd76546feccdf18e5e4d5fbc","0x714a07a5accc26a2799c50f3781612b4675129a1":"0x83ef76324d1c19aa59c76e5376814c0ed1071354d0c850110a94e91f35b4db28","0xfe0b24a3b4052ad78f10fa75a27118c3e54a00e6":"0x965e384f236132ec25d88662665408e49a443014a7fc58af92c03833df957f2f","0x2079c001b1a1e1be53b7463387510ddac2b45da2":"0x6c9c976c7cbd34e17e14189ccd487be9b541107885b86e28aa7ef1a033b7bb9f","0x147ef077bfbe4bbec3f267c358073c449cbb4b32":"0x5064f645f51ece3be2e5a6624c9cc6d508ba1544fef45455bbc7a906d07e6a4f","0xe6fa04e189ea271f0311162afc839443c51fe920":"0x467b919a9109c34d63ce40f8fcb4c9f33bccb45e7f6a027685a22228882553e1","0x492d80f0009cd250ceabcfcfb1c5c1de40f98ef6":"0x5da29cfd5f8f686998564a8ef0b89156c9f75d381c80ee5886b617385346e928","0x5bdf7bd9b20bb7c50061e4f4748725cd341d1f45":"0x94c052d894b557ac5b20295d74ee82c2a34b127cf148ba93e7596dc0cab549eb","0xdd59536f394c4b589e695f5921723b89ea479379":"0xa2c5533b1f8a41d863fa787dec42e51d57d8d77343555e5b0a9ce18fb51361ef","0xf29aa29804033d5fc9a16ad6f864e495d950acb4":"0xec8d77482cbd2f550345d67fc7f0f317e349ffd148a06b05237c9efb82b61900","0x26c41f7c732cf27b9c687f88ae4c9dbfed4f9ac4":"0xce7a9041ec2808643506b6327fed3d46b07dca344ff7b32e110d28a8fe6c712a","0x6109ed398827f06ba2ccd763a597ae2e0586b349":"0x625695c20dccfca1c2db898d09b4f56bde23b6ae0b9d76adc05573d280f320b0","0x95aa9e2130016e7ffe8828a4e1e2047441704cfd":"0xded628a34f602a70f5dc4d34974a2107ad5539be3428a34083aeddce8b2f46c4"}),wn=Object.freeze({chainId:ne,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),xt=new hs(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function inventoryLength() view returns (uint256)","function oldestTokenId() view returns (uint256)","function getNextTokenId(uint256 tokenId) view returns (uint256)","function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),xV=new hs(["function allowance(address owner,address spender) view returns (uint256)"]),$N=new hs(["function decimals() view returns (uint8)"]),NN=new hs(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),Sn=new hs(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)","function tokenURI(uint256 tokenId) view returns (string)","function rarityOf(uint256 tokenId) view returns (uint8)","function tokenWallet(uint256 tokenId) view returns (address)","function predictWallet(uint256 tokenId) view returns (address)"]),co=new hs(["function pendingEth() view returns (uint256)","function minDropWei() view returns (uint256)","function roundActive() view returns (bool)","function currentRound() view returns (uint256)","function roundState() view returns (uint256 roundId,bool active,uint256 cursor,uint256 remaining,uint256[3] amounts,uint256[3] paid)","function getStockTokens() view returns (address[3])","function startDropPublic(uint256 minOutBps)","function continueDrop(uint256 batchSize)"])});import{createHash as LV}from"node:crypto";function Mc(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Error(`erc8004: ${t} must be a plain object`);return e}function Eb(e,t,n){for(let r of Object.keys(e)){if(UV.test(r))throw new Error(`erc8004: secret-looking field ${n}.${r} forbidden`);if(!t.has(r))throw new Error(`erc8004: unknown field ${n}.${r}`)}}function ys(e,t,n,{empty:r=!1}={}){if(typeof e!="string"||!r&&e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`erc8004: malformed or oversized ${t}`);return e}function cT(e,t,{service:n=!1}={}){let r=ys(e,t,2048);if(/^(?:javascript|file):/i.test(r))throw new Error(`erc8004: unsafe ${t} URI`);if(n&&(/^[^\s@]+@[^\s@]+$/.test(r)||/^[\w-]+(?:\.[\w-]+)*\.eth$/i.test(r))||n&&/^did:[a-z0-9]+:[^\s]+$/i.test(r)||/^(?:https|ipfs):\/\/[^\s]+$/i.test(r)||/^data:image\/(?:png|jpeg|gif|webp|svg\+xml);base64,[a-z0-9+/]+=*$/i.test(r)&&r.length<=16384)return r;throw new Error(`erc8004: ${t} must use a safe URI scheme`)}function xb(e,t){let n=String(e||"");if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`erc8004: ${t} must be a 20-byte address`);return n.toLowerCase()}function dp(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function Ab(e){if(typeof e!="number"&&typeof e!="bigint"||e<0||!Number.isSafeInteger(Number(e)))throw new Error("erc8004: agentId must be a non-negative safe integer");return BigInt(e)}function Ib(e){let t=dp(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return xb(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function uT(){let e=[];try{let t=dp(process.env.ORACLE_ERC8004_CHAIN_ID);Ib(t),e=[t]}catch{}return{provider:"erc8004-identity",status:e.length>0?"configured":"unconfigured",standardStatus:"draft",custody:"public-keyless",signingReady:!1,broadcastReady:!1,configuredChainIds:e}}function qV(e){return JSON.parse(JSON.stringify(e))}function pp(e){let t=Mc(e,"registration file");if(Eb(t,$V,"registration"),t.type!==up)throw new Error("erc8004: registration-v1 type required");let n={type:up,name:ys(t.name,"name",128),description:ys(t.description,"description",4096),image:cT(t.image,"image")};if(!Array.isArray(t.services)||t.services.length>32)throw new Error("erc8004: services must be a bounded array");let r=new Set;if(n.services=t.services.map((s,a)=>{let c=Mc(s,`services[${a}]`);Eb(c,BV,`services[${a}]`);let l=ys(c.name,`services[${a}].name`,64);if(/^(?:x|twitter)$/i.test(l)||/(?:^|\.)x\.com(?:\/|$)|twitter\.com/i.test(String(c.endpoint)))throw new Error("erc8004: X/Twitter services are excluded");let u=l.toLowerCase();if(r.has(u))throw new Error(`erc8004: duplicate service ${l}`);r.add(u);let d={name:l,endpoint:cT(c.endpoint,`services[${a}].endpoint`,{service:!0})};c.version!=null&&(d.version=ys(c.version,`services[${a}].version`,64));for(let p of["skills","domains"])if(c[p]!=null){if(!Array.isArray(c[p])||c[p].length>64||c[p].some(m=>typeof m!="string"||m.length>128))throw new Error(`erc8004: malformed services[${a}].${p}`);d[p]=[...c[p]]}return d}),typeof t.x402Support!="boolean"||typeof t.active!="boolean")throw new Error("erc8004: x402Support and active must be boolean");if(n.x402Support=t.x402Support,n.active=t.active,!Array.isArray(t.registrations)||t.registrations.length>32)throw new Error("erc8004: registrations must be a bounded array");let o=new Set;if(n.registrations=t.registrations.map((s,a)=>{let c=Mc(s,`registrations[${a}]`);Eb(c,DV,`registrations[${a}]`);let l=Ab(c.agentId),u=/^eip155:([1-9][0-9]*):(0x[0-9a-fA-F]{40})$/.exec(String(c.agentRegistry||""));if(!u)throw new Error(`erc8004: malformed registrations[${a}].agentRegistry`);let d=`eip155:${Number(u[1])}:${u[2].toLowerCase()}`,p=`${d}:${l}`;if(o.has(p))throw new Error("erc8004: duplicate registration");return o.add(p),{agentId:Number(l),agentRegistry:d}}),t.supportedTrust!=null){if(!Array.isArray(t.supportedTrust)||t.supportedTrust.length>aT.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(s=>!aT.has(s)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>FV)throw new Error("erc8004: registration metadata oversized");return qV(n)}function jV(e){if(Mc(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==up)throw new Error("erc8004: registration-v1 type required");return pp({type:up,...e})}function HV(e){let t=pp(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function $c(e){return BigInt(e).toString(16).padStart(64,"0")}function dT(e){let t=Buffer.from(e,"utf8").toString("hex");return`${$c(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function zV(e){return`${ai.register}${$c(32)}${dT(e)}`}function VV(e,t){return`${ai.setAgentURI}${$c(e)}${$c(64)}${dT(t)}`}function WV(e,t){return`${e}${$c(t)}`}function GV(e){return LV("sha256").update(e,"utf8").digest("hex")}function kb(e,t){Mc(e,"arguments");for(let n of Object.keys(e))if(!t.has(n))throw new Error(`erc8004: caller field ${n} is forbidden or unknown`)}function pT(e,t,{kind:n,uri:r,selector:o,data:i,id:s}){let a=dp(e.chainId),c=xb(e.owner,"owner"),l=Ib(a),u=Number(t?.nowMs??Date.now());return U({chainId:a,registry:l,owner:c,taker:c,...s==null?{}:{agentId:Number(s)},agentURI:r,agentURIHash:GV(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:a,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function fT(e={},t={}){kb(e,new Set(["chainId","owner","registration"]));let n=HV(jV(e.registration));return pT(e,t,{kind:"erc8004-register",uri:n,selector:ai.register,data:zV(n)})}function mT(e={},t={}){kb(e,new Set(["chainId","owner","agentId","agentURI"]));let n=Ab(e.agentId),r=hT(e.agentURI);return pT(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:ai.setAgentURI,data:VV(n,r),id:n})}function hT(e){let t=ys(e,"agentURI",9e4);if(/^(?:javascript|file):/i.test(t))throw new Error("erc8004: unsafe agentURI");if(/^(?:https|ipfs):\/\/[^\s]+$/i.test(t))return t;let n="data:application/json;base64,";if(!t.startsWith(n)||t.length>9e4)throw new Error("erc8004: agentURI must use https, ipfs, or base64 JSON data URI");let r=t.slice(n.length);if(!/^[A-Za-z0-9+/]+={0,2}$/.test(r)||r.length%4!==0)throw new Error("erc8004: malformed agentURI base64");let o;try{o=JSON.parse(Buffer.from(r,"base64").toString("utf8"))}catch{throw new Error("erc8004: malformed agentURI JSON")}return pp(o),t}function lT(e,t){if(!/^0x[0-9a-fA-F]{64}$/.test(e)||!/^0{24}/.test(e.slice(2)))throw new Error(`erc8004: malformed ${t} RPC result`);return xb(`0x${e.slice(-40)}`,t)}function KV(e,t){if(!/^0x[0-9a-fA-F]*$/.test(e)||e.length<130)throw new Error(`erc8004: malformed ${t} RPC result`);let n=e.slice(2),r=Number.parseInt(n.slice(0,64),16)*2,o=Number.parseInt(n.slice(r,r+64),16)*2;if(!Number.isSafeInteger(r)||!Number.isSafeInteger(o)||r+64+o>n.length)throw new Error(`erc8004: malformed ${t} RPC bounds`);return Buffer.from(n.slice(r+64,r+64+o),"hex").toString("utf8")}async function gT(e={},t={}){kb(e,new Set(["chainId","agentId"]));let n=dp(e.chainId),r=Ab(e.agentId),o=Ib(n);if(typeof t.rpcCall!="function")throw new Error("erc8004: reviewed rpcCall function required");let i=async d=>t.rpcCall("eth_call",[{to:o,data:WV(d,r)},"latest"]),[s,a,c]=await Promise.all([i(ai.ownerOf),i(ai.tokenURI),i(ai.getAgentWallet)]),l=hT(KV(a,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=pp(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:lT(s,"owner"),tokenURI:l,agentURI:l,agentWallet:lT(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}var up,MV,ai,$V,BV,DV,aT,UV,FV,yT=_(()=>{oe();up="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",MV=Object.freeze([{name:"register",signature:"register(string)",selector:"0xf2c298be"},{name:"setAgentURI",signature:"setAgentURI(uint256,string)",selector:"0x0af28bd3"},{name:"ownerOf",signature:"ownerOf(uint256)",selector:"0x6352211e"},{name:"tokenURI",signature:"tokenURI(uint256)",selector:"0xc87b56dd"},{name:"getAgentWallet",signature:"getAgentWallet(uint256)",selector:"0x00339509"}]),ai=Object.freeze(Object.fromEntries(MV.map(e=>[e.name,e.selector]))),$V=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),BV=new Set(["name","endpoint","version","skills","domains"]),DV=new Set(["agentId","agentRegistry"]),aT=new Set(["reputation","crypto-economic","tee-attestation"]),UV=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,FV=64*1024});async function wT(e={}){let t={chainId:bT,rpc:null,dex:null};try{t.rpc=await Pi(bT,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Sa("HYPE",e),r=(n.pairs||[]).filter(o=>/hyper|hl|hyperevm/i.test(String(o.chainId||o.chain||"")));t.dex={ok:!0,hypePairs:r.length||(n.pairs||[]).length,sample:(r[0]||n.pairs?.[0])?.pairAddress||null}}catch(n){t.dex={ok:!1,error:String(n.message||n).slice(0,120)}}return{ok:!!(t.rpc?.ok||t.dex?.ok),...t}}async function ST(e="HYPE",t={}){let r=(await Sa(e,t)).pairs||[],o=r.filter(i=>/hyper|hl|hyperevm/i.test(String(i.chainId||"")));return{query:e,hyperPairs:o,allPairs:r.slice(0,20),count:o.length||r.length}}async function vT(e,t={}){return jn(e,t)}var bT,ET=_(()=>{nr();Ne();bT=999});function xT(e={}){return Me({provider:"magiceden",defaultUrl:JV,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function ws(e={}){return xT(e).baseUrl}function ci(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function Ss(e={}){let t=ci(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},xT(e).trusted)}function _b(e){let t=String(e||"").trim();if(!/^[a-z0-9_]{1,64}$/i.test(t))throw new Error("magiceden: symbol must be a collection slug");return t}function bs(e,t){if(typeof e=="number"){if(!Number.isFinite(e)||e<=0)throw new Error(`magiceden: ${t} must be a positive number`);return e}let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`magiceden: ${t} must be a plain decimal number (no hex, exponent, or sign)`);let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new Error(`magiceden: ${t} must be a positive number`);return r}function QV(e){let t=[e?.price,e?.mintPrice,e?.priceSol,e?.v0?.price,e?.launchStageInfo?.price,e?.stage?.price];for(let n of t){if(n==null)continue;let r=Number(n);if(Number.isFinite(r)&&r>=0)return r}return e?.isFree===!0?0:null}function ZV(e){return Math.round(bs(e,"priceSol")*Bc)}function e7(e){if(e==null||e==="")throw new Error("magiceden: listing expiry is required and must be in the future");let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("magiceden: expiry must be a future Unix timestamp in seconds");if(t<=Math.floor(Date.now()/1e3))throw new Error("magiceden: expiry must be in the future");return t}function t7({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function n7(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=t7(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function AT(e={}){try{let t=await Ob({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!ci(e),readTier:"keyless",prepareTier:ci(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!ci(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Ob(e={},t={}){let n=_b(e.symbol||e.collection),r=await x(`${ws(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Number(r?.floorPrice??0);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,floorPriceLamports:o||null,floorPriceSol:o?o/Bc:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Bc:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Bc:null,exec:!1,raw:r}}function IT(e={}){let t=Number(e.price??0);return{tokenMint:e.tokenMint??null,tokenATA:e.tokenAddress??null,seller:e.seller??null,sellerReferral:e.sellerReferral??null,auctionHouse:e.auctionHouse??null,pdaAddress:e.pdaAddress??null,priceSol:t||null,priceLamports:t?Math.round(t*Bc):null,tokenSize:e.tokenSize??1}}async function kT(e={},t={}){let n=_b(e.symbol||e.collection),r=Math.min(Math.max(Number(e.limit??20)||20,1),100),o=Math.max(Number(e.offset??0)||0,0),i=new URL(`${ws(t)}/collections/${encodeURIComponent(n)}/listings`);i.searchParams.set("offset",String(o)),i.searchParams.set("limit",String(r)),e.sort&&i.searchParams.set("sort",String(e.sort));let s=await x(i.toString(),{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=(Array.isArray(s)?s:[]).map(IT);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:a.length,listings:a,exec:!1}}async function _T(e={},t={}){let n=Ce(e.tokenMint||e.mint,"tokenMint"),r=await x(`${ws(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(IT);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function OT(e={},t={}){if(!ci(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=Ce(e.buyer||e.userPublicKey,"buyer"),r=Ce(e.seller,"seller"),o=Ce(e.tokenMint,"tokenMint"),i=Ce(e.tokenATA||e.tokenAddress,"tokenATA"),s=Ce(e.auctionHouse,"auctionHouse"),a=bs(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?a:bs(e.maxPriceSol,"maxPriceSol");if(a>c)throw new Error(`magiceden: listing price ${a} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${ws(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",s),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await x(l.toString(),{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});hr("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: buy_now returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return U({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-buy",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,seller:r,tokenMint:o,priceSol:a,maxPriceSol:c,lamports:ZV(a),transaction:p,transactionEncoding:"base64",raw:u})}async function fp(e={},t={}){if(!ci(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=Ce(e.seller||e.userPublicKey,"seller"),r=Ce(e.tokenMint,"tokenMint"),o=Ce(e.tokenATA||e.tokenAddress,"tokenATA"),i=Ce(e.auctionHouse,"auctionHouse"),s=bs(e.priceSol??e.price,"priceSol"),a=e7(e.expiry),c=n7(e,{tokenMint:r,priceSol:s,expiry:a}),l=new URL(`${ws(t)}/instructions/sell`);l.searchParams.set("seller",n),l.searchParams.set("auctionHouseAddress",i),l.searchParams.set("tokenMint",r),l.searchParams.set("tokenAccount",o),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",Ce(e.sellerReferral,"sellerReferral")),a!=null&&l.searchParams.set("expiry",String(a));let u=await x(l.toString(),{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});hr("magiceden",u);let d=u?.v0?.tx?.data??u?.tx?.data??null;if(!Array.isArray(d))throw u?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: sell returned no unsigned transaction payload");let p=Buffer.from(d).toString("base64");return U({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-list",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,seller:n,tokenMint:r,priceSol:s,expiry:a,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function NT(e={},t={}){if(!ci(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=Ce(e.buyer||e.userPublicKey,"buyer"),r=_b(e.symbol||e.collection);if(e.maxPriceSol==null)throw new Error("magiceden: maxPriceSol is required to prepare a mint \u2014 an uncapped mint has no spend ceiling");let o=bs(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:bs(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let s=new URL(`${ws(t)}/instructions/mint`);s.searchParams.set("symbol",r),s.searchParams.set("wallet",n),s.searchParams.set("nftAmount",String(i));let a=await x(s.toString(),{headers:Ss(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=QV(a);if(c==null)throw new Error("magiceden: mint price not present in the API response \u2014 refusing to prepare an unverifiable spend");let l=c*i;if(l>o)throw new Error(`magiceden: mint cost ${l} SOL exceeds maxPriceSol cap ${o} SOL`);hr("magiceden",a);let u=a?.v0?.tx?.data??a?.tx?.data??null;if(!Array.isArray(u))throw a?.txSigned?new Error("magiceden: refused a pre-signed transaction payload from the API"):new Error("magiceden: mint returned no unsigned transaction payload");let d=Buffer.from(u).toString("base64");return U({provider:"magiceden-sol",chain:"solana-mainnet-beta",kind:"nft-mint",prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,buyer:n,symbol:r,nftAmount:i,priceSol:c,totalSol:l,maxPriceSol:o,transaction:d,transactionEncoding:"base64",raw:a})}var JV,Bc,Nb=_(()=>{q();Zo();vt();oe();kd();JV="https://api-mainnet.magiceden.dev/v2",Bc=1e9});function s7(e={}){return e.exchangeUrl?e.exchangeUrl:process.env.HL_EXCHANGE_URL?process.env.HL_EXCHANGE_URL:e.testnet||process.env.HL_TESTNET==="1"?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange"}function Uc(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function xs(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`hl-staking: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Dc(e,t="amount"){let n=String(e??"").trim();if(!/^\d+(\.\d+)?$/.test(n))throw new Error(`hl-staking: ${t} must be a positive decimal HYPE amount`);let[r,o=""]=n.split(".");if(o.length>vs)throw new Error(`hl-staking: ${t} has more than ${vs} decimals`);let i=BigInt(r)*Tb+BigInt((o+"0".repeat(vs)).slice(0,vs)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>i7)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Es(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Er(e){let t=BigInt(String(e||"0")),n=t/Tb,r=(t%Tb).toString().padStart(vs,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function CT(e={}){try{let t=await Pb(e);return{ok:t.count>0,provider:"hl-staking",chain:Uc(e),validators:t.count,exec:!1}}catch(t){return{ok:!1,provider:"hl-staking",error:String(t?.message||t).slice(0,160),exec:!1}}}async function Pb(e={}){let t=await Te({type:"validatorSummaries"},e),r=(Array.isArray(t)?t:[]).map(o=>({validator:o.validator??null,name:o.name??null,isActive:o.isActive??null,isJailed:o.isJailed??null,commission:o.commission??null,stake:o.stake??null,nRecentBlocks:o.nRecentBlocks??null}));return{provider:"hl-staking",count:r.length,validators:r,exec:!1,raw:t}}async function Rb(e={},t={}){let n=xs(e.user||e.address,"user"),r=await Te({type:"delegatorSummary",user:n},t);return{provider:"hl-staking",user:n,delegatedWei:r?.delegated??null,undelegatedWei:r?.undelegated??null,totalPendingWithdrawalWei:r?.totalPendingWithdrawal??null,nPendingWithdrawals:r?.nPendingWithdrawals??null,delegatedHype:r?.delegated!=null?String(r.delegated):null,undelegatedHype:r?.undelegated!=null?String(r.undelegated):null,exec:!1,raw:r}}async function Lb(e={},t={}){let n=xs(e.user||e.address,"user"),r=await Te({type:"delegations",user:n},t),o=Array.isArray(r)?r:[];return{provider:"hl-staking",user:n,count:o.length,delegations:o.map(i=>({validator:i.validator??null,amount:i.amount??null,lockedUntilTimestamp:i.lockedUntilTimestamp??null})),exec:!1,raw:r}}async function PT(e={},t={}){let n=xs(e.user||e.address,"user"),r=await Te({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function RT(e={},t={}){let n=xs(e.user||e.address,"user"),r=await Te({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Mb(e={}){let t=e.nonce==null?Date.now():Number(e.nonce);if(!Number.isInteger(t)||t<=0)throw new Error("hl-staking: nonce must be a positive integer ms timestamp");return t}function mp(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||o7)}function a7(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(mp(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function $b({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:s,caps:a,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Uc(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:s7(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:a7(i),types:n,primaryType:r,message:o},caps:a||null,notes:s,exec:!1};try{l.localSignerEnvelope=yd(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,U(l,{provider:"hl-staking",kind:e})}function LT(e={},t={}){let n=Dc(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Dc(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Er(n)} HYPE exceeds maxHype cap ${Er(r)} HYPE`);let o=Mb(e),i=Uc(t),s={type:"cDeposit",hyperliquidChain:i,signatureChainId:mp(t),wei:Es(n),nonce:o};return $b({kind:"hype-stake-deposit",action:s,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:Es(n),nonce:o},opts:t,args:e,caps:{amountHype:Er(n),maxHype:r?Er(r):null},notes:["Moves HYPE from your Hyperliquid spot balance into your staking balance.","Staking balance still earns nothing until it is delegated to a validator.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function MT(e={},t={}){let n=Dc(e.amountHype??e.amount,"amountHype"),r=Mb(e),o=Uc(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:mp(t),wei:Es(n),nonce:r};return $b({kind:"hype-stake-withdraw",action:i,primaryType:"HyperliquidTransaction:CWithdraw",types:{"HyperliquidTransaction:CWithdraw":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:o,wei:Es(n),nonce:r},opts:t,args:e,caps:{amountHype:Er(n)},notes:[`Starts the ${TT} day unstaking queue back to spot. The HYPE is not liquid during the queue.`,"Undelegate from the validator first: only undelegated staking balance can be withdrawn.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}function $T(e={},t={}){let n=xs(e.validator,"validator"),r=Dc(e.amountHype??e.amount,"amountHype"),o=Object.prototype.hasOwnProperty.call(e,"isUndelegate"),i=Object.prototype.hasOwnProperty.call(e,"undelegate");if(o&&typeof e.isUndelegate!="boolean")throw new Error("hl-staking: isUndelegate must be a boolean");if(i&&typeof e.undelegate!="boolean")throw new Error("hl-staking: undelegate must be a boolean");if(o&&i&&e.isUndelegate!==e.undelegate)throw new Error("hl-staking: isUndelegate and undelegate must match");let s=o?e.isUndelegate:i?e.undelegate:!1,a=e.maxHype==null?null:Dc(e.maxHype,"maxHype");if(!s&&a&&BigInt(r)>BigInt(a))throw new Error(`hl-staking: delegate amount ${Er(r)} HYPE exceeds maxHype cap ${Er(a)} HYPE`);let c=Mb(e),l=Uc(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:mp(t),validator:n,wei:Es(r),isUndelegate:s,nonce:c};return $b({kind:s?"hype-undelegate":"hype-delegate",action:u,primaryType:"HyperliquidTransaction:TokenDelegate",types:{"HyperliquidTransaction:TokenDelegate":[{name:"hyperliquidChain",type:"string"},{name:"validator",type:"address"},{name:"wei",type:"uint64"},{name:"isUndelegate",type:"bool"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:l,validator:n,wei:Es(r),isUndelegate:s,nonce:c},opts:t,args:e,caps:{amountHype:Er(r),maxHype:a?Er(a):null,validator:n},notes:s?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Cb} day validator lockup before they can be undelegated.`,"Oracle prepared this. Your wallet signs it. Nothing was submitted."]:["Delegates staking balance to the chosen validator so it starts earning.",`Once delegated, the stake is locked with that validator for ${Cb} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function BT(e={},t={}){let n=xs(e.user||e.address,"user"),r=await Rb({user:n},t),o=await Lb({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:TT,validatorLockupDays:Cb,exec:!1}}var vs,Tb,o7,TT,Cb,i7,DT=_(()=>{oe();ny();q();Xt();vs=8,Tb=10n**BigInt(vs),o7="0xa4b1",TT=7,Cb=1,i7=2n**64n-1n});async function Bb(e={}){let t=Date.now();try{let n=await _n(e);return{provider:"hl-markets",ok:!0,venue:"hyperliquid",symbols:Object.keys(n||{}).length,latencyMs:Date.now()-t}}catch(n){return{provider:"hl-markets",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}function At(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function d7(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function As(e={},t={}){let[n,r]=await Promise.all([jt(t),_n(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],a=o.map((c,l)=>{let u=i[l]||{},d=At(u.markPx),p=At(u.prevDayPx),m=At(u.openInterest),f=At(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:At(u.oraclePx),midPx:At(u.midPx)??At(r?.[c.name]),prevDayPx:p,change24hPct:d7(d,p),dayNtlVolumeUsd:At(u.dayNtlVlm),premium:At(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(l7/u7)*100,openInterestCoin:m,openInterestUsd:m==null||d==null?null:m*d,maxLeverage:c.maxLeverage??null,szDecimals:c.szDecimals??null,isDelisted:!!c.isDelisted}}).filter(c=>!c.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:a.length,markets:a,totals:{openInterestUsd:a.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:a.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function UT(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await As(e,t),s=(a,c=-1)=>r.filter(l=>l[a]!=null).sort((l,u)=>(l[a]-u[a])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:s("change24hPct"),losers:s("change24hPct",1),byVolume:s("dayNtlVolumeUsd"),byOpenInterest:s("openInterestUsd"),fundingHighest:s("fundingRateAprPct"),fundingLowest:s("fundingRateAprPct",1)}}async function FT(e={},t={}){let n=String(e.coin||e.symbol||"").trim().toUpperCase();if(!n)throw new Error("hl-markets: coin required");let r=String(e.interval||"1h"),o=Number(e.lookbackMs)||1440*60*1e3,i=Date.now(),s=i-o,[a,c,l]=await Promise.all([As({},t),cd({coin:n,interval:r,startTime:s,endTime:i},t).catch(()=>[]),es(n,t).catch(()=>null)]),u=a.markets.find(h=>h.coin===n)||null;if(!u)throw new Error(`hl-markets: ${n} is not a listed perp`);let d=(Array.isArray(c)?c:[]).map(h=>({t:Number(h.t),open:At(h.o),high:At(h.h),low:At(h.l),close:At(h.c),volume:At(h.v)})),p=l?.levels??[],m=At(p?.[0]?.[0]?.px),f=At(p?.[1]?.[0]?.px);return{provider:"hl-info",venue:"hyperliquid",kind:"coin-datapoints",asOfMs:Date.now(),coin:n,market:u,book:{bestBid:m,bestAsk:f,spread:m==null||f==null?null:f-m,spreadBps:m==null||f==null||f===0?null:(f-m)/f*1e4},candles:{interval:r,count:d.length,series:d}}}async function qT(e={},t={}){let n=await ld(t),r=n?.tokens??[],o=n?.universe??[];return{provider:"hl-info",venue:"hyperliquid",kind:"spot-datapoints",asOfMs:Date.now(),tokenCount:r.length,pairCount:o.length,tokens:r.map(i=>({name:i.name,index:i.index,szDecimals:i.szDecimals??null,weiDecimals:i.weiDecimals??null,tokenId:i.tokenId??null,isCanonical:!!i.isCanonical})),pairs:o.map(i=>({name:i.name,index:i.index,tokens:i.tokens,isCanonical:!!i.isCanonical}))}}var l7,u7,Db=_(()=>{Xt();l7=24*365,u7=8});var Fc,jT=_(()=>{Fc=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"})});import{Interface as Ub,getAddress as YT,isAddress as f7}from"ethers";function ks(e){let t=Number(e??42161),n=zT[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(zT).join(", ")})`);return{chainId:t,...n}}function gp(e,t={}){let n=ks(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function vn(e,t){if(!f7(e))throw new Error(`${t} must be a valid EVM address`);return YT(e)}function he(e){return YT(e).toLowerCase()}function Is(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function li(e,t){let n;try{n=BigInt(String(e??"0"))}catch{throw new Error(`${t} must be an integer string`)}if(n<0n)throw new Error(`${t} must be non-negative`);return n}function y7(e,t=50){let n=Number(e??t);if(!Number.isFinite(n)||n<0||n>100)throw new Error("gmx maxSlippageBps must be 0..100");return Math.floor(n)}function b7(e){let t=String(e||"marketIncrease").trim();if(!(t in WT))throw new Error(`gmx unsupported orderType ${t}`);if(!["marketIncrease","marketDecrease"].includes(t))throw new Error("gmx prepare currently supports marketIncrease and marketDecrease only");return{key:t,code:WT[t]}}function w7(e){let t=String(e||"noSwap").trim();if(!(t in GT))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:GT[t]}}function S7(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function v7(e,t){let n=he(t);return e.find(r=>he(r.marketToken||r.market||r.address)===n)||null}function E7(e,t){let n=he(t);return e.find(r=>he(r.tokenAddress||r.address)===n)||null}function x7({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Is(e?.minPrice,"gmx minPrice"),i=Is(e?.maxPrice,"gmx maxPrice"),s=BigInt(r),a=10000n;return n==="marketIncrease"?(t?i*(a+s)/a:o*(a-s)/a).toString():(t?o*(a-s)/a:i*(a+s)/a).toString()}function A7(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function I7(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Vn(e,t,n=r=>r){let o=Array.from(e?.items||e?.[0]||[]).find(i=>String(i?.key??i?.[0]??"")===t);return o?n(o.value??o[1]):null}function k7(e={}){let t=e.addressItems||e[0],n=e.uintItems||e[1],r=e.boolItems||e[3],o=e.bytes32Items||e[4],i=e.stringItems||e[6];return{account:Vn(t,"account",s=>he(s)),market:Vn(t,"market",s=>he(s)),initialCollateralToken:Vn(t,"initialCollateralToken",s=>he(s)),key:Vn(o,"key",s=>String(s).toLowerCase()),reason:Vn(i,"reason",s=>String(s)),sizeDeltaUsd:Vn(n,"sizeDeltaUsd",s=>BigInt(s).toString()),initialCollateralDeltaAmount:Vn(n,"initialCollateralDeltaAmount",s=>BigInt(s).toString()),executionFee:Vn(n,"executionFee",s=>BigInt(s).toString()),acceptablePrice:Vn(n,"acceptablePrice",s=>BigInt(s).toString()),isLong:Vn(r,"isLong",s=>!!s)}}function _7(e={},t){if(he(e.address)!==he(t.eventEmitter))return null;let n;try{n=h7.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=g7[r];if(!o)return null;let i=k7(n.args.eventData||{}),s=(i.key||String(n.args.topic1||"")).toLowerCase(),a=i.account||I7(n.args.topic2);return{eventName:r,status:o,orderKey:s,account:a?he(a):null,market:i.market,initialCollateralToken:i.initialCollateralToken,sizeDeltaUsd:i.sizeDeltaUsd,initialCollateralDeltaAmount:i.initialCollateralDeltaAmount,executionFee:i.executionFee,acceptablePrice:i.acceptablePrice,isLong:i.isLong,reason:i.reason,logIndex:e.logIndex==null?null:Number.parseInt(String(e.logIndex),16)}}function KT(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function O7(e=[],{chainId:t}={}){let n=ks(t);return(Array.isArray(e)?e:[]).map(r=>_7(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function JT(e={},t={}){return x(`${gp(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Fb(e={},t={}){return x(`${gp(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function QT(e={},t={}){return x(`${gp(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function lo(e={},t={}){return x(`${gp(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function ZT(e={}){let t=await lo({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function e1(e={},t={}){let n=ks(e.chainId??42161),r=vn(e.account||e.owner||e.user,"gmx account"),o=li(e.start??0,"gmx start"),i=li(e.end??e.limit??20,"gmx end"),s=XT.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||J)(n.chainId,"eth_call",[{to:n.reader,data:s},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:he(n.reader),dataStore:he(n.dataStore),account:he(r),raw:c}}async function t1(e={},t={}){let n=ks(e.chainId??42161),r=String(e.key||e.orderKey||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(r))throw new Error("gmx order key must be bytes32 hex");let o=XT.encodeFunctionData("getOrder",[n.dataStore,r]),s=await(t.rpcCall||J)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:he(n.reader),dataStore:he(n.dataStore),key:r,raw:s}}async function n1(e={},t={}){let n=ks(e.chainId??42161),r=t.receipt||await ba({chainId:n.chainId,txHash:e.txHash,expectedTo:e.expectedTo||n.exchangeRouter},t),o=String(e.txHash||r.txHash||"").toLowerCase();if(r.ok!==!0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:r.status||"unknown",reason:r.reason||"receipt not successful",receipt:r};let i=O7(r.logs||[],{chainId:n.chainId}),s=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,a=s?i.filter(u=>u.orderKey===s):i;if(a.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:s?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=a.reduce((u,d)=>KT(d.status)>=KT(u.status)?d:u,a[0]),l=e.expectedAccount||e.account?he(e.expectedAccount||e.account):null;return l&&c.account!==l?{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,reason:`account mismatch: expected ${l}, got ${c.account||"null"}`,orderKey:c.orderKey,account:c.account,events:i,receipt:r}:{ok:!0,provider:"gmx",chainId:n.chainId,txHash:o,status:c.status,orderKey:c.orderKey,account:c.account,market:c.market,eventEmitter:he(n.eventEmitter),events:a,receipt:r}}async function yp(e={},t={}){let n=ks(e.chainId??42161),r=b7(e.orderType||e.type),o=w7(e.decreasePositionSwapType),i=vn(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),s=vn(e.receiver||i,"gmx receiver"),a=vn(e.cancellationReceiver||s,"gmx cancellationReceiver"),c=e.callbackContract?vn(e.callbackContract,"gmx callbackContract"):VT,l=e.uiFeeReceiver?vn(e.uiFeeReceiver,"gmx uiFeeReceiver"):VT,u=vn(e.market||e.marketToken,"gmx market"),d=vn(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Is(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):li(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Is(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Is(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let g=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>g)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let y=y7(e.maxSlippageBps??e.slippageBps,50),b=e.isLong==null?!0:!!e.isLong,[w,S]=await Promise.all([Fb({chainId:n.chainId},t),lo({chainId:n.chainId},t)]),v=v7(S7(w,"markets"),u);if(!v)throw new Error("gmx market not found in public registry");if(v.isListed===!1)throw new Error("gmx market is not listed");let I=vn(v.indexToken,"gmx market indexToken"),A=vn(v.longToken,"gmx market longToken"),E=vn(v.shortToken,"gmx market shortToken"),k=he(d);if(![he(A),he(E)].includes(k))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let O=A7(v,b);if(O>0n&&m>O)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=E7(S,I);if(!T)throw new Error("gmx index ticker not found");let D=e.acceptablePrice?Is(e.acceptablePrice,"gmx acceptablePrice").toString():x7({ticker:T,isLong:b,typeKey:r.key,maxSlippageBps:y}),X=(e.swapPath||[]).map($t=>vn($t,"gmx swapPath market"));if(X.length>3)throw new Error("gmx swapPath too long for guarded slice");let H=li(e.triggerPrice??"0","gmx triggerPrice"),$=li(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=li(e.minOutputAmount??"0","gmx minOutputAmount"),C=li(e.validFromTime??"0","gmx validFromTime"),B=!!e.shouldUnwrapNativeToken,V=e.autoCancel==null?!0:!!e.autoCancel,K=String(e.referralCode||m7);if(!/^0x[0-9a-fA-F]{64}$/.test(K))throw new Error("gmx referralCode must be bytes32 hex");let Oe=Array.isArray(e.dataList)?e.dataList:[];for(let $t of Oe)if(!/^0x[0-9a-fA-F]{64}$/.test(String($t)))throw new Error("gmx dataList entries must be bytes32 hex");let Ee={addresses:{receiver:s,cancellationReceiver:a,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:X},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt(D),executionFee:f,callbackGasLimit:$,minOutputAmount:j,validFromTime:C},orderType:r.code,decreasePositionSwapType:o.code,isLong:b,shouldUnwrapNativeToken:B,autoCancel:V,referralCode:K,dataList:Oe},xe=[];r.key==="marketIncrease"&&p>0n&&xe.push(hp.encodeFunctionData("sendTokens",[d,n.orderVault,p])),xe.push(hp.encodeFunctionData("sendWnt",[n.orderVault,f])),xe.push(hp.encodeFunctionData("createOrder",[Ee]));let qe=hp.encodeFunctionData("multicall",[xe]),un={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:he(i),receiver:he(s),exchangeRouter:he(n.exchangeRouter),router:he(n.router),orderVault:he(n.orderVault),market:he(u),indexToken:he(I),initialCollateralToken:he(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:D,maxSlippageBps:y,isLong:b,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return U({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:he(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:he(d),spender:he(n.router),amount:p.toString()}:null,gmxGuard:un,transaction:{chainId:n.chainId,from:he(i),to:he(n.exchangeRouter),data:qe,value:f.toString(),gmxGuard:un}},{provider:"gmx",kind:"gmx-order"})}var HT,zT,VT,m7,WT,GT,hp,XT,h7,g7,bp=_(()=>{q();Ne();oe();HT=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),zT=Object.freeze({42161:{name:"arbitrum",api:HT[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:HT[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),VT="0x0000000000000000000000000000000000000000",m7=`0x${"0".repeat(64)}`,WT=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),GT=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),hp=new Ub(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),XT=new Ub(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),h7=new Ub(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),g7=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"})});import{mkdirSync as T7,readFileSync as C7,readdirSync as P7,renameSync as R7,writeFileSync as L7}from"node:fs";import{homedir as M7}from"node:os";import{join as Sp}from"node:path";function Re(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function _s(e){return e==null||e===0?0:e>0?1:-1}function qc(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function D7(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Sp(M7(),".config","oracle")}function i1(e={}){return Sp(D7(e),"hl-entry-states")}function wp(e,t,n){return n==null&&e.push(t),n}function U7(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(s=>String(s?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function xr(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function F7(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(s=>({t:Re(s.time),rate:Re(s.fundingRate)})).filter(s=>s.t!=null&&s.rate!=null).sort((s,a)=>s.t-a.t);if(!o.length)return xr("hl-info.fundingHistory","empty");let i=0;for(let s=1;s<o.length;s+=1)_s(o[s].rate)!==_s(o[s-1].rate)&&(i+=1);return{source:"hl-info.fundingHistory",asOfMs:n??o[o.length-1].t,unknown:!1,coin:t||null,samples:o.length,firstRate:o[0].rate,lastRate:o[o.length-1].rate,signFlips:i,windowMs:o[o.length-1].t-o[0].t}}function q7(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return xr("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let s=i.circulating||{},a=Re(s.peggedUSD??s.usd??i.circulatingPrevDay?.peggedUSD);a!=null&&(r+=a,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:xr("defillama.stablecoins","no peggedUSD")}function r1(e,t){let n=Re(e);if(n==null)return null;if(t!=null&&t>0){for(let r of[1,1e12,1e22,1e30]){let o=n/r;if(o>t*.5&&o<t*1.5)return o}return null}return n>1e20?n/1e22:n>1e12?n/1e30:n}function j7(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),s=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],a=o.find(p=>s.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!a)return xr("gmx.tickers","no matching symbol");let c=r1(a.minPrice,n),l=r1(a.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return xr("gmx.tickers","unreadable price");let d=n!=null&&n>0?qc(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?xr("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(a.tokenSymbol||a.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function H7({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?xr("hl-info.fundingHistory","not fetched"):F7(r,{coin:e,asOfMs:n}),llamaStables:o==null?xr("defillama.stablecoins","not fetched"):q7(o,n),gmxTicker:i==null?xr("gmx.tickers","not fetched"):j7(i,{coin:e,hlMark:t,asOfMs:n})}}function o1(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let a of r){let c=Re(a?.px),l=Re(a?.sz);if(c==null||l==null||c<=0||l<=0)continue;let u=c*l,d=Math.min(u,Math.max(0,t-o));if(d<=0||(i+=d/c,o+=d,o>=t))break}let s=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:s}}function z7(e,t){if(!e)return{present:!1,unknown:["userState"]};let n=String(t).toUpperCase(),i=(e.assetPositions||e.clearinghouseState?.assetPositions||[]).find(f=>String(f?.position?.coin||"").toUpperCase()===n)?.position;if(!i)return{present:!1,unknown:[]};let s=Re(i.szi),a=Re(i.positionValue)!=null&&s?Math.abs(Re(i.positionValue)/s):null,c=Re(i.entryPx),l=Re(i.liquidationPx),u=s==null?null:s>0?"long":s<0?"short":null,d=null,p=a??c;l!=null&&p!=null&&p!==0&&u==="long"?d=(p-l)/p*100:l!=null&&p!=null&&p!==0&&u==="short"&&(d=(l-p)/p*100);let m=[];return s==null&&m.push("position.szi"),c==null&&m.push("position.entryPx"),l==null&&m.push("position.liquidationPx"),d==null&&m.push("position.liqDistancePct"),{present:!0,side:u,szi:s,entryPx:c,liquidationPx:l,leverage:Re(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function V7({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:s=Date.now(),fundingHistory:a=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:uo,venue:"hyperliquid",coin:null,asOfMs:s,unknown:["coin"],verdict:"no"};let d=U7(n,e);if(!d)return{schema:uo,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:s,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=wp(u,"markPx",Re(m.markPx)),h=wp(u,"oraclePx",Re(m.oraclePx)),g=Re(m.midPx),y=Re(m.premium),b=wp(u,"fundingRate",Re(m.funding)),w=wp(u,"openInterestCoin",Re(m.openInterest)),S=Re(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],I=Re(v[0]),A=Re(v[1]),E=b==null?null:b*(B7/$7)*100,k=w==null||f==null?null:w*f,O=i==null||i===0||w==null?null:(w-i)/i*100;O==null&&u.push("oiDeltaPct");let T=r?.levels,D=Array.isArray(T)?T[0]:[],X=Array.isArray(T)?T[1]:[],H=Re(D?.[0]?.px),$=Re(X?.[0]?.px);H==null&&u.push("book.bidPx"),$==null&&u.push("book.askPx");let j=o1(X,Number(t)||0,"buy"),C=o1(D,Number(t)||0,"sell");j.fillable||u.push("book.buyFillable"),C.fillable||u.push("book.sellFillable");let B=g??f,V=j.avgFillPx==null||B==null?null:qc(j.avgFillPx,B),K=C.avgFillPx==null||B==null?null:qc(B,C.avgFillPx),Oe=z7(o,e);for(let un of Oe.unknown||[])u.push(un);let Ee=Re(m.prevDayPx),xe=f==null||Ee==null||Ee===0?null:(f-Ee)/Ee*100;xe==null&&u.push("change24hPct");let qe=H7({coin:String(p.name),hlMark:f,asOfMs:s,fundingHistory:a,llamaStables:c,gmxTickers:l});return qe.fundingPath.unknown&&u.push("overlays.fundingPath"),qe.llamaStables.unknown&&u.push("overlays.llamaStables"),qe.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:uo,venue:"hyperliquid",coin:String(p.name),asOfMs:s,markPx:f,oraclePx:h,midPx:g,premium:y,markOracleBps:qc(f,h),fundingRate:b,fundingAprPct:E,openInterestCoin:w,openInterestUsd:k,oiDeltaPct:O,dayNtlVolumeUsd:S,change24hPct:xe,impactBidPx:I,impactAskPx:A,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:$,spreadBps:H==null||$==null?null:qc($,H),notionalUsd:Number(t)||0,buy:j,sell:C,buySlipBps:V,sellSlipBps:K},position:Oe,overlays:qe,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function s1(e,t){let n=String(t||"").toLowerCase();if(n!=="long"&&n!=="short")return{side:null,verdict:"no",factors:[{key:"side",status:"unverifiable",note:"side must be long or short"}]};if(!e?.coin||e.verdict==="no")return{side:n,verdict:"no",factors:[{key:"market",status:"unverifiable",note:"no live market"}]};let r=[],o=e.fundingRate;o==null?r.push({key:"funding",status:"unverifiable",note:"fundingRate unknown"}):n==="long"?r.push({key:"funding",status:o>0?"counter":(o<0,"aligned"),note:o>0?"longs pay":"shorts pay / flat",fundingAprPct:e.fundingAprPct}):r.push({key:"funding",status:o<0?"counter":"aligned",note:o<0?"shorts pay":"longs pay / flat",fundingAprPct:e.fundingAprPct});let i=e.premium??(e.markOracleBps==null?null:e.markOracleBps/1e4);i==null?r.push({key:"premium",status:"unverifiable",note:"mark vs oracle unknown"}):n==="long"?r.push({key:"premium",status:i>0?"counter":"aligned",note:i>0?"mark rich to oracle":"mark cheap / flat"}):r.push({key:"premium",status:i<0?"counter":"aligned",note:i<0?"mark cheap to oracle":"mark rich / flat"});let s=n==="long"?e.book?.buy:e.book?.sell;if(!s)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!s.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${s.requestedNotionalUsd} usd`});else{let f=n==="long"?e.book.buySlipBps:e.book.sellSlipBps;r.push({key:"book",status:f!=null&&f>20?"counter":"aligned",note:f==null?"fillable, slip unknown":`slip ${f.toFixed(1)} bps`})}let a=e.position?.liqDistancePct;e.position?.present?a==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:a<5?"counter":"aligned",note:`${a.toFixed(2)}% to liq`}):r.push({key:"liqDistancePct",status:"unverifiable",note:"no position / no user"}),e.oiDeltaPct==null&&r.push({key:"oiDeltaPct",status:"unverifiable",note:"no prior OI \u2014 HL /info has no 24h OI"});let c=e.overlays?.fundingPath;!c||c.unknown?r.push({key:"fundingPath",status:"unverifiable",note:c?.reason||"funding history unknown"}):r.push({key:"fundingPath",status:c.signFlips>0?"unverifiable":"aligned",note:c.signFlips>0?`${c.signFlips} funding sign flip(s) in window`:`carry stable n=${c.samples}`});let l=e.overlays?.gmxTicker;!l||l.unknown?r.push({key:"gmxBasis",status:"unverifiable",note:l?.reason||"gmx ticker unknown"}):l.basisBps!=null&&Math.abs(l.basisBps)>80?r.push({key:"gmxBasis",status:"counter",note:`HL vs GMX ${l.basisBps.toFixed(1)} bps`}):r.push({key:"gmxBasis",status:"aligned",note:l.basisBps==null?"gmx print, no HL mark":`HL vs GMX ${l.basisBps.toFixed(1)} bps`});let u=r.some(f=>f.key==="book"&&f.status==="counter"&&/cannot fill/.test(f.note)),d=r.some(f=>f.status==="counter"),p=r.some(f=>f.status==="unverifiable");return{side:n,verdict:u?"no":d||p?"wait":"go",factors:r,seeUnknown:e.unknown||[]}}function W7(e){let t=String(e?.hash||e?.txHash||"").trim(),n=e?.oid,r=e?.tid;if(t)return{kind:e.kind||"hl-fill",hash:t};if(n!=null&&r!=null)return{kind:e.kind||"hl-fill",oid:n,tid:r,time:e.time??null};throw new Error("entry snapshot refused: no receipt (need hash or oid+tid)")}function G7({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==uo||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=W7(n),s=s1(e,t);if(!s.side)throw new Error("entry snapshot refused: side must be long or short");let a={schema:uo,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:s.side,receipt:i,see:e,qualify:s,actionMode:Fc.ALERT_ONLY},c=i1({...o,configDir:r||o.configDir});T7(c,{recursive:!0,mode:448});let l=Sp(c,`${a.id}.json`),u=`${l}.${process.pid}.tmp`;return L7(u,`${JSON.stringify(a,null,2)}
|
|
10
|
+
`,{mode:384}),R7(u,l),a}function qb(e={}){let t=i1(e),n=[];try{n=P7(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(C7(Sp(t,r),"utf8")))}function K7(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Fc.ALERT_ONLY};let r=e.see,o=t;_s(r.fundingRate)!==_s(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),_s(r.premium)!==_s(o.premium)&&r.premium!=null&&o.premium!=null&&n.push({key:"premiumSign",level:"hold",from:r.premium,to:o.premium});let i=r.position?.liqDistancePct,s=o.position?.liqDistancePct;i!=null&&s!=null&&(s<5||s<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:s});let a=e.side,c=a==="long"?r.book?.buy:r.book?.sell,l=a==="long"?o.book?.buy:o.book?.sell;c?.fillable&&l&&!l.fillable&&n.push({key:"bookFillable",level:"thesis-broke",from:!0,to:!1});let u=o.oiDeltaPct;return u!=null&&Math.abs(u)>=15&&n.push({key:"oiDeltaPct",level:"hold",from:0,to:u}),{schema:uo,id:e.id,coin:e.see.coin,side:e.side,actionMode:Fc.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function a1(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await jt(e))?.[0]?.universe?.length,venue:"hyperliquid",latencyMs:Date.now()-t}}catch(n){return{provider:"hl-entry-state",ok:!1,error:String(n?.message||n),latencyMs:Date.now()-t}}}async function jc(e={},t={}){let n=e.coin,r=Re(e.notionalUsd)??1e4,o=Date.now(),[i,s,a,c,l,u]=await Promise.all([jt(t),n?es(n,t).catch(()=>null):Promise.resolve(null),e.user?ts(e.user,t).catch(()=>null):Promise.resolve(null),n?MI({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),qu({},t).catch(()=>null),lo({chainId:42161},t).catch(()=>null)]);return V7({coin:n,notionalUsd:r,meta:i,book:s,userState:a,priorOiCoin:Re(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function c1(e={},t={}){let n=e.see&&e.see.schema===uo?e.see:await jc(e,t);return{see:n,...s1(n,e.side)}}async function l1(e={},t={}){let n=e.see&&e.see.schema===uo?e.see:await jc(e,t);return G7({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function u1(e={},t={}){let n=e.locked||qb(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Fc.ALERT_ONLY};let r=await jc({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return K7(n,r)}var uo,$7,B7,d1=_(()=>{jT();Ho();bp();Xt();uo="oracle.hl.entry-state.v1",$7=8,B7=24*365});async function p1(e={}){let t=await Ha(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function f1(e={},t={}){let n=e.coin,r=e.outcome==null?null:Kr(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=h1(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=jb(i)));let s=n==null?null:Yr(n);if(n!=null&&!s)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??s?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await Ha(t))?.outcomes||[]).find(f=>{try{return Kr(f.outcome,0).outcome===l}catch{return!1}}),p=Array.isArray(d?.sideSpecs)?d.sideSpecs.findIndex(f=>f?.name===e.sideName):-1;if(p<0)throw new Error("hl-outcome: unknown sideName for outcome");let m=jb(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(s&&s.side!==m)throw new Error("hl-outcome: sideName does not match outcome coin side");i=m}if(!n){if(r==null||i==null)throw new Error("hl-outcome: provide coin (#N) or outcome + side (0/1 or yes/no)");n=Kr(r,i).coin}if(s=Yr(n),!s)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&s.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&s.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let a=e.orderSide??o??(typeof e.isBuy=="boolean"?null:"buy"),c={...e,coin:n,outcome:void 0,outcomeSide:i};return delete c.orderSide,delete c.sideName,a==null?delete c.side:c.side=a,Qr(c,t)}async function m1(e={},t={}){let n=e.coin,r=e.outcome==null?null:Kr(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=h1(e.outcomeSide):(o=e.side,o!=null&&(o=jb(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Kr(r,o).coin}let i=Yr(n);if(!i)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&i.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(o!=null&&i.side!==o)throw new Error("hl-outcome: coin does not match outcome side");let s={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete s.side,Za(s,t)}function h1(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function jb(e){if(e===0||e===1)return e;if(typeof e=="string"){let t=e.trim().toLowerCase();if(t==="0"||t==="yes")return 0;if(t==="1"||t==="no")return 1}throw new Error("hl-outcome: outcome side must be 0, 1, yes, or no")}var g1=_(()=>{Xt();gd();ec()});function J7(e){let t=typeof e=="bigint"?e:gn(e,"poly: atomicUsdc");if(t<=0n)throw new Error("poly: order amounts must be positive integer micro-units");let n=t/1000000n,r=(t%1000000n).toString().padStart(6,"0").replace(/0+$/,"");return r?`${n.toString()}.${r}`:n.toString()}function y1(e,t){let n=gn(e.makerAmount,"poly: makerAmount"),r=gn(e.takerAmount,"poly: takerAmount");return J7(t==="BUY"?n:r)}var cfe,b1=_(()=>{ns();cfe="0x"+"00".repeat(32)});function S1(e){let t=String(e||"").replace(/\/$/,"");if(!Q7.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function v1(e){let t=hn(e,"poly: exchange").toLowerCase();if(!Z7.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function E1(e,t){if(e?.surface!=="poly")throw new Error("poly: surface poly required");let n=e.artifact;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("poly: structured artifact required");let r=w1(n.kind,"kind",48);if(r!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(hn(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(S1(n.submitTo),n.chainId!==137)throw new Error("poly: chainId must be Polygon 137");let o=n.domain;if(!o||typeof o!="object")throw new Error("poly: EIP-712 domain required");if(o.name!=="Polymarket CTF Exchange"||o.version!=="2"||o.chainId!==137)throw new Error("poly: EIP-712 domain must be official CTF Exchange v2 on Polygon");if(v1(o.verifyingContract),v1(n.exchange),hn(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==hn(n.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof n.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=n.negRisk?tW:eW;if(hn(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let s=n.message||n.value;if(!s||typeof s!="object")throw new Error("poly: signed order message required");let a=n.types?.Order;if(!Array.isArray(a)||a.length!==Hc.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let A=0;A<Hc.length;A+=1)if(a[A]?.name!==Hc[A][0]||a[A]?.type!==Hc[A][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((n.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(hn(s.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(hn(s.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(s.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof s.builder!="string"||s.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(s.side!==0&&s.side!==1)throw new Error("poly: side must be BUY or SELL");let l=w1(n.tokenId,"tokenId",80);if(hn(s.tokenId,"poly: tokenId")!==l)throw new Error("poly: tokenId mismatch");let u=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(u.length&&!u.includes(l)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(s.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=gn(s.makerAmount,"poly: makerAmount"),m=gn(s.takerAmount,"poly: takerAmount"),f=gn(n.makerAmount,"poly: prepared makerAmount"),h=gn(n.takerAmount,"poly: prepared takerAmount");if(p!==f)throw new Error("poly: signed makerAmount differs from prepared envelope");if(m!==h)throw new Error("poly: signed takerAmount differs from prepared envelope");let g=d==="BUY"?p:m,y=d==="BUY"?m:p,b=rt(n.quantity,6,"poly: quantity");if(b<=0n||b!==y)throw new Error("poly: quantity must match CLOB v2 amounts");let w=rt(n.price,6,"poly: price");if(w<=0n||w>=1000000n)throw new Error("poly: price must be within (0,1)");if(y*w!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(rt(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=y1(s,d);if(rt(v,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let I=t.maxNotionalUsd??t.maxNotionalUsdc;if(I!=null){let A=rt(I,6,"poly: maxNotionalUsd");if(g>A)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:v,submitTo:S1(n.submitTo)})}var Q7,Hc,pfe,Z7,eW,tW,w1,x1=_(()=>{b1();ns();Q7=new Set(["https://clob.polymarket.com/order"]),Hc=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),pfe=Object.freeze(Hc.map(e=>e[0])),Z7=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),eW="0xe111180000d2663c0091e4f400237545b87b996b",tW="0xe2222d279d744050d28e00520010520000310f59",w1=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e}});function nW(e){let t=e.owner||e.maker||e.signer||e.user||e.from;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("poly: owner/maker address required for local-signer envelope");return String(t).toLowerCase()}function A1(e,t={},n={}){if(String(e?.kind)!=="poly-order")throw new Error("poly: prepared kind is not a local-signer surface");if(!e?.domain||!e?.types||!e?.value)throw new Error("poly: prepared EIP-712 order required");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),s={version:1,surface:"poly",action:"order",owner:nW({...t,maker:e.value?.maker,signer:e.value?.signer}),destination:"polymarket",tradeId:String(t.tradeId||`poly:${e.value?.tokenId}:${e.value?.salt}`),expiresAtMs:r+o,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:"poly-clob",artifact:{kind:"poly-order",tokenId:String(e.tokenId||e.value.tokenId),side:e.side,makerAmount:String(e.value.makerAmount),takerAmount:String(e.value.takerAmount),price:e.price,quantity:e.quantity,notionalUsdc:e.notionalUsdc,exchange:e.exchange,negRisk:e.negRisk,chainId:137,submitTo:"https://clob.polymarket.com/order",orderType:e.orderType||"GTC",signatureType:e.signatureType??0,domain:e.domain,types:e.types,message:e.value}};return E1(s,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),s}var I1=_(()=>{x1()});import{createHmac as wfe,randomInt as rW}from"node:crypto";import{keccak256 as vfe,concat as Efe,zeroPadValue as xfe,getCreate2Address as Afe,AbiCoder as Ife}from"ethers";function vp(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Ep(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function O1(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function C1(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function cW(e,t,n,r){let o=C1(Number(n),r.price);if(e==="BUY"){let c=Ep(Number(t),r.size),l=c*o;return vp(l)>r.amount&&(l=O1(l,r.amount+4),vp(l)>r.amount&&(l=Ep(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let s=Ep(Number(t),r.size),a=s*o;return vp(a)>r.amount&&(a=O1(a,r.amount+4),vp(a)>r.amount&&(a=Ep(a,r.amount))),{rawMakerAmt:s,rawTakerAmt:a}}function N1(e){let t=Number(e).toFixed(Hb),[n,r=""]=t.split(".");return(n+r.padEnd(Hb,"0").slice(0,Hb)).replace(/^0+/,"")||"0"}function lW(e={}){if(Object.prototype.hasOwnProperty.call(e,"negRisk")&&typeof e.negRisk!="boolean")throw new Error("negRisk must be a boolean");let{tokenId:t,side:n,price:r,size:o,maker:i,signer:s,negRisk:a=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=k1,builder:p=k1}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!s)throw new Error("maker and signer required");let m=Number(r),f=Number(o);if(!(m>0&&m<1))throw new Error(`price out of (0,1): ${r}`);if(!(f>0))throw new Error(`size must be > 0: ${o}`);if(u!==0&&u!==3)throw new Error(`Desk poly supports signatureType 0 (EOA) or 3 (deposit wallet), got ${u}`);if(typeof p!="string"||!/^0x[0-9a-fA-F]{64}$/.test(p))throw new Error("poly: builder must be a 32-byte hex string");if(typeof d!="string"||!/^0x[0-9a-fA-F]{64}$/.test(d))throw new Error("poly: metadata must be a 32-byte hex string");let h=_1[String(c)]||_1["0.01"],g=C1(m,h.price),{rawMakerAmt:y,rawTakerAmt:b}=cW(n,f,g,h),w=N1(y),S=N1(b),v=String(rW(1,2**31-1)),I=Date.now().toString(),A=n==="BUY"?0:1,E=a?iW:oW,k={salt:v,maker:i,signer:s,tokenId:String(t),makerAmount:w,takerAmount:S,side:A,signatureType:u,timestamp:I,metadata:d,builder:p},O={...sW,verifyingContract:E},T=n==="BUY"?y:b;return{domain:O,types:aW,value:k,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?b:y),notionalUsdc:T,exchange:E,negRisk:a}}function P1(){return{ok:!0,provider:"poly-clob",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,note:"capability only. Hosted/keyless remains prepare-only."}}function R1(e={},t={}){let n=lW(e),r={provider:"poly-clob",kind:"poly-order",chainId:T1,tokenId:String(e.tokenId),side:n.side,orderType:n.orderType,price:n.price,quantity:n.quantity,notionalUsdc:n.notionalUsdc,exchange:n.exchange,domain:n.domain,types:n.types,value:n.value,tickSize:e.tickSize||"0.01",negRisk:n.negRisk,signatureType:e.signatureType??0,maxNotionalUsdc:e.maxNotionalUsdc??null};try{r.localSignerEnvelope=A1(r,e,t)}catch{r.oraclePrepared=!1}return U(r,{provider:"poly-clob",kind:"poly-order"})}var T1,oW,iW,k1,Hb,sW,aW,_1,L1=_(()=>{oe();I1();T1=137,oW="0xE111180000d2663C0091e4f400237545B87B996B",iW="0xe2222d279d744050d28e00520010520000310F59",k1="0x0000000000000000000000000000000000000000000000000000000000000000",Hb=6,sW={name:"Polymarket CTF Exchange",version:"2",chainId:T1},aW={Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"signer",type:"address"},{name:"tokenId",type:"uint256"},{name:"makerAmount",type:"uint256"},{name:"takerAmount",type:"uint256"},{name:"side",type:"uint8"},{name:"signatureType",type:"uint8"},{name:"timestamp",type:"uint256"},{name:"metadata",type:"bytes32"},{name:"builder",type:"bytes32"}]},_1={"0.1":{price:1,size:2,amount:3},"0.01":{price:2,size:2,amount:4},"0.001":{price:3,size:2,amount:5},"0.0001":{price:4,size:2,amount:6}}});import{existsSync as $1,readFileSync as dW}from"node:fs";import{dirname as M1,join as zb}from"node:path";import{fileURLToPath as pW}from"node:url";function fW(e){let t=M1(pW(e));for(let n=0;n<8;n+=1){let r=zb(t,"package.json");if($1(r))try{let i=JSON.parse(dW(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=M1(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function xp(e,t){let n=fW(t),r=zb(n,e);return $1(r)?r:zb(n,"dist","assets",e)}var Vb=_(()=>{});import{isAddress as mW}from"ethers";function gW(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:B1,tag:`v${B1}`}),constructor:Object.freeze([...t.constructor]),authority:Object.freeze([...t.authority]),monitor:Object.freeze([...t.monitor]),fixedSource:!0,proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1,modelEmittedSource:!1})}function Ap(e){let t=ui[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function zc(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Vc(e,t){let n=String(e||"");if(!mW(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function D1(e,t){let n=Ap(e);if(!Array.isArray(t))throw new Error(`${e}: constructor args must be an array`);if(t.length!==n.constructor.length)throw new Error(`${e}: expected ${n.constructor.length} constructor args`);if(e==="safe-erc20"){let[r,o,i,s,a]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");zc(i,"safe-erc20: supply"),Vc(s,"safe-erc20: initialHolder"),Vc(a,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,s,a,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(zc(i,"safe-erc721-drop: cap"),Vc(s,"safe-erc721-drop: treasury"),zc(a,"safe-erc721-drop: mintPrice"),zc(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Vc(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Vc(r,"safe-vesting: beneficiary");for(let[s,a]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(s);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${a} must be uint64`)}zc(i,"safe-vesting: durationSeconds")}return n}function U1(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var B1,hW,ui,Ip=_(()=>{B1="5.0.2",hW={"safe-erc20":{contractName:"SafeERC20",source:"src/SafeERC20.sol",constructor:["string name","string symbol","uint256 initialSupply","address initialHolder","address initialOwner"],authority:["initialOwner may pause transfers and use Ownable2Step"],monitor:["OwnershipTransferStarted","OwnershipTransferred","Paused","Unpaused","Transfer"]},"safe-erc721-drop":{contractName:"SafeERC721Drop",source:"src/SafeERC721Drop.sol",constructor:["string name","string symbol","uint256 cap","address treasury","uint256 mintPrice","uint256 perWalletCap","address initialOwner"],authority:["initialOwner may withdraw the full balance to immutable treasury","no mint, proxy, upgrade, or delegatecall authority"],monitor:["Transfer","OwnershipTransferred","Withdrawal"]},"safe-vesting":{contractName:"SafeVesting",source:"src/SafeVesting.sol",constructor:["address beneficiary","uint64 startTimestamp","uint64 durationSeconds"],authority:["beneficiary is the immutable OpenZeppelin owner/recipient identity","ownership transfer and renunciation are disabled","no separate administrator, proxy, upgrade, or delegatecall authority"],monitor:["EtherReleased","ERC20Released"]}};ui=Object.freeze(Object.fromEntries(Object.entries(hW).map(([e,t])=>[e,gW(e,t)])))});import{spawnSync as Wb}from"node:child_process";import{existsSync as di,readFileSync as kp,readdirSync as F1,statSync as q1}from"node:fs";import{join as Wn}from"node:path";import{createHash as yW}from"node:crypto";function j1(){if(Wc!==void 0)return Wc;try{Wc=xp("protocols/templates",import.meta.url)}catch{Wc=null}return Wc}function Op(){let e=j1();return!e||!di(e)?[]:F1(e).filter(t=>ui[t]&&q1(Wn(e,t)).isDirectory()).map(t=>{let n=Wn(e,t),r=Wn(n,"SECURITY.md");return{id:t,path:n,metadata:Ap(t),securityNotice:di(r)?kp(r,"utf8").slice(0,500):null,disclaimer:_p}})}function H1(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Wn(e,".foundry/bin/forge")];for(let n of t)if(Wb(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function bW(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Wb("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function Os(e,t,n){let r=Wb(e,t,{cwd:n,encoding:"utf8",env:{...process.env,PATH:`${process.env.HOME||""}/.foundry/bin:${process.env.PATH||""}`},timeout:12e4});return{ok:r.status===0,status:r.status,stdout:r.stdout||"",stderr:r.stderr||""}}function wW(e){let t=yW("sha256");function n(r){let o=q1(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of F1(r).sort())n(Wn(r,i))}else o.isFile()&&(r.endsWith(".sol")||r.endsWith(".toml")||r.endsWith(".md")||r.endsWith(".txt"))&&(t.update(r.slice(e.length)),t.update(kp(r)))}return n(e),t.digest("hex")}function Gc(e,t={}){let n=Ap(e),r=t.allowSkipStatic!==!1,o=j1(),i=o?Wn(o,e):null;if(!i||!di(i))throw new Error(`protocol-templates: unknown template "${e}"`);let s=H1();if(!s)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!di(Wn(i,"lib","forge-std"))){let f=Os(s,["install","foundry-rs/forge-std","--no-git"],i);if(!f.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
11
|
+
${f.stderr}`)}if(!di(Wn(i,"lib","openzeppelin-contracts"))){let f=Os(s,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],i);if(!f.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
12
|
+
${f.stderr}`)}let a=Wn(i,"lib","openzeppelin-contracts","package.json"),c=di(a)?JSON.parse(kp(a,"utf8")).version:null;if(c!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${c||"unknown"}`);let l=Os(s,["build","-q"],i);if(!l.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
13
|
+
${l.stderr}`.slice(0,2e3));let u=Os(s,["test","-q"],i);if(!u.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
14
|
+
${u.stdout}
|
|
15
|
+
${u.stderr}`.slice(0,2e3));let d={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},p=bW();if(p){let f=Os(p,[".","--filter-paths","lib","--exclude-dependencies"],i);if(d={tool:"slither",ok:f.ok,skipped:!1,stdout:(f.stdout||"").slice(0,1500),stderr:(f.stderr||"").slice(0,500)},!f.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
|
|
16
|
+
${f.stdout}
|
|
17
|
+
${f.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let m=wW(i);return{ok:!0,templateId:e,metadata:n,path:i,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:d,sourceHash:m,disclaimer:_p,firmAudit:!1}}function z1(e,t={}){let n=Gc(e,t),r=H1(),o=n.path,i=Os(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
|
|
18
|
+
${i.stderr}`.slice(0,1500));let s=n.metadata.contractName;if(t.contractName&&t.contractName!==s)throw new Error(`protocol-templates: fixed contract name is ${s}`);let a=Wn(o,"out",`${s}.sol`,`${s}.json`);if(!di(a))throw new Error(`protocol-templates: artifact missing at ${a}`);let c=JSON.parse(kp(a,"utf8"));return{gate:n,metadata:n.metadata,contractName:s,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:a}}var Wc,_p,Np=_(()=>{Vb();Ip();_p="Template + Foundry tests + optional static analysis. NOT a paid security-firm audit. Do not put mainnet TVL on forks without an independent Solidity audit."});import{ContractFactory as SW,keccak256 as V1}from"ethers";function EW(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=br(e);for(let o of Object.keys(n))if(!vW.has(o))throw new Error(`prepareTemplateDeploy: unsupported field "${o}" in localForkSimulationReceipt`);if(n.status!=="success"&&n.status!=="reverted")throw new Error('prepareTemplateDeploy: simulation status must be "success" or "reverted"');let r={status:n.status};if(n.chainId!==void 0){let o=Number(n.chainId);if(!Number.isSafeInteger(o)||o!==t)throw new Error("prepareTemplateDeploy: simulation chainId must match deployment chainId");r.chainId=o}if(n.forkBlockNumber!==void 0){let o=Number(n.forkBlockNumber);if(!Number.isSafeInteger(o)||o<0)throw new Error("prepareTemplateDeploy: simulation forkBlockNumber must be a nonnegative safe integer");r.forkBlockNumber=o}if(n.gasUsed!==void 0){let o=String(n.gasUsed);if(!/^(0|[1-9][0-9]*)$/.test(o))throw new Error("prepareTemplateDeploy: simulation gasUsed must be a nonnegative integer");r.gasUsed=o}if(n.transactionHash!==void 0){if(!/^0x[0-9a-fA-F]{64}$/.test(n.transactionHash))throw new Error("prepareTemplateDeploy: simulation transactionHash must be bytes32 hex");r.transactionHash=n.transactionHash}if(n.contractAddress!==void 0){if(!/^0x[0-9a-fA-F]{40}$/.test(n.contractAddress))throw new Error("prepareTemplateDeploy: simulation contractAddress must be an EVM address");r.contractAddress=n.contractAddress}if(n.revertReason!==void 0){if(typeof n.revertReason!="string"||n.revertReason.length>500)throw new Error("prepareTemplateDeploy: simulation revertReason must be at most 500 characters");r.revertReason=n.revertReason}return r}async function W1(e={},t={}){let n=String(e.templateId||"").trim();if(!n)throw new Error("prepareTemplateDeploy: templateId required");let r=Number(e.chainId);if(!Number.isInteger(r)||r<=0)throw new Error("prepareTemplateDeploy: chainId required");let o=e.args??e.constructorArgs??[],i=D1(n,o),s=z1(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!s.bytecode||s.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let a=s.bytecode.startsWith("0x")?s.bytecode:`0x${s.bytecode}`,u=(await new SW(s.abi,a).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...EW(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return U({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:s.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:s.abi,sourceHash:s.gate.sourceHash,bytecodeHash:V1(a),authorityReport:U1(i),simulationReceipt:p,verificationManifest:{contractName:s.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:s.gate.sourceHash,creationBytecodeHash:V1(a),constructorData:`0x${u.slice(a.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${s.contractName}`},monitoringPlan:{activation:"after user-signed deployment confirmation",enabled:!1,events:[...i.monitor],checks:["deployment bytecode matches verification manifest","authority changes","contract balance and release/withdraw events"]},gate:{forgeBuild:s.gate.forgeBuild,forgeTests:s.gate.forgeTests,staticAnalysis:{tool:s.gate.staticAnalysis.tool,ok:s.gate.staticAnalysis.ok,skipped:s.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:_p},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,deploymentActivated:!1,note:"Unsigned deploy. User wallet signs. Template tests passed; not a firm audit."},{provider:"protocol-templates",kind:"template-deploy"})}var vW,G1=_(()=>{kc();oe();Np();Ip();vW=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"])});import{createHash as Gb}from"node:crypto";import{secp256k1 as Kc}from"@noble/curves/secp256k1.js";import{bech32m as K1}from"@scure/base";function En(e,t){throw new Error(`${e}: ${t}`)}function Z1(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||En("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Kb(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{En(t,`must be an integer from ${n} to ${r}`)}}function AW(e){let t=String(e||"");if(!t||[...t].some(o=>!Y1.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(Y1.indexOf(o));let r=[];for(;n>0n;)r.unshift(Number(n&255n)),n>>=8n;for(let o of t){if(o!=="1")break;r.unshift(0)}return Uint8Array.from(r)}function X1(e,t){let n=String(e||"").trim(),r=AW(n);return(!r||r.length!==32)&&En(t,"must be a 32-byte base58 Solana public key"),n}function J1(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||En(t,"must be a compressed secp256k1 public key");try{Kc.Point.fromHex(n)}catch{En(t,"must encode a valid secp256k1 curve point")}return n}function IW(e){if(e<253)return Buffer.from([e]);if(e<=65535){let t=Buffer.alloc(3);return t[0]=253,t.writeUInt16LE(e,1),t}En("bitcoin-tapscript-vault","script too large")}function Xb(e,t){let n=Gb("sha256").update(e).digest();return Gb("sha256").update(n).update(n).update(t).digest()}function Q1(e){return Xb("TapLeaf",Buffer.concat([Buffer.from([192]),IW(e.length),e]))}function kW(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return Xb("TapBranch",Buffer.concat([n,r]))}function Tp(e){return Kc.Point.fromHex(e).x.toString(16).padStart(64,"0")}function eC(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function _W(e,t){let n=[];return e.forEach((r,o)=>n.push(eC(Tp(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function OW(e){let t=Number(e),n=[];for(;t>0;)n.push(t&255),t>>=8;return n[n.length-1]&128&&n.push(0),Buffer.from([n.length,...n])}function NW(e,t){return Buffer.concat([OW(t),Buffer.from([178,117]),eC(Tp(e)),Buffer.from([172])])}function TW(e,t,n){let r=Kc.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),s=BigInt(`0x${Xb("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Kc.Point.Fn.ORDER,a=o.add(Kc.Point.BASE.multiply(s)),c=Buffer.from(a.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:K1.encode(l,[1,...K1.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function Cn(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
19
|
+
`)?t:`${t}
|
|
20
|
+
`})}function CW(e){let t=Gb("sha256");for(let n of[...e].sort((r,o)=>r.path.localeCompare(o.path)))t.update(n.path).update("\0").update(n.content).update("\0");return t.digest("hex")}function PW(e){let t=Z1(e.projectName),n=X1(e.authority,"solana-safe-vault authority"),r=Kb(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||En("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=X1(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&En("solana-safe-vault programId","must not be the System Program placeholder");let s=`use anchor_lang::prelude::*;
|
|
21
|
+
use anchor_lang::system_program::{transfer, Transfer};
|
|
22
|
+
|
|
23
|
+
declare_id!("${i}");
|
|
24
|
+
|
|
25
|
+
#[program]
|
|
26
|
+
pub mod ${t} {
|
|
27
|
+
use super::*;
|
|
28
|
+
|
|
29
|
+
pub fn initialize(ctx: Context<Initialize>, unlock_delay_slots: u64) -> Result<()> {
|
|
30
|
+
require!(unlock_delay_slots > 0, VaultError::InvalidDelay);
|
|
31
|
+
let vault = &mut ctx.accounts.vault;
|
|
32
|
+
vault.authority = ctx.accounts.authority.key();
|
|
33
|
+
vault.unlock_delay_slots = unlock_delay_slots;
|
|
34
|
+
vault.last_deposit_slot = Clock::get()?.slot;
|
|
35
|
+
vault.bump = ctx.bumps.vault;
|
|
36
|
+
Ok(())
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
pub fn deposit(ctx: Context<Deposit>, lamports: u64) -> Result<()> {
|
|
40
|
+
require!(lamports > 0, VaultError::InvalidAmount);
|
|
41
|
+
transfer(
|
|
42
|
+
CpiContext::new(ctx.accounts.system_program.to_account_info(), Transfer {
|
|
43
|
+
from: ctx.accounts.depositor.to_account_info(),
|
|
44
|
+
to: ctx.accounts.vault.to_account_info(),
|
|
45
|
+
}),
|
|
46
|
+
lamports,
|
|
47
|
+
)?;
|
|
48
|
+
ctx.accounts.vault.last_deposit_slot = Clock::get()?.slot;
|
|
49
|
+
Ok(())
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
pub fn withdraw(ctx: Context<Withdraw>, lamports: u64) -> Result<()> {
|
|
53
|
+
require!(lamports > 0, VaultError::InvalidAmount);
|
|
54
|
+
let vault = &ctx.accounts.vault;
|
|
55
|
+
let unlock_slot = vault.last_deposit_slot.checked_add(vault.unlock_delay_slots)
|
|
56
|
+
.ok_or(VaultError::ArithmeticOverflow)?;
|
|
57
|
+
require!(Clock::get()?.slot >= unlock_slot, VaultError::StillLocked);
|
|
58
|
+
require!(vault.to_account_info().lamports() > lamports, VaultError::InsufficientFunds);
|
|
59
|
+
**vault.to_account_info().try_borrow_mut_lamports()? -= lamports;
|
|
60
|
+
**ctx.accounts.authority.to_account_info().try_borrow_mut_lamports()? += lamports;
|
|
61
|
+
Ok(())
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[derive(Accounts)]
|
|
66
|
+
pub struct Initialize<'info> {
|
|
67
|
+
#[account(mut, address = pubkey!("${n}"))]
|
|
68
|
+
pub authority: Signer<'info>,
|
|
69
|
+
#[account(init, payer = authority, space = 8 + Vault::INIT_SPACE, seeds = [b"vault", authority.key().as_ref()], bump)]
|
|
70
|
+
pub vault: Account<'info, Vault>,
|
|
71
|
+
pub system_program: Program<'info, System>,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#[derive(Accounts)]
|
|
75
|
+
pub struct Deposit<'info> {
|
|
76
|
+
#[account(mut)]
|
|
77
|
+
pub depositor: Signer<'info>,
|
|
78
|
+
#[account(mut, seeds = [b"vault", vault.authority.as_ref()], bump = vault.bump)]
|
|
79
|
+
pub vault: Account<'info, Vault>,
|
|
80
|
+
pub system_program: Program<'info, System>,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#[derive(Accounts)]
|
|
84
|
+
pub struct Withdraw<'info> {
|
|
85
|
+
#[account(mut, address = vault.authority)]
|
|
86
|
+
pub authority: Signer<'info>,
|
|
87
|
+
#[account(mut, seeds = [b"vault", authority.key().as_ref()], bump = vault.bump)]
|
|
88
|
+
pub vault: Account<'info, Vault>,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
#[account]
|
|
92
|
+
#[derive(InitSpace)]
|
|
93
|
+
pub struct Vault {
|
|
94
|
+
pub authority: Pubkey,
|
|
95
|
+
pub unlock_delay_slots: u64,
|
|
96
|
+
pub last_deposit_slot: u64,
|
|
97
|
+
pub bump: u8,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
#[error_code]
|
|
101
|
+
pub enum VaultError {
|
|
102
|
+
#[msg("Unlock delay must be positive")] InvalidDelay,
|
|
103
|
+
#[msg("Amount must be positive")] InvalidAmount,
|
|
104
|
+
#[msg("Vault is still locked")] StillLocked,
|
|
105
|
+
#[msg("Vault has insufficient funds")] InsufficientFunds,
|
|
106
|
+
#[msg("Arithmetic overflow")] ArithmeticOverflow,
|
|
107
|
+
}
|
|
108
|
+
`,a=[Cn("Anchor.toml",`[provider]
|
|
109
|
+
cluster = "${o}"
|
|
110
|
+
wallet = "~/.config/solana/id.json"
|
|
111
|
+
|
|
112
|
+
[programs.${o}]
|
|
113
|
+
${t} = "${i}"
|
|
114
|
+
`),Cn("Cargo.toml",`[workspace]
|
|
115
|
+
members = ["programs/${t}"]
|
|
116
|
+
resolver = "2"
|
|
117
|
+
`),Cn(`programs/${t}/Cargo.toml`,`[package]
|
|
118
|
+
name = "${t}"
|
|
119
|
+
version = "0.1.0"
|
|
120
|
+
edition = "2021"
|
|
121
|
+
|
|
122
|
+
[lib]
|
|
123
|
+
crate-type = ["cdylib", "lib"]
|
|
124
|
+
name = "${t}"
|
|
125
|
+
|
|
126
|
+
[features]
|
|
127
|
+
no-entrypoint = []
|
|
128
|
+
cpi = ["no-entrypoint"]
|
|
129
|
+
default = []
|
|
130
|
+
|
|
131
|
+
[dependencies]
|
|
132
|
+
anchor-lang = "0.31.1"
|
|
133
|
+
`),Cn(`programs/${t}/src/lib.rs`,s),Cn(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
|
|
134
|
+
// 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
|
|
135
|
+
// 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
|
|
136
|
+
`),Cn("SECURITY.md",`# Security model
|
|
137
|
+
|
|
138
|
+
- Initial and permanent withdrawal authority: \`${n}\`
|
|
139
|
+
- Unlock delay: ${r} slots after the most recent deposit
|
|
140
|
+
- No upgrade authority is created by this source; deployment authority handling is external
|
|
141
|
+
- Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
|
|
142
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:Cp["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:a,gate:{sourceChecks:{ok:s.includes("address = vault.authority")&&s.includes("checked_add")&&s.includes('seeds = [b"vault"')&&!s.includes("invoke_signed_unchecked"),checks:["authority constraint","checked slot arithmetic","PDA seed binding","no unchecked CPI"]},compiler:{tool:"anchor",requiredBeforeDeploy:!0,run:!1},tests:{tool:"anchor test",requiredBeforeDeploy:!0,run:!1},simulation:{cluster:o,requiredBeforeDeploy:!0,run:!1},firmAudit:!1,disclaimer:Yb},deploymentPrepared:!1}}function RW(e){let t=Z1(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||En("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((y,b)=>J1(y,`signerPubkeys[${b}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&En("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Kb(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=J1(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&En("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let s=Kb(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),a=`multi_a(${o},${r.map(Tp).join(",")})`,c=`and_v(v:older(${s}),pk(${Tp(i)}))`,l=`taproot_tree(${a},${c})`,u=_W(r,o),d=NW(i,Number(s)),p=kW(Q1(u),Q1(d)),m=TW(r[0],p,n),f=`tr(${m.internalKey},{${a},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(s),miniscript:l,cooperativeMiniscript:a,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[Cn("policy/miniscript.txt",l),Cn("policy/descriptor.txt",f),Cn("policy/manifest.json",JSON.stringify(h,null,2)),Cn("tests/policy-vectors.json",JSON.stringify({cooperative:{requiredSignatures:o,csvBlocks:0,expected:"spendable"},insufficientCooperative:{requiredSignatures:Math.max(0,o-1),csvBlocks:0,expected:"rejected"},earlyRecovery:{recoverySignature:!0,csvBlocks:Math.max(0,Number(s)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(s),expected:"spendable"}},null,2)),Cn("SECURITY.md",`# Security model
|
|
143
|
+
|
|
144
|
+
- Cooperative path: ${o}-of-${r.length}
|
|
145
|
+
- Recovery path: ${i} after ${s} blocks (BIP68 relative locktime)
|
|
146
|
+
- This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
|
|
147
|
+
- Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
|
|
148
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:Cp["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:a,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:s.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:s.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&s>0n&&new Set([...r,i]).size===r.length+1,checks:["bounded threshold","unique keys","positive BIP68 delay","separate recovery key"]},compiler:{tool:"rust-miniscript or equivalent",requiredBeforeFunding:!0,run:!1},tests:{tool:"regtest/signet policy satisfaction",requiredBeforeFunding:!0,run:!1},simulation:{network:n==="mainnet"?"signet or regtest required first":n,requiredBeforeFunding:!0,run:!1},firmAudit:!1,disclaimer:Yb},psbtPrepared:!1,fundingPrepared:!1}}function Yc(){return Object.values(Cp).map(e=>({...e,disclaimer:Yb}))}async function Xc(e={}){let t=String(e.templateId||"").trim(),n=Cp[t];n||En("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?PW(e):RW(e),o=CW(r.files);return U({provider:"protocol-templates",kind:"native-protocol-build",templateId:t,supportStatus:n.supportStatus,prepareOnly:!0,firmAudit:!1,artifactHash:o,...r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,note:"Deterministic native protocol source bundle only. Compile, test, simulate, and separately prepare deployment/funding before user signature."},{provider:"protocol-templates",kind:"native-protocol-build"})}var Yb,Y1,Cp,Jb=_(()=>{oe();Yb="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",Y1="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Cp=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});async function Qb(e={},t={}){let n=Math.max(1,Number(e.page||1));return x(`${Pp(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function tC(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return x(`${Pp(t)}/networks/${Ns(e.network)}/pools/${Ns(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function nC(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return x(`${Pp(t)}/networks/${Ns(e.network)}/tokens/${Ns(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function rC(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");let n=["minute","hour","day"].includes(e.timeframe)?e.timeframe:"hour",r=new URLSearchParams;return r.set("aggregate",String(Math.max(1,Number(e.aggregate||1)))),r.set("limit",String(Math.min(1e3,Math.max(1,Number(e.limit||168))))),e.beforeTimestamp!=null&&r.set("before_timestamp",String(e.beforeTimestamp)),e.currency&&r.set("currency",String(e.currency)),e.token&&r.set("token",String(e.token)),x(`${Pp(t)}/networks/${Ns(e.network)}/pools/${Ns(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function oC(e={}){let t=await Qb({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}var LW,Pp,Ns,iC=_(()=>{q();LW="https://api.geckoterminal.com/api/v2",Pp=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||LW).replace(/\/$/,""),Ns=e=>encodeURIComponent(String(e))});import{Interface as lC,getAddress as uC,isAddress as $W}from"ethers";function fC(e){let t=DW[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Jc(e,t){if(!$W(e))throw new Error(`${t} must be a valid EVM address`);return uC(e)}function UW(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function aC(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer ${n}..${r}`);return o}function mC(e,t,n){return[e,t,n,...Array(8).fill(pC)]}function hC(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function gC(e){return[e,...Array(4).fill(pC)]}async function FW({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){return(await Promise.all(Array.from({length:n},(s,a)=>{let c=sC.encodeFunctionData("coins",[a]);return r(e,"eth_call",[{to:t,data:c},o.blockTag||"latest"],o)}))).map(s=>uC(sC.decodeFunctionResult("coins",s)[0]))}function cC(e,t,n){let r=t.toLowerCase(),o=e.findIndex(i=>i.toLowerCase()===r);if(o<0)throw new Error(`Curve pool does not contain ${n}`);return o}async function yC(e={}){return x(`${dC(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function e0(e={},t={}){let n=String(e.chain||e.network||"ethereum").toLowerCase(),r=String(e.registry||"main").toLowerCase();if(!/^[a-z0-9-]+$/.test(n)||!/^[a-z0-9-]+$/.test(r))throw new Error("invalid Curve chain or registry");return x(`${dC(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function bC(e={}){let t=await e0({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function t0(e={},t={}){let n=Number(e.chainId??8453),r=fC(n),o=Jc(e.pool,"curve pool"),i=Jc(e.tokenIn,"curve tokenIn"),s=Jc(e.tokenOut,"curve tokenOut"),a=UW(e.amountIn,"curve amountIn"),c=aC(e.nCoins??2,"curve nCoins",2,8),l=aC(e.poolType,"curve poolType",1,4),u=t.rpcCall||J,d=await FW({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=cC(d,i,"tokenIn"),m=cC(d,s,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=mC(i,o,s),h=hC(p,m,l,c),g=gC(o),y=Zb.encodeFunctionData("get_dy",[f,h,a,g]),b=await u(n,"eth_call",[{to:r,data:y},e.blockTag||"latest"],t),w=Zb.decodeFunctionResult("get_dy",b),S=BigInt(w[0]);if(S<=0n)throw new Error("curve quote returned zero output");return we({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:S.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(v=>v.map(I=>I.toString())),pools:g},{chainId:n,venue:r,amountOut:S.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function wC(e={},t={}){let n=Number(e.chainId??8453),r=fC(n),o=Jc(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Jc(e.receiver||e.recipient||o,"curve receiver"),s=await t0({...e,sender:o},t),a=mC(s.tokenIn,s.pool,s.tokenOut),c=hC(s.i,s.j,s.poolType,s.nCoins),l=gC(s.pool),u=Zb.encodeFunctionData("exchange",[a,c,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,i]);return U({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,autoSlippage:s.autoSlippage,requiresApproval:{token:s.tokenIn,spender:r,amount:s.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:De(s.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}var BW,dC,DW,pC,Zb,sC,SC=_(()=>{q();Ne();Ot();oe();BW="https://api.curve.finance/v1",dC=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||BW).replace(/\/$/,""),DW=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),pC="0x0000000000000000000000000000000000000000",Zb=new lC(["function get_dy(address[11] route,uint256[5][5] swap_params,uint256 amount,address[5] pools) view returns (uint256)","function exchange(address[11] route,uint256[5][5] swap_params,uint256 amount,uint256 expected,address[5] pools,address receiver) payable returns (uint256)"]),sC=new lC(["function coins(uint256) view returns (address)"])});import{Interface as jW,getAddress as HW,isAddress as zW,keccak256 as vC,toUtf8Bytes as EC}from"ethers";async function r0(e,t,n={}){return x(WW(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}function Qc(e,t){let n=String(e||"").trim();if(!zW(n))throw new Error(`morpho: ${t} must be an address`);return HW(n).toLowerCase()}function YW(e,t="amount"){try{let n=BigInt(String(e));if(n<=0n)throw new Error("nonpositive");return n.toString()}catch{throw new Error(`morpho: ${t} must be a positive integer string`)}}function n0(e){return Array.isArray(e)?`[${e.map(n0).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${n0(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Zc(e,t,n,r,o={}){let i=Rp.encodeFunctionData(n,r),a=await(o.rpcCall||J)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Rp.decodeFunctionResult(n,a)}function XW(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function xC(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return r0(GW,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function o0(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return r0(KW,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function AC(e={}){return{ok:(await r0("query { __typename }",{},e))?.data?.__typename==="Query"}}async function IC(e={},t={}){let n=Number(e.chainId??8453),r=String(e.action||"deposit").toLowerCase();if(!["deposit","withdraw"].includes(r))throw new Error("morpho: action must be deposit or withdraw");let o=Qc(e.vault||e.vaultAddress,"vault"),i=Qc(e.owner||e.from||e.sender,"owner"),s=Qc(e.receiver||i,"receiver"),a=YW(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),[l,[u]]=await Promise.all([o0({chainId:n,first:100},t),Zc(n,o,"asset",[],t)]),d=XW(l?.data?.vaults?.items,o);if(!d)throw new Error("morpho: vault not found in public Morpho vault registry");if(d.listed===!1)throw new Error("morpho: vault is not listed");let p=Number(d?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&p<c)throw new Error(`morpho: vault totalAssetsUsd ${p} below minimum ${c}`);let m=Qc(u,"vault asset");if((d?.asset?.address?Qc(d.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[[b],[w]]=await Promise.all([Zc(n,o,"maxDeposit",[i],t),Zc(n,o,"previewDeposit",[a],t)]);if(BigInt(a)>BigInt(b.toString()))throw new Error("morpho: amount exceeds maxDeposit");if(BigInt(w.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:w.toString()},h=Rp.encodeFunctionData("deposit",[a,s])}else{let[[b],[w]]=await Promise.all([Zc(n,o,"maxWithdraw",[i],t),Zc(n,o,"previewWithdraw",[a],t)]);if(BigInt(a)>BigInt(b.toString()))throw new Error("morpho: amount exceeds maxWithdraw");if(BigInt(w.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:w.toString()},h=Rp.encodeFunctionData("withdraw",[a,s,i])}let y={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,totalAssetsUsd:p,...g,calldataHash:vC(EC(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return y.guardHash=vC(EC(n0(y))),U({provider:"morpho",protocol:"erc4626-vault",vaultReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,chainId:n,action:r,vault:o,asset:m,owner:i,receiver:s,amount:a,vaultInfo:d,vaultGuard:y,requiresApproval:r==="deposit"?{token:m,spender:o,amount:a}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:y}},{provider:"morpho",kind:"erc4626-vault"})}var VW,Rp,WW,GW,KW,kC=_(()=>{q();Ne();oe();VW="https://api.morpho.org/graphql",Rp=new jW(["function asset() view returns (address)","function maxDeposit(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256)"]),WW=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||VW;GW="query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }",KW="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }"});import{Interface as QW,getAddress as i0,isAddress as ZW}from"ethers";async function NC(e,t,n={}){return x(tG(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}function TC(e){let t=Number(e??8453),n=_C[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(_C).join(", ")})`);return{chainId:t,...n}}function CC(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===oG||t===rG.toLowerCase()}function Lp(e,t){if(!ZW(e))throw new Error(`${t} must be a valid EVM address`);return i0(e)}function OC(e,t,n){let r=String(e||"");return CC(r)||/^weth$/i.test(r)?i0(t.weth):/^usdc$/i.test(r)?i0(t.usdc):Lp(r,n)}function iG(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n}function PC(e){if(e==null||e==="")return"0x";let t=String(e);if(!/^0x[0-9a-fA-F]*$/.test(t))throw new Error("balancer userData must be hex");return t}async function RC(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chains||[e.chain||"ETHEREUM"]).map(o=>String(o).toUpperCase());return NC(nG,{first:n,chains:r,where:{chainIn:r}},t)}async function LC(e={}){return{ok:(await NC("query { __typename }",{},e))?.data?.__typename==="Query"}}async function a0(e={},t={}){let n=TC(e.chainId),r=Lp(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=OC(o,n,"balancer tokenIn"),s=OC(e.tokenOut||"USDC",n,"balancer tokenOut"),a=iG(e.amountIn,"balancer amountIn"),c=Lp(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=s0.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,s,a,c,PC(e.userData)]),d=await(t.rpcCall||J)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=s0.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return we({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:s,amountIn:a.toString(),amountOut:m.toString()},{chainId:n.chainId,venue:n.router,amountOut:m.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function MC(e={},t={}){let n=TC(e.chainId),r=Lp(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=CC(o),s=await a0({...e,sender:r},t),a=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+a),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=s0.encodeFunctionData("swapSingleTokenExactIn",[s.pool,s.tokenIn,s.tokenOut,BigInt(s.amountIn),BigInt(s.amountOutMinimum),l,u,PC(e.userData)]);return U({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:s,autoSlippage:s.autoSlippage,requiresApproval:i?null:{token:s.tokenIn,spender:n.router,amount:s.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?s.amountIn:"0",slippageGuard:De(s.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}var eG,tG,nG,_C,rG,oG,s0,$C=_(()=>{q();Ne();Ot();oe();eG="https://api-v3.balancer.fi/",tG=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||eG;nG="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",_C=Object.freeze({1:{name:"ethereum",router:"0xAE563E3f8219521950555F5962419C8919758Ea2",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",router:"0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2c639c533813f4aa9d7837caf62653d097ff85"},8453:{name:"base",router:"0x3f170631ed9821Ca51A59D996aB095162438DC10",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",router:"0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",router:"0xF39CA6ede9BF7820a952b52f3c94af526bAB9015",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),rG="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",oG="0x0000000000000000000000000000000000000000",s0=new QW(["function querySwapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,address sender,bytes userData) returns (uint256 amountOut)","function swapSingleTokenExactIn(address pool,address tokenIn,address tokenOut,uint256 exactAmountIn,uint256 minAmountOut,uint256 deadline,bool wethIsEth,bytes userData) payable returns (uint256 amountOut)"])});import{getAddress as aG}from"ethers";function Mp(e,t){try{return aG(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Ts(e,t){return Mp(e,t).toLowerCase()}function pG(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===dG||t===uG}function c0(e,t){let n;try{n=BigInt(String(e))}catch{throw new Error(`${t} must be an integer string`)}if(n<=0n)throw new Error(`${t} must be positive`);return n.toString()}function fG(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Mp(t.token,`pendle input ${n} token`),amount:c0(t.amount,`pendle input ${n} amount`)}))}function mG(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Mp(t,`pendle output ${n} token`))}function hG(e){let t=lG[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function gG(e){let t=e?.routes?.[0]?.outputs?.[0]?.amount||e?.outputs?.[0]?.amount;if(!t)throw new Error("Pendle convert response missing output amount");return c0(t,"pendle output amount")}function yG(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!pG(r.token)).map(r=>({token:Ts(r.token,"pendle approval token"),spender:Ts(t,"pendle approval spender"),amount:c0(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function l0(e={},t={}){let n=Number(e.chainId||42161),r=new URLSearchParams({limit:String(Math.min(100,Math.max(1,Number(e.limit||20)))),skip:String(Math.max(0,Number(e.skip||0)))});return e.isExpired!=null&&r.set("isExpired",String(!!e.isExpired)),x(`${BC(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function DC(e={}){let t=await l0({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function u0(e={},t={}){let n=Number(e.chainId??42161),r=hG(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Mp(e.receiver||o,"pendle receiver"),s=fG(e.inputs),a=mG(e.outputs);if(e.enableAggregator===!0||Array.isArray(e.aggregators)&&e.aggregators.length)throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");let c=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!c.executable)throw new Error(`Pendle: route requires ${c.requiredBps} bps above cap ${c.capBps}`);let l={receiver:i,slippage:c.selectedBps/1e4,enableAggregator:!1,useLimitOrder:!1,inputs:s,outputs:a,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await x(`${BC(t)}/v3/sdk/${n}/convert`,{method:"POST",body:l,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),p=u?.routes?.[0]?.tx;if(!p?.to||!p?.data)throw new Error("Pendle convert returned no executable tx");if(Ts(p.to,"pendle tx target")!==Ts(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Ts(p.from,"pendle tx sender")!==Ts(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=gG(u),f=we(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return U({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:yG(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:De(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function UC(e={},t={}){let n=await u0(e,t),{transaction:r,...o}=n;return o}var cG,lG,uG,dG,BC,FC=_(()=>{q();Ot();oe();cG="https://api-v2.pendle.finance/core",lG=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),uG="0x0000000000000000000000000000000000000000",dG="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",BC=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||cG).replace(/\/$/,"")});import{isAddress as wG}from"ethers";async function p0(e={}){return x(`${d0(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function vG(e={}){let t=Number(e.chainId);if(!Number.isInteger(t))throw new Error("odos: chainId required");if(!Array.isArray(e.inputTokens)||e.inputTokens.length<1)throw new Error("odos: inputTokens[] required");if(!Array.isArray(e.outputTokens)||e.outputTokens.length!==1)throw new Error("odos: agentic execution currently requires exactly one output token");if(!wG(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function qC(e={},t={}){let n=vG(e),r=Bt({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!r.executable)throw new Error(`odos: route requires ${r.requiredBps} bps above cap ${r.capBps}`);let o={chainId:n,inputTokens:e.inputTokens,outputTokens:e.outputTokens,userAddr:e.userAddr,slippageLimitPercent:r.selectedBps/100,disableRFQs:e.disableRFQs??!0,compact:e.compact??!0,simple:e.simple??!1},i=await x(`${d0(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),s=i?.outAmounts?.[0];if(!i?.pathId||!s)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:s}}async function jC(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await qC(e,t);return{...we(r,{chainId:n,venue:"odos-quote",amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),executionReady:!1,executionBlocker:"call prepare to assemble and simulate the path"}}async function HC(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await qC(e,t),i=await x(`${d0(t)}/sor/assemble`,{method:"POST",body:{userAddr:e.userAddr,pathId:r.pathId,simulate:!0,...e.receiver?{receiver:e.receiver}:{}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),s=i?.transaction;if(!s?.to||!s?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(s.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(s.from&&String(s.from).toLowerCase()!==String(e.userAddr).toLowerCase())throw new Error("odos: transaction sender mismatch");if(i?.simulation?.isSuccess!==!0)throw new Error(`odos: assembled transaction simulation failed: ${i?.simulation?.simulationError||"unknown"}`);let a=we(r,{chainId:n,venue:s.to,amountOut:o,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),c=i?.simulation?.amountsOut?.[0];if(c!=null&&BigInt(c)<BigInt(a.amountOutMinimum))throw new Error("odos: simulation output is below the bounded automatic floor");let l="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",u="0x0000000000000000000000000000000000000000",d=e.inputTokens.filter(p=>![l,u].includes(String(p.tokenAddress).toLowerCase())).map(p=>({token:p.tokenAddress,spender:s.to,amount:String(p.amount)}));return U({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,simulation:i.simulation,requiresApproval:d,autoSlippage:a.autoSlippage,transaction:{chainId:n,from:s.from||e.userAddr,to:s.to,data:s.data,value:s.value??"0x0",...s.gas!=null?{gasLimit:s.gas}:{},...s.nonce!=null?{nonce:s.nonce}:{},slippageGuard:De(a.autoSlippage,{chainId:n,venue:s.to,data:s.data})}},{provider:"odos",kind:"odos-tx"})}async function zC(e={}){let t=await p0(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}var SG,d0,VC=_(()=>{q();Ot();oe();SG="https://api.odos.xyz",d0=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||SG).replace(/\/$/,"")});function Cs(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(WC,"").replace(AG,"").replace(xG,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function f0(e){if(e==null)return!1;let t=String(e);return t.search(WC)!==-1?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var WC,xG,AG,m0=_(()=>{WC=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,xG=/[<>&`*_~[\]()|\\]/g,AG=/[\u0000-\u001F\u007F]/g});function el(e){return Number.isSafeInteger(e)&&e>=0}function po(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 IG(e){if(!qt(e))throw new Error("blockscout transaction cursor must be a plain object");let t=Object.getOwnPropertyNames(e);if(t.length!==h0.length||t.some(o=>!h0.includes(o)))throw new Error("blockscout transaction cursor fields are invalid");let n=po(e,"block_number","blockscout transaction",!0),r=po(e,"index","blockscout transaction",!0);if(!el(n)||!el(r))throw new Error("blockscout transaction cursor values are invalid");return{block_number:n,index:r}}function kG(e){if(!qt(e))throw new Error("blockscout transactions returned an invalid next cursor");let t=Object.getOwnPropertyNames(e);if(t.length===0||t.length>GC.size||t.some(a=>!GC.has(a)))throw new Error("blockscout transactions returned an invalid next cursor");let n=po(e,"block_number","blockscout provider",!0),r=po(e,"index","blockscout provider",!0);if(!el(n)||!el(r))throw new Error("blockscout transactions returned an invalid next cursor");let o=po(e,"items_count","blockscout provider");if(o!==void 0&&!el(o))throw new Error("blockscout transactions returned an invalid next cursor");for(let a of["value","fee"]){let c=po(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 i=po(e,"hash","blockscout provider");if(i!==void 0&&(typeof i!="string"||!/^0x[0-9a-f]{64}$/iu.test(i)))throw new Error("blockscout transactions returned an invalid next cursor");let s=po(e,"inserted_at","blockscout provider");if(s!==void 0&&(typeof s!="string"||s.length>64||!Number.isFinite(Date.parse(s))))throw new Error("blockscout transactions returned an invalid next cursor");return{block_number:n,index:r}}function tl(e,t={}){let n=Number(e),r=t.baseUrl||$p[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Bp(e){return!!$p[Number(e)]}async function nl(e={},t={}){return x(`${tl(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function KC(e={},t={}){if(!e.address)throw new Error("address required");return x(`${tl(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function YC(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return x(`${tl(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Dp(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${tl(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=Fe(await x(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}}),"blockscout token balances response");return Array.isArray(o)?o:[]}async function Up(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,i=e.cursor;if(i!=null){let m=IG(i);for(let[f,h]of Object.entries(m))h!=null&&o.set(f,String(h))}let s=`${tl(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/transactions?${o}`,a=Fe(await x(s,{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=Nt(a,"items");if(!qt(a)||!Array.isArray(c))throw new Error("blockscout transactions returned an invalid response");let l=c.slice(0,r),u=null,d=Nt(a,"next_page_params");if(d!=null){if(!qt(d))throw new Error("blockscout transactions returned an invalid next cursor");u=kG(d)}let p=c.length>l.length?null:u;return{provider:"blockscout",chainId:n,address:String(e.address),limit:r,cursor:i??null,nextCursor:p,pageComplete:c.length<=l.length&&u==null,count:l.length,truncated:c.length>l.length,transactions:l,raw:{items:l,next_page_params:p}}}function Fp(e=[],{fungibleOnly:t=!0}={}){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r.token&&typeof r.token=="object"?r.token:{},i=String(o.type||r.token_type||"").toUpperCase();if(t&&i&&!i.includes("ERC-20")&&i!=="ERC20")continue;let s=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!s||typeof s!="string")continue;let a=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(a)||a==="0")continue;let c=o.decimals??r.decimals;typeof c=="string"&&/^\d+$/.test(c)&&(c=Number(c)),(typeof c!="number"||!Number.isInteger(c)||c<0||c>36)&&(c=18);let l=Cs(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Cs(o.name,{max:80,fallback:""})||null;n.push({address:s.toLowerCase().startsWith("0x")?s:`0x${s}`,symbol:l,name:u,decimals:c,amountRaw:a,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:f0(o.symbol)||f0(o.name)||void 0})}return n}async function XC(e={}){let t=await nl({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}var $p,h0,GC,rl=_(()=>{q();mn();m0();$p=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"}),h0=Object.freeze(["block_number","index"]),GC=new Set([...h0,"items_count","value","hash","inserted_at","fee"])});function CG(e){if(e==null)return null;let t=typeof e=="string"&&!/^\d+$/.test(e)?e.toLowerCase():Number(e);return OG[t]??null}function PG(e,t){let n=String(t??"").trim();return n?e==="solana"?/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(n)?n:null:/^0x[0-9a-fA-F]{40}$/.test(n)?n.toLowerCase():null:null}function ol(e,t){let n=CG(e),r=n?PG(n,t):null;return n&&r?`${n}:${r}`:null}function RG(e,t,n){let r=null;for(let o of Array.isArray(e)?e:[]){if(String(o?.baseToken?.address??"").toLowerCase()!==t.toLowerCase())continue;let s=Number(o?.priceUsd),a=Number(o?.liquidity?.usd);!Number.isFinite(s)||s<=0||!Number.isFinite(a)||a<n||(!r||a>r.liquidityUsd)&&(r={priceUsd:s,liquidityUsd:a,pairAddress:o?.pairAddress??null,dexId:o?.dexId??null,source:"dexscreener",provisional:!0})}return r}async function QC(e=[],t={}){let n=typeof t.now=="function"?t.now():Date.now(),r=Number.isFinite(t.cacheTtlMs)?t.cacheTtlMs:TG,o=Number.isFinite(t.minLiquidityUsd)?t.minLiquidityUsd:NG,i=(t.baseUrl||process.env.DEXSCREENER_API_URL||Ym).replace(/\/$/,""),s=new Map,a=[],c=new Map;for(let d of Array.isArray(e)?e:[]){let p=ol(d?.chain??d?.chainId,d?.address);if(!p||s.has(p))continue;let m=JC.get(p);if(m&&m.expiresAt>n){m.value?s.set(p,m.value):s.set(p,null);continue}let[f,h]=p.split(":");c.has(f)||c.set(f,[]),c.get(f).push(h)}let l=[...s.keys()].length+[...c.values()].reduce((d,p)=>d+p.length,0),u=!0;for(let[d,p]of c)for(let m=0;m<p.length;m+=wa){let f=p.slice(m,m+wa),h=null;try{h=await x(`${i}/tokens/v1/${d}/${f.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??1e4})}catch(y){u=!1,a.push(`${d}: ${String(y?.message||y).slice(0,120)}`);continue}let g=Array.isArray(h)?h:Array.isArray(h?.pairs)?h.pairs:[];for(let y of f){let b=`${d}:${y}`,w=RG(g,y,o);JC.set(b,{value:w,expiresAt:n+r}),s.set(b,w)}}for(let[d,p]of s)p===null&&s.delete(d);return{prices:s,requested:l,resolved:s.size,reachable:u,failures:a}}var OG,NG,TG,JC,ZC=_(()=>{q();nr();OG=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood",2741:"abstract",solana:"solana"}),NG=1e3,TG=6e4,JC=new Map});import{getAddress as LG}from"ethers";function Ar(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function qp(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function nP(e){if(!e)return null;try{return LG(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function pi(e={},t=process.env){let n=e.addresses||{},r=nP(n.evm||e.evmAddress||qp(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||qp(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||qp(t,"ORACLE_BITCOIN_ADDRESS"),s=nP(n.hyperliquid||e.hyperliquidAddress||qp(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?Ce(o,"portfolio Solana address"):null,bitcoin:i?yn(i,"portfolio Bitcoin address"):null,hyperliquid:s}}function il(e,t){let n=BigInt(String(e||"0")),r=Number(t);if(!Number.isInteger(r)||r<0||r>36)throw new Error("portfolio: decimals must be an integer from 0 to 36");if(r===0)return n.toString();let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=i/s,c=String(i%s).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${c?`.${c}`:""}`}function fo(e){let t=Number(e);return Number.isFinite(t)?t:null}function sl(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Pn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function oP(e,t){let n=rP[t],r=n?e?.coins?.[n]:null,o=Number(r?.price);return{key:n||null,priceUsd:Number.isFinite(o)?o:null,timestamp:r?.timestamp??null,confidence:r?.confidence??null}}function $G(e){let t=new Map;for(let n of e)if(n?.ok)for(let r of n.data?.accounts||[]){let o=BigInt(String(r.amount||"0"));if(o===0n||!r.mint)continue;let i=`${r.mint}:${r.decimals??"unknown"}`,s=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};s.amountRaw+=o,s.accounts+=1,n.program&&s.programs.add(n.program),t.set(i,s)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:il(r,n.decimals),i=n.decimals===0&&n.amountRaw===1n;return{mint:n.mint,amountRaw:r,amount:o,decimals:n.decimals,tokenPrograms:[...n.programs],accountCount:n.accounts,verification:"unverified",classification:i?"collectible-candidate":"fungible-or-unclassified",priceUsd:null,usdValue:null}})}function g0(e,t){return{family:e,status:"unsupported",reason:t}}function y0(e,t){if(!e||e.status!=="ok")return e;let n=oP(t,e.symbol),r=fo(e.amount),o=r!=null&&n.priceUsd!=null?sl(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function iP(e={}){let t=pi({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function jp(e={},t={}){let n=new Date().toISOString(),r=pi(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,s=e.includeCollectibles!==!1,a=new Map(Ko.map(R=>[R.chainId,R])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...a.keys()],l=[...new Set(Object.values(rP))],u=o?Xe(()=>Kt(l,Ar(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ge(c,e.concurrency||5,async R=>{let F=a.get(R);if(!F)return{family:"evm",chainId:R,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:R,name:F.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let z={...Ar(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},Z=await Xe(()=>Do(R,r.evm,z)),re=F.nativeCurrency?.decimals??18,me=F.nativeCurrency?.symbol||"NATIVE",be=Z.ok?Z.data.balanceWei:null,ue={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Bp(R)){let le=await Xe(()=>Dp({chainId:R,address:r.evm},{...Ar(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));le.ok?ue={status:"ok",assets:Fp(le.data,{fungibleOnly:!0}).map(_m=>{let _4=il(_m.amountRaw,_m.decimals);return{..._m,amount:_4,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:le.ms}:ue={status:"unavailable",assets:[],reason:le.error||"blockscout token-balances failed",source:"blockscout",latencyMs:le.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:Z.ok?"ok":"unavailable",...Z.ok?{}:{error:Z.error},latencyMs:Z.ms,native:Z.ok?{status:"ok",symbol:me,amountRaw:be,decimals:re,amount:il(be,re)}:{status:"unavailable",symbol:me,error:Z.error},fungibleTokens:ue,collectibles:{status:s?"unavailable":"not-requested",assets:[],reason:s?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ue.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let R=Ar(t,"solana"),F=await Xe(()=>Sd({address:r.solana},R)),z=i||s?await Promise.all([Xe(()=>oc({owner:r.solana,programId:ky},R)).then(ue=>({...ue,program:"spl-token"})),Xe(()=>oc({owner:r.solana,programId:MG},R)).then(ue=>({...ue,program:"token-2022"}))]):[],Z=$G(z),re=Z.filter(ue=>ue.classification==="collectible-candidate"),me=Z.filter(ue=>ue.classification!=="collectible-candidate"),be=z.filter(ue=>!ue.ok).map(ue=>ue.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||z.some(ue=>ue.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:il(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?be.length===z.length?"unavailable":be.length?"partial":"ok":"not-requested",assets:i?me:[],errors:be,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:s?be.length===z.length?"unavailable":"partial":"not-requested",assets:s?re:[],errors:be,note:"decimals=0 and amount=1 is only a collectible candidate, not verified NFT metadata"},source:"solana-rpc"}})(),m=(async()=>{if(!r.bitcoin)return{family:"bitcoin",name:"Bitcoin Mainnet",address:null,status:"not-configured",error:"set ORACLE_BITCOIN_ADDRESS or pass addresses.bitcoin"};let R=Ar(t,"bitcoin"),F=Ar(t,"bitcoinMeta"),[z,Z,re]=await Promise.all([Xe(()=>Ed({address:r.bitcoin},R)),i?Xe(()=>Ad({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),s?Xe(()=>as({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),me=Z.ok?Z.data:null,be=re.ok?re.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:z.ok||me?.ok||be?.ok?"ok":"unavailable",native:z.ok?{status:"ok",symbol:"BTC",amountRaw:z.data.balanceSats,decimals:8,amount:il(z.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:z.error},fungibleTokens:{status:i?me?.ok?"ok":"unavailable":"not-requested",assets:me?.balances||[],error:me?.ok?null:me?.error||Z.error,verification:"indexer-reported"},collectibles:{status:s?be?.ok?"ok":"unavailable":"not-requested",assets:be?.inscriptions||[],error:be?.ok?null:be?.error||re.error,unknownNotEmpty:!!be?.unknownNotEmpty,verification:"indexer-reported"},source:"bitcoin-esplora+bitcoin-meta"}})(),f=(async()=>{if(!r.hyperliquid)return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:null,status:"not-configured",error:"set ORACLE_HYPERLIQUID_ADDRESS or pass addresses.hyperliquid"};let R=Ar(t,"hyperliquid"),[F,z,Z,re]=await Promise.all([Xe(()=>sd(r.hyperliquid,R)),Xe(()=>ts(r.hyperliquid,R)),Xe(()=>_n(R)),Xe(()=>Va({user:r.hyperliquid},R))]),me=(re.ok&&Array.isArray(re.data?.positions)?re.data.positions:[]).filter(le=>le.vaultAddress&&Pn(le.equity)).map(le=>({vaultAddress:String(le.vaultAddress),equityUsd:fo(le.equity)})),be=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(le=>Pn(le.total)||Pn(le.hold)).map(le=>({coin:le.coin||null,total:String(le.total??"0"),hold:String(le.hold??"0"),priceUsd:null,usdValue:null})),ue=(z.ok&&Array.isArray(z.data?.assetPositions)?z.data.assetPositions:[]).map(le=>le.position||le).filter(le=>Pn(le.szi)).map(le=>({coin:le.coin||null,size:String(le.szi??"0"),entryPrice:le.entryPx??null,positionValueUsd:le.positionValue??null,unrealizedPnlUsd:le.unrealizedPnl??null,liquidationPrice:le.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||z.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:be,error:F.ok?null:F.error},perps:{status:z.ok?"ok":"unavailable",accountValueUsd:z.data?.marginSummary?.accountValue??null,withdrawableUsd:z.data?.withdrawable??null,positions:ue,error:z.ok?null:z.error},vaults:{status:re.ok?"ok":"unavailable",positions:me,error:re.ok?null:re.error},mids:Z.ok?Z.data:{},source:"hyperliquid-info"}})(),[h,g,y,b,w]=await Promise.all([d,p,m,f,u]),S=w.ok?w.data:null,v=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),I=[];for(let R of h){if(R.family!=="evm"||R.fungibleTokens?.status!=="ok")continue;let F=v[R.chainId];if(F)for(let z of R.fungibleTokens.assets||[])z.address&&I.push(`${F}:${String(z.address).toLowerCase()}`)}let A=null;if(o&&I.length){let R=[...new Set(I)],F={coins:{}},z=!1;for(let Z=0;Z<R.length;Z+=eP){let re=R.slice(Z,Z+eP),me=await Xe(()=>Kt(re,Ar(t,"prices")));me.ok&&me.data?.coins&&(z=!0,Object.assign(F.coins,me.data.coins))}z&&(A=F)}let E=Object.freeze({1:new Set(["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","0xdac17f958d2ee523a2206206994597c13d831ec7","0x6b175474e89094c44da98b954eedeac495271d0f","0x4c9edd5852cd905f086c759e8383e09bff1e68b3"]),10:new Set(["0x0b2c639c533813f4aa9d7837caf62653d097ff85","0x94b008aa00579c1307b0ef2c499ad98a8ce58e58","0xda10009cbd5d07dd0cecc66161fc93d7c9000da1"]),56:new Set(["0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d","0x55d398326f99059ff775485246999027b3197955","0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3"]),137:new Set(["0x3c499c542cef5e3811e1192ce70d8cc03d5c3359","0xc2132d05d31c914a87c6611c10748aeb04b58e8f","0x8f3cf7ad23cd3cadbd9735aff958023239c6a063"]),8453:new Set(["0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca"]),42161:new Set(["0xaf88d065e77c8cc2239327c5edb3a432268e5831","0xff970a61a04b1ca14834a43f5de4533ebddb5cc8","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0xda10009cbd5d07dd0cecc66161fc93d7c9000da1"]),43114:new Set(["0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e","0xc7198437980c041c805a1edcba50c1ce5db95118","0xd586e7f844cea2f87f50152665bcbc2c279d8d70"])}),k=(R,F)=>{let z=String(F.address||"").toLowerCase();if(E[R]?.has(z))return{priceUsd:1,priceSource:"stable-peg"};let Z=v[R];if(Z&&F.address&&A?.coins){let re=`${Z}:${String(F.address).toLowerCase()}`,me=Number(A.coins[re]?.price);if(Number.isFinite(me)&&me>0)return{priceUsd:me,priceSource:"defillama"}}return{priceUsd:null,priceSource:null}},O=[];for(let R of h)if(!(R.family!=="evm"||R.fungibleTokens?.status!=="ok"))for(let F of R.fungibleTokens.assets||[])!F.address||!Pn(F.amount)||k(R.chainId,F).priceUsd==null&&ol(R.chainId,F.address)&&O.push({chain:R.chainId,address:F.address});for(let R of g.fungibleTokens?.assets||[]){let F=R.mint||R.address;F&&Pn(R.amount)&&ol("solana",F)&&O.push({chain:"solana",address:F})}let T={prices:new Map,requested:0,resolved:0,reachable:!0,failures:[]};if(o&&O.length)try{T=await QC(O.slice(0,tP),Ar(t,"prices"))}catch(R){T={prices:new Map,requested:O.length,resolved:0,reachable:!1,failures:[String(R?.message||R)]}}let D=(R,F)=>{let z=ol(R,F),Z=z?T.prices.get(z):null;return Z?{priceUsd:Z.priceUsd,priceSource:"dexscreener",priceLiquidityUsd:Z.liquidityUsd,priceProvisional:Z.provisional===!0}:null},X=h.map(R=>{let F=R.native?{...R,native:y0(R.native,S)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let z=F.fungibleTokens.assets.map(Z=>{let re=k(F.chainId,Z);re.priceUsd==null&&Z.address&&(re=D(F.chainId,Z.address)??re);let me=fo(Z.amount),be=me!=null&&re.priceUsd!=null&&re.priceProvisional!==!0?sl(me*re.priceUsd):null;return{...Z,priceUsd:re.priceUsd,priceSource:re.priceSource,...re.priceLiquidityUsd!=null?{priceLiquidityUsd:re.priceLiquidityUsd}:{},...re.priceProvisional===!0?{priceProvisional:!0}:{},usdValue:be}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:z}}}return F});g.native&&(g.native=y0(g.native,S)),g.fungibleTokens?.status==="ok"&&Array.isArray(g.fungibleTokens.assets)&&(g.fungibleTokens={...g.fungibleTokens,assets:g.fungibleTokens.assets.map(R=>{let F=R.mint||R.address,z=F?D("solana",F):null,Z=fo(R.amount),re=z&&Z!=null&&z.priceProvisional!==!0?sl(Z*z.priceUsd):null;return{...R,priceUsd:z?.priceUsd??null,priceSource:z?.priceSource??null,...z?.priceLiquidityUsd!=null?{priceLiquidityUsd:z.priceLiquidityUsd}:{},...z?.priceProvisional===!0?{priceProvisional:!0}:{},usdValue:re}})}),y.native&&(y.native=y0(y.native,S));let H=0,$=0,j=0;for(let R of[...X,g,y]){R.native?.status==="ok"&&Pn(R.native.amount)&&(R.native.usdValue!=null?(H+=R.native.usdValue,$+=1):j+=1);for(let F of R.fungibleTokens?.assets||[])!Pn(F.amount)&&!Pn(F.amountRaw)||(F.usdValue!=null?(H+=F.usdValue,$+=1):j+=1)}let C=oP(S,"HYPE");for(let R of b.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),z=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?C.priceUsd||fo(b.mids?.HYPE):fo(b.mids?.[R.coin]),Z=fo(R.total);R.priceUsd=z,R.usdValue=Z!=null&&z!=null?sl(Z*z):null,Pn(R.total)&&(R.usdValue!=null?(H+=R.usdValue,$+=1):j+=1)}let B=fo(b.perps?.accountValueUsd);B!=null&&B!==0&&(H+=B,$+=1);for(let R of b.vaults?.positions||[])R.equityUsd!=null&&(H+=R.equityUsd,$+=1);let V=(g.collectibles?.assets||[]).filter(R=>Pn(R.amount)).length,K=(y.fungibleTokens?.assets||[]).length+(y.collectibles?.assets||[]).length;j+=V+K;let Oe=[...X,g,y,b],Ee=R=>Oe.filter(F=>F.status===R).length,xe=[],qe=X.filter(R=>R.fungibleTokens?.status==="unavailable"),un=X.filter(R=>R.fungibleTokens?.status==="ok");qe.length&&!un.length?xe.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):qe.length&&xe.push(`EVM token discovery partial: Blockscout covered ${un.length} chain(s); ${qe.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&xe.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),y.collectibles?.unknownNotEmpty&&xe.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),w.ok||xe.push(`Price provider unavailable: ${w.error}`);let $t=[g0("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),g0("sui","Sui balance adapter is not installed"),g0("aptos","Aptos balance adapter is not installed")],W=Oe.some(R=>["unavailable","partial","not-configured"].includes(R.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(R.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:Oe.length,ok:Ee("ok"),unavailable:Ee("unavailable"),notConfigured:Ee("not-configured"),unsupported:Ee("unsupported")+$t.length,evmChainsRequested:c.length,evmChainsOk:X.filter(R=>R.status==="ok").length},valuation:{knownUsd:sl(H),label:"known priced value, not a complete portfolio total",pricedItems:$,unpricedNonzeroItems:j,complete:j===0&&!W&&Ee("unavailable")===0&&Ee("not-configured")===0&&$t.length===0,priceSource:o?"DefiLlama+DexScreener":null,priceStatus:w.ok?"ok":"unavailable",priceFallback:{provider:"DexScreener",requested:T.requested,resolved:T.resolved,reachable:T.reachable,skipped:Math.max(0,O.length-tP)},priceQueriedAt:n},chains:[...X,g,y,b],unsupportedFamilies:$t,warnings:xe}}var eP,tP,MG,rP,Hp=_(()=>{Yi();q();Ne();Zo();is();Id();Xt();dd();Ho();ZC();rl();eP=80,tP=600,MG="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",rP=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"})});import{getAddress as DG}from"ethers";function UG(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid NFT cursor");let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(!(n==="token_contract_address_hash"?/^0x[\da-f]{40}$/i.test(String(r)):n==="token_type"?["ERC-721","ERC-1155","ERC-404"].includes(r):["token_id","items_count"].includes(n)&&/^\d{1,100}$/.test(String(r))))throw new Error("invalid NFT cursor");t.set(n,String(r))}if(!t.size)throw new Error("empty NFT cursor");return t.toString()}async function cP(e={},t={}){let n=DG(e.address),r=sP[e.chainId];if(!r)throw new Error("Blockscout NFT chain not verified");let o=Math.min(3,Math.max(1,Math.trunc(Number(e.maxPages)||3))),i=[],s=[],a=new Set,c=null,l="",u=0,d=!1;for(;u<o;)try{let p=Fe(await x(`${r}/api/v2/addresses/${n}/nft${l?`?${l}`:""}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??8e3,maxResponseBytes:2e6,redirectPolicy:"error",headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}}),"blockscout NFT inventory");if(!Array.isArray(p?.items))throw new Error("invalid NFT inventory response");u++;for(let f of p.items.slice(0,50)){let h=f.token;if(!/^0x[\da-f]{40}$/i.test(h?.address_hash||"")||!/^\d+$/.test(String(f.id??"")))throw new Error("invalid NFT identity");if(!["ERC-721","ERC-1155","ERC-404"].includes(h.type))throw new Error("invalid NFT standard");if(f.owner?.hash&&f.owner.hash.toLowerCase()!==n.toLowerCase())throw new Error("NFT owner mismatch");i.push({chain:e.chain,chainId:e.chainId,family:"evm",owner:n,contract:h.address_hash,tokenId:String(f.id),tokenStandard:h.type,collection:Cs(h.name,{max:160,fallback:h.address_hash}),name:Cs(f.metadata?.name||h.name,{max:160,fallback:`NFT ${f.id}`}),imageUrl:f.image_url||null,estimatedValueUsd:null,spam:["scam","spam"].includes(h.reputation)||h.is_spam===!0,source:"blockscout-owner-inventory",listingAdapter:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"owner indexer provides no acquisition cost"}})}if(p.items.length>50)throw new Error("NFT provider page exceeds 50 item bound");let m=p.next_page_params??null;if(!m){c=null,d=!0;break}if(c=null,l=UG(m),c=Object.fromEntries(new URLSearchParams(l)),a.has(l))throw new Error("repeated NFT cursor");a.add(l)}catch(p){if(s.push(`blockscout: ${p.message}`.slice(0,300)),!u)throw p;break}return{nfts:i,complete:d,next:c,pages:u,truncated:!d,errors:s}}var sP,aP,lP=_(()=>{q();mn();m0();sP=Object.freeze({1:"https://eth.blockscout.com",8453:"https://base.blockscout.com",42161:"https://arbitrum.blockscout.com"}),aP=e=>!!sP[e]});function jG(e){let t=String(e||"").toLowerCase();return FG.some(n=>t===n||t.endsWith(`.${n}`))}function HG(e){let t=String(e||"").trim();return t.startsWith("ipfs://")?`https://ipfs.io/ipfs/${t.slice(7).replace(/^ipfs\//,"")}`:t.startsWith("ar://")?`https://arweave.net/${t.slice(5)}`:t}function uP(e){let t=HG(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!jG(n.hostname)?null:n}async function zG(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=uP(e);if(!r)throw new Error("image host is not on the raster gallery allowlist");let o=Math.min(Math.max(Number(t.maxImageBytes??15e5),5e4),4e6);for(let i=0;i<=3;i+=1){let s=await Xe(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!s.ok)throw new Error(s.error);let a=s.data;if(a.status>=300&&a.status<400){let d=a.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=uP(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!a.ok)throw new Error(`image HTTP ${a.status}`);let c=String(a.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!qG.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(a.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await a.arrayBuffer());if(!u.length||u.length>o)throw new Error("image exceeds gallery byte cap");return{mimeType:c,data:u.toString("base64"),sourceUrl:r.toString(),bytes:u.length}}throw new Error("too many image redirects")}function b0(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function VG(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function dP(e={},t={}){let n=Array.isArray(e.items)?e.items:[];if(!n.length)throw new Error("nft gallery requires inventory items");let r=Math.min(Math.max(Number(e.pageSize??12)||12,1),12),o=Math.max(Number(e.page??1)||1,1),i=Math.max(Math.ceil(n.length/r),1);if(o>i)throw new Error(`nft gallery page ${o} exceeds ${i}`);let s=n.slice((o-1)*r,o*r),a=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let w of s){if(c>=l){a.push({item:w,image:null,error:"gallery page byte cap reached"});continue}try{let S=await zG(w.imageUrl||w.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=S.bytes,a.push({item:w,image:S,error:null})}catch(S){a.push({item:w,image:null,error:String(S?.message||S).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(s.length/u),h=u*d,g=m+f*p,y=a.map(({item:w,image:S,error:v},I)=>{let A=I%u,E=Math.floor(I/u),k=A*d,O=m+E*p,T=S?`<image x="${k+14}" y="${O+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${S.mimeType};base64,${S.data}"/>`:`<rect x="${k+14}" y="${O+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${k+170}" y="${O+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,D=b0(VG(w,I).slice(0,34)),X=b0(w.chain||"unknown chain");return`${T}<text x="${k+16}" y="${O+350}" fill="#f3f5f7" font-size="17" font-weight="600">${D}</text><text x="${k+16}" y="${O+376}" fill="#8d98a8" font-size="13">${X}${v?" \xB7 placeholder":""}</text>`}).join(""),b=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${g}" viewBox="0 0 ${h} ${g}"><rect width="100%" height="100%" fill="#090b10"/><text x="24" y="34" fill="#ffffff" font-size="24" font-weight="700">NFT INVENTORY</text><text x="24" y="58" fill="#8d98a8" font-size="14">page ${o} of ${i} \xB7 ${n.length} assets \xB7 generated ${b0(new Date().toISOString())}</text>${y}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(b).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:a.filter(w=>w.image).length,placeholders:a.filter(w=>!w.image).map(w=>({assetKey:w.item.assetKey||null,name:w.item.name||null,sourceUrl:w.item.imageUrl||null,error:w.error})),rasterOnly:!0,externalScripts:!1}}var FG,qG,pP=_(()=>{q();FG=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"]),qG=new Set(["image/jpeg","image/png","image/webp"])});function YG(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;GG.test(n)&&t.push("url-in-name");let i=WG.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),KG.test(n)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(n)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function fP(e={}){let t=YG(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}var WG,GG,KG,mP=_(()=>{WG=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],GG=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,KG=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i});function fi(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Ps(e,t){let n=await Xe(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function QG(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function ZG(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function eK(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function yP(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function tK(e){let t=new Map;if(Array.isArray(e)){for(let n of e)n?.assetKey&&t.set(String(n.assetKey).toLowerCase(),n);return t}if(e&&typeof e=="object")for(let[n,r]of Object.entries(e))t.set(n.toLowerCase(),r);return t}function nK(e,t){let n=yP(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),s=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function rK(e){let t=new Map;for(let n of e){let r=yP(n);t.has(r)||t.set(r,n)}return[...t.values()]}function oK(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function bP(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Rs(e={},t={}){let n=new Date().toISOString(),r=pi(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(S=>String(S).toLowerCase())):null,i=XG.filter(S=>!o||o.has(S.chain)),s=[],a=[],c=fi(t,"opensea"),l=r.evm?i.filter(S=>S.family!=="solana"):[],u=await Ge(l,4,async S=>({row:S,result:await Ps(`opensea-${S.chain}`,()=>Ba({chain:S.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:S,result:v}of u)if(v.ok){let I=v.data.nfts.map(A=>({...A,family:S.family,chainId:S.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(...I),s.push({family:S.family,chain:S.chain,chainId:S.chainId,status:v.data.complete?"ok":"partial",count:I.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else{let I=aP(S.chainId)?await Ps(`blockscout-${S.chain}`,()=>cP({chain:S.chain,chainId:S.chainId,address:r.evm,maxPages:e.maxPages},{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})):null;I?.ok?(a.push(...I.data.nfts),s.push({...S,status:I.data.complete?"ok":"partial",count:I.data.nfts.length,complete:I.data.complete,next:I.data.next,truncated:I.data.truncated,source:"blockscout",errors:[v.error,...I.data.errors]})):s.push({...S,status:"unavailable",count:null,complete:!1,error:v.error,errors:[v.error,...I?[I.error]:[]],source:"opensea"})}if(!r.evm)for(let S of i.filter(v=>v.family!=="solana"))s.push({family:S.family,chain:S.chain,chainId:S.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let S=await Ps("opensea-solana",()=>Ba({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(S.ok){let v=S.data.nfts.map(I=>({...I,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...v),s.push({family:"solana",chain:"solana",status:S.data.complete?"ok":"partial",count:v.length,complete:S.data.complete,next:S.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:S.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let S=await Ps("satflow-wallet-contents",()=>Od({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},fi(t,"satflow")),t.timeoutMs??35e3);if(S.ok){let v=QG(S.data.contents).map(A=>ZG(A,r.bitcoin));a.push(...v);let I=v.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:I?"ok":"partial",count:v.length,complete:I,source:"satflow"})}else{let v=await Ps("bitcoin-meta-inscriptions",()=>as({address:r.bitcoin},fi(t,"bitcoinMeta")),t.timeoutMs??35e3),I=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];a.push(...I.map(A=>eK(A,r.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:I.length?"partial":"unavailable",count:I.length,complete:!1,source:I.length?"bitcoin-meta":"satflow",error:I.length?"Satflow unavailable; fallback has IDs only":S.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let S of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await Ps(`opensea-pnl-${S}`,()=>Xu({address:S},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:S,source:"opensea-indexed-account-pnl",error:v.error})}let p=tK(e.costBasis),m=rK(a).map(S=>nK(S,p)).map(S=>fP(S)),f=m.filter(S=>!S.spam),h=m.filter(S=>S.spam),g=f.filter(S=>S.estimatedValueUsd!=null&&Number.isFinite(Number(S.estimatedValueUsd))),y=Math.round(g.reduce((S,v)=>S+Number(v.estimatedValueUsd),0)*100)/100,b=f.length-g.length,w=s.filter(S=>S.status!=="ok"||S.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:s,unsupported:JG,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:y,valuedItems:g.length,unvaluedItems:b,complete:b===0&&w.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:oK(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function hP(e,t){let n=typeof e=="number"?e*1e3:Date.parse(String(e||""));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp or Unix seconds`);let r=Math.floor(n/1e3);if(r<=Math.floor(Date.now()/1e3))throw new Error(`${t} must be in the future`);return r}function iK(e){let t=String(e??"").trim();if(!/^[1-9]\d*$/.test(t))throw new Error("Bitcoin NFT list priceSats must be a positive integer");return t}async function wP(e={},t={}){if(e.userConfirmed!==!0)throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");let n=String(e.marketplace||"").trim().toLowerCase();if(n==="opensea")return nd(e,fi(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=hP(e.expiry??e.endTime,"Solana NFT listing expiry");return fp({...e,expiry:r},fi(t,"magiceden"))}if(n==="satflow"){let r=hP(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Nd({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:iK(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},fi(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function w0(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`${t} must be a non-negative ETH number`);return n}function S0(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function zp(e){return String(e??"").trim().toLowerCase()}function sK(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=zp(t),i=zp(n);return!o||!i?!1:r.some(s=>zp(s.trait_type??s.traitType??s.type)===o&&zp(s.value??s.trait_value??s.traitValue)===i)}function aK(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function gP(e={},t=["timestamp","listedAt","createdAt"]){for(let n of t){let r=e[n]??e[n.replace(/[A-Z]/g,i=>`_${i.toLowerCase()}`)];if(r==null)continue;let o=typeof r=="number"?r:Date.parse(String(r));if(Number.isFinite(o))return o}return null}function v0(e){return Math.round(Number(e)*1e6)/1e6}function mo(e,t,n={}){return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:String(e.marketplace||"").toLowerCase(),collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"PASS",reason:t,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:null,evidence:n,prepareIntent:null}}async function SP(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return mo(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(A=>e[A]==null||e[A]==="");if(o.length)return mo(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),s=w0(e.maxPriceEth,"maxPriceEth"),a=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=w0(e.minTraitVolumeEth,"minTraitVolumeEth"),u=w0(e.traitFloorEth,"traitFloorEth"),d=S0(e.collectionFloorEth),p=S0(e.maxListingAgeMs),m=S0(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(a)||a<0)return mo(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return mo(e,"invalid-min-trait-sales");if(u<=0)return mo(e,"trait-floor-unavailable");let f=A=>sK(A,e.traitType,e.traitValue)&&aK(A,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(A=>{if(!m)return!0;let E=gP(A,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=v0(h.reduce((A,E)=>A+Number(E.priceEth??E.price??0),0)),y={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return mo(e,"trait-liquidity-insufficient",{traitSales:y});let b=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(A=>{let E=Number(A.priceEth??A.price);if(!Number.isFinite(E)||E<=0||E>s)return!1;if(!p)return!0;let k=gP(A,["listedAt","createdAt","timestamp"]);return k!=null&&i-k<=p}).map(A=>{let E=Number(A.priceEth??A.price),k=Math.round((u-E)/u*1e4);return{...A,priceEth:E,discountBps:k}}).filter(A=>A.discountBps>=a).sort((A,E)=>A.priceEth-E.priceEth||E.discountBps-A.discountBps),w={traitSales:y,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:b.length,minFreshListings:e.minTraitListings==null?null:Number(e.minTraitListings)},methodology:"Trait buy intent requires caller-supplied fresh listings, real trait sales, volume, max price, and min discount gates. Rarity metadata alone is ignored."},S=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(S)||S<1)return mo(e,"invalid-min-trait-listings",w);if(b.length<S)return mo(e,"trait-listing-depth-insufficient",w);let v=b[0],I=U({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:v0(v.priceEth),maxPriceEth:s,traitType:e.traitType,traitValue:e.traitValue,evidence:w,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:v0(v.priceEth),discountBps:v.discountBps},evidence:w,prepareIntent:I}}async function vP(e={},t={}){let n=await Rs({...e,includePnl:!0},t);return{provider:"nft-portfolio",operation:"pnl",readOnly:!0,generatedAt:n.generatedAt,addresses:n.addresses,coverage:n.coverage,unsupported:n.unsupported,valuation:n.valuation,pnl:n.pnl}}async function EP(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Rs({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await dP({...e,items:n},fi(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var XG,JG,E0=_(()=>{q();lP();Hp();Ki();My();Id();Nb();pP();mP();oe();XG=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),JG=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}])});import{constants as Vp}from"node:fs";import{chmod as lK,mkdir as uK,open as dK,readFile as pK}from"node:fs/promises";import{createHash as fK,randomUUID as mK}from"node:crypto";import hK from"node:os";import Ls from"node:path";function ho(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ms(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function AP(e,t){if(e==null||e==="")return null;let n=Date.parse(String(e));if(!Number.isFinite(n))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(n).toISOString()}function _P(e,t,n,r,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<n||i>r)throw new Error(`${o} must be an integer from ${n} to ${r}`);return i}function gK(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function OP(e={}){return`portfolio_${fK("sha256").update(gK(e)).digest("hex").slice(0,20)}`}function NP(e={}){if(e.historyFile)return Ls.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Ls.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Ls.join(hK.homedir(),".hermes");return Ls.join(Ls.resolve(n),"state","oracle","portfolio-history.jsonl")}function yK(e){let t=ho(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Ms(t):null}function bK(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=ho(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Ms(t):null}function wK(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((a,c)=>{let l=ho(c.usdValue);return l==null?a:a+l},0),i=ho(n.perps?.accountValueUsd),s=Ms(o+(i??0));(s!==0||i!=null||(n.spot?.balances||[]).some(a=>ho(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:s});continue}let r=ho(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Ms(r)})}return t}function SK(e,t,n){let r=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:n,ok:r.filter(o=>o.status==="ok").length,partial:r.filter(o=>o.status==="partial").length,unavailable:r.filter(o=>o.status==="unavailable").length,notConfigured:r.filter(o=>o.status==="not-configured").length,status:n?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function vK(e,t){let n=NP(t),r=`${JSON.stringify(e)}
|
|
149
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await uK(Ls.dirname(n),{recursive:!0,mode:448});let o=Vp.O_APPEND|Vp.O_CREAT|Vp.O_WRONLY|(Vp.O_NOFOLLOW||0),i=await dK(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await lK(n,384),n}async function TP(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||jp,o=t.nftInventoryImpl||Rs,i=r(e,t),s=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),l=yK(a),u=bK(c),d=[l,u].filter(v=>v!=null),p=d.length?Ms(d.reduce((v,I)=>v+I,0)):null,m=!!(a?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=a?.addresses||pi(e,t.env||process.env),y=OP(g),b=[...a?.warnings||[]];n&&c?.status==="unavailable"&&b.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&b.push("NFT estimated value is incomplete and is not an executable bid.");let w={schemaVersion:1,id:`snapshot_${mK()}`,portfolioId:y,recordedAt:h,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(a?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(a?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:wK(a),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:SK(a,c,n),warnings:[...new Set(b)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await vK(w,t),snapshot:w,balance:a,nfts:c}}async function EK(e){let t=NP(e);try{let n=await pK(t);if(n.byteLength>xP)throw new Error(`portfolio history exceeds ${xP} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
150
|
+
`))if(i.trim())try{let s=JSON.parse(i);s?.schemaVersion===1&&s?.portfolioId&&s?.recordedAt?r.push(s):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function xK(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=pi(e,t.env||process.env);return Object.values(n).some(Boolean)?OP(n):null}async function x0(e={},t={}){let n=_P(e.limit,100,1,kP,"portfolio history limit"),r=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(r))throw new Error("portfolio history order must be asc or desc");let o=AP(e.since,"portfolio history since"),i=AP(e.until,"portfolio history until"),s=xK(e,t),a=await EK(t),c=a.snapshots.filter(d=>!(s&&d.portfolioId!==s||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>ho(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:a.file,portfolioId:s,order:r,totalStored:a.snapshots.length,totalMatching:l,corruptLines:a.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function IP(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Wp(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function AK(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function IK(e,t){let c=e.map(w=>w.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let w=Math.max(1,Math.abs(l)*.05);l-=w,u+=w}else{let w=(u-l)*.1;l=Math.max(0,l-w),u+=w}let d=w=>e.length===1?1240/2:100+1040*w/(e.length-1),p=w=>570-(w-l)/(u-l)*470,m=e.map((w,S)=>`${S?"L":"M"}${d(S).toFixed(2)},${p(w.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(w,S)=>{let v=S/4,I=100+v*470,A=u-v*(u-l);return`<line x1="100" y1="${I}" x2="1140" y2="${I}" stroke="#26313c" stroke-width="1"/><text x="86" y="${I+5}" text-anchor="end" fill="#8795a5" font-size="15">${IP(A)}</text>`}).join(""),h=e.map((w,S)=>`<circle cx="${d(S)}" cy="${p(w.value)}" r="5" fill="#b8f0ff"><title>${Wp(w.recordedAt)}: ${IP(w.value)}</title></circle>`).join(""),g=Wp(e[0].recordedAt.slice(0,10)),y=Wp(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${Wp(t||"configured portfolio")}</text>${f}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${m}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${h}<text x="100" y="610" fill="#8795a5" font-size="15">${g}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${y}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function CP(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=_P(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await x0({...e,order:"asc",limit:e.limit??kP},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:ho(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=AK(o,n),s=i[0].value,a=i.at(-1).value,c=Ms(a-s),l=s===0?null:Number(((a-s)/s*100).toFixed(2)),u=IK(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:s,endKnownUsd:a,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}var xP,kP,PP=_(()=>{Hp();E0();xP=10*1024*1024,kP=1e3});function TK(e){return!e||e==="0x"||e===NK}async function mi(e={},t={}){let n=t.rpcCall||J,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(h){return{address:r,chainId:o,status:"unavailable",error:h?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let s=[],a=[],c=i.slice(2).toLowerCase();for(let[h,g]of Object.entries(_K))c.includes(h)&&a.push({selector:`0x${h}`,...g});let l=!1,u=null,d=null,p=await Promise.all(OK.map(async({label:h,slot:g})=>{try{let y=await n(o,"eth_getStorageAt",[r,g,"latest"],t);return{label:h,word:y,error:null}}catch{return{label:h,word:null,error:`proxy slot (${h}) unreadable; proxy status uncertain`}}}));for(let h of p)h.error&&s.push(h.error),!l&&h.word&&!TK(h.word)&&(l=!0,u=h.label,d=`0x${String(h.word).slice(-40)}`);l&&(a.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),s.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let f=a.filter(h=>h.weight==="high").length>0?"high":a.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&s.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:f,findings:a,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:s}}async function RP(e={}){let t=Date.now();try{let n=await mi({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var _K,OK,NK,Gp=_(()=>{Ne();_K=Object.freeze({"8da5cb5b":{name:"owner()",weight:"low",note:"contract has an owner"},f2fde38b:{name:"transferOwnership(address)",weight:"low",note:"ownership transferable"},"40c10f19":{name:"mint(address,uint256)",weight:"high",note:"owner can mint new supply"},a0712d68:{name:"mint(uint256)",weight:"high",note:"owner can mint new supply"},f9f92be4:{name:"blacklist(address)",weight:"high",note:"addresses can be blocked from selling"},e4997dc5:{name:"removeBlackList(address)",weight:"high",note:"blacklist machinery present"},"8456cb59":{name:"pause()",weight:"high",note:"transfers can be frozen"},"3f4ba83a":{name:"unpause()",weight:"high",note:"pausable transfers"},c0246668:{name:"setFee/excludeFromFee",weight:"high",note:"transfer fees can be changed"},"3659cfe6":{name:"upgradeTo(address)",weight:"high",note:"logic can be replaced entirely"},"4f1ef286":{name:"upgradeToAndCall(address,bytes)",weight:"high",note:"logic can be replaced entirely"}}),OK=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),NK=`0x${"0".repeat(64)}`});function Kp(e,t){let n=String(e||"").trim();if(!PK.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function A0(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n)||BigInt(n)<=0n)throw new Error(`evm-token-sniper: ${t} must be a positive raw integer amount`);return n}function al(e,t){return e==null||e===""?null:A0(e,t)}function RK({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:s,unsignedTx:a,args:c,opts:l}){let u=a?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=Kp(u.to,"prepared destination"),p=String(u.data||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(p))throw new Error("local-signer envelope requires hex calldata");let m=A0(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=al(u.gasLimit??c.gasLimit,"gasLimit"),h=al(u.maxFeePerGas??c.maxFeePerGas,"maxFeePerGas");if(!f||!h)throw new Error("local-signer envelope requires explicit gasLimit and maxFeePerGas caps");let g=Number(l.nowMs??Date.now()),y=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),b=Qm({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:s?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:y,secret:l.routeAttestationSecret}),w=De(b,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),S={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:w.selectedBps,expiresAtMs:g+y},v=al(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(S.maxPriorityFeePerGas=v),c.nonce!==void 0&&(S.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(S.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(S.l1FeeWei=al(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(S.operatorFeeWei=al(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:w.selectedBps,expiresAtMs:g+y,fee:{oracleFeeBps:5},autoSlippage:w,artifact:{chainId:e,owner:o,transactions:[S]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function LK(e,t){if(t){if(Number(t.chainId)!==e)throw new Error(`evm-token-sniper: supplied scanner chain ${t.chainId} does not match ${e}`);return t}od();let n=Ix(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function MK({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:s,scanner:a}){let c=[];return e?.evidence!==se.LIVE&&c.push("token identity is not live-verified"),(!Array.isArray(t?.pools)||t.pools.length===0)&&c.push("no liquid pool was resolved"),n?.status!=="ok"&&c.push("structural contract risk is unavailable"),n?.risk==="high"&&c.push("structural contract risk is high"),r?.verdict!==te.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),a.supports?.("sellSimulation")?o?.verdict!==te.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),a.supports?.("quote")?i?.evidence!==se.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),a.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),s.tokenIn||c.push("tokenIn is required to prepare"),s.amountIn||c.push("amountIn is required to prepare"),s.recipient||c.push("recipient is required to prepare"),c}async function MP(e={},t={}){let n=Number(e.chainId??LP);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Kp(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Kp(e.tokenIn,"tokenIn"):null,i=e.recipient?Kp(e.recipient,"recipient"):null,s=e.amountIn==null?null:A0(e.amountIn,"amountIn"),a=LK(n,t.scanner),c=t.scanContractRisk||mi,[l,u,d]=await Promise.all([a.resolveToken(r),a.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await a.scoreRisk(r),m=null;a.supports?.("sellSimulation")&&s?m=await a.sellSimulation({token:r,amountIn:s,base:o||void 0}):a.supports?.("sellSimulation")&&(m=await a.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;a.supports?.("quote")&&o&&s&&(f=await a.quote({tokenIn:o,tokenOut:r,amountIn:s}));let h={...e,tokenIn:o,amountIn:s,recipient:i},g=MK({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:a}),y=null,b=null,w=null;if(e.prepare===!0&&g.length===0){y=await a.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:s,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{b=RK({chainId:n,tokenAddress:r,tokenIn:o,amountIn:s,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:y,args:e,opts:t})}catch(S){w=String(S?.message||S).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!b,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:a.key,name:a.name,nativeCurrency:a.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!y,unsignedTx:y,localSignerEnvelope:b,localSignerBlockedReason:w,signed:b?"pending-local-signer":!1,broadcast:b?"pending-local-signer":!1}}async function $P(){od();let e=kx();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:LP,chainIds:e.map(t=>t.chainId),execution:"armed-local",armed:!1,signing:"local-signer",broadcasting:"local-signer",signed:!1,broadcast:!1,note:"capability only; actual arming requires owner-local signer policy and a compatible prepared artifact"}}var PK,LP,BP=_(()=>{Yi();jo();Ot();Gp();PK=/^0x[0-9a-fA-F]{40}$/,LP=4663});import{createHash as BK}from"node:crypto";function DP(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))DP(t);Object.freeze(e)}return e}function I0(e){return Array.isArray(e)?`[${e.map(I0).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${I0(e[t])}`).join(",")}}`:JSON.stringify(e)}function UK(e){return`sha256:${BK("sha256").update(I0(e)).digest("hex")}`}function FK(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("evidence event must be an object");if(typeof e.id!="string"||e.id.length===0)throw new TypeError("evidence event id must be non-empty");if(typeof e.type!="string"||e.type.length===0)throw new TypeError("evidence event type must be non-empty");if(typeof e.at!="string"||!Number.isFinite(Date.parse(e.at))||new Date(e.at).toISOString()!==e.at)throw new TypeError("evidence event at must be an exact ISO instant");if(!e.data||typeof e.data!="object"||Array.isArray(e.data))throw new TypeError("evidence event data must be an object");return{sequence:t,id:e.id,type:e.type,at:e.at,data:structuredClone(e.data),previousDigest:n}}function UP(e=[]){if(!Array.isArray(e))throw new TypeError("evidence records must be an array");let t=new Set,n=DK,r=e.map((o,i)=>{if(t.has(o?.id))throw new Error(`duplicate evidence event id: ${o.id}`);t.add(o?.id);let s=FK(o,i+1,n),a=UK(s);if(o.sequence!==i+1||o.previousDigest!==n||o.digest!==a)throw new Error(`evidence digest chain mismatch at sequence ${i+1}`);return n=a,{...s,digest:a}});return DP(r)}var DK,FP=_(()=>{DK="sha256:"+"0".repeat(64)});import qP from"node:fs";import qK from"node:path";function Yp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function HK(e){return structuredClone(e)}function k0(e,t="state"){if(!(e===null||typeof e=="string"||typeof e=="boolean")&&!(typeof e=="number"&&Number.isFinite(e))){if(Array.isArray(e))return e.forEach((n,r)=>k0(n,`${t}[${r}]`));if(Yp(e)){for(let[n,r]of Object.entries(e)){if(r===void 0)throw new Error(`launch-radar store: non-JSON value at ${t}.${n}`);k0(r,`${t}.${n}`)}return}throw new Error(`launch-radar store: non-JSON value at ${t}`)}}function zK(e){if(!Yp(e)||!["shadow","armed","autonomous"].includes(e.mode)||typeof e.status!="string"||typeof e.ambiguous!="boolean")throw new Error("launch-radar store: corrupt strategy status shape")}function VK(e){if(!Yp(e)||e.version!==jK)throw new Error("launch-radar store: corrupt or unsupported version");if(!Array.isArray(e.candidates)||!(e.cursor===null||Yp(e.cursor))||!Array.isArray(e.evidence))throw new Error("launch-radar store: corrupt state shape");zK(e.strategyStatus),k0(e);try{UP(e.evidence)}catch(t){throw new Error(`launch-radar store: corrupt evidence: ${t.message}`)}return HK(e)}function WK(e,t=!1){let n;try{n=qP.lstatSync(e)}catch(r){if(t&&r?.code==="ENOENT")return!1;throw r}if(n.isSymbolicLink())throw new Error("launch-radar store: path must not be a symlink");if(!n.isFile())throw new Error("launch-radar store: path must be a regular file");if((n.mode&511)!==384)throw new Error("launch-radar store: existing file permissions must be 0600");return!0}function GK(e){WK(e);let t;try{t=JSON.parse(qP.readFileSync(e,"utf8"))}catch{throw new Error("launch-radar store: corrupt JSON")}return VK(t)}function jP(e={}){let t=e.path;if(typeof t!="string"||!qK.isAbsolute(t))throw new Error("launch-radar store: path must be absolute");return GK(t)}var jK,HP=_(()=>{FP();jK=1});function $s(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))$s(t);Object.freeze(e)}return e}function Rn(e,t=null){return e&&typeof e=="object"?structuredClone(e):t}function WP(e){return typeof e!="string"||!Number.isFinite(Date.parse(e))?null:new Date(e).toISOString()===e?e:null}function VP(e){return!!(e&&KK.has(e.evidence)&&WP(e.observedAt))}function GP(e){return!e||e.status!=="KNOWN"||e.amount===null||e.amount===void 0||e.amount===""?{status:"UNKNOWN",amount:null,unit:e?.unit??null}:{status:"KNOWN",amount:String(e.amount),unit:e.unit??null}}function Xp(e){return[...new Set(e.filter(Boolean))]}function XK(e={}){let t=[],n=[],r=[];(e.venue?.supported!==!0||e.venue?.verified!==!0)&&t.push("unsupported venue"),e.signal?.unsolicitedAirdrop===!0&&t.push("unsolicited airdrop is not a held or eligible candidate"),e.risk?.verdict==="FAIL"&&t.push("risk verdict is FAIL"),e.sellability?.verdict==="FAIL"&&t.push("sellability verdict is FAIL"),e.route?.status==="BLOCK"&&t.push("route is blocked");for(let[i,s]of[["token",e.token],["venue",e.venue],["signal",e.signal],["risk",e.risk],["sellability",e.sellability],["route",e.route]])!VP(s)||s.evidence==="UNKNOWN"||s.evidence==="UNAVAILABLE"?n.push(`${i} evidence is missing or unavailable`):(s.evidence==="CACHED"||s.evidence==="STALE")&&r.push(`${i} evidence is ${s.evidence}`);(!e.pool||!VP(e.pool))&&n.push("pool evidence is missing or unavailable"),(!e.risk||!["PASS","CAUTION","FAIL"].includes(e.risk.verdict))&&n.push("risk verdict is UNKNOWN"),(!e.sellability||!["PASS","CAUTION","FAIL"].includes(e.sellability.verdict))&&n.push("sellability verdict is UNKNOWN"),(!e.route||!["PASS","WARN","BLOCK"].includes(e.route.status))&&n.push("route status is UNKNOWN"),GP(e.route?.cost).status==="UNKNOWN"&&n.push("route cost is UNKNOWN"),e.risk?.verdict==="CAUTION"&&r.push("risk verdict is CAUTION"),e.sellability?.verdict==="CAUTION"&&r.push("sellability verdict is CAUTION"),e.route?.status==="WARN"&&r.push("route status is WARN");let o=Xp(t);return o.length?$s({status:cl.BLOCK,whyBlocked:o}):n.length?$s({status:cl.UNKNOWN,whyBlocked:Xp(n)}):r.length?$s({status:cl.WARN,whyBlocked:[],warnings:Xp(r)}):$s({status:cl.PASS,whyBlocked:[]})}function JK(e={}){let t=Rn(e,{}),n=Object.fromEntries(Object.entries(t).map(([o,i])=>[o,WP(i)])),r=(o,i)=>n[o]&&n[i]?Math.max(0,Date.parse(n[i])-Date.parse(n[o])):null;return t.stagesMs={discoveryToRisk:r("discoveredAt","riskCompletedAt"),riskToSellability:r("riskCompletedAt","sellabilityCompletedAt"),sellabilityToRoute:r("sellabilityCompletedAt","routeCompletedAt"),routeToNormalized:r("routeCompletedAt","normalizedAt"),total:r("discoveredAt","normalizedAt")},t}function KP(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("candidate must be an object");let t=Rn(e.chain,{}),n=Rn(e.token,{}),r=Rn(e.pool),o=Rn(e.venue,{}),i=Rn(e.signal,{}),s=Rn(e.route,{});s.cost=GP(s.cost);let a=XK({...e,chain:t,token:n,pool:r,venue:o,signal:i,route:s}),c=i.unsolicitedAirdrop===!0,l=zP.test(n.address||"")?n.address.toLowerCase():"unknown-token",u=zP.test(r?.address||"")?r.address.toLowerCase():YK.test(r?.poolId||"")?r.poolId.toLowerCase():"unknown-pool",d=`${Number.isInteger(t.id)?t.id:"unknown-chain"}:${l}:${u}:${o.key||"unknown-venue"}`;return $s({id:d,status:a.status,chain:t,token:n,pool:r,venue:o,signal:i,risk:Rn(e.risk,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellability:Rn(e.sellability,{verdict:"UNKNOWN",evidence:"UNKNOWN",observedAt:null}),sellSimulation:Rn(e.sellSimulation,{verdict:"UNKNOWN",evidence:"UNAVAILABLE",observedAt:null}),quoteAsset:e.quoteAsset??r?.quoteAsset??null,roundTripLossBps:e.roundTripLossBps??null,quoteAmountIn:e.quoteAmountIn??null,quoteSlippageBps:e.quoteSlippageBps??null,quoteAssetDecimals:e.quoteAssetDecimals??null,route:s,prepared:Rn(e.prepared,{status:"NOT_PREPARED",unsigned:!0}),whyBlocked:Xp([...e.whyBlocked||[],...a.whyBlocked]),latency:JK(e.latency),held:c?!1:e.held===!0,eligible:c?!1:a.status===cl.PASS&&e.eligible!==!1})}var cl,KK,zP,YK,YP=_(()=>{cl=Object.freeze({PASS:"PASS",WARN:"WARN",BLOCK:"BLOCK",UNKNOWN:"UNKNOWN"}),KK=new Set(["LIVE","CACHED","STALE","UNKNOWN","UNAVAILABLE"]),zP=/^0x[0-9a-fA-F]{40}$/,YK=/^0x[0-9a-fA-F]{64}$/});function XP(e=[]){if(!Array.isArray(e))throw new TypeError("candidates must be an array");return Object.freeze(e.map(KP).sort((t,n)=>t.id.localeCompare(n.id)))}var JP=_(()=>{YP()});function QP(e){return[...new Set(e.filter(Boolean).map(String))]}function hi(e){return Array.isArray(e)?e.map(hi):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,n])=>[t,hi(n)])):e}function go(e,t,n="UNKNOWN"){return!e||typeof e!="object"?{evidence:n,observedAt:t}:hi({...structuredClone(e),evidence:e.evidence||n,observedAt:e.observedAt||t})}function QK(e,t){let n=String(t||"").toLowerCase();return!!(n&&[e?.address,e?.pair,e?.poolId].some(r=>String(r||"").toLowerCase()===n))}function ZK(e,t){let n=e.poolId||e.poolAddress||null,r=[t.topPool,...t.pools?.pools||[]].filter(Boolean),o=n?r.find(s=>QK(s,n)):t.topPool,i={address:e.poolAddress??null,poolId:e.poolId,poolKey:e.poolKey,quoteAsset:e.quoteAsset};return hi({...o||{},...i})}function eY(e,t,n,r){let o=e.observedAt||r,i=ZK(e,t),s=go(t.scannerRisk||t.risk,o),a=go(t.sellability,o,"UNAVAILABLE"),c=go(t.quote,o,"UNAVAILABLE"),l=c.evidence==="LIVE"?"PASS":"UNKNOWN";return hi({chain:{id:e.chainId,...t.chain||{}},token:go({address:e.tokenAddress,...t.token||{}},o,"LIVE"),pool:go(i,o,"LIVE"),venue:go({...e.venue,supported:e.venue?.supported===!0,verified:e.venue?.verified===!0},o,"LIVE"),signal:go({kind:e.kind,source:"verified-factory",unsolicitedAirdrop:!1},o,"LIVE"),risk:s,sellability:a,sellSimulation:go(t.sellSimulation,o,"UNAVAILABLE"),quoteAsset:e.quoteAsset||i.quoteAsset||null,roundTripLossBps:t.roundTripLossBps??null,quoteAmountIn:c.amountIn??null,quoteSlippageBps:t.quoteSlippageBps??null,quoteAssetDecimals:t.quoteAssetDecimals??null,route:hi({status:l,amountOut:c.amountOut??null,cost:c.fee==null?{status:"UNKNOWN",amount:null,unit:null}:{status:"KNOWN",amount:String(c.fee),unit:c.feeUnit||"wei"},routeEvidence:c.routeEvidence,evidence:c.evidence,observedAt:c.observedAt}),prepared:{status:"NOT_PREPARED",unsigned:!0},whyBlocked:QP([...n||[],...t.blockedReasons||[],t.error]),latency:{discoveredAt:o,riskCompletedAt:s.observedAt,sellabilityCompletedAt:a.observedAt,routeCompletedAt:c.observedAt,normalizedAt:r}})}async function ZP(e={}){let t=e.discover||e.discoveryFn,n=e.evaluator||e.evaluate;if(typeof t!="function")throw new TypeError("service requires an injected discovery function");if(typeof n!="function")throw new TypeError("service requires an injected evaluator function");let r=await t(e.discovery||e.discoveryOptions||{}),o=Array.isArray(r?.discoveries)?r.discoveries:[],i=e.observedAt||o[0]?.observedAt||new Date(0).toISOString(),s=[];for(let a of o){if(a?.signal?.unsolicitedAirdrop===!0||a?.unsolicitedAirdrop===!0||a?.kind==="wallet-transfer")continue;let c;try{c=await n({chainId:a.chainId,tokenAddress:a.tokenAddress,discovery:hi(structuredClone(a)),prepare:e.prepare===!0})}catch(l){c={error:`evaluation unavailable: ${String(l?.message||l).slice(0,300)}`}}s.push(eY(a,c||{},r?.status==="LIVE"?[]:r?.whyBlocked,i))}return Object.freeze({status:r?.status||"UNKNOWN",cursor:r?.cursor||null,unavailable:Object.freeze([...r?.unavailable||[]]),whyBlocked:Object.freeze(QP(r?.whyBlocked||[])),candidates:XP(s)})}var eR=_(()=>{JP()});function tY(e,t,n=.5){return Number.isFinite(t)?e==null||!Number.isFinite(e)?t:n*t+(1-n)*e:e??null}function nY(e,t=Math.random){let n=Math.min(1e3,50*2**Math.max(0,e-1)),r=t()*n*.5;return Math.round(n+r)}function rY(e){if(!e||typeof e!="object")return{ok:!1,reason:"malformed probe response: not an object"};let{blockNumber:t,chainId:n,timestampMs:r}=e;return!Number.isInteger(t)||t<0?{ok:!1,reason:"malformed probe response: blockNumber must be a non-negative integer"}:n!=null&&(!Number.isFinite(n)||n<=0)?{ok:!1,reason:"malformed probe response: chainId must be a positive number"}:r!=null&&(!Number.isFinite(r)||r<0)?{ok:!1,reason:"malformed probe response: timestampMs must be a non-negative number"}:{ok:!0}}function oY(e,t,n){let r=n(t).then(()=>{throw new Error(`rpc-health: probe timeout after ${t}ms`)});return r.catch(()=>{}),Promise.race([e,r])}async function iY(e,t){let{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:a,backoff:c,latencyAlpha:l,previousLatencyEwmaMs:u,previousErrorRate:d,previousSamples:p}=t,m=1+a,f=0,h=0,g=u??null,y=null,b=null;for(let I=1;I<=m;I++){f=I;let A=r.now();try{let E=await oY(n(e,{attempt:I,timeoutMs:s}),s,o),k=r.now()-A,O=rY(E);if(!O.ok)h+=1,y=O.reason;else{g=tY(g,k,l),b={blockNumber:E.blockNumber,chainId:E.chainId??null,timestampMs:E.timestampMs??null,latencyMs:k};break}}catch(E){h+=1,y=E?.message||String(E)}if(I<m){let E=c(I,i);await o(E)}}let w=(p??0)+f,S=d!=null&&p?d*p:0,v=w>0?(S+h)/w:0;return{id:e.id,endpoint:e,ok:b!=null,attempts:f,failures:h,errorRate:v,latencyEwmaMs:b?g:u??null,latencyMs:b?b.latencyMs:null,blockNumber:b?b.blockNumber:null,chainId:b?b.chainId:null,timestampMs:b?b.timestampMs:null,lastError:b?null:y,sampleCount:w}}async function sY(e,t,n){let r=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;r[a]=await n(e[a],a)}}let s=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:s},()=>i())),r}function aY(e,{networkHeadBlock:t,maxHeadLagBlocks:n,maxHeadAgeMs:r,now:o}){if(!e.ok)return"down";let i=t!=null&&e.blockNumber!=null?t-e.blockNumber:null,s=i!=null&&i>n,a=e.timestampMs!=null&&o-e.timestampMs>r;return s||a?"stale":"fresh"}function cY(e,t){let n=tR[e.tier]-tR[t.tier];if(n!==0)return n;let r=e.errorRate-t.errorRate;if(r!==0)return r;let o=e.headLagBlocks??1/0,i=t.headLagBlocks??1/0;if(o!==i)return o-i;let s=e.latencyEwmaMs??1/0,a=t.latencyEwmaMs??1/0;return s!==a?s-a:e.id<t.id?-1:e.id>t.id?1:0}async function nR(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("rankRpcEndpoints requires a non-empty array of endpoints");let{probe:n,clock:r={now:()=>Date.now()},sleep:o=k=>new Promise(O=>setTimeout(O,k)),rng:i=Math.random,timeoutMs:s=2e3,retries:a=3,concurrency:c=4,backoff:l=nY,maxHeadLagBlocks:u=3,maxHeadAgeMs:d=6e4,latencyAlpha:p=.5,previousStats:m={}}=t;if(typeof n!="function")throw new Error("rankRpcEndpoints requires an injected probe(endpoint, ctx) function");let f=new Set;for(let k of e){if(!k||typeof k.id!="string"||!k.id)throw new Error("each RPC endpoint requires a stable string id");if(f.has(k.id))throw new Error(`duplicate RPC endpoint id: ${k.id}`);f.add(k.id)}let h=Math.min(Math.max(0,a),3),g=await sY(e,c,k=>iY(k,{probe:n,clock:r,sleep:o,rng:i,timeoutMs:s,maxRetries:h,backoff:l,latencyAlpha:p,previousLatencyEwmaMs:m[k.id]?.latencyEwmaMs??null,previousErrorRate:m[k.id]?.errorRate??null,previousSamples:m[k.id]?.sampleCount??0})),y=g.reduce((k,O)=>O.ok&&O.blockNumber!=null&&(k==null||O.blockNumber>k)?O.blockNumber:k,null),b=r.now(),S=[...g.map(k=>{let O=aY(k,{networkHeadBlock:y,maxHeadLagBlocks:u,maxHeadAgeMs:d,now:b}),T=k.ok&&y!=null&&k.blockNumber!=null?y-k.blockNumber:null;return{...k,tier:O,headLagBlocks:T,costUnknown:!k.ok}})].sort(cY),v=S.every(k=>k.tier==="down"),I=v?null:S[0],A=v?null:S[1]??null;return{status:v?Bs.UNKNOWN:S.some(k=>k.tier!=="fresh")?Bs.DEGRADED:Bs.OK,networkHeadBlock:y,results:S,primary:I,backup:A,allDown:v}}var Bs,tR,rR=_(()=>{Bs=Object.freeze({OK:"ok",DEGRADED:"degraded",UNKNOWN:"unknown"}),tR=Object.freeze({fresh:0,stale:1,down:2})});import{createHash as lY}from"node:crypto";function T0(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))T0(t);Object.freeze(e)}return e}function N0(e){return Array.isArray(e)?`[${e.map(N0).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).filter(t=>e[t]!==void 0).sort().map(t=>`${JSON.stringify(t)}:${N0(e[t])}`).join(",")}}`:JSON.stringify(e)}function pY(e){return`sha256:${lY("sha256").update(N0(e)).digest("hex")}`}function _0(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError(`${t} must be a non-empty exact allowlist`);let r=e.map(o=>n(o,t));if(new Set(r).size!==r.length)throw new TypeError(`${t} contains a duplicate entry`);return r.sort((o,i)=>typeof o=="number"?o-i:o.localeCompare(i))}function fY(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new TypeError(`${t} entries must be positive safe integers`);return e}function O0(e,t){if(typeof e!="string"||e.trim()!==e||e.length===0)throw new TypeError(`${t} entries must be non-empty exact strings`);return e}function Ds(e,t,{positive:n=!1}={}){let r=typeof e=="number"?String(e):e;if(typeof r!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(r))throw new TypeError(`${t} must be a finite non-negative decimal`);if(n&&/^0(?:\.0+)?$/.test(r))throw new TypeError(`${t} must be greater than zero`);return r}function ll(e,t,{min:n=0,max:r=Number.MAX_SAFE_INTEGER}={}){if(!Number.isSafeInteger(e)||e<n||e>r)throw new TypeError(`${t} must be an integer from ${n} through ${r}`);return e}function Qp(e,t){let n=Ds(e,t),[r,o=""]=n.split(".");return{digits:BigInt(r+o),scale:o.length}}function Jp(e,t,n="value"){let r=Qp(e,n),o=Qp(t,"strategy cap"),i=Math.max(r.scale,o.scale),s=r.digits*10n**BigInt(i-r.scale),a=o.digits*10n**BigInt(i-o.scale);return s<a?-1:s>a?1:0}function oR(e){let t=structuredClone(e);return delete t.digest,t}function mY(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");return pY(oR(e))}function hY(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy must be an object");let t=e.mode??yo.SHADOW;if(!dY.has(t))throw new TypeError("mode must be shadow, armed, or autonomous");let n={version:1,mode:t,chains:_0(e.chains,"chains",fY),venues:_0(e.venues,"venues",O0),quoteAssets:_0(e.quoteAssets,"quoteAssets",O0),maxSpendPerTrade:Ds(e.maxSpendPerTrade,"maxSpendPerTrade",{positive:!0}),maxSpendPerDay:Ds(e.maxSpendPerDay,"maxSpendPerDay",{positive:!0}),minLiquidityUsd:Ds(e.minLiquidityUsd,"minLiquidityUsd",{positive:!0}),maxSlippageBps:ll(e.maxSlippageBps,"maxSlippageBps",{max:1e4}),maxGas:Ds(e.maxGas,"maxGas",{positive:!0}),maxPriorityFee:Ds(e.maxPriorityFee,"maxPriorityFee"),maxBuysPerHour:ll(e.maxBuysPerHour,"maxBuysPerHour",{min:1}),retryCeiling:ll(e.retryCeiling,"retryCeiling",{max:uY}),ttlMs:ll(e.ttlMs,"ttlMs",{min:1}),requireSellSimulation:e.requireSellSimulation,requireRiskPass:e.requireRiskPass??!0,maxRoundTripLossBps:ll(e.maxRoundTripLossBps??1500,"maxRoundTripLossBps",{max:1e4}),killSwitch:e.killSwitch,recipient:e.recipient==null||e.recipient===""?null:O0(e.recipient,"recipient")};if(n.requireSellSimulation!==!0)throw new TypeError("requireSellSimulation must be true");if(n.requireRiskPass!==!0)throw new TypeError("requireRiskPass must be true");if(typeof n.killSwitch!="boolean")throw new TypeError("killSwitch must be boolean");if(n.mode!==yo.SHADOW&&!n.recipient)throw new TypeError("recipient is required when mode is armed or autonomous");if(Jp(n.maxSpendPerTrade,n.maxSpendPerDay)>0)throw new TypeError("maxSpendPerTrade cannot exceed maxSpendPerDay");return n.digest=mY(n),T0(n)}function Qe(e,t,n){t&&e.push(n)}function iR(e,t={},n={}){let r=hY(oR(e)),o=[];Qe(o,r.killSwitch,"kill switch is engaged"),Qe(o,!r.chains.includes(t.chain),"chain is not on the exact allowlist"),Qe(o,!r.venues.includes(t.venue),"venue is not on the exact allowlist"),Qe(o,!r.quoteAssets.includes(t.quoteAsset),"quote asset is not on the exact allowlist");let i=(a,c,l)=>{try{Qe(o,Jp(a,c,l)>0,`${l} exceeds cap`)}catch{o.push(`${l} evidence is missing or unknown`)}};i(t.spend,r.maxSpendPerTrade,"per-trade spend");try{let a=Qp(t.spentToday,"daily spend"),c=Qp(t.spend,"per-trade spend"),l=Math.max(a.scale,c.scale),u=a.digits*10n**BigInt(l-a.scale)+c.digits*10n**BigInt(l-c.scale),d=l===0?String(u):`${String(u).padStart(l+1,"0").slice(0,-l)}.${String(u).padStart(l+1,"0").slice(-l)}`;Qe(o,Jp(d,r.maxSpendPerDay,"daily spend")>0,"daily spend cap would be exceeded")}catch{o.push("daily spend evidence is missing or unknown")}try{Qe(o,Jp(t.liquidityUsd,r.minLiquidityUsd,"liquidity")<0,"minimum real liquidity is not met")}catch{o.push("liquidity evidence is missing or unknown")}i(t.slippageBps,String(r.maxSlippageBps),"slippage"),i(t.gas,r.maxGas,"gas"),i(t.priorityFee,r.maxPriorityFee,"priority fee"),Qe(o,!Number.isSafeInteger(t.buysLastHour),"buys per hour evidence is missing or unknown"),Qe(o,Number.isSafeInteger(t.buysLastHour)&&t.buysLastHour>=r.maxBuysPerHour,"buys per hour cap is reached"),Qe(o,!Number.isSafeInteger(t.retries)||t.retries<0,"retry evidence is missing or unknown"),Qe(o,Number.isSafeInteger(t.retries)&&t.retries>r.retryCeiling,"retry ceiling is exceeded"),Qe(o,!Number.isFinite(t.ageMs)||t.ageMs<0,"TTL evidence is missing or unknown"),Qe(o,Number.isFinite(t.ageMs)&&t.ageMs>=r.ttlMs,"TTL has expired"),Qe(o,t.sellSimulation?.verdict!=="PASS"||t.sellSimulation?.evidence!=="LIVE","mandatory sell simulation has no LIVE PASS evidence"),Qe(o,typeof t.fireId!="string"||t.fireId.length===0,"fire id evidence is missing or unknown"),Qe(o,!Array.isArray(t.firedIds),"duplicate-fire history is missing or unknown"),Qe(o,Array.isArray(t.firedIds)&&t.firedIds.includes(t.fireId),"duplicate fire is blocked");let s=[...o];Qe(s,n?.ORACLE_AUTONOMOUS_TRADING!=="1","ORACLE_AUTONOMOUS_TRADING=1 is required literally");for(let[a,c]of gY)Qe(s,t.autonomousGates?.[a]!==!0,c);return Qe(s,r.mode!==yo.AUTONOMOUS,"strategy mode is not autonomous"),T0({strategyDigest:r.digest,mode:r.mode,policyEligible:o.length===0,blockers:o,autonomousEligible:s.length===0,autonomousBlockers:s,reportOnly:!0})}var yo,uY,dY,gY,sR=_(()=>{yo=Object.freeze({SHADOW:"shadow",ARMED:"armed",AUTONOMOUS:"autonomous"}),uY=3,dY=new Set(Object.values(yo));gY=Object.freeze([["localSignerReady","local signer is not ready"],["dedicatedWallet","dedicated non-main wallet evidence is missing"],["exactStrategyBinding","exact strategy digest/grant binding is missing"],["trustedOneUseTrigger","fresh trusted one-use trigger attestation is missing"],["durableReceipts","durable receipts evidence is missing"],["balanceReconciliation","balance reconciliation evidence is missing"]])});import bY from"node:os";import aR from"node:path";function ul(e){return String(e?.message||e||"unknown error").slice(0,300)}function xY(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||aR.join(bY.homedir(),".config","oracle")}function AY(e={}){return e.storePath||process.env.LAUNCH_RADAR_STORE_PATH||aR.join(xY(e),"launch-radar","state.json")}function C0(e,t,n){return Number.isSafeInteger(e)&&e>0?Math.min(e,n):t}function cR(e={}){let t=AY(e);try{return{ok:!0,path:t,state:jP({path:t})}}catch(n){return{ok:!1,path:t,error:ul(n)}}}function lR(){return process.env.ORACLE_AUTONOMOUS_TRADING==="1"}function uR(){return Object.freeze({schema:Gn,evidence:"LIVE",mode:yo.SHADOW,executionReady:!1,signingReady:!1,broadcastReady:!1,funded:!1,autonomousTradingEnvSet:lR()})}function dR(e={},t={}){let n=cR(t),r={schema:Gn,storePath:n.path,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,autonomousTradingEnvSet:lR()};if(!n.ok)return Object.freeze({...r,evidence:"UNAVAILABLE",reason:n.error,mode:yo.SHADOW,status:"unavailable",ambiguous:null,candidateCount:null,cursor:null,evidenceCount:null,lastEvidenceAt:null});let{state:o}=n,i=o.evidence.at(-1)||null;return Object.freeze({...r,evidence:"LIVE",reason:o.strategyStatus.reason??null,mode:o.strategyStatus.mode,status:o.strategyStatus.status,ambiguous:o.strategyStatus.ambiguous,candidateCount:o.candidates.length,cursor:o.cursor,evidenceCount:o.evidence.length,lastEvidenceAt:i?i.at:null})}function pR(e={},t={}){let n=cR(t);if(!n.ok)return Object.freeze({schema:Gn,evidence:"UNAVAILABLE",reason:n.error,storePath:n.path,strategyStatus:null,cursor:null,candidates:[],evidenceRecords:[]});let{state:r}=n,o=C0(e.limit,wY,SY),i=C0(e.evidenceLimit,vY,EY);return Object.freeze({schema:Gn,evidence:"LIVE",storePath:n.path,strategyStatus:structuredClone(r.strategyStatus),cursor:structuredClone(r.cursor),candidateCount:r.candidates.length,candidates:structuredClone(r.candidates.slice(0,o)),evidenceCount:r.evidence.length,evidenceRecords:structuredClone(r.evidence.slice(-i))})}async function fR(e={}){let t=Array.isArray(e.discoveries)?e.discoveries:[],n=Array.isArray(e.evaluations)?e.evaluations:[],r=Array.isArray(e.whyBlocked)?e.whyBlocked:[],o=typeof e.status=="string"&&e.status?e.status:t.length?"LIVE":"UNKNOWN",i=async()=>({status:o,cursor:e.cursor??null,discoveries:t,whyBlocked:r,unavailable:[]}),s=async({chainId:a,tokenAddress:c})=>{let l=n.find(u=>u?.chainId===a&&String(u?.tokenAddress||"").toLowerCase()===String(c||"").toLowerCase());return l?l.evaluation&&typeof l.evaluation=="object"?l.evaluation:l:{}};try{let a=await ZP({discover:i,evaluator:s,observedAt:e.observedAt}),c=a.status==="LIVE"?"LIVE":a.status==="UNAVAILABLE"?"UNAVAILABLE":"UNKNOWN";return{schema:Gn,evidence:c,...a}}catch(a){return{schema:Gn,evidence:"UNAVAILABLE",reason:ul(a),status:"UNKNOWN",cursor:null,unavailable:[],whyBlocked:[ul(a)],candidates:[]}}}async function mR(e={}){let t=Array.isArray(e.endpoints)?e.endpoints:[],n={schema:Gn,evidence:"UNAVAILABLE",status:Bs.UNKNOWN,networkHeadBlock:null,results:[],primary:null,backup:null,allDown:!0};if(t.length===0)return{...n,reason:"no endpoints supplied"};let r=e.samples&&typeof e.samples=="object"&&!Array.isArray(e.samples)?e.samples:{},o=async s=>{let a=r[s.id];if(!a||a.ok===!1)throw new Error(a?.error||`no probe sample supplied for endpoint "${s.id}"`);return a},i=C0(e.retries,0,3);try{let s=await nR(t,{probe:o,retries:i,concurrency:e.concurrency,maxHeadLagBlocks:e.maxHeadLagBlocks,maxHeadAgeMs:e.maxHeadAgeMs}),a=s.allDown?"UNAVAILABLE":s.status===Bs.OK?"LIVE":"STALE";return{schema:Gn,evidence:a,...s}}catch(s){return{...n,reason:ul(s)}}}function hR(e={}){try{let t=iR(e.strategy,e.observation,{});return{schema:Gn,evidence:"LIVE",...t,autonomousEligible:!1,autonomousBlockers:[...new Set([...t.autonomousBlockers||[],"Launch Radar autonomous execution is not released"])],reportOnly:!0}}catch(t){let n=ul(t);return{schema:Gn,evidence:"UNAVAILABLE",reason:n,mode:yo.SHADOW,policyEligible:!1,blockers:[n],autonomousEligible:!1,autonomousBlockers:[n],reportOnly:!0}}}var Gn,wY,SY,vY,EY,gR=_(()=>{HP();eR();rR();sR();Gn="oracle.launch-radar.data-plane.v1",wY=200,SY=500,vY=100,EY=500});function gi(e,t){if(e==null)return null;try{if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||e<0)throw new Error("bad number");return BigInt(Math.floor(e))}let n=String(e).trim();return n.startsWith("0x"),BigInt(n)}catch{throw new Error(`${t} must be a non-negative integer (wei)`)}}function _Y(e){let t=e.filter(n=>n!=null).sort((n,r)=>n<r?-1:n>r?1:0);return t.length?t[Math.floor(t.length/2)]:null}async function Zp(e={},t={}){let n=t.rpcCall||J,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=yR[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(yR).join(", ")}`};let i,s,a,c;try{i=gi(e.maxFeePerGasWei,"maxFeePerGasWei"),s=gi(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),a=gi(e.gasLimit,"gasLimit"),c=gi(e.maxTotalGasWei,"maxTotalGasWei")}catch(A){return{status:"error",viable:!1,error:A.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${kY.toString(16)}`,"pending",P0],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(A){return{status:"unavailable",viable:!1,error:A?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=gi(u?.baseFeePerGas,"baseFeePerGas")??gi(l?.baseFeePerGas?.[l.baseFeePerGas.length-1],"baseFeePerGas");if(d==null)return{status:"unavailable",viable:!1,error:"chain did not report a baseFeePerGas (pre-EIP-1559?)",notes:["this pricer is EIP-1559 only"]};let m=(Array.isArray(l?.reward)?l.reward:[]).map(A=>{try{return gi(A?.[o.percentile],"reward")}catch{return null}}).filter(A=>A!=null&&A>0n),f=_Y(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,y=d*o.baseFeeMultiplier+g,b=[];s!=null&&g>s&&(b.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:s.toString()}),g=s,y=d*o.baseFeeMultiplier+g),i!=null&&y>i&&(b.push({field:"maxFeePerGas",wanted:y.toString(),capped:i.toString()}),y=i,g>y&&(g=y));let w=a!=null?a*y:null;c!=null&&w!=null&&w>c&&b.push({field:"totalGas",wanted:w.toString(),capped:c.toString()});let S=f==null||g>=f,v=c==null||w==null||w<=c,I=S&&v;return S||h.push(`tip cap ${g} is below the observed ${P0[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||h.push(`worst-case gas ${w} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:I,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:P0[o.percentile],maxFeePerGas:y.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:w==null?null:w.toString(),clamps:b,notes:h}}var kY,P0,yR,R0=_(()=>{Ne();kY=5,P0=[50,75,90],yR=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}})});function TY(e){let t=BigInt(e).toString(16);if(t.length>64)throw new Error("value too large for a 32-byte word");return t.padStart(64,"0")}function CY(e){let t=String(e).toLowerCase().replace(/^0x/,"");if(!/^[a-f0-9]{40}$/.test(t))throw new Error(`invalid address: ${e}`);return t.padStart(64,"0")}function bR(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=CY(t);else if(o==="quantity")r+=TY(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function PY({address:e,chainId:t,minter:n,quantity:r,tx:o,nowMs:i,ttlMs:s=3e4}){if(!o?.gasLimit||!o?.maxFeePerGas)throw new Error("local-signer envelope requires gasLimit and maxFeePerGas");let a=Number(i??Date.now()),c=String(o.value??"0");return{version:1,surface:"evm-nft",action:"mint",provider:"nft-mint",owner:n,destination:e,contract:e,quantity:String(r),totalWei:c,slippageBps:0,expiresAtMs:a+Math.min(Math.max(Number(s)||3e4,1e3),6e4),fee:{oracleFeeBps:0},artifact:{chainId:t,owner:n,contract:e,quantity:String(r),totalWei:c,transactions:[{chainId:t,from:n,to:e,data:o.data,value:c,gasLimit:String(o.gasLimit),maxFeePerGas:String(o.maxFeePerGas),...o.maxPriorityFeePerGas!=null?{maxPriorityFeePerGas:String(o.maxPriorityFeePerGas),type:2}:{}}]}}}async function ef(e={},t={}){let n=t.rpcCall||J,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",found:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",found:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(c){return{status:"unavailable",error:c?.message||"eth_getCode failed",found:[]}}if(!i||i==="0x")return{status:"ok",found:[],notes:["no contract deployed at this address"]};let s=i.slice(2).toLowerCase(),a=NY.filter(c=>s.includes(c.selector));return{status:"ok",address:r,chainId:o,found:a,notes:a.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function wR(e={}){let t=Date.now();try{let n=await ef({address:"0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",chainId:1},e),r=n.status==="ok";return{provider:"nft-mint",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe failed"}}catch(n){return{provider:"nft-mint",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}async function tf(e={},t={}){let n=String(e.contract||e.address||"").trim().toLowerCase(),r=Number(e.chainId),o=String(e.minter||e.from||"").trim().toLowerCase(),i=e.quantity==null?1:Number(e.quantity);if(!/^0x[a-f0-9]{40}$/.test(n))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"minter address is required"};if(!Number.isInteger(i)||i<1)return{status:"error",error:"quantity must be a positive integer"};if(!Number.isInteger(r))return{status:"error",error:"chainId is required"};let s=await ef({address:n,chainId:r},t);if(s.status!=="ok")return{status:s.status,error:s.error};if(!s.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:s.notes};let a=e.signature?s.found.find(w=>w.signature===e.signature):s.found[0];if(!a)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:s.found.map(w=>w.signature)};let c=s.found.length>1&&!e.signature,l=await mi({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await qo({chainId:r,tx:{from:o,to:n,data:bR(a,{minter:o,quantity:i}),value:e.valueWei},gasBufferPercent:e.gasBufferPercent},t),u.willRevert===!0&&e.ignoreRevert!==!0))return{status:"would-revert",error:`mint would revert: ${u.revert.reason}`,simulation:u,mintFunction:a.signature,notes:["signing this now would burn gas and fail; pass ignoreRevert to prepare anyway (e.g. a mint that has not opened yet)"]};let d=e.gasLimit??(u?.gasLimit?Number(u.gasLimit):null),p=await Zp({chainId:r,urgency:e.urgency||"war",gasLimit:d,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,maxTotalGasWei:e.maxTotalGasWei},t);if(p.status!=="ok")return{status:"unavailable",error:p.error,notes:p.notes};let m;try{m=bR(a,{minter:o,quantity:i})}catch(w){return{status:"error",error:w.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=bg({chainId:r,tx:{gasLimit:d,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},policy:{maxTotalGasWei:e.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei,grant:e.grant}}),!h.ok))return{status:"refused",error:`gas-war cap exceeded: ${h.reason||h.error}`,gas:p,capCheck:h};let g=[];c&&g.push(`contract exposes ${s.found.length} mint entrypoints (${s.found.map(w=>w.signature).join(", ")}); defaulted to ${a.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(w=>w.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let y=null,b=null;try{y=PY({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(w){b=String(w?.message||w).slice(0,200)}return{status:"ok",execution:y?"armed-local":"prepare-only",signed:y?"pending-local-signer":!1,broadcast:y?"pending-local-signer":!1,tx:f,localSignerEnvelope:y,localSignerBlockedReason:b,mintFunction:a.signature,alternatives:s.found.map(w=>w.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}var NY,L0=_(()=>{Ne();wg();R0();Gp();vu();NY=Object.freeze([{selector:"a0712d68",signature:"mint(uint256)",args:["quantity"]},{selector:"40c10f19",signature:"mint(address,uint256)",args:["to","quantity"]},{selector:"1249c58b",signature:"mint()",args:[]},{selector:"2db11544",signature:"publicMint(uint256)",args:["quantity"]},{selector:"efef39a1",signature:"purchase(uint256)",args:["quantity"]},{selector:"a6f2ae3a",signature:"buy()",args:[]}])});import{createHash as LY}from"node:crypto";function Us(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new yt(`${t} must be a plain object`);return e}function Fs(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new yt(`${n} has unknown field ${r}`,"unknown-field")}function xn(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new yt(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function HY(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new yt(`${t} must be a positive safe integer`);return e}function M0(e,t){if(e=Us(e,t),Fs(e,qY,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new yt(`${t} requires amount and unit`,"ambiguous-unit");let n=xn(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new yt(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:xn(e.unit,`${t}.unit`)}}function $0(e,t){if(e=Us(e,t),Fs(e,jY,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new yt(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function zY(e,t){e=Us(e,t),Fs(e,FY,t);let n=xn(e.kind,`${t}.kind`),r=xn(e.proofFormat,`${t}.proofFormat`),o=xn(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new yt(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function VY(e,t){let n=`stages[${t}]`;e=Us(e,n),Fs(e,UY,n);let r=$0(e.startsAt,`${n}.startsAt`),o=$0(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new yt(`${n} must end after it starts`,"invalid-stage-range");return{id:xn(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:zY(e.eligibility,`${n}.eligibility`)}}function B0(e){if(e=Us(e,"input"),Fs(e,BY,"input"),e.version!==MY)throw new yt("version must be 1");let t=Us(e.chain,"chain");Fs(t,DY,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>$Y)throw new yt("stages must contain 1 through 8 entries","stage-count");let r=n.map(VY).sort((s,a)=>s.startsAt.value-a.startsAt.value||s.id.localeCompare(a.id)),o=new Set;for(let s=0;s<r.length;s+=1){if(o.has(r[s].id))throw new yt("stage ids must be unique","duplicate-stage");if(o.add(r[s].id),s&&r[s].startsAt.value<r[s-1].endsAt.value)throw new yt("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new yt("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:xn(t.family,"chain.family"),id:xn(t.id,"chain.id")},marketplace:xn(e.marketplace,"marketplace"),mechanism:xn(e.mechanism,"mechanism"),collection:xn(e.collection,"collection"),recipient:xn(e.recipient,"recipient"),quantity:HY(e.quantity,"quantity"),stages:r,mintValueCap:M0(e.mintValueCap,"mintValueCap"),networkFeeCap:M0(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:M0(e.priorityFeeCap,"priorityFeeCap"),expiry:$0(e.expiry,"expiry"),maxExecutions:1};if(r.some(s=>s.endsAt.value>i.expiry.value))throw new yt("every stage must end no later than expiry","stage-after-expiry");return i}function WY(e){return JSON.stringify(B0(e))}function SR(e){return`sha256:${LY("sha256").update(WY(e),"utf8").digest("hex")}`}var MY,$Y,yt,BY,DY,UY,FY,qY,jY,vR=_(()=>{MY=1,$Y=8,yt=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},BY=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),DY=new Set(["family","id"]),UY=new Set(["id","startsAt","endsAt","eligibility"]),FY=new Set(["kind","proofFormat","proofDigest"]),qY=new Set(["amount","unit"]),jY=new Set(["value","unit"])});function nf(e,t){if(!Array.isArray(e)||e.length===0)throw new Pt(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Pt(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Pt(`${t} contains duplicates`);return[...n].sort()}function YY(e){if(!Array.isArray(e))throw new Pt("capabilities must be an array");let t=new Set(e);for(let n of t)if(!ER.has(n))throw new Pt(`unknown capability ${n}`,"unknown-capability");return GY.every(n=>t.has(n))?D0.AUTOMINT_READY:xR.every(n=>t.has(n))?D0.PREPARE_READY:D0.RESEARCH_ONLY}function F0(e=[]){if(!Array.isArray(e))throw new Pt("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Pt("entry must be an object");for(let i of Object.keys(n))if(!KY.has(i))throw new Pt(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Pt("entry id must be an exact string");if(t.has(n.id))throw new Pt(`duplicate entry id ${n.id}`,"duplicate-entry");let r=nf(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(nf(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(nf(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(nf(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:YY(r)});t.set(o.id,o)}return Object.freeze({entries:Object.freeze([...t.values()]),get(n){return t.get(n)||null},find({chainFamily:n,marketplace:r,mechanism:o}={}){return[...t.values()].filter(i=>i.chainFamilies.includes(n)&&i.marketplaces.includes(r)&&i.mechanisms.includes(o))},require(n,r=xR){let o=t.get(n);if(!o)throw new Pt(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!ER.has(i))throw new Pt(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Pt(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var D0,yi,U0,ER,xR,GY,KY,Pt,jhe,AR=_(()=>{D0=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),yi=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),U0=Object.freeze(Object.values(yi)),ER=new Set(U0),xR=Object.freeze(U0.slice(0,4)),GY=U0,KY=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Pt=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};jhe=F0([])});import{getAddress as XY,Interface as q0,keccak256 as JY}from"ethers";function Se(e){throw new Error(`evm-mint-launchpads: ${e}`)}function en(e,t){try{return XY(String(e||""))}catch{return Se(`invalid ${t}`)}}function Rt(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&Se(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return Se(`${t} must be an unsigned integer`)}}function j0(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&Se(`invalid ${t}`),e.map(String)}function QY(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&Se("invalid chainId");let o=en(t.contract,"contract"),s=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&en(u.contract,"reviewed contract")===o);s||Se("unsupported contract or wrong chain");let a=en(s.mintTarget||s.contract,"reviewed mint target"),c=bo[e].getFunction(H0[e].signature).selector.toLowerCase();return(!(s.selectors||[c]).map(u=>String(u).toLowerCase()).includes(c)||!s.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(s.codeHash))&&Se("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:a,selector:c,review:s}}async function ZY(e,t,n){if(typeof n.getCode=="function")return n.getCode(e,t);if(typeof n.rpcCall=="function")return n.rpcCall(e,"eth_getCode",[t,"latest"],n);Se("runtime bytecode verification required")}function eX(e,t){let n=e.stage;if(!n)return null;let r=Rt(n.startTime,"stage startTime"),o=Rt(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&Se("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function tX(e,t){let n=H0[e];String(t).slice(0,10).toLowerCase()!==bo[e].getFunction(n.signature).selector.toLowerCase()&&Se("unknown selector");let r;try{r=bo[e].decodeFunctionData(n.signature,t)}catch{Se("invalid calldata layout")}let o;return e==="manifold"&&(o=bo.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=bo.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=bo.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&Se("calldata must be canonical with no suffix"),r}async function IR(e,t={},n={}){bo[e]||Se("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:s}=QY(e,t,n),a=en(t.recipient||t.minter,"recipient"),c=Rt(t.quantity,"quantity",{positive:!0}),l=Rt(t.priceWei,"priceWei"),u=Rt(t.maxValueWei,"maxValueWei"),d=Rt(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&Se("transaction chain mismatch"),en(p.to,"transaction target")!==i&&Se("transaction target mismatch");let m=await ZY(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||JY(m).toLowerCase()!==String(s.codeHash).toLowerCase())&&Se("runtime bytecode is not reviewed");let f=tX(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=eX(t,h),y,b,w,S=null,v=[];if(e==="manifold")en(f[0],"calldata contract")!==o&&Se("calldata contract mismatch"),(t.instanceId==null||Rt(f[1],"instanceId")!==Rt(t.instanceId,"instanceId"))&&Se("instance/stage mismatch"),(t.mintIndex==null||Rt(f[2],"mintIndex")!==Rt(t.mintIndex,"mintIndex"))&&Se("mint index/stage mismatch"),v=j0([...f[3]]),y=en(f[4],"calldata recipient"),b=1n,w=l;else if(e==="zora")y=en(f[0],"calldata recipient"),b=BigInt(f[1]),w=l,t.comment!=null&&f[2]!==String(t.comment)&&Se("comment mismatch"),t.mintReferral!=null&&en(f[3],"mint referral")!==en(t.mintReferral,"expected mint referral")&&Se("mint referral mismatch");else{y=en(f[0],"calldata recipient"),b=BigInt(f[1]),w=BigInt(f[3]);let O=f[4];v=j0([...O.proof]),S=BigInt(O.quantityLimitPerWallet),S<c&&Se("wallet allowance below quantity"),(BigInt(O.pricePerToken)!==l||en(O.currency,"allowlist currency")!==en(f[2],"currency"))&&Se("allowlist terms mismatch")}y!==a&&Se("recipient mismatch"),b!==c&&Se("quantity mismatch"),w!==l&&Se("price mismatch"),t.proof!=null&&JSON.stringify(v.map(O=>O.toLowerCase()))!==JSON.stringify(j0(t.proof).map(O=>O.toLowerCase()))&&Se("proof mismatch");let I=Rt(p.value??0,"transaction value"),A=l*c;(I<A||I-A>d||I>u)&&Se("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:Rt(p.gasLimit,"gasLimit"),k=p.maxFeePerGas==null?null:Rt(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>Rt(t.maxGasLimit,"maxGasLimit"))&&Se("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(k==null||k>Rt(t.maxFeePerGasWei,"maxFeePerGasWei"))&&Se("gas fee cap exceeded"),U({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:a,quantity:c.toString(),priceWei:l.toString(),valueWei:I.toString(),platformFeeWei:(I-A).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...S==null?{}:{walletAllowance:S.toString()},proof:v,transaction:{chainId:r,to:i,data:p.data,value:I.toString(),...E==null?{}:{gasLimit:E.toString()},...k==null?{}:{maxFeePerGas:k.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var bo,H0,Whe,kR=_(()=>{oe();bo=Object.freeze({manifold:new q0(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new q0(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new q0(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),H0=Object.freeze({manifold:Object.freeze({signature:"mint(address,uint256,uint32,bytes32[],address)",layout:"manifold-claim-v1"}),zora:Object.freeze({signature:"mint(address,uint256,string,address)",layout:"zora-1155-mint-v1"}),thirdweb:Object.freeze({signature:"claim(address,uint256,address,uint256,(bytes32[],uint256,uint256,address),bytes)",layout:"thirdweb-drop-claim-v1"})}),Whe=Object.freeze(Object.fromEntries(Object.entries(H0).map(([e,t])=>[bo[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])))});function oX(){throw new Error(`solana-mint: ${nX}; disabled until ${rX}`)}function _R(){oX()}var nX,rX,rf,Khe,OR=_(()=>{nX="RESEARCH_ONLY",rX="canonical serialized-message decoding and program-specific instruction validation are not implemented",rf=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),Khe=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"})});import{Address as iX,CompactSize as sX,NETWORK as aX,OutScript as UR,Script as cX,TEST_NETWORK as NR,Transaction as lX,utils as uX}from"@scure/btc-signer";import{createHash as dl}from"node:crypto";function Ln(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function wo(e,t,{positive:n=!1}={}){let r=String(e??"").trim();if(!/^\d+$/.test(r))throw new Error(`ordinals mint: ${t} must be an integer`);let o=BigInt(r);if(n?o<=0n:o<0n)throw new Error(`ordinals mint: ${t} must be ${n?"positive":"non-negative"}`);return o}function z0(e,t){let n=Number(e);if(!Number.isFinite(n)||n<0)throw new Error(`ordinals mint: ${t} must be a non-negative number`);return n}function FR(e,t){let n=Ln(e,t).toLowerCase();if(!/^(?:[0-9a-f]{2})+$/.test(n))throw new Error(`ordinals mint: ${t} must be non-empty canonical hex`);return n}function mX(e){return e==="bitcoin"||e==="mainnet"?aX:e==="regtest"?{...NR,bech32:"bcrt"}:NR}function RR(e,t){try{let n=UR.decode(e);if(n.type==="unknown")throw new Error("unknown script type");return n}catch(n){throw new Error(`${t} must be a recognized standard Bitcoin script (${n?.message||"decode failed"})`)}}function hX(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function gX(e){let t=dl("sha256").update(e.unsignedTx).digest();return dl("sha256").update(t).digest().reverse().toString("hex")}function LR(e,...t){let n=dl("sha256").update(e,"ascii").digest();return dl("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function yX(e,t,n,r){let o=Buffer.from(t||[]);if(o.length<1)throw new Error(`${r} has an empty tapLeafScript`);let i=o.subarray(0,-1),s=o.at(-1);if(n.type!=="tr")throw new Error(`${r} tapLeafScript requires a taproot prevout`);if(!e?.internalKey||!Array.isArray(e.merklePath))throw new Error(`${r} has malformed tapLeafScript control data`);let a=LR("TapLeaf",Buffer.from([s]),Buffer.from(sX.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);a=LR("TapBranch",...Buffer.compare(a,d)<0?[a,d]:[d,a])}let[c,l]=uX.taprootTweakPubkey(e.internalKey,a);if(!Buffer.from(c).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==s)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function MR(e,t){let n=Ln(e,t);try{let r=Buffer.from(n,"base64");if(!r.length||r.toString("base64")!==n||r.subarray(0,5).toString("hex")!=="70736274ff")throw new Error("bad PSBT encoding or magic");let o=lX.fromPSBT(r);if(o.global?.unknown?.length||o.global?.proprietary?.length)throw new Error(`${t} contains opaque unknown/proprietary global fields`);let i=Array.from({length:o.inputsLength},(a,c)=>{let l=o.getInput(c);for(let p of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(hX(l[p]))throw new Error(`${t} contains signed/finalized input ${c}`);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} input ${c} contains opaque unknown/proprietary fields`);if(![0,1].includes(l.sighashType))throw new Error(`${t} input ${c} requires explicit SIGHASH_DEFAULT or SIGHASH_ALL`);if(!l.witnessUtxo?.script||l.witnessUtxo.amount==null)throw new Error(`${t} input ${c} requires witnessUtxo value and script`);let u=RR(l.witnessUtxo.script,`${t} input ${c} witnessUtxo script`);if(l.sighashType===0&&u.type!=="tr")throw new Error(`${t} input ${c} uses SIGHASH_DEFAULT for a non-taproot prevout`);let d=(l.tapLeafScript||[]).map(([p,m],f)=>yX(p,m,u,`${t} input ${c} tapLeafScript ${f}`));return{txid:Buffer.from(l.txid).toString("hex"),vout:Number(l.index),sequence:Number(l.sequence),valueSats:BigInt(l.witnessUtxo.amount).toString(),scriptHex:Buffer.from(l.witnessUtxo.script).toString("hex"),sighashType:l.sighashType,tapLeafScripts:d}}),s=Array.from({length:o.outputsLength},(a,c)=>{let l=o.getOutput(c);if(l.unknown?.length||l.proprietary?.length)throw new Error(`${t} output ${c} contains opaque unknown/proprietary fields`);return RR(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:gX(o),inputs:i,outputs:s,feeSats:o.fee.toString(),vsizeLowerBound:o.unsignedTx.length}}catch(r){throw new Error(`ordinals mint: invalid ${t}; decoded PSBT required (${r?.message||"decode failed"})`)}}function bX(e){let t=Buffer.from(e);if(t.length!==36)throw new Error("ordinals mint: inscription envelope parent linkage must be 36 bytes");return`${Buffer.from(t.subarray(0,32)).reverse().toString("hex")}i${t.readUInt32LE(32)}`}function wX(e){if(Number.isInteger(e)&&e>=1&&e<=16)return e;if(e instanceof Uint8Array&&e.length===1&&e[0]>=1&&e[0]<=16)return e[0]}function vX(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=wX(e[n++]),s=e[n++];if(i==null||!(s instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!SX.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let a=r.get(i)||[];a.push(Buffer.from(s)),r.set(i,a)}if(e[n++]!==0)throw new Error("ordinals mint: malformed inscription envelope body separator");let o=[];for(;n<e.length&&e[n]!=="ENDIF";){if(!(e[n]instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope body");o.push(Buffer.from(e[n++]))}if(e[n]!=="ENDIF")throw new Error("ordinals mint: unterminated inscription envelope");return{fields:r,content:Buffer.concat(o)}}function EX(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=cX.decode(u)}catch(p){throw new Error(`ordinals mint: invalid reveal tapLeafScript (${p?.message||"script decode failed"})`)}for(let p=0;p+2<d.length;p+=1)d[p]===0&&d[p+1]==="IF"&&d[p+2]instanceof Uint8Array&&Buffer.from(d[p+2]).equals(Buffer.from("ord","ascii"))&&o.push(vX(d,p))}if(o.length===0)throw new Error("ordinals mint: missing tapLeafScript inscription envelope");if(o.length!==1)throw new Error("ordinals mint: ambiguous tapLeafScript inscription envelope");let i=o[0],s=i.fields.get(1)||[];if(s.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let a;try{a=new TextDecoder("utf-8",{fatal:!0}).decode(s[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(a!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(dl("sha256").update(i.content).digest("hex")!==t)throw new Error("ordinals mint: inscription envelope content SHA-256 does not match contentHash");let l=i.fields.get(3)||[];if(r!=null){if(l.length!==1||bX(l[0])!==r)throw new Error("ordinals mint: inscription envelope parent linkage does not match parentId")}else if(l.length!==0)throw new Error("ordinals mint: unexpected inscription envelope parent linkage")}function $R(e){return{txid:e.txid,vout:e.vout,sequence:e.sequence,valueSats:e.valueSats,scriptHex:e.scriptHex,sighashType:e.sighashType,outpoint:`${e.txid}:${e.vout}`}}function xX(e){let t=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|signedPsbt|signedTransaction|rawTransaction|txHex)$/i,n=r=>{if(!(!r||typeof r!="object"))for(let[o,i]of Object.entries(r)){if(t.test(o))throw new Error(`ordinals mint: ${o} refused; private/signed material is outside this prepare-only adapter`);n(i)}};if(n(e),e.sign===!0||e.execute===!0||e.broadcast===!0||e.submit===!0)throw new Error("ordinals mint: sign/broadcast/execute refused; adapter is prepare-only")}function qR(e,t="parentId"){let n=Ln(e,t).toLowerCase();if(!/^[0-9a-f]{64}i\d+$/.test(n))throw new Error(`ordinals mint: ${t} must be a canonical inscription id`);return n}function jR(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Ln(e.txid,`commitInputs[${t}].txid`).toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`ordinals mint: commitInputs[${t}].txid must be 64 hex`);let r=Number(e.vout);if(!Number.isSafeInteger(r)||r<0||r>4294967295)throw new Error(`ordinals mint: commitInputs[${t}].vout invalid`);let o=wo(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function AX(e,{recipient:t,parentId:n,postageSats:r}){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: revealOutputs required");let o=e.map((s,a)=>{if(!s||typeof s!="object")throw new Error(`ordinals mint: reveal output ${a} invalid`);return{role:Ln(s.role,`revealOutputs[${a}].role`),address:Ln(s.address,`revealOutputs[${a}].address`),valueSats:wo(s.valueSats??s.value,`revealOutputs[${a}].valueSats`).toString(),scriptHex:FR(s.scriptHex,`revealOutputs[${a}].scriptHex`),...s.parentId==null?{}:{parentId:qR(s.parentId,`revealOutputs[${a}].parentId`)}}}),i=o.filter(s=>s.role==="inscription");if(i.length!==1)throw new Error("ordinals mint: exactly one inscription reveal output required");if(i[0].address!==t)throw new Error("ordinals mint: reveal destination mutation refused");if(i[0].valueSats!==r)throw new Error("ordinals mint: reveal postage does not match bound postageSats");if(i[0].parentId!==n)throw new Error("ordinals mint: missing or mutated parent linkage on inscription output");return o}function IX(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Ln(n?.role,`commitOutputs[${r}].role`),valueSats:wo(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:FR(n?.scriptHex,`commitOutputs[${r}].scriptHex`)}));if(t.filter(n=>n.role==="reveal").length!==1)throw new Error("ordinals mint: exactly one commit reveal output required");return t}function BR(e,t,n){if(e.length!==t.length||e.some((r,o)=>r.valueSats!==t[o].valueSats||r.scriptHex!==t[o].scriptHex))throw new Error(`ordinals mint: actual ${n} outputs do not match reviewed outputs`)}function DR(e,t,n){try{return Buffer.from(UR.encode(iX(mX(t)).decode(e))).toString("hex")}catch(r){throw new Error(`ordinals mint: ${n} must be a valid address for ${t} (${r?.message||"decode failed"})`)}}function kX(e,t){let n=e.commitPsbtInputs??e.psbtInputs;if(n==null)return;if(!Array.isArray(n))throw new Error("ordinals mint: commitPsbtInputs must be an array");let r=n.map((i,s)=>jR({...i,valueSats:i.valueSats??i.value??t[s]?.valueSats},s).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,s)=>i!==o[s]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function _X(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");xX(e);for(let T of["content","contentBytes","body","file","path","url","contentUrl"])if(e[T]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let T of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[T]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Ln(e.network,"network").toLowerCase();if(!pX.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Ln(e.contentHash??e.contentSha256??e.sha256,"contentHash").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new Error("ordinals mint: contentHash must be a 32-byte SHA-256 hex digest");let o=Ln(e.contentType??e.mimeType,"contentType").toLowerCase();if(!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(o))throw new Error("ordinals mint: invalid contentType");let i=qR(e.parentId??e.parentInscriptionId),s=Ln(e.recipient??e.destination,"recipient"),a=wo(e.postageSats??e.postage,"postageSats",{positive:!0}).toString();if(!Array.isArray(e.commitInputs)||e.commitInputs.length===0)throw new Error("ordinals mint: exact commitInputs required");let c=e.commitInputs.map(jR);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");kX(e,c);let l=MR(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=MR(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=IX(e.commitOutputs),p=AX(e.revealOutputs,{recipient:s,parentId:i,postageSats:a});if(l.inputs.length!==c.length||l.inputs.some((T,D)=>T.txid!==c[D].txid||T.vout!==c[D].vout||T.valueSats!==c[D].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");BR(l.outputs,d,"commit PSBT"),BR(u.outputs,p,"reveal PSBT");let m=DR(s,n,"recipient");if(p.find(T=>T.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[T,D]of p.entries())if(D.scriptHex!==DR(D.address,n,`revealOutputs[${T}].address`))throw new Error(`ordinals mint: reveal output ${T} script does not pay its bound address`);let f=d.findIndex(T=>T.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(T=>T.txid===l.txid&&T.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");EX(u,{contentHash:r,contentType:o,parentId:i});let g=z0(e.commitFeeRateSatVb,"commitFeeRateSatVb"),y=z0(e.revealFeeRateSatVb,"revealFeeRateSatVb"),b=z0(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(b<=0||g>b||y>b)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let w=wo(e.commitFeeSats,"commitFeeSats"),S=wo(e.revealFeeSats,"revealFeeSats"),v=wo(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(w+S>v)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==w.toString()||u.feeSats!==S.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(w)/l.vsizeLowerBound>g||Number(S)/u.vsizeLowerBound>y)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(T=>T.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let E=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:wo(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(E.enabled){if(!Number.isSafeInteger(E.outputIndex)||E.outputIndex<0||p[E.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[E.outputIndex].valueSats!==E.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(T=>T.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let k=Number(t.nowMs??Date.now()),O=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(O)||O<=k||O-k>dX)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:s,postageSats:a,commitInputs:l.inputs.map($R),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map($R),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:y,maxRate:b,commitFee:w.toString(),revealFee:S.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:E,expiresAt:O}}function OX(e={},t={}){let n=_X(e,t),r=n.commitInputs.find(a=>PR.has(a.outpoint));if(r)throw new Error(`ordinals mint: commit UTXO ${r.outpoint} already reserved; reuse refused`);let o=Object.freeze({...t.feeConfig||e.feeConfiguration||{}}),i={provider:TR,kind:CR,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...fX},feeConfiguration:o,plan:{version:1,network:n.network,content:{sha256:n.contentHash,type:n.contentType,mutable:!1},parentId:n.parentId,recipient:n.recipient,postageSats:n.postageSats,commit:{unsignedPsbt:n.commitPsbt,inputs:n.commitInputs,outputs:n.commitOutputs,feeRateSatVb:n.commitRate,feeSats:n.commitFee,rbf:n.rbf},reveal:{unsignedPsbt:n.revealPsbt,inputs:n.revealInputs,outputs:n.revealOutputs,feeRateSatVb:n.revealRate,feeSats:n.revealFee,cpfp:n.cpfp},caps:{maxFeeRateSatVb:n.maxRate,maxTotalFeeSats:n.maxTotalFee},expiresAt:n.expiresAt,maxExecutions:1},note:"Unsigned commit/reveal PSBT plan only. Sign and broadcast in a user-controlled Bitcoin wallet; inscription numbers are not stable before confirmation."},s=U(i,{provider:TR,kind:CR,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let a of n.commitInputs)PR.add(a.outpoint);return s}var TR,CR,dX,pX,PR,fX,SX,HR,zR=_(()=>{oe();TR="universal-ordinals-mint",CR="bitcoin-ordinals-mint-plan",dX=1800*1e3,pX=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),PR=new Set,fX=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});SX=new Set([1,3]);HR=OX});import{createHash as NX}from"node:crypto";function Le(e,t,n){throw new of(e,t,n?{cause:n}:{})}function Q(e,t,n){String(e??"")!==String(t)&&Le("intent-mismatch",`${n} does not match canonical intent`)}function dt(e,t,n){let r=e[t];return r.unit!==n&&Le("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function KR(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))PX.test(n)&&Le("custody-refused",`${t}.${n} is outside the prepare-only boundary`),KR(r,`${t}.${n}`)}function RX(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function LX(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&Le("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||Le("intent-mismatch","stageId does not match canonical intent"),Q(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${NX("sha256").update(JSON.stringify(RX(n,t))).digest("hex")}`;Q(i,o.eligibility.proofDigest,"decoded proof digest");let s=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),a=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(s)||!Number.isSafeInteger(a))&&Le("invalid-request","decoded input requires exact stage bounds"),Q(s,o.startsAt.value,"stage start"),Q(a,o.endsAt.value,"stage end"),(r<s||r>=a)&&Le("expired-intent","canonical mint stage is not active at authoritative now"),o}function MX(e,t){let n=GR.get(t);n||Le("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return Q(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&Le("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function $X(e,t){e.chain.family==="evm"?(Q(t.chainId,e.chain.id,"network"),Q(t.contract,e.collection,"collection/drop"),Q(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),Q(t.quantity,e.quantity,"quantity"),Q(t.maxValueWei??t.maxTotalWei,dt(e,"mintValueCap","wei"),"mint-value cap"),Q(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,dt(e,"networkFeeCap","wei"),"network-fee cap"),Q(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,dt(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(Q(t.network,e.chain.id,"network"),Q(t.collection??t.drop??t.identity,e.collection,"collection/drop"),Q(t.recipientOwner??t.recipient,e.recipient,"recipient"),Q(t.quantity,e.quantity,"quantity"),Q(t.priceLamports,dt(e,"mintValueCap","lamports"),"mint-value cap"),Q(t.networkFeeCapLamports,dt(e,"networkFeeCap","lamports"),"network-fee cap"),Q(t.priorityFeeCapLamports,dt(e,"priorityFeeCap","lamports"),"priority-fee cap")):(Q(t.network,e.chain.id,"network"),Q(t.parentId,e.collection,"collection/drop"),Q(t.recipient,e.recipient,"recipient"),Q(e.quantity,1,"Ordinals quantity"),Q(t.postageSats,dt(e,"mintValueCap","sats"),"mint-value cap"),Q(t.maxTotalFeeSats,dt(e,"networkFeeCap","sats"),"network-fee cap"),Q(t.maxFeeRateSatVb,dt(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function BX(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==rr(e))&&Le("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&Le("custody-refused","leaf artifact is not strictly prepare-only")}function DX(e,t,n){Q(t.chainId,e.chain.id,"network"),Q(t.contract,e.collection,"collection/drop"),Q(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),Q(t.quantity,e.quantity,"quantity");let r=dt(e,"mintValueCap","wei"),o=dt(e,"networkFeeCap","wei"),i=dt(e,"priorityFeeCap","wei-per-gas");Q(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),Q(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),Q(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let s=n.transaction??n.transactions?.[0];s||Le("artifact-mismatch","prepared EVM transaction is missing"),Q(s.chainId,e.chain.id,"artifact network");let a=BigInt(s.gasLimit??0),c=BigInt(s.maxFeePerGas??0);(!a||!c||a*c>o)&&Le("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(s.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&Le("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),Q(n.contract,e.collection,"artifact collection/drop"),Q(n.recipient??n.buyer,e.recipient,"artifact recipient"),Q(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&Le("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(a*c).toString(),priorityFee:l.toString()}}function UX(e,t,n){Q(t.network,e.chain.id,"network"),Q(t.collection??t.drop??t.identity,e.collection,"collection/drop"),Q(t.recipientOwner??t.recipient,e.recipient,"recipient"),Q(t.quantity,e.quantity,"quantity"),Q(t.priceLamports,dt(e,"mintValueCap","lamports"),"mint-value cap");let r=dt(e,"networkFeeCap","lamports"),o=dt(e,"priorityFeeCap","lamports");Q(t.networkFeeCapLamports,r,"network-fee cap"),Q(t.priorityFeeCapLamports,o,"priority-fee cap"),Q(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let s of n.transactions)for(let a of s.instructions)if(String(a.decoded?.type).toLowerCase().includes("price")){let c=s.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(c)*BigInt(a.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&Le("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function FX(e,t,n){return Q(t.network,e.chain.id,"network"),Q(t.parentId,e.collection,"collection/drop"),Q(t.recipient,e.recipient,"recipient"),Q(e.quantity,1,"Ordinals quantity"),Q(t.postageSats,dt(e,"mintValueCap","sats"),"mint-value cap"),Q(t.maxTotalFeeSats,dt(e,"networkFeeCap","sats"),"network-fee cap"),Q(t.maxFeeRateSatVb,dt(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),Q(n.plan.network,e.chain.id,"artifact network"),Q(n.plan.parentId,e.collection,"artifact collection/drop"),Q(n.plan.recipient,e.recipient,"artifact recipient"),Q(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),Q(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),Q(n.plan.caps.maxFeeRateSatVb,e.priorityFeeCap.amount,"artifact priority-fee cap"),{networkFee:(BigInt(n.plan.commit.feeSats)+BigInt(n.plan.reveal.feeSats)).toString(),priorityFee:String(n.plan.caps.maxFeeRateSatVb)}}function V0(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:WR})}async function YR(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:V0()}}async function XR(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&Le("invalid-request","request must be a plain object");for(let u of Object.keys(e))CX.has(u)||Le("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&Le("invalid-request","explicit adapterId is required; adapter inference is refused"),GR.has(e.adapterId)||Le("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&Le("invalid-request","family-specific decoded input is required"),KR(n);let r;try{r=B0(e.intent)}catch(u){Le("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||Le("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&Le("expired-intent","canonical mint intent has expired");let i=MX(r,e.adapterId);i[1]==="solana"&&Le("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let s=LX(r,n,r.chain.family,o);$X(r,n);let a;try{i[4]==="evm"?a=await IR(i[5],n,t):i[4]==="opensea"?a=await td(n,t):i[4]==="solana"?(Q(n.programId,i[5],"selected Solana adapter program"),a=await _R(n,t)):a=await HR(n,t)}catch(u){if(u instanceof of)throw u;Le("adapter-refused",u?.message||"adapter preparation failed",u)}BX(a);let c=i[4]==="bitcoin"?FX(r,n,a):i[4]==="solana"?UX(r,n,a):DX(r,n,a),l=Object.freeze({intentHash:SR(r),adapterId:e.adapterId,family:r.chain.family,network:r.chain.id,marketplace:r.marketplace,mechanism:r.mechanism,collection:r.collection,recipient:r.recipient,quantity:String(r.quantity),stageId:s.id,proofDigest:s.eligibility.proofDigest,mintValueCap:r.mintValueCap,networkFeeCap:r.networkFeeCap,priorityFeeCap:r.priorityFeeCap,observedNetworkFee:c.networkFee,observedPriorityFee:c.priorityFee});return U({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:a},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,s.endsAt.value,Number(a.expiresAt))})}var TX,VR,WR,cge,GR,CX,PX,of,JR=_(()=>{oe();vR();AR();kR();OR();zR();Ki();TX=Object.freeze([yi.DISCOVERY,yi.ELIGIBILITY,yi.PREPARATION,yi.SIMULATION]),VR=[["evm.manifold","evm",["manifold"],["mint","claim"],"evm","manifold"],["evm.zora","evm",["zora"],["mint"],"evm","zora"],["evm.thirdweb","evm",["thirdweb"],["mint","claim"],"evm","thirdweb"],["evm.opensea-seadrop","evm",["opensea"],["mint","seadrop"],"opensea",null],["solana.metaplex-core","solana",["metaplex"],["mint"],"solana",rf.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",rf.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",rf.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],WR=Object.freeze(VR.map(([e,t,n,r])=>Object.freeze({id:e,family:t,chainFamilies:Object.freeze([t]),marketplaces:Object.freeze(n),mechanisms:Object.freeze(r),enabled:t!=="solana",capabilities:t==="solana"?Object.freeze([yi.DISCOVERY]):TX,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),cge=F0(WR.map(({family:e,tier:t,enabled:n,...r})=>r)),GR=new Map(VR.map(e=>[e[0],e])),CX=new Set(["intent","adapterId","input"]),PX=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,of=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}}});function Hs(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new _e(`${t} must be a plain object`);return e}function pl(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new _e(`${n} has unknown field ${r}`,"unknown-field")}function He(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new _e(`${t} must be an exact non-empty string`);return e}function eL(e,t,{positive:n=!1}={}){if(e=He(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new _e(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function qs(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new _e(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>He(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new _e(`${t} contains duplicates`);return r}function tL(e,t){return e=Hs(e,t),pl(e,HX,t),{amount:eL(e.amount,`${t}.amount`),currency:He(e.currency,`${t}.currency`)}}function QR(e,t){if(!Array.isArray(e))throw new _e(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>tL(n,`${t}[${r}]`))}function GX(e){if(e=Hs(e,"expiry"),pl(e,zX,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new _e("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function KX(e,t,n){Object.hasOwn(e,n)&&(t[n]=He(e[n],n))}function nL(e){e=Hs(e,"intent"),pl(e,jX,"intent");let t=He(e.action,"action");if(!ZR.has(t))throw new _e(`unsupported action ${t}`,"invalid-action");let n={action:t,family:He(e.family,"family"),network:He(e.network,"network"),standard:He(e.standard,"standard"),collection:He(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])KX(e,n,o);let r=["tokenId","mint","inscription"].filter(o=>Object.hasOwn(n,o));if(t==="mint"){if(r.length!==0||n.outpoint)throw new _e("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new _e("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new _e("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=He(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new _e("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=He(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=He(e.sender,"sender"))}else n.owner=He(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=He(e.recipient,"recipient")),n.quantity=eL(e.quantity,"quantity",{positive:!0}),n.marketplace=He(e.marketplace,"marketplace"),n.protocol=He(e.protocol,"protocol"),n.artifactKind=He(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new _e(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=tL(e.price,"price"),n.expiry=GX(e.expiry),n.fees=QR(e.fees,"fees"),n.royalties=QR(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=He(e.listingId,"listingId")),n}function YX(e){e=Hs(e,"adapter"),pl(e,VX,"adapter");let t=qs(e.actions,"adapter.actions");for(let o of t)if(!ZR.has(o))throw new _e(`adapter has unknown action ${o}`,"invalid-action");let n=Hs(e.surface,"adapter.surface");pl(n,WX,"adapter.surface");let r=Hs(n.operations,"adapter.surface.operations");for(let o of t)He(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new _e(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:He(e.id,"adapter.id"),family:He(e.family,"adapter.family"),networks:Object.freeze(qs(e.networks,"adapter.networks")),standards:Object.freeze(qs(e.standards,"adapter.standards")),marketplaces:Object.freeze(qs(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(qs(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(qs(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:W0,custody:"user",surface:Object.freeze({provider:He(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function XX(e=[]){if(!Array.isArray(e))throw new _e("entries must be an array");let t=e.map(YX);if(new Set(t.map(r=>r.id)).size!==t.length)throw new _e("adapter ids must be unique","duplicate-adapter");function n(r,o){return t.filter(i=>i.family===r.family&&i.networks.includes(r.network)&&i.standards.includes(r.standard)&&i.marketplaces.includes(r.marketplace)&&i.protocols.includes(r.protocol)&&i.artifactKinds.includes(r.artifactKind)&&(!o||i.actions.includes(r.action)))}return Object.freeze({tier:W0,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=nL(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new _e("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new _e(`adapter lacks ${o.action}`,"unsupported-operation"):new _e("no exact adapter route","unsupported-operation")}})}function rL(e,{access:t="public",feeProfile:n="default",registry:r=K0,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new _e("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new _e("nowMs must be a non-negative safe integer","invalid-expiry");let i=nL(e);if(i.expiry&&o>=i.expiry.value)throw new _e("lifecycle intent has expired","expired-intent");let s=r.route(i);return Object.freeze({tier:W0,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:He(n,"feeProfile"),fees:Object.freeze({oracle:"0",currency:"none"}),adapterId:s.id,surface:Object.freeze({provider:s.surface.provider,operation:s.surface.operations[i.action]}),intent:Object.freeze(i)})}var W0,G0,ZR,jX,HX,zX,VX,WX,_e,js,K0,oL=_(()=>{W0="ROUTE_ONLY",G0=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),ZR=new Set(Object.values(G0)),jX=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),HX=new Set(["amount","currency"]),zX=new Set(["value","unit"]),VX=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),WX=new Set(["provider","operations"]),_e=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};js=(e,t,n,r,o,i,s,a,c,l)=>({id:e,family:t,networks:n,standards:r,marketplaces:o,protocols:i,artifactKinds:s,actions:a,surface:{provider:c,operations:l}}),K0=XX([js("opensea-evm-market","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["opensea"],["seaport","seadrop"],["provider-request"],["mint","list","cancel_listing"],"opensea-nft",{mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"}),js("evm-asset-safe-transfer","evm",["eip155:1","eip155:10","eip155:137","eip155:8453","eip155:42161","eip155:4663"],["erc721","erc1155"],["none"],["erc721","erc1155"],["evm-safe-transfer"],["send"],"universal-evm-nft-transfer",{send:"prepare"}),js("magic-eden-solana-market","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["magic-eden"],["magic-eden-solana"],["solana-transaction"],["buy","list"],"magiceden-sol",{buy:"prepareBuy",list:"prepareList"}),js("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),js("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),js("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})])});function sL(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(eJ.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);sL(r,t)}}}function Y0(e,t){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n)||/^0x0{40}$/.test(n))throw new Error(`evm nft transfer: valid non-zero ${t} address required`);return n}function bi(e,t,{positive:n=!1,safe:r=!1}={}){let o=String(e??"").trim();if(!/^\d+$/.test(o))throw new Error(`evm nft transfer: ${t} must be an unsigned integer`);let i=BigInt(o);if(i>=1n<<256n||n&&i===0n)throw new Error(`evm nft transfer: ${t} is out of range`);if(r&&i>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`evm nft transfer: ${t} is out of range`);return i}function tJ(e,t,n,r,o){return e==="erc721"?`0x42842e0e${sf(t)}${sf(n)}${fl(r)}`:`0xf242432a${sf(t)}${sf(n)}${fl(r)}${fl(o)}${fl(160n)}${fl(0n)}`}function nJ(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(sL(e),["sign","execute","broadcast","submit"].some(h=>e[h]===!0))throw new Error("evm nft transfer: execution refused; adapter is prepare-only");let n=String(e.standard??e.tokenStandard??"").toLowerCase().replace("-","");if(n!=="erc721"&&n!=="erc1155")throw new Error("evm nft transfer: standard must be exact ERC-721 or ERC-1155");let r=bi(e.chainId,"chainId",{positive:!0,safe:!0}),o=Y0(e.sender??e.from,"sender"),i=Y0(e.recipient??e.to,"recipient"),s=Y0(e.contract??e.contractAddress??e.tokenContract,"contract"),a=bi(e.tokenId,"tokenId"),c=bi(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(bi(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=bi(e.gasLimit,"gasLimit",{positive:!0}),u=bi(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=bi(e.maxPriorityFeePerGasWei??e.maxPriorityFeePerGas,"maxPriorityFeePerGasWei");if(d>u)throw new Error("evm nft transfer: priority fee cap exceeds max fee cap");if(e.reviewed!==!0&&e.userConfirmed!==!0)throw new Error("evm nft transfer: reviewed=true required after reviewing chain, parties, NFT, quantity, fee caps, and expiry");let p=Number(e.expiresAt??e.expiry??e.expiresAtMs);if(!Number.isSafeInteger(p)||p<=Number(t)||p-Number(t)>QX)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=tJ(n,o,i,a,c),f=e.calldata??e.data;if(f!=null&&String(f).toLowerCase()!==m)throw new Error("evm nft transfer: calldata mutation refused; only canonical safeTransferFrom is allowed");return{standard:n,chainId:Number(r),sender:o,recipient:i,contract:s,tokenId:a.toString(),quantity:c.toString(),gasLimit:l.toString(),maxFeePerGasWei:u.toString(),maxPriorityFeePerGasWei:d.toString(),expiresAt:p,data:m}}function aL(e={},t={}){let n=nJ(e,t),r={provider:af,kind:iL,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...ZX},fee:{oracleFeeBps:0,oracleFeeWei:"0"},transfer:{standard:n.standard,sender:n.sender,recipient:n.recipient,contract:n.contract,tokenId:n.tokenId,quantity:n.quantity},transaction:{chainId:n.chainId,from:n.sender,to:n.contract,data:n.data,value:"0",gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei},caps:{gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei,nativeValueWei:"0"},reviewed:!0,note:"Unsigned exact safeTransferFrom only; sign and broadcast in a user-controlled wallet."};return U(r,{provider:af,kind:iL,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}var af,iL,QX,ZX,eJ,fl,sf,cL=_(()=>{oe();af="universal-evm-nft-transfer",iL="evm-nft-safe-transfer",QX=1800*1e3,ZX=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),eJ=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;fl=e=>e.toString(16).padStart(64,"0"),sf=e=>e.slice(2).padStart(64,"0")});function pe(e){throw new Error(`solana nft transfer: ${e}`)}function Mn(e,t){let n=String(e??"").trim();return n||pe(`${t} required`),n}function Kn(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||pe(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&pe(`${t} must be positive`),r}function Je(e,t,n){String(e??"")!==String(t)&&pe(`${n} mismatch; mutation refused`)}function pL(e,t="request",n=new Set){if(!(!e||typeof e!="object"||n.has(e))){n.add(e);for(let[r,o]of Object.entries(e))sJ.test(r)&&o!=null&&o!==!1&&pe(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),pL(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&pe(`${r} refused; adapter is prepare-only`)}}function aJ(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&pe(`${t} must be decoded`),Array.isArray(e.accounts)||pe(`${t} decoded accounts required`),e.decoded}function cJ(e,t,n){for(let r of e.accounts){let o=Mn(r.pubkey,"account pubkey");t.has(o)||pe(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&pe(`unexpected writable account ${o}`)}}function lJ(e={}){(!e||typeof e!="object"||Array.isArray(e))&&pe("request object required"),pL(e),(e.network!=="mainnet-beta"||e.genesisHash!==dL)&&pe("mainnet genesis/network mismatch"),e.reviewed!==!0&&pe("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Mn(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&pe("standard must be metaplex or core");let n=Mn(e.mint??e.asset,"mint/asset"),r=Mn(e.collection,"collection");e.collectionVerified!==!0&&pe("verified collection required");let o=Mn(e.owner,"owner"),i=Mn(e.recipient,"recipient"),s=Kn(e.quantity,"quantity",{positive:!0}),a=Kn(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});s>a&&pe("quantity exceeds reviewed edition bound"),t==="core"&&s!==1n&&pe("Core quantity must be exactly 1");let c=Mn(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==wi.core:!oJ.has(c))&&pe("reviewed transfer program mismatch");let l=t==="metaplex"?Mn(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Mn(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Je(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Kn(e.decimals??0,"decimals")):null,p=Kn(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Kn(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Kn(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&pe("priority fee exceeds reviewed cap");let g=Kn(e.networkFeeLamports,"networkFeeLamports"),y=Kn(e.networkFeeCapLamports,"networkFeeCapLamports");g>y&&pe("network fee cap exceeded");let b=e.transaction;(!b||typeof b!="object"||Array.isArray(b))&&pe("transaction object required"),b.version!==0&&b.version!=="legacy"&&pe("transaction version must be 0 or legacy");let w=Mn(b.recentBlockhash,"recentBlockhash");Je(w,e.approvedBlockhash,"blockhash mutation after approval");let S=Kn(b.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=Kn(e.currentBlockHeight,"currentBlockHeight");v>S&&pe("expired blockhash"),(!Array.isArray(b.instructions)||b.instructions.length<3)&&pe("canonical instructions required");let I=new Set([o,n,l,u].filter(Boolean)),A=new Set([o,i,n,r,l,u,...uL].filter(Boolean)),E=0,k=0,O=0,T=0;for(let[D,X]of b.instructions.entries()){let H=Mn(X.programId,`instructions[${D}].programId`);uL.has(H)||pe(`unknown program ${H}`);let $=aJ(X,`instructions[${D}]`);cJ(X,A,I);let j=String($.type??$.instruction??"").toLowerCase();H===wi.computeBudget?j.includes("limit")?(Je($.units??$.computeUnitLimit,p,"compute-unit limit"),E++):j.includes("price")?(Je($.microLamports??$.computeUnitPriceMicroLamports,m,"compute-unit price"),k++):pe("unsupported compute budget instruction"):H===wi.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&pe("non-canonical associated token instruction"),Je($.payer,o,"ATA payer"),Je($.owner,i,"ATA recipient"),Je($.mint,n,"ATA mint"),Je($.tokenAccount,u,"recipient ATA"),Je($.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&H===c?(j!=="transferchecked"&&pe("only canonical transferChecked is allowed"),Je($.mint,n,"mint"),Je($.owner,o,"owner"),Je($.recipient,i,"recipient"),Je($.sourceTokenAccount,l,"source token account"),Je($.destinationTokenAccount,u,"recipient ATA"),Je($.amount,s,"quantity"),Je($.decimals,d,"decimals"),O++):t==="core"&&H===wi.core?(j!=="transfer"&&pe("only canonical Core transfer is allowed"),Je($.asset,n,"mint/asset"),Je($.collection,r,"collection"),$.collectionVerified!==!0&&pe("verified collection required in Core instruction"),Je($.owner,o,"owner"),Je($.newOwner,i,"recipient"),Je($.amount??1,1,"quantity"),O++):pe(`program ${H} is not valid for ${t} transfer`)}return(E!==1||k!==1)&&pe("exactly one compute-unit limit and price instruction required"),O!==1&&pe("exactly one canonical transfer instruction required"),t==="metaplex"&&T>1&&pe("at most one idempotent recipient ATA instruction allowed"),{standard:t,mint:n,collection:r,owner:o,recipient:i,quantity:s.toString(),maxEditionQuantity:a.toString(),tokenProgramId:c,sourceTokenAccount:l,recipientTokenAccount:u,decimals:d,recentBlockhash:w,lastValidBlockHeight:S.toString(),currentBlockHeight:v.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:y.toString(),transaction:b}}function fL(e={},t={}){let n=lJ(e),r=Number(t.nowMs??Date.now()),o={provider:cf,kind:lL,chain:"solana-mainnet-beta",genesisHash:dL,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...iJ},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:!0,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,...n.sourceTokenAccount?{sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,decimals:n.decimals}:{}},transaction:{unsigned:!0,version:n.transaction.version,recentBlockhash:n.recentBlockhash,lastValidBlockHeight:n.lastValidBlockHeight,instructions:structuredClone(n.transaction.instructions)},caps:{currentBlockHeight:n.currentBlockHeight,computeUnitLimit:n.computeUnitLimit,computeUnitPriceMicroLamports:n.computeUnitPriceMicroLamports,priorityFeeLamports:n.priorityFeeLamports,priorityFeeCapLamports:n.priorityFeeCapLamports,networkFeeLamports:n.networkFeeLamports,networkFeeCapLamports:n.networkFeeCapLamports},reviewed:!0};return U(o,{provider:cf,kind:lL,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}var cf,lL,dL,wi,uL,oJ,iJ,sJ,mL=_(()=>{oe();cf="universal-solana-nft-transfer",lL="solana-verified-nft-transfer",dL="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",wi=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),uL=new Set(Object.values(wi)),oJ=new Set([wi.token,wi.token2022]),iJ=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),sJ=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i});function Ae(e){throw new Error(`ordinals transfer: ${e}`)}function vo(e,t){let n=String(e??"").trim();return n||Ae(`${t} required`),n}function So(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||Ae(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&Ae(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&Ae(`${t} out of range`),o}function yL(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&Ae(`${t} must be positive`),n}function vL(e,t){let n=vo(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||Ae(`${t} must be 64 hex`),n}function EL(e,t="inscriptionId"){let n=vo(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||Ae(`${t} must be canonical`),n}function xL(e,t="request"){if(!e||typeof e!="object")return;let n=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|partialSig|partialSigs|signedPsbt|signedTransaction|rawTransaction|txHex|finalized|finalScriptSig|finalScriptWitness)$/i;for(let[r,o]of Object.entries(e))n.test(r)&&o!=null&&o!==!1&&Ae(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),xL(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&Ae(`${r} bypass refused; adapter is prepare-only`)}function AL(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&Ae(`${t}.${n} arbitrary script refused; use a bound address`)}function bL(e,t){(!e||typeof e!="object"||Array.isArray(e))&&Ae(`${t} must be an object`),AL(e,t);let n=vL(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&Ae(`${t}.vout invalid`),{txid:n,vout:r,valueSats:So(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:vo(e.address,`${t}.address`),sequence:Number(So(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function wL(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&Ae(`${t} must be an object`),AL(e,t),{role:vo(e.role,`${t}.role`),address:vo(e.address,`${t}.address`),valueSats:So(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:EL(e.inscriptionId,`${t}.inscriptionId`)}}}function SL(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&Ae(`${n} mismatch; mutation refused`)}function pJ(e={}){(!e||typeof e!="object"||Array.isArray(e))&&Ae("request object required"),xL(e);let t=vo(e.network,"network").toLowerCase(),n=vL(e.genesisHash,"genesisHash");(!gL[t]||n!==gL[t])&&Ae("network/genesis mismatch");let r=EL(e.inscriptionId),o=bL(e.ownerInput,"ownerInput");vo(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&Ae("current inscription outpoint mismatch");let i=vo(e.destination,"destination"),s=So(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),a=e.changeOutput==null?null:wL(e.changeOutput,"changeOutput");(a?.role!=="change"||a?.inscriptionId!=null)&&Ae("exact change output invalid");let c=yL(e.feeRateSatVb,"feeRateSatVb"),l=yL(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&Ae("fee rate exceeds reviewed cap");let u=So(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=So(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&Ae("total fee exceeds reviewed cap");let p=Number(So(e.locktime,"locktime",{max:0xffffffffn})),m=Number(So(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&Ae("RBF sequence refused"),o.sequence!==m&&Ae("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&Ae("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&Ae("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&Ae("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&Ae("exactly one PSBT input required; extra inputs refused"),SL(bL(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((w,S)=>wL(w,`psbt.outputs[${S}]`)):Ae("PSBT outputs required"),g={role:"inscription",address:i,valueSats:s,inscriptionId:r};SL(h,a?[g,a]:[g],"exact PSBT outputs"),h.filter(w=>w.role==="inscription"&&w.inscriptionId===r).length!==1&&Ae("exactly one inscription-carrying output required");let b=h.reduce((w,S)=>w+BigInt(S.valueSats),0n);return BigInt(o.valueSats)!==b+u&&Ae("input/output/fee conservation mismatch; inscription burn or fee widening refused"),{network:t,genesisHash:n,inscriptionId:r,currentOutpoint:o.outpoint,ownerInput:o,destination:i,postageSats:s,changeOutput:a,feeRateSatVb:c,maxFeeRateSatVb:l,totalFeeSats:u.toString(),maxTotalFeeSats:d.toString(),locktime:p,sequence:m,psbt:{version:0,unsigned:!0,locktime:p,inputs:[o],outputs:h}}}function IL(e={},t={}){let n=pJ(e);return U({provider:lf,kind:hL,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...dJ},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:lf,kind:hL,env:t.env})}var lf,hL,gL,dJ,kL=_(()=>{oe();lf="universal-ordinals-transfer",hL="bitcoin-ordinals-transfer-plan",gL=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),dJ=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1})});function mJ(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();if(/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),e.expiresAt!=null){let o=Number(e.expiresAt);Number.isFinite(o)?o<=t&&n.push("grant has expired"):n.push("grant.expiresAt must be a timestamp when supplied")}return{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function _L(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),s=[];if(!/^0x[a-f0-9]{40}$/.test(o))return{status:"error",error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(i))return{status:"error",error:"chainId is required"};if(r!=="alert_only"&&r!=="execute")return{status:"ok",actionMode:"alert_only",requestedMode:r,downgraded:!0,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:null,notes:[`unrecognized actionMode ${JSON.stringify(r)} \u2014 defaulted to alert_only; only the exact string "execute" arms a trigger`]};let a=r;if(r==="execute")if(!Wh(t.env||process.env))a="alert_only",s.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=mJ(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(a="alert_only",s.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(a="alert_only",s.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return a==="alert_only"?s.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):s.push("ARMED until mint opens: this trigger will submit one prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:a,requestedMode:r,downgraded:a!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:a==="execute"?e.grant:null,armedUntil:a==="execute"?"mint-opens":null,notes:s}}async function X0(e={},t={}){let n=t.rpcCall||J,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=[{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}];for(let s of i)try{let a=await n(o,"eth_call",[{to:r,data:s.selector},"latest"],t);if(a&&a!=="0x"){let c=BigInt(a)===1n;return{status:"ok",open:s.openWhen?c:!c,evidence:s.name,raw:a}}}catch{}return{status:"unknown",open:!1,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}async function OL(e={},t={}){if(e.status!=="ok")return{status:"error",error:"invalid trigger"};let n=await X0({contract:e.contract,chainId:e.chainId},t);if(!n.open)return{status:"waiting",open:!1,reason:n.notes?.[0]||`sale flag ${n.evidence||"unknown"} reports closed`};let r=await tf({contract:e.contract,chainId:e.chainId,minter:e.minter||t.minter,quantity:e.quantity,urgency:e.urgency,gasLimit:e.gasLimit??t.gasLimit,maxTotalGasWei:e.grant?.maxTotalGasWei??e.maxTotalGasWei??t.maxTotalGasWei,maxFeePerGasWei:e.maxFeePerGasWei??t.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei??t.maxPriorityFeePerGasWei,valueWei:e.valueWei??t.valueWei,grant:e.grant},t);if(r.status!=="ok")return{status:"blocked",open:!0,reason:r.error,prepared:r};if(e.actionMode==="execute"&&e.grant?.maxValueWei!=null){let o=BigInt(r.tx.value||"0");if(o>BigInt(e.grant.maxValueWei))return{status:"refused",open:!0,reason:`mint price ${o} exceeds granted maxValueWei ${e.grant.maxValueWei}`,prepared:r}}return{status:e.actionMode==="execute"?"fire":"alert",open:!0,actionMode:e.actionMode,prepared:r,signed:!1}}var NL=_(()=>{Tu();L0();Ne()});function TL(e){return/^0x[a-f0-9]{40}$/.test(String(e||"").toLowerCase())}async function J0(e={},t={}){let n=t.rpcCall||J,r=String(e.contract||"").trim().toLowerCase(),o=Number(e.chainId);if(!TL(r)||!Number.isInteger(o))return{status:"error",open:!1,error:"contract and chainId are required"};let i=Date.now(),s=await Promise.allSettled(uf.map(async c=>{let l=await n(o,"eth_call",[{to:r,data:c.selector},"latest"],t);if(!l||l==="0x")throw new Error("flag absent");return{probe:c,result:l}})),a=Date.now()-i;for(let c=0;c<s.length;c+=1){let l=s[c];if(l.status!=="fulfilled")continue;let{probe:u,result:d}=l.value,p;try{p=BigInt(d)===1n}catch{continue}return{status:"ok",open:u.openWhen?p:!p,evidence:u.name,raw:d,elapsedMs:a,probesIssued:uf.length,roundTrips:1}}return{status:"unknown",open:!1,elapsedMs:a,probesIssued:uf.length,notes:["no readable sale-state flag; cannot confirm the mint is open \u2014 will not fire on a guess"]}}async function Q0(e={},t={}){let n=t.rpcCall||J,r=Number(e.chainId),o=Math.min(Math.max(Number(e.samples)||3,1),10);if(!Number.isInteger(r))return{error:"chainId is required"};let i=[];for(let c=0;c<o;c+=1){let l=Date.now();try{await n(r,"eth_blockNumber",[],t),i.push(Date.now()-l)}catch{}}if(!i.length)return{chainId:r,samples:0,error:"no successful latency samples"};let s=[...i].sort((c,l)=>c-l),a=s[Math.floor(s.length/2)];return{chainId:r,samples:i.length,medianMs:a,bestMs:s[0],worstMs:s[s.length-1],verdict:a<=50?"competitive":a<=150?"marginal":"too slow for contested mints"}}function Z0(e){let t=e&&typeof e=="object"?e.chainId??e.family??e.chain:e,n=String(t??"").trim().toLowerCase(),r=yJ[n]||gJ[Number(t)];if(!r)return{chainId:Number.isInteger(Number(t))?Number(t):null,chain:null,regime:null,ordering:"unknown",lever:"unknown",priorityFeeHelps:null,latencyDecides:null,privateRelayAvailable:!1,subSecondRace:null,notes:["chain ordering not classified; treat inclusion strategy as unverified"]};let o=bJ[r.regime];return{chainId:Number.isInteger(Number(t))?Number(t):null,chain:r.chain,regime:r.regime,...o,notes:[...o.notes]}}async function CL(e={},t={}){let n=String(e.contract||"").trim().toLowerCase(),r=Number(e.chainId);if(!TL(n))return{error:"contract must be a 0x-prefixed EVM address"};if(!Number.isInteger(r))return{error:"chainId is required"};let[o,i]=await Promise.all([J0({contract:n,chainId:r},t),Q0({chainId:r,samples:e.samples},t)]),s=Z0(r),a=[];return o.status==="unknown"&&a.push("sale state unreadable \u2014 no known flag on this contract"),i.verdict==="too slow for contested mints"&&a.push(`rpc median ${i.medianMs}ms`),{contract:n,chainId:r,open:o.open===!0,saleState:o,latency:i,strategy:s,blockers:a,prepared:!1,signed:!1}}async function PL(){try{return{ok:uf.length===5}}catch(e){return{ok:!1,error:String(e.message||e).slice(0,160)}}}var uf,Ke,gJ,yJ,bJ,RL=_(()=>{Ne();uf=Object.freeze([{selector:"0xeb8d2444",name:"saleIsActive()",openWhen:!0},{selector:"0x25fd90f3",name:"mintActive()",openWhen:!0},{selector:"0x68428a1b",name:"saleActive()",openWhen:!0},{selector:"0x22f3e2d4",name:"isActive()",openWhen:!0},{selector:"0x5c975abb",name:"paused()",openWhen:!1}]),Ke=Object.freeze({BUILDER_AUCTION:"builder-auction",OP_STACK_SEQUENCER:"op-stack-sequencer",NITRO_FCFS:"nitro-fcfs",HYPERBFT:"hyperbft",SOLANA_LEADER:"solana-leader",BITCOIN_FEE_RATE:"bitcoin-fee-rate"}),gJ=Object.freeze({1:{chain:"Ethereum",regime:Ke.BUILDER_AUCTION},137:{chain:"Polygon",regime:Ke.BUILDER_AUCTION},56:{chain:"BNB Chain",regime:Ke.BUILDER_AUCTION},43114:{chain:"Avalanche C-Chain",regime:Ke.BUILDER_AUCTION},988:{chain:"Stable Mainnet",regime:Ke.BUILDER_AUCTION},8453:{chain:"Base",regime:Ke.OP_STACK_SEQUENCER},10:{chain:"OP Mainnet",regime:Ke.OP_STACK_SEQUENCER},7777777:{chain:"Zora",regime:Ke.OP_STACK_SEQUENCER},81457:{chain:"Blast",regime:Ke.OP_STACK_SEQUENCER},42161:{chain:"Arbitrum One",regime:Ke.NITRO_FCFS},4663:{chain:"Robinhood Chain",regime:Ke.NITRO_FCFS},2741:{chain:"Abstract",regime:Ke.NITRO_FCFS},999:{chain:"HyperEVM",regime:Ke.HYPERBFT}}),yJ=Object.freeze({solana:{chain:"Solana",regime:Ke.SOLANA_LEADER},bitcoin:{chain:"Bitcoin",regime:Ke.BITCOIN_FEE_RATE},ordinals:{chain:"Bitcoin Ordinals",regime:Ke.BITCOIN_FEE_RATE}}),bJ=Object.freeze({[Ke.BUILDER_AUCTION]:{ordering:"builder-auction",lever:"priority-fee",priorityFeeHelps:!0,latencyDecides:!1,privateRelayAvailable:!0,subSecondRace:!0,notes:["inclusion is bought through the block builder auction","priority fee is the lever that actually moves position","a private relay hides the transaction from the public mempool and avoids being front-run"]},[Ke.OP_STACK_SEQUENCER]:{ordering:"sequencer",lever:"priority-fee+latency",priorityFeeHelps:!0,latencyDecides:!0,privateRelayAvailable:!1,subSecondRace:!0,notes:["the sequencer mempool orders by effective gas price, so paying more does move you forward","arrival time still matters within a fee tier, so latency and fee are both live levers","there is no public builder auction to bid into and no private relay to hide in"]},[Ke.NITRO_FCFS]:{ordering:"sequencer",lever:"latency",priorityFeeHelps:!1,latencyDecides:!0,privateRelayAvailable:!1,subSecondRace:!0,notes:["Nitro timestamps by arrival order; fees do not reorder the sequencer queue","raw round-trip time is the only lever that changes position","co-locate near the sequencer endpoint rather than raising gas"]},[Ke.HYPERBFT]:{ordering:"consensus",lever:"latency",priorityFeeHelps:!1,latencyDecides:!0,privateRelayAvailable:!1,subSecondRace:!0,notes:["HyperBFT consensus orders transactions; there is no public builder auction to bid into","reaching a validator early is the lever, not paying more","block times are sub-second, so a slow RPC path costs whole blocks"]},[Ke.SOLANA_LEADER]:{ordering:"leader",lever:"priority-fee+latency",priorityFeeHelps:!0,latencyDecides:!0,privateRelayAvailable:!0,subSecondRace:!0,notes:["there is no mempool: transactions are sent to the current and next slot leaders","compute-unit price is the fee lever; Jito bundles are the private-inclusion path","landing depends on reaching the leader in time, so both levers are live"]},[Ke.BITCOIN_FEE_RATE]:{ordering:"fee-rate",lever:"fee-rate",priorityFeeHelps:!0,latencyDecides:!1,privateRelayAvailable:!1,subSecondRace:!1,notes:["inclusion is fee-rate against roughly ten-minute blocks, not a sub-second race","being milliseconds earlier does not change inclusion; sat/vB estimation does","a co-located executor buys nothing here \u2014 this is a fee-estimation problem"]}})});function ML({nowMs:e=Date.now(),fetchedAtMs:t=null}={}){let n=t==null?0:Math.max(0,e-t),r=Math.max(0,6e4-n);return{canPresignAhead:!1,reason:"recent_blockhash is inside the signed message; refreshing it invalidates every signature",validSlots:150,windowMsFloor:6e4,remainingMs:r,expired:r===0&&t!=null,commitment:zs,model:"arm, wait for trigger, then build and sign \u2014 ed25519 signing is microseconds"}}function ml({identicalBytes:e,previousAttemptProvablyDead:t=!1}={}){return e?{safe:!0,mode:"rebroadcast",reason:"signature dedup makes identical bytes idempotent"}:t?{safe:!0,mode:"resign",reason:"previous attempt confirmed dead (blockhash expired or transaction failed), so no double-mint is possible"}:{safe:!1,mode:"refused",reason:"re-signing creates a SECOND valid transaction and Solana has no nonce to invalidate the first; both can land and both can mint. Rebroadcast the identical bytes, or prove the previous attempt is dead."}}function $L({computeUnitsPerMint:e}={}){let t=Number(e);return!Number.isFinite(t)||t<=0?{error:"computeUnitsPerMint must be a positive number"}:{mintsPerBlock:Math.floor(12e6/t),capUnits:12e6,note:"every minter writes the same candy machine account, so this ceiling is network-wide; adding wallets buys a larger share of a fixed number of slots, not more slots"}}function BL({computeUnitPrice:e,computeUnitLimit:t,signatureCount:n=1}={}){let r=Number(e),o=Number(t),i=Number(n);if(![r,o,i].every(c=>Number.isFinite(c)&&c>=0))return{error:"computeUnitPrice, computeUnitLimit and signatureCount must be non-negative numbers"};let s=Math.ceil(r*o/1e6),a=i*5e3;return{priorityLamports:s,baseLamports:a,totalLamports:a+s,chargedOnFailure:!0}}var zs,ew,LL,tw=_(()=>{zs="confirmed",ew="/api/v1/bundles",LL=Object.freeze({computeUnitPrice:"getRecentPrioritizationFees with the hot writable accounts as params",jitoTip:"poll Jito tip_floor / tip_stream at arm time"})});async function rw(e={}){try{let t=await rc({commitment:zs},e),n=Date.now();return{blockhash:t?.blockhash??t?.value?.blockhash??null,lastValidBlockHeight:t?.lastValidBlockHeight??t?.value?.lastValidBlockHeight??null,commitment:zs,fetchedAtMs:n}}catch(t){return{error:String(t?.message||t).slice(0,200)}}}async function ow(e={},t={}){let n=Array.isArray(e.writableAccounts)?e.writableAccounts.filter(Boolean).slice(0,128):[];if(n.length===0)return{error:"writableAccounts is required; querying without them returns the global minimum, not the contested rate"};let r=Number(e.percentile??75);if(!Number.isFinite(r)||r<0||r>100)return{error:"percentile must be between 0 and 100"};try{let i=await(typeof t.rpcImpl=="function"?t.rpcImpl:mr)("getRecentPrioritizationFees",[n],t),s=(Array.isArray(i)?i:[]).map(c=>Number(c?.prioritizationFee)).filter(c=>Number.isFinite(c)).sort((c,l)=>c-l);if(s.length===0)return{error:"no prioritization fee samples returned for those accounts"};let a=Math.min(s.length-1,Math.floor(r/100*s.length));return{microLamportsPerCu:s[a],samples:s.length,percentile:r,max:s[s.length-1],allZero:s[s.length-1]===0}}catch(o){return{error:String(o?.message||o).slice(0,200)}}}function iw(e,t={}){if(typeof e!="string"||e.length===0)return{error:"base64Tx must be a non-empty base64 string"};let n={encoding:"base64",skipPreflight:t.skipPreflight!==!1,maxRetries:Number.isInteger(t.maxRetries)?t.maxRetries:0,preflightCommitment:zs};return{request:{jsonrpc:"2.0",id:1,method:"sendTransaction",params:[e,n]},prepared:!0,broadcast:!1,skipPreflight:n.skipPreflight}}function UL(e,t={}){if(!Array.isArray(e)||e.length===0)return{error:"base64Txs must be a non-empty array"};if(e.length>5)return{error:`a Jito bundle holds at most ${5} transactions, got ${e.length}`};let n=t.region&&vJ.includes(t.region)?`${t.region}.`:"";return{url:`${t.baseUrl||(n?`https://${n}mainnet.block-engine.jito.wtf`:DL)}${ew}`,request:{jsonrpc:"2.0",id:1,method:"sendBundle",params:[e,{encoding:"base64"}]},prepared:!0,broadcast:!1,atomic:!0,transactionCount:e.length}}async function FL(e,t={}){let n=Array.isArray(e)?e.filter(Boolean).slice(0,5):[];if(n.length===0)return{error:"bundleIds must be a non-empty array"};let r=t.baseUrl||DL;try{return{statuses:((await x(`${r}${ew}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"getInflightBundleStatuses",params:[n]}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??1e4}))?.result?.value??[]).map(s=>({bundleId:s?.bundle_id??null,status:s?.status??"Unknown",landedSlot:s?.landed_slot??null}))}}catch(o){return{error:String(o?.message||o).slice(0,200)}}}function qL(e,t={}){let n=ml({identicalBytes:t.identicalBytes!==!1,previousAttemptProvablyDead:!!t.previousAttemptProvablyDead});if(!n.safe)return{error:n.reason,refused:!0};let r=iw(e,t);return r.error?r:{...r,retryMode:n.mode}}async function jL(e={},t={}){let n=await ow(e,t);if(n.error)return n;let r=Number(e.computeUnitLimit);return!Number.isFinite(r)||r<=0?{error:"computeUnitLimit is required; measure it by simulating, do not pad it"}:{...BL({computeUnitPrice:n.microLamportsPerCu,computeUnitLimit:r,signatureCount:Number(e.signatureCount??2)}),computeUnitPrice:n.microLamportsPerCu,samples:n.samples,allZero:n.allZero}}async function HL(e={},t={}){let n=String(e.messageBase64||"");if(!n)return{error:"messageBase64 is required"};let r=Number(e.signatureCount??2);if(!Number.isInteger(r)||r<1||r>8)return{error:"signatureCount must be between 1 and 8"};let o=Buffer.from(n,"base64"),i=Buffer.concat([Buffer.from([r]),Buffer.alloc(64*r),o]).toString("base64"),a=await(typeof t.rpcImpl=="function"?t.rpcImpl:mr)("simulateTransaction",[i,{encoding:"base64",sigVerify:!1,replaceRecentBlockhash:!0,commitment:"processed"}],t),c=a?.value||a;if(c?.err)return{error:`simulation failed: ${JSON.stringify(c.err).slice(0,160)}`,logs:Array.isArray(c.logs)?c.logs.slice(-8):[]};let l=Number(c?.unitsConsumed);return!Number.isFinite(l)||l<=0?{error:"simulation returned no unitsConsumed"}:{unitsConsumed:l,recommendedLimit:Math.ceil(l*1.15),marginPct:15,logs:Array.isArray(c.logs)?c.logs.slice(-4):[]}}async function zL(e={}){try{let t=await rw(e);return{ok:!!t.blockhash,provider:"solana-mint-submit",commitment:zs,exec:!1,error:t.error?String(t.error).slice(0,160):void 0}}catch(t){return{ok:!1,provider:"solana-mint-submit",error:String(t?.message||t).slice(0,160),exec:!1}}}var DL,vJ,VL=_(()=>{q();Zo();tw();DL="https://mainnet.block-engine.jito.wtf",vJ=Object.freeze(["amsterdam","dublin","frankfurt","london","ny","slc","singapore","tokyo"])});function xJ(e={},{satIndexAvailable:t=!1}={}){return e.hasInscription===!0?{spendable:!1,class:"inscribed",reason:"holds an inscription; spending it as an input burns the inscription"}:e.hasRune===!0?{spendable:!1,class:"runic",reason:"holds a rune balance; ord locks runic outputs before funding"}:e.hasInscription==null||e.hasRune==null?{spendable:!1,class:"unknown",reason:"inscription/rune status unproven; an unproven UTXO must never enter coin selection"}:t?e.hasRareSat===!0?{spendable:!1,class:"rare",reason:"holds a rare sat; it would be spent as ordinary change"}:{spendable:!0,class:"cardinal",reason:"no inscription, rune, or rare sat",rareSatRisk:!1}:{spendable:!0,class:"cardinal-unverified",reason:"no inscription or rune, but without a sat index rare sats cannot be excluded",rareSatRisk:!0}}function WL(e=[],t={}){if(!Array.isArray(e))return{error:"utxos must be an array"};let n=[],r=[];for(let o of e){let i=xJ(o,t);i.spendable?n.push({...o,class:i.class,rareSatRisk:i.rareSatRisk}):r.push({outpoint:o.outpoint??null,class:i.class,reason:i.reason})}return{spendable:n,excluded:r,satIndexAvailable:!!t.satIndexAvailable,rareSatProven:!!t.satIndexAvailable}}function GL(e,{blocks:t=1,bufferPct:n=15}={}){if(!Array.isArray(e)||e.length===0)return{error:"mempoolBlocks must be a non-empty array from /api/v1/fees/mempool-blocks"};let r=Math.max(1,Math.floor(t));if(r>e.length)return{error:`deadline of ${r} blocks exceeds the ${e.length} projected blocks available`,projectedBlocks:e.length};let o=e[r-1],i=Number(o?.feeRange?.[0]);if(!Number.isFinite(i))return{error:"projected block is missing feeRange[0], the marginal inclusion rate"};let s=i*(1+n/100);return{marginalSatVb:i,recommendedSatVb:Number(s.toFixed(3)),blocks:r,bufferPct:n,note:"feeRange[0] is the cheapest rate included in that projected block; pay above it, not at it"}}function KL({contentBytes:e,satVb:t,postageSats:n=1e4}={}){let r=Number(e),o=Number(t);if(!Number.isFinite(r)||r<0)return{error:"contentBytes must be a non-negative number"};if(!Number.isFinite(o)||o<=0)return{error:"satVb must be a positive number"};let s=r/4+110,a=Math.ceil(s*o),c=Math.ceil(s*4);return{contentBytes:r,revealVbytes:Number(s.toFixed(1)),revealFeeSats:a,postageSats:n,commitOutputSats:a+n,weightUnits:c,relayable:c<=4e5,withinRecommended:c<=39e4,pushChunks:Math.ceil(r/520)}}var YL=_(()=>{});async function XL(e,t={}){let n=Array.isArray(e)?e.filter(Boolean):[];if(n.length===0)return{annotated:[],indexReachable:!1,error:"outpoints must be a non-empty array"};let r=t.ordBase||IJ,o=[],i=!0;for(let s of n.slice(0,200))try{let a=await x(`${r}/output/${s}`,{headers:{accept:"application/json"},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??8e3}),c=Array.isArray(a?.inscriptions)?a.inscriptions:[],l=a?.runes&&typeof a.runes=="object"?Object.keys(a.runes):[];o.push({outpoint:s,valueSats:Number(a?.value)||0,hasInscription:c.length>0,hasRune:l.length>0,inscriptionIds:c,indexed:!0})}catch(a){i=!1,o.push({outpoint:s,indexed:!1,error:String(a?.message||a).slice(0,120)})}return{annotated:o,indexReachable:i,checked:o.length}}function sw(e,{targetSats:t,satIndexAvailable:n=!1,feeRateSatVb:r=0}={}){let o=Number(t);if(!Number.isFinite(o)||o<=0)return{error:"targetSats must be a positive number"};let i=WL(Array.isArray(e)?e:[],{satIndexAvailable:n});if(i.error)return i;let s=[...i.spendable].sort((u,d)=>(Number(d.valueSats)||0)-(Number(u.valueSats)||0)),a=[],c=0;for(let u of s){if(c>=o)break;a.push(u),c+=Number(u.valueSats)||0}if(c<o)return{funded:!1,reason:`insufficient cardinal balance: need ${o} sats, safe UTXOs total ${c}`,shortfallSats:o-c,excluded:i.excluded,excludedCount:i.excluded.length,rareSatProven:i.rareSatProven};let l=a.length*68+86+11;return{funded:!0,inputs:a,inputCount:a.length,totalSats:c,changeSats:c-o,estimatedVbytes:l,estimatedFeeSats:r>0?Math.ceil(l*r):null,excluded:i.excluded,excludedCount:i.excluded.length,rareSatProven:i.rareSatProven}}async function aw(e={},t={}){let n=t.mempoolBase||kJ;try{let r=await x(`${n}/api/v1/fees/mempool-blocks`,{headers:{accept:"application/json"},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??1e4}),o=GL(r,{blocks:e.blocks??1,bufferPct:e.bufferPct??15});return o.error?o:{...o,source:`${n}/api/v1/fees/mempool-blocks`}}catch(r){return{error:String(r?.message||r).slice(0,200)}}}function JL({contentBytes:e,satVb:t,annotatedUtxos:n,satIndexAvailable:r=!1,postageSats:o=1e4}={}){let i=KL({contentBytes:e,satVb:t,postageSats:o});if(i.error)return i;if(!i.relayable)return{fundable:!1,reason:`inscription is ${i.weightUnits} weight units, over the 400000 relay limit; it will not propagate`,cost:i};let s=sw(n,{targetSats:i.commitOutputSats,satIndexAvailable:r,feeRateSatVb:t});return s.error?s:{fundable:!!s.funded,cost:i,selection:s,totalRequiredSats:s.funded?i.commitOutputSats+(s.estimatedFeeSats||0):null,warnings:[...s.rareSatProven?[]:["no sat index: rare sats cannot be excluded from the selected inputs"],...s.excludedCount>0?[`${s.excludedCount} UTXO(s) withheld as unsafe to spend`]:[]]}}async function QL(e={}){try{let t=await aw({blocks:1},e);return{ok:!t.error,provider:"bitcoin-mint-funding",marginalSatVb:t.marginalSatVb??null,exec:!1,error:t.error?String(t.error).slice(0,160):void 0}}catch(t){return{ok:!1,provider:"bitcoin-mint-funding",error:String(t?.message||t).slice(0,160),exec:!1}}}var IJ,kJ,ZL=_(()=>{q();YL();IJ="https://ordinals.com",kJ="https://mempool.space"});function NJ(e={},{nowMs:t=Date.now()}={}){let n=[];if(!e||typeof e!="object")return{ok:!1,problems:["grant is required for execute mode"]};let r=String(e.contract||"").toLowerCase();/^0x[a-f0-9]{40}$/.test(r)||n.push("grant.contract must be an exact address"),Number.isInteger(Number(e.chainId))||n.push("grant.chainId is required"),e.maxTotalGasWei==null&&n.push("grant.maxTotalGasWei is required"),e.maxValueWei==null&&n.push("grant.maxValueWei is required (mint price ceiling)"),String(e.maxValueWei)!=="0"&&n.push("grant.maxValueWei must be 0 for Mancers free mints");let o=Number(e.expiresAt);return Number.isFinite(o)?o<=t?n.push("grant has expired"):o-t>OJ&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}function cw(e){return String(e||"").trim().toLowerCase()}function Vs(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function RJ(e){let t=Vs(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${t2}${t.padStart(64,"0")}${"0".repeat(64)}`}function LJ(e){return Vs(e).includes(Vs(e2))}function MJ(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Vs(n?.data).startsWith(t2))}function $J(e={},t){let n=Vs(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return cw(i[0])!==CJ?!1:Vs(i[2])===n})}function BJ(e=1){return`0x${PJ}${BigInt(e).toString(16).padStart(64,"0")}`}function n2(e={},t={}){let n=cw(e.contract),r=cw(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),s=[];/^0x[a-f0-9]{40}$/.test(n)||s.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||s.push("minter must be a 0x address"),o!==TJ&&s.push("only Robinhood chain 4663"),i!=="0"&&s.push("value must be 0 \u2014 paid mints are skipped"),LJ(e.bytecode||"")||s.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let a=e.simulation||{};a.willRevert===!0&&s.push("mint simulation reverts"),MJ(a)&&s.push("simulation sets approval / setApprovalForAll"),$J(a,r)||s.push("simulation has no ERC721 Transfer to minter");let c=s.length===0,l={chainId:o,from:r,to:n,data:BJ(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:RJ(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Kx(t.env||process.env))s.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=NJ(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?s.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:s.push(`DOWNGRADED: ${p.problems.join("; ")}`)}return{status:c?"ok":"fail",verdict:c?"unknown-risk":"fail",failClosedPass:c,executeFire:d,oneShot:d,execution:"prepare-only",signed:!1,chainId:o,contract:n,minter:r,gate:e2.toLowerCase(),reasons:s,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}var OJ,e2,TJ,CJ,t2,PJ,r2=_(()=>{Tu();OJ=1440*60*1e3;e2="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",TJ=4663,CJ="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",t2="a22cb465",PJ="a0712d68"});import{createHash as UJ}from"node:crypto";import{getAddress as l2,isAddress as lw}from"ethers";function ze(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function s2(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ze(t,"must be a positive chainId"),n}function df(e,t){let n=String(e??"").trim();return(!jJ.test(n)||BigInt(n)<=0n)&&ze(t,"must be a positive integer string"),n}function HJ(e,t){return e==null||e===""?null:df(e,t)}function a2(e,t){let n=String(e??"").trim();return n.toLowerCase()===o2.toLowerCase()?o2:(lw(n)||ze(t,"must be an EVM address or native token sentinel"),l2(n))}function u2(e,t){let n=String(e??"").trim();return lw(n)||ze(t,"must be an EVM address"),l2(n)}function zJ(e,t){return e==null||e===""?null:u2(e,t)}function c2(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ze(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function VJ(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ze(r,"must be a finite millisecond timestamp"),o<=t&&ze(r,"expired"),o>t+n&&ze(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Ws(e){if(Array.isArray(e))return e.map(Ws);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Ws(e[n]));return t}return e}function WJ(e){return JSON.stringify(Ws(e))}function pf(e){return`0x${UJ("sha256").update(WJ(e)).digest("hex")}`}function d2(e,t){let n={...e};for(let r of t)delete n[r];return n}function GJ(e){return pf(d2(e,["intentHash"]))}function KJ(e){return pf(d2(e,["firmQuoteHash"]))}function uw(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ze("time","is invalid");let o=s2(e.fromChainId??e.fromChain,"fromChainId"),i=s2(e.toChainId??e.toChain,"toChainId"),a=o===i?FJ:qJ,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:a2(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:a2(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:df(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:u2(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:VJ(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:HJ(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:c2(e.allowedSources,"allowedSources",a),allowedRouters:c2(e.allowedRouters,"allowedRouters",[]),slippageBps:Number.isFinite(Number(e.slippageBps))?Number(e.slippageBps):null,partialFill:e.partialFill===!0,metadata:e.metadata&&typeof e.metadata=="object"&&!Array.isArray(e.metadata)?Ws(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ze("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):pf({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=GJ(c),Object.freeze(c)}function YJ(e){return(!e||typeof e!="object"||Array.isArray(e))&&ze("artifact","required"),e.typedDataHash!=null&&!i2.test(String(e.typedDataHash))&&ze("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!i2.test(String(e.calldataHash))&&ze("artifact.calldataHash","must be bytes32"),e.to!=null&&!lw(String(e.to))&&ze("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ze("artifact.data","must be hex"),Ws(e)}function p2(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ze("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ze("quote expiry","required"),o<=r&&ze("quote","expired"),o>e.deadlineMs&&ze("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ze("source","required"),e.allowedSources.includes(i)||ze("source","not allowed by intent");let s=df(t.amountOut??t.buyAmount,"amountOut"),a=df(t.minBuyAmount??t.minOut??s,"minBuyAmount");BigInt(a)>BigInt(s)&&ze("minBuyAmount","exceeds amountOut");let c=YJ(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||ze("quotedAtMs","must be finite");let u=zJ(t.router??t.settlementRouter??c.to,"router"),d={kind:"rfq-firm-quote",provider:"rfq",surface:"rfq",version:1,quoteId:String(t.quoteId??t.id??"").trim(),source:i,intentHash:e.intentHash,fromChainId:e.fromChainId,toChainId:e.toChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,receiver:e.receiver,router:u,amountOut:s,minBuyAmount:a,quotedAtMs:Math.floor(l),expiryMs:Math.floor(o),artifact:c,maker:t.maker?String(t.maker):null,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?Ws(t.metadata):{}};return d.quoteId||(d.quoteId=pf({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=KJ(d),Object.freeze(d)}var o2,FJ,qJ,i2,jJ,dw=_(()=>{o2="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",FJ=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),qJ=Object.freeze(["lifi"]),i2=/^0x[0-9a-fA-F]{64}$/,jJ=/^\d+$/});function hl(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function f2(e,t){return String(e?.[t]??"").trim()}function gl(e,t){return Object.freeze({source:e,run:t})}function XJ(e,t={}){if(!e||e.kind!=="rfq-intent")throw new Error("rfq: intent required");let n=t.env??process.env,r=t.providers??{},o=t.supportedUniV3Chains??wt,i=Number(e.fromChainId)===Number(e.toChainId),s=[];return hl(e,"lifi")&&s.push(gl("lifi",async()=>{let c=await(r.lifiQuote??ir)({fromChain:e.fromChainId,toChain:e.toChainId,fromToken:e.sellToken,toToken:e.buyToken,fromAmount:e.sellAmount,fromAddress:e.receiver},t),l=c?.estimate??c?.[0]?.estimate??c;return{quoteId:c?.id??c?.routeId??null,amountOut:l?.toAmount??c?.toAmount,minBuyAmount:l?.toAmountMin??c?.toAmountMin??l?.toAmount??c?.toAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"lifi-route",calldataHash:c?.transactionRequest?.data?await JJ(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(hl(e,"paraswap")&&s.push(gl("paraswap",async()=>{let c=await(r.paraswapPrice??sr)({chainId:e.fromChainId,srcToken:e.sellToken,destToken:e.buyToken,amount:e.sellAmount,srcDecimals:t.decimalsIn,destDecimals:t.decimalsOut},t),l=c?.priceRoute??c;return{quoteId:l?.id??null,amountOut:l?.destAmount,minBuyAmount:c?.amountOutMinimum??l?.destAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"paraswap-price-route",route:l},metadata:{contractAddress:l?.contractAddress??null}}})),hl(e,"0x")&&(f2(n,"ZEROX_API_KEY")||f2(n,"0X_API_KEY")||r.zeroxQuote)&&s.push(gl("0x",async()=>{let c=await(r.zeroxQuote??Fr)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmount:e.sellAmount,taker:e.receiver},t);return{quoteId:c?.id??null,amountOut:c?.buyAmount??c?.grossBuyAmount,minBuyAmount:c?.minBuyAmount??c?.buyAmount,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"0x-transaction",to:c?.transaction?.to,data:c?.transaction?.data,value:c?.transaction?.value??"0"},metadata:{route:c?.route??null}}})),hl(e,"cow")&&s.push(gl("cow",async()=>{let c=await(r.cowQuote??cr)({chainId:e.fromChainId,sellToken:e.sellToken,buyToken:e.buyToken,sellAmountBeforeFee:e.sellAmount,from:e.receiver,signingScheme:"eip712"},t),l=c?.quote??c;return{quoteId:c?.id??null,amountOut:l?.buyAmount,minBuyAmount:l?.buyAmount,expiryMs:Math.min(Number(l?.validTo??0)*1e3||Date.now()+Number(t.defaultQuoteTtlMs??2e4),e.deadlineMs),artifact:{type:"cow-order",order:l},metadata:{solver:!0}}})),hl(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&s.push(gl("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??or)({chainId:e.fromChainId,tokenIn:e.sellToken,tokenOut:e.buyToken,amountIn:e.sellAmount},t);return{quoteId:c?.id??null,amountOut:c?.amountOut,minBuyAmount:c?.minOut??c?.amountOutMinimum??c?.amountOut,expiryMs:Date.now()+Number(t.defaultQuoteTtlMs??2e4),artifact:{type:"uniswap-v3-quote",quoter:c?.quoter,fee:c?.fee},metadata:{onchain:!0}}}))),s}async function JJ(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function QJ(e,t){let n;return Promise.race([Promise.resolve().then(e.run),new Promise((r,o)=>{n=setTimeout(()=>o(new Error(`${e.source}: timeout`)),t)})]).finally(()=>clearTimeout(n))}async function ZJ(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(a=>QJ(a,r))),i=[],s=[];for(let a=0;a<o.length;a++){let c=t[a],l=o[a];if(l.status==="rejected"){s.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(p2(e,{...l.value,source:c.source},n))}catch(u){s.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:s}}function eQ(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(s=>Number(s.expiryMs??0)>n);r.sort((s,a)=>{let c=BigInt(a.minBuyAmount??0)-BigInt(s.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(a.amountOut??0)-BigInt(s.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(s=>({...s,scoreBasis:"minBuyAmount"})),i=[];return o.length||i.push("no RFQ source returned a usable firm quote"),e.length!==o.length&&i.push("expired RFQ quotes were excluded from ranking"),{best:o[0]??null,quotes:o,failed:[],warnings:i}}async function m2(e,t={}){let n=XJ(e,t),{quotes:r,failed:o}=await ZJ(e,n,t),i=eQ(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}var h2=_(()=>{ka();_a();Oa();Pa();Mi();dw()});function g2(e={},t={}){return uw(e,t)}async function y2(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:uw(e,t);return m2(n,t)}async function b2(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}var w2=_(()=>{dw();h2()});function pw(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||nQ).replace(/\/$/,"")}async function S2(e={}){try{let t=await x(`${pw(e)}/api/pools?token=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t.totalPoolSize=="string",provider:"across-bridge",l1Token:t.l1Token}}catch(t){return{ok:!1,provider:"across-bridge",error:String(t.message||t).slice(0,120)}}}async function v2(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return x(`${pw(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function E2(e={},t={}){let n=new URLSearchParams;return e.originChainId&&n.set("originChainId",String(e.originChainId)),e.destinationChainId&&n.set("destinationChainId",String(e.destinationChainId)),e.token&&n.set("token",String(e.token)),e.amount&&n.set("amount",String(e.amount)),x(`${pw(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var nQ,x2=_(()=>{q();nQ="https://app.across.to"});function fw(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||oQ).replace(/\/$/,"")}async function A2(e={}){try{let t=await x(`${fw(e)}/apy`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Object.keys(t||{});return{ok:n.length>0,provider:"beefy-yields",vaultCount:n.length}}catch(t){return{ok:!1,provider:"beefy-yields",error:String(t.message||t).slice(0,120)}}}async function I2(e={},t={}){let n=await x(`${fw(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,s]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=s);return o}return n}async function k2(e={}){return x(`${fw(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}var oQ,_2=_(()=>{q();oQ="https://api.beefy.finance"});function O2(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||sQ).replace(/\/$/,"")}async function N2(e={}){try{let t=await x(`${O2(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function T2(e={},t={}){let n=String(e.sortBy||"v24hUSD"),r=String(e.sortType||"desc"),o=Math.max(0,Number(e.offset||0)),i=Math.min(50,Math.max(1,Number(e.limit||20)));return x(`${O2(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var sQ,C2=_(()=>{q();sQ="https://public-api.birdeye.so"});function mw(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||cQ).replace(/\/$/,"")}async function P2(e={}){try{let t=await x(`${mw(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&t.blobs_count!=null,provider:"celestia-da"}}catch(t){return{ok:!1,provider:"celestia-da",error:String(t.message||t).slice(0,120)}}}async function R2(e={}){return x(`${mw(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function L2(e={},t={}){let n=Number(e.height);if(n&&(!Number.isFinite(n)||n<1))throw new Error("celestia-da: height must be positive");let r=n?`/v1/block/${n}`:"/v1/block";return x(`${mw(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var cQ,M2=_(()=>{q();cQ="https://api.celenium.io"});function dQ(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||uQ).replace(/\/$/,"")}async function ff(e,t,n={}){let r=dQ(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),a=await(await(n.fetchImpl||fetch)(r,{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:o,signal:AbortSignal.timeout(n.timeoutMs??2e4)})).json();if(a.error)throw new Error(`das-assets ${e}: ${a.error.message||JSON.stringify(a.error)}`);return a.result}async function $2(e={}){try{let t=await ff("getAsset",{id:"12He3nqt2XLbpuWGdwsJBNcomm7r3M8Kh6Dj9w7ZAK9"},e);return{ok:t&&typeof t=="object",provider:"das-assets"}}catch(t){return{ok:!1,provider:"das-assets",error:String(t.message||t).slice(0,120)}}}async function B2(e={},t={}){let n=String(e.ownerAddress||"").trim();if(!n)throw new Error("das-assets: ownerAddress is required");let r=Math.max(1,Number(e.page||1)),o=Math.min(1e3,Math.max(1,Number(e.limit||50)));return ff("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function D2(e={},t={}){let n=Math.max(1,Number(e.page||1)),r=Math.min(100,Math.max(1,Number(e.limit||20))),o={page:n,limit:r};return e.ownerAddress&&(o.ownerAddress=String(e.ownerAddress)),e.collectionId&&(o.collectionId=String(e.collectionId)),e.creatorAddress&&(o.creatorAddress=String(e.creatorAddress)),e.delegate&&(o.delegate=String(e.delegate)),ff("searchAssets",o,t)}async function U2(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return ff("getAssetProof",{id:n},t)}var uQ,F2=_(()=>{q();uQ="https://api.mainnet-beta.solana.com"});function hw(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||fQ).replace(/\/$/,"")}async function q2(e={}){try{let t=await x(`${hw(e)}/api/scaling/tvl`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:t&&typeof t.totalUsd=="string",provider:"l2beat-tvl"}}catch(t){return{ok:!1,provider:"l2beat-tvl",error:String(t.message||t).slice(0,120)}}}async function j2(e={},t={}){let n=await x(`${hw(t)}/api/scaling/tvl`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.project){let r=String(e.project).toLowerCase(),o=n?.projects||{},i=Object.entries(o).find(([s])=>String(s).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function H2(e={},t={}){return x(`${hw(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var fQ,z2=_(()=>{q();fQ="https://api.l2beat.com"});function gw(e={}){return(e.baseUrl||process.env.SPARK_API_URL||hQ).replace(/\/$/,"")}async function V2(e={}){try{return{ok:(await x(`${gw(e)}/v1/savings/spark/mainnet/usdc`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4}))?.data?.vault?.address!=null,provider:"spark-lend"}}catch(t){return{ok:!1,provider:"spark-lend",error:String(t.message||t).slice(0,120)}}}async function W2(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?x(`${gw(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):x(`${gw(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}var hQ,G2=_(()=>{q();hQ="https://api.spark.fi"});function yw(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||yQ).replace(/\/$/,"")}async function K2(e={}){try{let t=await x(`${yw(e)}/v1/vaults`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3});return{ok:Array.isArray(t)&&t.length>0,provider:"symbiotic-restaking",count:t.length}}catch(t){return{ok:!1,provider:"symbiotic-restaking",error:String(t.message||t).slice(0,120)}}}async function Y2(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await x(`${yw(t)}/v1/vaults?limit=${n}&offset=${Math.max(0,Number(e.offset||0))}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return e.approvedOnly?r.filter(o=>o.approved===!0):r}async function X2(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return x(`${yw(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var yQ,J2=_(()=>{q();yQ="https://api.symbiotic.fi"});function AQ(e){let t=[0];for(let o of e){let i=xQ.get(o);if(i===void 0)return null;let s=i;for(let a=0;a<t.length;a+=1)s+=t[a]*58,t[a]=s&255,s>>=8;for(;s>0;)t.push(s&255),s>>=8}let n=0;for(let o of e){if(o!=="1")break;n+=1}let r=t[t.length-1]===0&&t.length>1?t.length-1:t.length;return n+(e.replace(/^1+/u,"")===""?0:r)}function Ew(e){if(e===null||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.keys(e))Ew(e[t]);return Object.freeze(e)}function Z2(e){return e==="1"||e===1||e===!0}function eM(e){return e==="1"||e===1||e===!0?!0:e==="0"||e===0||e===!1?!1:null}function oM(e){return typeof e=="string"?e.trim()!=="":!e||typeof e!="object"||Array.isArray(e)?!1:["address","program_id","programId","program","hook"].some(t=>typeof e[t]=="string"&&e[t].trim()!=="")}function iM(e){return typeof e!="object"||e===null||Array.isArray(e)?!1:Object.keys(e).length===0?!0:rM.some(t=>{let n=yl(e[t]);return n!==null&&n>=0})}function tM(e,t){let n=Object.hasOwn(e,t)?e[t]:void 0;if(n==null||n==="")return!1;if(!MQ.has(t))return $Q.has(t)?n==="1"||n===1||n===!0||n==="0"||n===0||n===!1:t==="transfer_hook"?Array.isArray(n)?n.length===0||n.some(oM):!1:t==="transfer_fee"?iM(n):!0;if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n.status;return r==null||r===""?!1:r==="1"||r===1||r===!0||r==="0"||r===0||r===!1}function Yn(e,t){return typeof e!="string"||e.trim()===""?null:e.slice(0,t)}function yl(e){if(typeof e!="number"&&typeof e!="string"||typeof e=="string"&&e.trim()==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function BQ(e,t){return(Array.isArray(e?.[t])?e[t]:[]).slice(0,_Q).map(r=>Yn(typeof r=="string"?r:r?.address,64)).filter(r=>r!==null)}function DQ(e,t){let r=Array.isArray(e?.[t])?e[t]:[];if(r.length===0)return null;let o=!1,i=!1;for(let s of r){if(Yn(typeof s=="string"?s:s?.address,64)===null){i=!0;continue}let c=s?.malicious_address,l=c===1||c==="1"||c===!0;if(!l&&!(c===0||c==="0"||c===!1)){i=!0;continue}if(o=!0,l)return!0}return i?null:o?!1:null}function UQ(e){return Number.isInteger(e)?Math.min(Math.max(e,RQ),LQ):PQ}function bw(e,t,n={}){return Ew({provider:mf,chain:bl,mint:e,status:"unavailable",execution:"read-only",risk:"unknown-risk",findings:[],evidenceComplete:!1,missingEvidence:[...ww].map(r=>vw[r]||r),topHolders:[],token:{name:null,symbol:null},vendorTrustedListing:null,error:t,notes:["scan did not complete; treat this token as UNVERIFIED, not as clean"],...n})}function nM(e,t){return{provider:mf,chain:bl,mint:e,status:"error",execution:"read-only",risk:"unknown-risk",findings:[],evidenceComplete:!1,missingEvidence:[],topHolders:[],token:{name:null,symbol:null},vendorTrustedListing:null,error:t,notes:["input rejected before any network call"]}}function FQ(e,t){return!e||typeof e!="object"?null:Object.hasOwn(e,t)&&e[t]&&typeof e[t]=="object"?e[t]:null}async function xw(e={},t={}){let n=typeof e.mint=="string"?e.mint.trim():"",r=n.slice(0,64);if(e.chain!==void 0&&e.chain!==null&&e.chain!==""&&String(e.chain).trim().toLowerCase()!==bl)return nM(r,`solana-token-risk: unsupported chain "${String(e.chain).slice(0,32)}" \u2014 this scanner covers solana only`);if(!vQ.test(n)||AQ(n)!==IQ)return nM(r,"solana-token-risk: mint must be a base58 Solana address (32-44 chars)");let o=`${wQ}${Q2}?contract_addresses=${n}`,i;try{i=await x(o,{method:"GET",headers:{Accept:"application/json"},fetchImpl:t.fetchImpl,timeoutMs:UQ(t.timeoutMs),maxResponseBytes:kQ})}catch(y){return bw(n,`solana-token-risk: ${bn(y)}`)}let s=i?.code;if(s!==SQ){let y=Yn(i?.message,120)||"unknown upstream error",b=typeof s=="number"||typeof s=="string"?String(s):"none";return bw(n,`solana-token-risk: goplus returned code ${b} (${y})`)}let a=FQ(i?.result,n);if(!a)return bw(n,`solana-token-risk: goplus returned no record for ${n}`);let c=[],l=[];for(let y of ww)tM(a,y)||l.push(vw[y]||y);for(let y of wl){let b=a[y.field];if(b==null||!Z2(b?.status))continue;let w=y.authorityKey||"authority";c.push({id:y.id,severity:y.severity,title:y.title,note:y.note,authorities:BQ(b,w),maliciousAuthority:DQ(b,w),source:"goplus:solana/token_security",field:y.field})}for(let y of Sw)Z2(a[y.field])&&c.push({id:y.id,severity:y.severity,title:y.title,note:y.note,authorities:[],maliciousAuthority:null,source:"goplus:solana/token_security",field:y.field});let u=a.transfer_fee;iM(u)&&rM.some(y=>(yl(u[y])??0)>0)&&c.push({id:"transfer-fee",severity:"medium",title:"transfer fee active",note:"a fee is deducted on every transfer",authorities:[],maliciousAuthority:null,source:"goplus:solana/token_security",field:"transfer_fee"}),Array.isArray(a.transfer_hook)&&a.transfer_hook.some(oM)&&c.push({id:"transfer-hook",severity:"high",title:"transfer hook present",note:"a custom program runs on every transfer and can block it",authorities:[],maliciousAuthority:null,source:"goplus:solana/token_security",field:"transfer_hook"});let d=c.slice(0,CQ),m=d.filter(y=>y.severity==="high").length>0?"high":d.length>0?"elevated":"unknown-risk",h=(Array.isArray(a.holders)?a.holders:[]).filter(y=>typeof y?.account=="string"&&y.account.trim()!=="").slice(0,OQ).map(y=>({account:Yn(y?.account,64),percent:yl(y?.percent),isLocked:eM(y?.is_locked),tag:Yn(y?.tag,64)||null})),g=[];if(l.length>0&&g.push(`partial evidence: upstream omitted ${l.length} field(s) (${l.slice(0,6).join(", ")}) \u2014 absence of a field is not evidence of low risk`),m==="unknown-risk"){let y=wl.every(b=>tM(a,b.field));l.length===ww.length?g.push("no authority evidence was readable; nothing was verified about this token"):y?l.length>0?g.push(`no retained authorities detected, but ${l.length} other expected field(s) were unreadable; this is not a complete scan`):g.push("no retained authorities detected; this is weak evidence, not a safety guarantee"):g.push("authority evidence was incomplete; retained authorities cannot be ruled out")}return yl(a.trusted_token)===1&&g.push("goplus lists this as a trusted token \u2014 a vendor opinion, not a safety verdict"),g.push("authority findings show retained CAPABILITY, not proven intent"),g.push("single-vendor view: one input to a decision, never a sole gate"),g.push("a completed scan is not a safety guarantee; liquidity, LP locks, and deployer intent are out of scope"),Ew({provider:mf,chain:bl,mint:n,status:"ok",execution:"read-only",risk:m,findings:d,evidenceComplete:l.length===0,missingEvidence:l,topHolders:h,holderCount:yl(a.holder_count),totalSupply:Yn(a.total_supply,64),token:{name:Yn(a?.metadata?.name,NQ),symbol:Yn(a?.metadata?.symbol,TQ)},vendorTrustedListing:eM(a.trusted_token),source:{provider:"goplus",api:"solana/token_security",official:!0,endpoint:Q2,docs:"https://docs.gopluslabs.io/reference/solanatokensecurityusingget",fetchedAt:new Date().toISOString()},notes:g})}async function sM(e={}){let t=Date.now(),n={provider:mf,chain:bl,execution:"read-only",requiresCredential:!1,api:"goplus:solana/token_security"};try{let r=await xw({mint:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"},e);return r.status==="ok"?{...n,ok:!0,latencyMs:Date.now()-t}:{...n,ok:!1,latencyMs:Date.now()-t,error:r.error||"probe did not complete"}}catch(r){return{...n,ok:!1,latencyMs:Date.now()-t,error:bn(r)}}}var wQ,mf,bl,Q2,SQ,vQ,EQ,xQ,IQ,kQ,_Q,OQ,NQ,TQ,CQ,PQ,RQ,LQ,wl,Sw,ww,vw,MQ,Wge,$Q,rM,aM=_(()=>{q();Ld();wQ="https://api.gopluslabs.io",mf="solana-token-risk",bl="solana",Q2="/api/v1/solana/token_security",SQ=1,vQ=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u,EQ="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",xQ=new Map([...EQ].map((e,t)=>[e,t]));IQ=32,kQ=2*1024*1024,_Q=16,OQ=20,NQ=128,TQ=32,CQ=32,PQ=15e3,RQ=1e3,LQ=6e4,wl=Object.freeze([{id:"mintable",field:"mintable",severity:"high",title:"mint authority retained",note:"supply can still be inflated at will"},{id:"freezable",field:"freezable",severity:"high",title:"freeze authority retained",note:"token accounts can be frozen, blocking sells"},{id:"closable",field:"closable",severity:"high",title:"mint account closable",note:"the mint account can be closed by its authority"},{id:"balance-mutable",field:"balance_mutable_authority",severity:"high",title:"balances mutable by authority",note:"holder balances can be changed directly"},{id:"metadata-mutable",field:"metadata_mutable",authorityKey:"metadata_upgrade_authority",severity:"medium",title:"metadata mutable",note:"name, symbol, and image can be swapped after launch"},{id:"transfer-fee-upgradable",field:"transfer_fee_upgradable",severity:"high",title:"transfer fee upgradable",note:"the transfer fee can be raised after you buy"},{id:"transfer-hook-upgradable",field:"transfer_hook_upgradable",severity:"high",title:"transfer hook upgradable",note:"custom transfer logic can be swapped in later"},{id:"default-account-state-upgradable",field:"default_account_state_upgradable",severity:"high",title:"default account state upgradable",note:"new accounts can be made frozen-by-default later"}]),Sw=Object.freeze([{id:"non-transferable",field:"non_transferable",severity:"high",title:"non-transferable token",note:"the token cannot be transferred at all (soulbound)"}]),ww=Object.freeze([...wl.map(e=>e.field),...Sw.map(e=>e.field),"transfer_fee","transfer_hook"]),vw=Object.freeze({mintable:"mintable",freezable:"freezable",closable:"closable",balance_mutable_authority:"balance-mutable",metadata_mutable:"metadata-mutable",transfer_fee_upgradable:"transfer-fee-upgradable",transfer_hook_upgradable:"transfer-hook-upgradable",default_account_state_upgradable:"default-account-state-upgradable",non_transferable:"non-transferable",transfer_fee:"transfer-fee",transfer_hook:"transfer-hook"});MQ=new Set(wl.map(e=>e.field)),Wge=new Set(wl.map(e=>vw[e.field]??e.field)),$Q=new Set(Sw.map(e=>e.field)),rM=Object.freeze(["fee_rate","maximum_fee","transfer_fee_basis_points","basis_points","maximum_fee_rate"])});function kw(e){let t=typeof e=="string"?e.trim():"";if(!YQ.test(t))throw new Error("robinhood-wallet-history: address must be a 0x-prefixed 20-byte hex address");return t.toLowerCase()}function XQ(e){if(e==null||e==="")return HQ;let t=Math.trunc(Number(e));if(!Number.isFinite(t)||t<1)throw new Error("robinhood-wallet-history: limit must be a positive integer");return Math.min(t,zQ)}function _w(e={}){let t=e&&typeof e=="object"?e:{},n=Number(t.timeoutMs),r=Number.isFinite(n)?Math.min(Math.max(Math.trunc(n),WQ),cM):VQ,o=Number(t.maxResponseBytes),i=Number.isFinite(o)&&o>0?Math.min(Math.trunc(o),KQ):GQ,s=typeof t.fetchImpl=="function"?t.fetchImpl:void 0;return{timeoutMs:r,maxResponseBytes:i,fetchImpl:s}}function Ow(e){let t=typeof e=="function"?e:fetch;return async function(r,o={}){let i={...o&&typeof o=="object"?o.headers:void 0};return i["user-agent"]=jQ,t(r,{...o,headers:i})}}async function Nw(e={},t={}){let n=kw(e?.address),r=XQ(e?.limit),o=e&&Object.hasOwn(e,"cursor")?e.cursor:void 0,{timeoutMs:i,maxResponseBytes:s,fetchImpl:a}=_w(t);try{return{...await Up({chainId:Eo,address:n,limit:r,cursor:o},{baseUrl:xo,fetchImpl:Ow(a),timeoutMs:i,maxResponseBytes:s}),provider:Sl,chainId:Eo,execution:"read-only",explorer:Aw,source:xo,docs:Iw}}catch(c){throw new Error(`robinhood-wallet-history: ${bn(c)}`)}}async function Tw(e={},t={}){let n=kw(e?.address),r=e?.fungibleOnly!==!1,{timeoutMs:o,maxResponseBytes:i,fetchImpl:s}=_w(t);try{let a=await Dp({chainId:Eo,address:n},{baseUrl:xo,fetchImpl:Ow(s),timeoutMs:o,maxResponseBytes:i}),c=Fp(a,{fungibleOnly:r});return{provider:Sl,chainId:Eo,execution:"read-only",explorer:Aw,source:xo,docs:Iw,address:n,count:c.length,balances:c}}catch(a){throw new Error(`robinhood-wallet-history: ${bn(a)}`)}}async function lM(e={},t={}){let n=kw(e?.address),[r,o]=await Promise.allSettled([Nw({address:n,limit:e?.limit,cursor:e?.cursor},t),Tw({address:n,fungibleOnly:e?.fungibleOnly},t)]),i=[];r.status==="rejected"&&i.push({source:"transactions",reason:bn(r.reason)}),o.status==="rejected"&&i.push({source:"tokenBalances",reason:bn(o.reason)});let s=i.length===0?"COMPLETE":i.length===2?"UNAVAILABLE":"PARTIAL";return{schemaVersion:"oracle.robinhood-wallet-history/1",provider:Sl,chainId:Eo,execution:"read-only",reportOnly:!0,address:n,status:s,transactions:r.status==="fulfilled"?r.value:null,tokenBalances:o.status==="fulfilled"?o.value:null,gaps:i,evidence:{explorer:Aw,source:xo,docs:Iw}}}async function uM(e={}){let{timeoutMs:t,maxResponseBytes:n,fetchImpl:r}=_w(e);try{let o=await nl({chainId:Eo},{baseUrl:xo,fetchImpl:Ow(r),timeoutMs:Math.min(t,cM),maxResponseBytes:n});return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:Sl,chainId:Eo,execution:"read-only",source:xo}}catch(o){return{ok:!1,provider:Sl,chainId:Eo,execution:"read-only",source:xo,error:bn(o)}}}var Sl,Eo,xo,Aw,Iw,jQ,HQ,zQ,VQ,WQ,cM,GQ,KQ,YQ,dM=_(()=>{rl();Ld();Sl="robinhood-wallet-history",Eo=4663,xo="https://robinhoodchain.blockscout.com",Aw="blockscout",Iw="https://docs.robinhood.com/chain/connecting",jQ="Mozilla/5.0 (compatible; OracleRobinhoodWalletHistory/1.0; +https://github.com/demi-hl/oracle)",HQ=20,zQ=50,VQ=15e3,WQ=2e3,cM=3e4,GQ=512*1024,KQ=4*1024*1024,YQ=/^0x[0-9a-f]{40}$/i});function Pw(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||QQ).replace(/\/$/,"")}function rZ(e,t="id"){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);let r=Number(n);if(!Number.isSafeInteger(r)||r<1)throw new Error(`polygon-staking: ${t} must be a positive integer validator id`);return r}function oZ(e,t=tZ){let n=Number(e??t);return Number.isFinite(n)?Math.min(eZ,Math.max(1,Math.trunc(n))):t}function Cw(e){let t=Number(e);return Number.isFinite(t)?t/10**ZQ:null}async function Rw(e,t={}){let n=await x(`${Pw(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});if(typeof n=="string")throw new Error(`polygon-staking GET ${e}: non-JSON response`);if(n?.success===!1){let r=n?.message||n?.error||n?.status||"request rejected";throw new Error(`polygon-staking GET ${e}: ${r}`)}return n}function pM(e={}){return{id:e.id??null,name:typeof e.name=="string"?e.name.trim():null,status:e.status??null,currentState:e.currentState??null,owner:e.owner??null,signer:e.signer??null,contractAddress:e.contractAddress??null,commissionPercent:e.commissionPercent??null,uptimePercent:e.uptimePercent??null,performanceIndex:e.performanceIndex??null,delegationEnabled:e.delegationEnabled??null,activationEpoch:e.activationEpoch??null,deactivationEpoch:e.deactivationEpoch??null,jailEndEpoch:e.jailEndEpoch??null,missedLatestCheckpointCount:e.missedLatestCheckpointcount??null,totalStakedRaw:e.totalStaked??null,selfStakeRaw:e.selfStake??null,delegatedStakeRaw:e.delegatedStake??null,totalStakedPolApprox:Cw(e.totalStaked),selfStakePolApprox:Cw(e.selfStake),delegatedStakePolApprox:Cw(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function fM(e={},t={}){let n=await Rw("/validators",t),r=Array.isArray(n?.result)?n.result:[],o=n?.summary?.total??r.length;if(e.status){let d=String(e.status).toLowerCase();r=r.filter(p=>String(p?.status||"").toLowerCase()===d)}if(e.currentState){let d=String(e.currentState).toUpperCase();r=r.filter(p=>String(p?.currentState||"").toUpperCase()===d)}if(e.delegationEnabled!=null){let d=!!e.delegationEnabled;r=r.filter(p=>!!p?.delegationEnabled===d)}let i=nZ.has(String(e.sortBy))?String(e.sortBy):"id",s=String(e.direction||"").toUpperCase()==="DESC";r=[...r].sort((d,p)=>{let m=Number(d?.[i]??0),f=Number(p?.[i]??0),h=Number.isFinite(m)&&Number.isFinite(f)?m-f:0;return s?-h:h});let a=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=oZ(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:a,total:o,limit:l,offset:c,sortBy:i,direction:s?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(pM)}}async function mM(e={},t={}){let n=rZ(e.id??e.validatorId,"id"),o=(await Rw(`/validators/${n}`,t))?.result;if(!o||typeof o!="object")throw new Error(`polygon-staking: validator ${n} not found`);return{provider:"polygon-staking",chainId:137,id:n,validator:e.raw?o:{...pM(o),delegatorCount:o.delegatorCount??null,checkpointsSigned:o.checkpointsSigned??null,checkpointsMissed:o.checkpointsMissed??null,isInAuction:o.isInAuction??null,auctionAmount:o.auctionAmount??null,delegatorUnclaimedRewardsRaw:o.delegatorUnclaimedRewards??null,validatorUnclaimedRewardsRaw:o.validatorUnclaimedRewards??null,claimedRewardRaw:o.claimedReward??null,description:typeof o.description=="string"?o.description:null,logoUrl:o.logoUrl??null},raw:e.raw?void 0:o}}async function hM(e={}){try{let t=await Rw("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Pw(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Pw(e),error:String(t?.message||t),exec:!1}}}var QQ,ZQ,eZ,tZ,nZ,gM=_(()=>{q();QQ="https://staking-api.polygon.technology/api/v2",ZQ=18,eZ=200,tZ=50,nZ=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"])});async function hf(e,t,n={}){let r=await x(aZ(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4});if(r?.errors?.length)throw new Error(`aave-v3: ${r.errors.map(o=>o?.message||String(o)).join("; ")}`);return r}function dZ(e={}){let t=e.chainIds??(e.chainId!=null?[e.chainId]:null),n=(Array.isArray(t)?t:[t??1]).map(Number).filter(r=>Number.isInteger(r)&&r>0);if(!n.length)throw new Error("aave-v3: chainIds must contain at least one chain id");return[...new Set(n)]}async function yM(e={},t={}){let n={chainIds:dZ(e)};return e.user&&(n.user=String(e.user)),{markets:(await hf(cZ,{request:n},t))?.data?.markets??[]}}async function bM(e={},t={}){let n=String(e.address||e.market||e.marketAddress||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("aave-v3: marketReserves requires an EVM market (pool) address");let r=Number(e.chainId??1);if(!Number.isInteger(r)||r<=0)throw new Error("aave-v3: chainId must be a positive integer");let o={address:n,chainId:r};e.user&&(o.user=String(e.user));let s=(await hf(lZ,{request:o},t))?.data?.market??null;if(!s)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:s}}async function wM(e={},t={}){let n=new Set(["MAINNET_ONLY","TESTNET_ONLY","ALL"]),r=String(e.filter||"MAINNET_ONLY").toUpperCase();if(!n.has(r))throw new Error(`aave-v3: filter must be one of ${[...n].join(", ")}`);return{chains:(await hf(uZ,{filter:r},t))?.data?.chains??[]}}async function SM(e={}){return{ok:(await hf("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}var sZ,Jge,aZ,cZ,lZ,uZ,vM=_(()=>{q();sZ="https://api.v3.aave.com/graphql",Jge=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),aZ=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||sZ;cZ=`query Markets($request: MarketsRequest!) {
|
|
151
|
+
markets(request: $request) {
|
|
152
|
+
name
|
|
153
|
+
address
|
|
154
|
+
chain { chainId name }
|
|
155
|
+
totalMarketSize
|
|
156
|
+
totalAvailableLiquidity
|
|
157
|
+
}
|
|
158
|
+
}`,lZ=`query Market($request: MarketRequest!) {
|
|
159
|
+
market(request: $request) {
|
|
160
|
+
name
|
|
161
|
+
address
|
|
162
|
+
chain { chainId name }
|
|
163
|
+
totalMarketSize
|
|
164
|
+
totalAvailableLiquidity
|
|
165
|
+
reserves {
|
|
166
|
+
underlyingToken { symbol address decimals }
|
|
167
|
+
isFrozen
|
|
168
|
+
isPaused
|
|
169
|
+
flashLoanEnabled
|
|
170
|
+
size { amount { value } usd }
|
|
171
|
+
supplyInfo {
|
|
172
|
+
apy { value formatted }
|
|
173
|
+
total { value }
|
|
174
|
+
supplyCap { amount { value } usd }
|
|
175
|
+
supplyCapReached
|
|
176
|
+
canBeCollateral
|
|
177
|
+
maxLTV { value }
|
|
178
|
+
liquidationThreshold { value }
|
|
179
|
+
}
|
|
180
|
+
borrowInfo {
|
|
181
|
+
apy { value formatted }
|
|
182
|
+
total { amount { value } usd }
|
|
183
|
+
availableLiquidity { amount { value } usd }
|
|
184
|
+
utilizationRate { value }
|
|
185
|
+
borrowCap { amount { value } usd }
|
|
186
|
+
borrowCapReached
|
|
187
|
+
reserveFactor { value }
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}`,uZ=`query Chains($filter: ChainsFilter!) {
|
|
192
|
+
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
193
|
+
}`});function Lw(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||fZ).replace(/\/$/,"")}function gf(e,t={}){return x(`${Lw(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function EM(e,t="pkHex"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]+$/.test(n))throw new Error(`babylon-staking: ${t} must be hex`);if(n.length===66&&(n.startsWith("02")||n.startsWith("03")))return n.slice(2);if(n.length!==64)throw new Error(`babylon-staking: ${t} must be a 64-char x-only (or 66-char compressed) BTC public key`);return n}async function xM(e={}){try{let n=(await gf("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Lw(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Lw(e),error:String(t?.message||t),exec:!1}}}async function AM(e={},t={}){let r=(await gf("/v2/stats",t))?.data||{};return{provider:"babylon-staking",activeTvlSats:String(r.active_tvl??""),totalActiveTvlSats:String(r.total_active_tvl??""),activeDelegations:r.active_delegations??null,totalActiveDelegations:r.total_active_delegations??null,activeFinalityProviders:r.active_finality_providers??null,totalFinalityProviders:r.total_finality_providers??null,btcStakingApr:r.btc_staking_apr??null,btcStakingAprPct:r.btc_staking_apr==null?null:Number(r.btc_staking_apr)*100,maxStakingApr:r.max_staking_apr??null,maxStakingAprPct:r.max_staking_apr==null?null:Number(r.max_staking_apr)*100,raw:r}}async function IM(e={},t={}){let n=await gf("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(s=>String(s.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=EM(e.btcPk,"btcPk");r=r.filter(s=>String(s.btc_pk||"").toLowerCase()===i)}let o=Math.min(500,Math.max(1,Number(e.limit||r.length||1)));return{provider:"babylon-staking",count:r.length,finalityProviders:r.slice(0,o).map(i=>({btcPk:i.btc_pk??null,moniker:i.description?.moniker??null,website:i.description?.website??null,state:i.state??null,commission:i.commission??null,activeTvlSats:i.active_tvl==null?null:String(i.active_tvl),activeDelegations:i.active_delegations??null}))}}async function kM(e={},t={}){let n=EM(e.stakerPkHex||e.stakerPk||e.pkHex||e.pk,"stakerPkHex"),r=new URLSearchParams({staker_pk_hex:n});e.paginationKey&&r.set("pagination_key",String(e.paginationKey));let o=await gf(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],s=i.reduce((a,c)=>a+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(s),nextKey:o?.pagination?.next_key||null,delegations:i.map(a=>({stakingTxHashHex:a.delegation_staking?.staking_tx_hash_hex??a.staking_tx_hash_hex??null,state:a.state??null,stakingAmountSats:a.delegation_staking?.staking_amount==null&&a.staking_amount==null?null:String(a.delegation_staking?.staking_amount??a.staking_amount),stakingTimelock:a.delegation_staking?.staking_timelock??null,startHeight:a.delegation_staking?.start_height??null,finalityProviderBtcPks:a.finality_provider_btc_pks_hex??null})),raw:i}}var fZ,_M=_(()=>{q();fZ="https://staking-api.babylonlabs.io"});function Mw(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||hZ).replace(/\/$/,"")}function OM(e,t="market"){let n=String(e||"").trim().toLowerCase().replace(/[/\-\s]/g,"_");if(!/^[a-z0-9]{2,12}_[a-z0-9]{2,12}$/.test(n))throw new Error(`bisq-markets: ${t} must look like btc_usd (got "${e}")`);return n}function yf(e,t={}){return x(`${Mw(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function NM(e={}){try{let t=await yf("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Mw(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Mw(e),error:String(t?.message||t),exec:!1}}}async function TM(e={},t={}){let n=await yf("/api/markets",t),r=Object.values(n&&typeof n=="object"?n:{});if(e.base){let o=String(e.base).trim().toLowerCase();r=r.filter(i=>String(i.lsymbol||"").toLowerCase()===o)}if(e.quote){let o=String(e.quote).trim().toLowerCase();r=r.filter(i=>String(i.rsymbol||"").toLowerCase()===o)}return{provider:"bisq-markets",count:r.length,markets:r.map(o=>({pair:o.pair??null,name:o.name??null,base:o.lsymbol??null,baseName:o.lname??null,quote:o.rsymbol??null,quoteName:o.rname??null,baseType:o.ltype??null,quoteType:o.rtype??null}))}}async function CM(e={},t={}){let n=OM(e.market||e.pair||"btc_usd","market"),r=await yf(`/api/ticker?market=${encodeURIComponent(n)}`,t),o=Array.isArray(r)?r[0]||{}:r||{};return{provider:"bisq-markets",market:n,last:o.last==null?null:Number(o.last),high:o.high==null?null:Number(o.high),low:o.low==null?null:Number(o.low),bid:o.buy==null?null:Number(o.buy),ask:o.sell==null?null:Number(o.sell),volumeBase:o.volume_left==null?null:Number(o.volume_left),volumeQuote:o.volume_right==null?null:Number(o.volume_right),note:"Bisq is thin, non-KYC P2P \u2014 treat as a basis signal against centralized spot, not a reference rate",raw:o}}async function PM(e={},t={}){let n=OM(e.market||e.pair||"btc_usd","market"),r=Math.min(2e3,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({market:n,limit:String(r)});e.timestampFrom&&o.set("timestamp_from",String(e.timestampFrom)),e.timestampTo&&o.set("timestamp_to",String(e.timestampTo));let i=await yf(`/api/trades?${o}`,t),s=Array.isArray(i)?i:[],a=s.length?Number(s[0].trade_date||0):null,c=s.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:s.length,latestTradeAt:a?new Date(a).toISOString():null,latestTradeAgeHours:a?Math.round((Date.now()-a)/36e5*10)/10:null,volumeBase:c,trades:s.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}var hZ,RM=_(()=>{q();hZ="https://markets.bisq.network"});import{readFileSync as yZ,existsSync as bZ}from"node:fs";import{homedir as wZ}from"node:os";import SZ from"node:path";function EZ(e={}){return String(e.storePath||process.env.ORACLE_SOCIAL_INTEL_STORE||SZ.join(wZ(),".config","oracle","social-intel","store.json"))}function LM(){let e=Number(process.env.ORACLE_SOCIAL_INTEL_STALE_MIN);return Number.isFinite(e)&&e>0?e:vZ}function Ks(e={}){return Number.isFinite(e.nowMs)?Number(e.nowMs):Date.now()}function Ys(e={}){let t=EZ(e);if(!bZ(t))return{storePath:t,missing:!0};let n;try{n=JSON.parse(yZ(t,"utf8"))}catch(i){return{storePath:t,error:`store unparseable: ${String(i?.message||i)}`}}if(!n||typeof n!="object"||Array.isArray(n))return{storePath:t,error:"store root must be a JSON object"};let r=Array.isArray(n.mentions)?n.mentions.filter(i=>i&&typeof i=="object"):[],o=n.accounts&&typeof n.accounts=="object"&&!Array.isArray(n.accounts)?n.accounts:{};return{storePath:t,store:{updatedAt:typeof n.updatedAt=="string"?n.updatedAt:null,windowHours:Number.isFinite(Number(n.windowHours))?Number(n.windowHours):24,sources:n.sources&&typeof n.sources=="object"?n.sources:{},mentions:r,accounts:o}}}function MM(e,t){if(!e)return null;let n=Date.parse(e);return Number.isFinite(n)?Math.max(0,Math.round((t-n)/6e4*10)/10):null}function Gs(e,t){let n=MM(e.updatedAt,t);return{sample:"curated-accounts",accounts:Object.keys(e.accounts).length,updatedAt:e.updatedAt,stale:n==null?!0:n>LM()}}function xl(e){return{provider:$n,unavailable:!0,reason:e.missing?`store missing at ${e.storePath}`:e.error,rows:[]}}function $w(e){let t=String(e??"24h").trim().match(/^(\d+(?:\.\d+)?)\s*([mhd])$/i);if(!t)return 24*36e5;let n=Number(t[1]),r=t[2].toLowerCase();return n*(r==="m"?6e4:r==="h"?36e5:864e5)}function vl(e){let t=Date.parse(e.ts||"");return Number.isFinite(t)?t:null}function Bw(e,t,n){let r=vl(e);return r!=null&&t-r<n}function El(e){return(Array.isArray(e.tickers)?e.tickers:[]).map(t=>String(t||"").replace(/^\$/,"").toUpperCase()).filter(Boolean)}function Dw(e){return(Array.isArray(e.cas)?e.cas:[]).filter(t=>t&&typeof t=="object"&&t.address).map(t=>({chain:String(t.chain||"").toLowerCase()||null,address:String(t.address).toLowerCase()}))}function Uw(e,t){let n=e.accounts[t];return n&&typeof n=="object"?n.grade??null:null}function Al(e,t,n=200){let r=Number(e);return Number.isFinite(r)&&r>=1?Math.min(n,Math.floor(r)):t}function $M(e,t=280){let n=String(e??"");return n.length>t?`${n.slice(0,t-1)}\u2026`:n}async function BM(e={},t={}){try{let n=Ks(t),r=Ys(t);if(r.missing)return{ok:!0,provider:$n,configured:!1,storePath:r.storePath,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0,note:"store absent \u2014 run the social-intel ingester to populate it; absence is not an error"};if(r.error)return{ok:!1,provider:$n,configured:!0,storePath:r.storePath,error:r.error,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0};let o=MM(r.store.updatedAt,n);return{ok:!0,provider:$n,configured:!0,storePath:r.storePath,updatedAt:r.store.updatedAt,ageMinutes:o,stale:o==null?!0:o>LM(),accounts:Object.keys(r.store.accounts).length,mentions:r.store.mentions.length}}catch(n){return{ok:!1,provider:$n,configured:!1,error:String(n?.message||n)}}}async function DM(e={},t={}){let n=Ys(t);if(!n.store)return xl(n);let r=Ks(t),o=$w(e.timeWindow),i=Al(e.limit,20),s=new Map;for(let c of n.store.mentions){if(!Bw(c,r,o))continue;let l=Uw(n.store,c.account),u=vl(c);for(let d of new Set(El(c))){let p=s.get(d)||{ticker:d,mentions:0,accounts:new Set,smartMentions:0,firstSeen:null,lastSeen:null};p.mentions+=1,c.account&&p.accounts.add(c.account),l==="ELITE"&&(p.smartMentions+=1),u!=null&&((p.firstSeen==null||u<p.firstSeen)&&(p.firstSeen=u),(p.lastSeen==null||u>p.lastSeen)&&(p.lastSeen=u)),s.set(d,p)}}let a=[...s.values()].sort((c,l)=>l.mentions-c.mentions||l.smartMentions-c.smartMentions||c.ticker.localeCompare(l.ticker)).slice(0,i).map(c=>({ticker:c.ticker,mentions:c.mentions,uniqueAccounts:c.accounts.size,smartMentions:c.smartMentions,firstSeen:c.firstSeen==null?null:new Date(c.firstSeen).toISOString(),lastSeen:c.lastSeen==null?null:new Date(c.lastSeen).toISOString(),sampleNote:"curated caller sample, not market-wide volume"}));return{provider:$n,timeWindow:String(e.timeWindow??"24h"),count:a.length,rows:a,basis:Gs(n.store,r)}}async function UM(e={},t={}){let n=Ys(t);if(!n.store)return xl(n);let r=Ks(t),o=$w(e.timeWindow),i=Al(e.limit,20),s=String(e.platform??"x").toLowerCase(),a=e.chain?String(e.chain).toLowerCase():null,c=new Map;for(let u of n.store.mentions){if(!Bw(u,r,o)||String(u.source||"x").toLowerCase()!==s)continue;let d=Uw(n.store,u.account),p=vl(u);for(let m of Dw(u)){if(a&&m.chain!==a)continue;let f=`${m.chain}:${m.address}`,h=c.get(f)||{chain:m.chain,address:m.address,mentions:0,accounts:new Set,smartMentions:0,lastSeen:null};h.mentions+=1,u.account&&h.accounts.add(u.account),d==="ELITE"&&(h.smartMentions+=1),p!=null&&(h.lastSeen==null||p>h.lastSeen)&&(h.lastSeen=p),c.set(f,h)}}let l=[...c.values()].sort((u,d)=>d.mentions-u.mentions||d.smartMentions-u.smartMentions||u.address.localeCompare(d.address)).slice(0,i).map(u=>({chain:u.chain,address:u.address,mentions:u.mentions,uniqueAccounts:u.accounts.size,smartMentions:u.smartMentions,lastSeen:u.lastSeen==null?null:new Date(u.lastSeen).toISOString()}));return{provider:$n,platform:s,chain:a,count:l.length,rows:l,basis:Gs(n.store,r)}}async function FM(e={},t={}){let n=Ys(t);if(!n.store)return xl(n);let r=Ks(t),o=Al(e.limit,50),i=String(e.q??"").trim().toLowerCase();if(!i)return{provider:$n,q:"",count:0,rows:[],basis:Gs(n.store,r)};let s=i.replace(/^\$/,""),a=n.store.mentions.filter(c=>String(c.text??"").toLowerCase().includes(i)?!0:El(c).some(u=>u.toLowerCase()===s)).sort((c,l)=>(vl(l)??0)-(vl(c)??0)).slice(0,o).map(c=>({id:c.id??null,account:c.account??null,grade:Uw(n.store,c.account),ts:c.ts??null,text:$M(c.text),tickers:El(c),cas:Dw(c),engagement:c.engagement&&typeof c.engagement=="object"?c.engagement:null}));return{provider:$n,q:i,count:a.length,rows:a,basis:Gs(n.store,r)}}async function qM(e={},t={}){let n=Ys(t);if(!n.store)return xl(n);let r=Ks(t),o=Al(e.limit,50),i=Object.entries(n.store.accounts).map(([s,a])=>({handle:s,grade:a?.grade??null,pnlUsd:Number.isFinite(Number(a?.pnlUsd))?Number(a.pnlUsd):0,callHitRate:Number.isFinite(Number(a?.callHitRate))?Number(a.callHitRate):null,lastSeen:a?.lastSeen??null})).sort((s,a)=>a.pnlUsd-s.pnlUsd||s.handle.localeCompare(a.handle)).slice(0,o);return{provider:$n,count:i.length,rows:i,basis:Gs(n.store,r)}}async function jM(e={},t={}){let n=Ys(t);if(!n.store)return xl(n);let r=Ks(t),o=$w(e.timeWindow),i=Al(e.limit,10,50),s=n.store.mentions.filter(m=>Bw(m,r,o)),a=new Map,c=m=>{let f=m;for(;a.get(f)!==f;)f=a.get(f);let h=m;for(;a.get(h)!==h;){let g=a.get(h);a.set(h,f),h=g}return f},l=(m,f)=>{a.has(m)||a.set(m,m),a.has(f)||a.set(f,f);let h=c(m),g=c(f);h!==g&&a.set(g,h)},u=s.map(m=>{let f=[...El(m).map(h=>`ticker:${h}`),...Dw(m).map(h=>`ca:${h.chain}:${h.address}`)];for(let h of f)a.has(h)||a.set(h,h),l(f[0],h);return f}),d=new Map;s.forEach((m,f)=>{let h=u[f];if(!h.length)return;let g=c(h[0]),y=d.get(g)||{tickers:new Map,mentions:0,accounts:new Set,sampleTexts:[]};y.mentions+=1,m.account&&y.accounts.add(m.account);for(let b of El(m))y.tickers.set(b,(y.tickers.get(b)||0)+1);y.sampleTexts.length<3&&m.text&&y.sampleTexts.push($M(m.text,140)),d.set(g,y)});let p=[...d.values()].map(m=>{let f=[...m.tickers.entries()].sort((h,g)=>g[1]-h[1]||h[0].localeCompare(g[0])).map(([h])=>h);return{label:f[0]??"(no ticker)",tickers:f,mentions:m.mentions,uniqueAccounts:m.accounts.size,sampleTexts:m.sampleTexts}}).sort((m,f)=>f.uniqueAccounts-m.uniqueAccounts||f.mentions-m.mentions||m.label.localeCompare(f.label)).slice(0,i);return{provider:$n,timeWindow:String(e.timeWindow??"24h"),count:p.length,rows:p,basis:Gs(n.store,r)}}var $n,vZ,HM=_(()=>{$n="social-intel",vZ=120});function Xs(e){return String(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kl(e){let t=String(e||"").slice(0,WM*2);if(!t)return{tokens:[],chains:[],protocols:[]};let n=PZ.filter(i=>i.re.test(t)).map(i=>i.symbol),r=RZ.filter(i=>i.matchers.some(s=>s.test(t))).map(i=>i.chain),o=LZ.filter(i=>i.re.test(t)).map(i=>i.name);return{tokens:[...new Set(n)],chains:[...new Set(r)],protocols:[...new Set(o)]}}function KM(e){return String(e).replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g,(t,n)=>{if(n[0]==="#"){let o=n[1]==="x"||n[1]==="X",i=Number.parseInt(o?n.slice(2):n.slice(1),o?16:10);if(!Number.isInteger(i)||i<1||i>1114111)return t;try{return String.fromCodePoint(i)}catch{return t}}let r=MZ[n.toLowerCase()];return r===void 0?t:r})}function $Z(e){return String(e).replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g,"$1")}function VM(e){if(e==null)return"";let t=$Z(String(e));return t=t.replace(/<[^>]*>/g," "),t=KM(t),t=t.replace(/<[^>]*>/g," "),t.replace(/\s+/g," ").trim().slice(0,WM)}function Ir(e,t){for(let n of t){let r=new RegExp(`<${Xs(n)}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/${Xs(n)}\\s*>`,"i"),o=e.match(r);if(o&&VM(o[1]))return VM(o[1])}return""}function BZ(e){let t=[...e.matchAll(/<link\b([^>]*)\/?>/gi)].map(s=>s[1]),n=(s,a)=>{let c=s.match(new RegExp(`${a}\\s*=\\s*("([^"]*)"|'([^']*)')`,"i"));return c?KM(c[2]??c[3]??""):""},r=t.find(s=>/rel\s*=\s*("|')alternate\1/i.test(s)),o=t.find(s=>!/rel\s*=\s*/i.test(s)),i=r??o??t.find(s=>!/rel\s*=\s*("|')self\1/i.test(s));return i?n(i,"href").trim():""}function YM(e){let t=String(e||"").trim();if(!t)return null;let n=Date.parse(t);return Number.isFinite(n)?new Date(n).toISOString():null}function DZ(e,t,n,r){let o=t||n||r;return o?`${e}:${String(o).slice(0,200)}`:""}function UZ(e,{source:t="unknown"}={}){let n=typeof e=="string"?e:"";if(!n)return[];let r=[...[...n.matchAll(/<item(?:\s[^>]*)?>([\s\S]*?)<\/item\s*>/gi)].map(i=>({kind:"rss",body:i[1]})),...[...n.matchAll(/<entry(?:\s[^>]*)?>([\s\S]*?)<\/entry\s*>/gi)].map(i=>({kind:"atom",body:i[1]}))].slice(0,IZ),o=[];for(let i of r)try{let s=Ir(i.body,["title"]),a=i.kind==="atom"?BZ(i.body)||Ir(i.body,["id"]):Ir(i.body,["link"])||Ir(i.body,["guid"]);if(!s&&!a)continue;let c=i.kind==="atom"?Ir(i.body,["id"]):Ir(i.body,["guid"]),l=YM(i.kind==="atom"?Ir(i.body,["published","updated"]):Ir(i.body,["pubDate","dc:date"])),u=Ir(i.body,["description","summary","content:encoded","content"]),d=DZ(t,c,a,s);if(!d)continue;o.push({id:d,source:t,title:s,url:a,publishedAt:l,summary:u,entities:kl(`${s} ${u}`)})}catch{}return o}function qZ(e){let t=String(e||"").trim();if(!t)return"";let n;try{n=new URL(t)}catch{return t}if(n.protocol!=="http:"&&n.protocol!=="https:")return t;for(let o of[...n.searchParams.keys()])FZ.test(o)&&n.searchParams.delete(o);n.hash="",n.hostname=n.hostname.toLowerCase();let r=n.toString();return r=r.replace(/\?$/,""),n.pathname!=="/"&&(r=r.replace(/\/(?=$|\?)/,"")),r}function qw(e){let t=new Set,n=[];for(let r of e||[]){if(!r)continue;let o=qZ(r.url);if(!o){n.push(r);continue}t.has(o)||(t.add(o),n.push(r))}return n}function Si(e){return[...e||[]].sort((t,n)=>{let r=t?.publishedAt||"",o=n?.publishedAt||"";return r===o?0:r?o&&r<o?1:-1:1})}function vi(e,t=bf){let n=Array.isArray(e)?e:[],r=Math.max(1,Math.min(Number(t)||bf,bf));return n.length<=r?{items:n,complete:!0,rowsOmitted:0}:{items:n.slice(0,r),complete:!1,rowsOmitted:n.length-r}}function XM(e,t=50){let n=Number(e);return!Number.isFinite(n)||n<=0?t:Math.min(Math.floor(n),bf)}function jZ(e){let t=Cm(e);if(!t.ok)return{ok:!1,error:`news-rss refused ${String(e).slice(0,120)}: ${t.error}`};let n=_Z.get(String(e));return n?{ok:!0,feed:n}:{ok:!1,error:`news-rss refused ${String(e).slice(0,120)}: not on the curated news roster`}}async function HZ(e,t={}){let n=jZ(e);if(!n.ok)throw new Error(n.error);let r=await x(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??kZ,maxResponseBytes:AZ,headers:{Accept:"application/rss+xml, application/atom+xml, application/xml;q=0.9, text/xml;q=0.8"},...t.retries==null?{}:{retries:t.retries}});return typeof r=="string"?r:JSON.stringify(r)}function JM(e={}){let t=e.sources;if(t==null)return{ok:!0,feeds:Il};let n=Array.isArray(t)?t:String(t).split(",").map(o=>o.trim()).filter(Boolean),r=[];for(let o of n){let i=zM.get(String(o));if(!i)return{ok:!1,error:`unknown source '${String(o).slice(0,60)}'. Known sources: ${[...zM.keys()].join(", ")}`};r.push(i)}return{ok:!0,feeds:r.length?r:Il}}async function jw(e,t={}){let n=await Promise.all(e.map(async r=>{try{let o=await HZ(r.url,t),i=UZ(o,{source:r.id});return{source:{id:r.id,name:r.name,url:r.url,status:i.length?"ok":"degraded",items:i.length},items:i}}catch(o){return{source:{id:r.id,name:r.name,url:r.url,status:"unavailable",items:0,error:String(o?.message||o).slice(0,200)},items:[]}}}));return{sources:n.map(r=>r.source),items:n.flatMap(r=>r.items)}}function QM({op:e,sources:t,items:n,limit:r,extra:o={}}){let i=Si(qw(n)),s=vi(i.slice(0,r)),a=t.some(c=>c.status!=="ok");return{ok:!0,provider:"news-rss",op:e,items:s.items,count:s.items.length,complete:s.complete,rowsOmitted:s.rowsOmitted,degraded:a,sources:t,basis:{sample:"curated-official-feeds",feeds:t.length,note:"Curated wire roster, not a full market firehose. Source status is reported per feed."},...o}}async function ZM(e={}){let{sources:t}=await jw(Il,e),n=t.filter(r=>r.status==="ok").length;return{ok:n>0,provider:"news-rss",keyless:!0,feeds:t.length,live:n,sources:t,...n===0?{error:"every curated feed is unavailable"}:{}}}async function _l(e={},t={}){let n=JM(e);if(!n.ok)return{ok:!1,provider:"news-rss",op:"latest",status:"refused",reason:n.error,items:[],sources:[]};let r=XM(e.limit),o=e.sinceIso?YM(e.sinceIso):null;if(e.sinceIso&&!o)return{ok:!1,provider:"news-rss",op:"latest",status:"refused",reason:`sinceIso is not a parseable date: ${String(e.sinceIso).slice(0,60)}`,items:[],sources:[]};let{sources:i,items:s}=await jw(n.feeds,t),a=o?s.filter(c=>c.publishedAt&&c.publishedAt>=o):s;return QM({op:"latest",sources:i,items:a,limit:r,extra:o?{sinceIso:o}:{}})}async function e$(e={},t={}){let n=String(e.q||"").trim();if(!n)return{ok:!1,provider:"news-rss",op:"search",status:"refused",reason:"q is required",items:[],sources:[]};let r=JM(e);if(!r.ok)return{ok:!1,provider:"news-rss",op:"search",status:"refused",reason:r.error,items:[],sources:[]};let o=XM(e.limit),i=n.toLowerCase(),{sources:s,items:a}=await jw(r.feeds,t),c=a.filter(l=>`${l.title} ${l.summary}`.toLowerCase().includes(i));return QM({op:"search",sources:s,items:c,limit:o,extra:{q:n}})}var bf,AZ,IZ,WM,kZ,Il,zM,_Z,OZ,NZ,TZ,CZ,Fw,GM,PZ,RZ,LZ,MZ,FZ,Ol=_(()=>{q();$m();bf=200,AZ=4*1024*1024,IZ=500,WM=4e3,kZ=15e3,Il=Object.freeze([Object.freeze({id:"coindesk",name:"CoinDesk",url:"https://www.coindesk.com/arc/outboundfeeds/rss",kind:"rss"}),Object.freeze({id:"theblock",name:"The Block",url:"https://www.theblock.co/rss.xml",kind:"rss"}),Object.freeze({id:"decrypt",name:"Decrypt",url:"https://decrypt.co/feed",kind:"rss"}),Object.freeze({id:"blockworks",name:"Blockworks",url:"https://blockworks.com/feed",kind:"atom"}),Object.freeze({id:"bankless",name:"Bankless",url:"https://www.bankless.com/rss/feed",kind:"rss"}),Object.freeze({id:"dlnews",name:"DL News",url:"https://www.dlnews.com/arc/outboundfeeds/rss/",kind:"rss"}),Object.freeze({id:"hyperliquid-blog",name:"Hyperliquid blog",url:"https://hyperliquid.medium.com/feed",kind:"rss"})]),zM=new Map(Il.map(e=>[e.id,e])),_Z=new Map(Il.map(e=>[e.url,e])),OZ=Object.freeze(["HYPE","BTC","ETH","SOL","USDC","USDT","DAI","ARB","OP","AVAX","MATIC","BNB","DOGE","XRP","LINK","UNI","AAVE","PEPE","LDO","PENDLE","CRV","MKR","TIA","SUI","APT","TON","TRX","WIF","JUP","ENA"]),NZ=Object.freeze({hyperliquid:["hyperliquid","hyperevm","hypercore"],ethereum:["ethereum","mainnet ethereum"],solana:["solana"],bitcoin:["bitcoin"],base:["base chain","base network","coinbase base"],arbitrum:["arbitrum"],optimism:["optimism"],polygon:["polygon"],avalanche:["avalanche"],bnb:["bnb chain","binance smart chain"],tron:["tron"],ton:["ton network","the open network"],sui:["sui network"],aptos:["aptos"],celestia:["celestia"],monad:["monad"],berachain:["berachain"]}),TZ=Object.freeze({base:["Base"]}),CZ=Object.freeze(["uniswap","aave","curve","lido","eigenlayer","pendle","morpho","gmx","jupiter","jito","makerdao","sky protocol","compound","balancer","chainlink","polymarket","opensea","magic eden","ethena","wormhole","layerzero","across","cowswap","1inch","raydium","orca","kamino","spark","sanctum","symbiotic","babylon","renzo","etherfi"]),Fw=Object.freeze({hyperliquid:"hyperliquid",hyperevm:"hyperliquid",hypercore:"hyperliquid",hype:"hyperliquid",ethereum:"ethereum",eth:"ethereum",mainnet:"ethereum",solana:"solana",sol:"solana",bitcoin:"bitcoin",btc:"bitcoin",base:"base",arbitrum:"arbitrum",arb:"arbitrum",optimism:"optimism",op:"optimism",polygon:"polygon",matic:"polygon",avalanche:"avalanche",avax:"avalanche",bnb:"bnb",bsc:"bnb",tron:"tron",ton:"ton",sui:"sui",aptos:"aptos",celestia:"celestia",monad:"monad",berachain:"berachain"}),GM=Object.freeze({hyperliquid:["HYPE"],ethereum:["ETH"],solana:["SOL"],bitcoin:["BTC"],base:["ETH"],arbitrum:["ARB"],optimism:["OP"],polygon:["MATIC"],avalanche:["AVAX"],bnb:["BNB"],tron:["TRX"],ton:["TON"],sui:["SUI"],aptos:["APT"],celestia:["TIA"],monad:[],berachain:[]});PZ=OZ.map(e=>({symbol:e,re:new RegExp(`(?:^|[^A-Za-z0-9$])\\$?${Xs(e)}(?![A-Za-z0-9])`)})),RZ=Object.entries(NZ).map(([e,t])=>({chain:e,matchers:[...t.map(n=>new RegExp(`(?:^|[^a-z0-9])${Xs(n)}(?![a-z0-9])`,"i")),...(TZ[e]||[]).map(n=>new RegExp(`(?:^|[^A-Za-z0-9])${Xs(n)}(?![A-Za-z0-9])`))]})),LZ=CZ.map(e=>({name:e,re:new RegExp(`(?:^|[^a-z0-9])${Xs(e)}(?![a-z0-9])`,"i")}));MZ=Object.freeze({amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "});FZ=/^(utm_|fbclid$|gclid$|mc_cid$|mc_eid$|ref$|source$|__twitter_impression$)/i});function zw(e){let t=Number(e);return!Number.isFinite(t)||t<=0?KZ:Math.min(Math.floor(t),YZ)}function Xn(e,t){return{ok:!1,provider:"social-farcaster",op:e,status:"unavailable",reason:String(t||"farcaster public API unavailable").slice(0,300),items:[],count:0,complete:!0,rowsOmitted:0}}function XZ(e){let t=Number(e);if(!Number.isFinite(t)||t<=0)return null;let n=new Date(t);return Number.isNaN(n.getTime())?null:n.toISOString()}function JZ(e){if(!e||typeof e!="object")return null;let t=typeof e.hash=="string"?e.hash.trim():"";if(!t)return null;let n=String(e.author?.username||e.author?.fid||"unknown").trim(),r=String(e.text||"").replace(/\s+/g," ").trim();return{id:`farcaster:${t}`,source:"farcaster",title:r,url:`${VZ}/${encodeURIComponent(n)}/${t}`,publishedAt:XZ(e.timestamp),summary:"",entities:kl(r),engagement:{replies:Number(e.replies?.count)||0,reactions:Number(e.reactions?.count)||0,recasts:Number(e.recasts?.count)||0},author:{fid:Number(e.author?.fid)||null,username:n||null}}}async function Nl(e,t={}){return x(`${Hw}${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??WZ,maxResponseBytes:GZ,...t.retries==null?{}:{retries:t.retries}})}function Vw(e,t,n,r={}){let o=(Array.isArray(t)?t:[]).map(JZ).filter(Boolean),i=vi(Si(o).slice(0,n));return{ok:!0,provider:"social-farcaster",op:e,status:"ok",items:i.items,count:i.items.length,complete:i.complete,rowsOmitted:i.rowsOmitted,basis:{sample:"warpcast-public-api",keyless:!0,note:"Unauthenticated public endpoint with an undocumented rate limit. Not a complete Farcaster firehose."},...r}}async function wf(e={}){try{let t=await Nl("/v2/user-by-username?username=dwr.eth",e),n=Number(t?.result?.user?.fid)||null;return{ok:n!=null,provider:"social-farcaster",keyless:!0,base:Hw,probedFid:n}}catch(t){return{ok:!1,provider:"social-farcaster",keyless:!0,base:Hw,error:String(t?.message||t).slice(0,200)}}}async function t$(e={},t={}){let n=String(e.feedId||e.channel||e.channelKey||"").trim();if(!n)return Xn("channel","feedId is required (a Farcaster channel key such as hyperliquid)");if(!/^[a-z0-9][a-z0-9-]{0,63}$/i.test(n))return Xn("channel",`feedId must be a simple channel key: ${n.slice(0,40)}`);let r=zw(e.limit),o=String(e.q||n).trim();try{let i=new URLSearchParams({q:o,limit:String(r),channelKey:n}),s=await Nl(`/v2/search-casts?${i}`,t);return Vw("channel",s?.result?.casts,r,{feedId:n,basis:{sample:"warpcast-channel-scoped-search",keyless:!0,note:"No keyless channel timeline endpoint exists, so this is a channel-scoped search, not the full channel feed."}})}catch(i){return Xn("channel",i?.message||i)}}async function Sf(e={},t={}){let n=String(e.q||"").trim();if(!n)return Xn("search","q is required");let r=zw(e.limit);try{let o=new URLSearchParams({q:n,limit:String(r)}),i=await Nl(`/v2/search-casts?${o}`,t);return Vw("search",i?.result?.casts,r,{q:n})}catch(o){return Xn("search",o?.message||o)}}async function n$(e={},t={}){let n=e.fid==null?"":String(e.fid).trim(),r=String(e.username||"").trim();if(!n&&!r)return Xn("user","fid or username is required");let o=zw(e.limit),i=null;if(n){if(!/^\d{1,12}$/.test(n))return Xn("user",`fid must be a positive integer: ${n.slice(0,20)}`);i=Number(n)}try{if(i==null){if(!/^[a-z0-9][a-z0-9._-]{0,63}$/i.test(r))return Xn("user",`username must be a simple handle: ${r.slice(0,40)}`);let a=await Nl(`/v2/user-by-username?username=${encodeURIComponent(r)}`,t);if(i=Number(a?.result?.user?.fid)||null,i==null)return Xn("user",`no such Farcaster user: ${r.slice(0,40)}`)}let s=await Nl(`/v2/casts?fid=${i}&limit=${o}`,t);return Vw("user",s?.result?.casts,o,{fid:i,...r?{username:r}:{}})}catch(s){return Xn("user",s?.message||s)}}var Hw,VZ,WZ,GZ,KZ,YZ,Ww=_(()=>{q();Ol();Hw="https://api.farcaster.xyz",VZ="https://farcaster.xyz",WZ=15e3,GZ=8*1024*1024,KZ=25,YZ=100});function o$(e={}){let t=e.env&&typeof e.env=="object"?e.env[Kw]:void 0;if(typeof t=="string"&&t.trim())return t.trim();if(e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1)return"";let n=process.env[Kw];return typeof n=="string"&&n.trim()?n.trim():""}function iee(e){return{ok:!1,provider:"social-x-public",op:e,status:"unavailable",configured:!1,reason:Tl,items:[],count:0,complete:!0,rowsOmitted:0}}function Gw(e,t){return{ok:!1,provider:"social-x-public",op:e,status:"unavailable",configured:!0,reason:String(t||"X API unavailable").slice(0,300),items:[],count:0,complete:!0,rowsOmitted:0}}function see(e){let t=Number(e);return!Number.isFinite(t)||t<=0?ree:Math.min(Math.max(Math.floor(t),r$),oee)}function aee(e,t){if(!e||typeof e!="object")return null;let n=String(e.id||"").trim();if(!n)return null;let r=String(t.get(String(e.author_id))||"i").trim()||"i",o=String(e.text||"").replace(/\s+/g," ").trim(),i=e.created_at?Date.parse(e.created_at):NaN;return{id:`x:${n}`,source:"x",title:o,url:`${eee}/${encodeURIComponent(r)}/status/${n}`,publishedAt:Number.isFinite(i)?new Date(i).toISOString():null,summary:"",entities:kl(o),author:{id:e.author_id?String(e.author_id):null,username:r==="i"?null:r}}}async function vf(e={}){if(!o$(e))return{ok:!1,provider:"social-x-public",configured:!1,keyless:!1,reason:Tl};try{let n=await Cl({q:"crypto",limit:r$},e);return{ok:n.ok===!0,provider:"social-x-public",configured:!0,keyless:!1,...n.ok?{}:{error:n.reason}}}catch(n){return{ok:!1,provider:"social-x-public",configured:!0,keyless:!1,error:String(n?.message||n).slice(0,200)}}}async function Cl(e={},t={}){let n=o$(t);if(!n)return iee("search");let r=String(e.q||"").trim();if(!r)return Gw("search","q is required");if(r.length>512)return Gw("search","q exceeds the 512 character X query limit");let o=see(e.limit),i=new URLSearchParams({query:r,max_results:String(o),"tweet.fields":"created_at,author_id,public_metrics",expansions:"author_id","user.fields":"username"});try{let s=await x(`${ZZ}/2/tweets/search/recent?${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??tee,maxResponseBytes:nee,headers:{Authorization:`Bearer ${n}`},...t.retries==null?{}:{retries:t.retries}}),a=new Map((s?.includes?.users||[]).map(u=>[String(u?.id),String(u?.username||"")])),c=(s?.data||[]).map(u=>aee(u,a)).filter(Boolean),l=vi(Si(c).slice(0,o));return{ok:!0,provider:"social-x-public",op:"search",status:"ok",configured:!0,q:r,items:l.items,count:l.items.length,complete:l.complete,rowsOmitted:l.rowsOmitted,basis:{sample:"x-recent-search",keyless:!1,note:"X recent search covers roughly the last seven days on standard access, not full archive."}}}catch(s){let a=String(s?.message||s).replaceAll(n,"[redacted]");return Gw("search",a)}}var Kw,ZZ,eee,Tl,tee,nee,ree,r$,oee,Yw=_(()=>{q();Ol();Kw="ORACLE_X_BEARER_TOKEN",ZZ="https://api.x.com",eee="https://x.com",Tl=`requires X API key, set ${Kw}`,tee=15e3,nee=4*1024*1024,ree=25,r$=10,oee=100});function pee(e){let t=Number(e);return!Number.isFinite(t)||t<=0?lee:Math.min(t,uee)}function fee(e){let t=Number(e);return!Number.isFinite(t)||t<=0?dee:Math.min(Math.floor(t),200)}function mee(e,t){if(!t)return!0;let n=e?.entities||{};if((n.chains||[]).includes(t))return!0;let r=GM[t]||[];return(n.tokens||[]).some(o=>r.includes(o))}function Xw(e,t){if(!t)return{id:e,status:"unavailable",items:0,reason:"no result"};if(t.ok===!1)return{id:e,status:"unavailable",items:0,reason:String(t.reason||t.error||"unavailable").slice(0,300)};let n=Array.isArray(t.items)?t.items.length:0;return{id:e,status:n>0?"ok":"degraded",items:n}}async function i$(e={},t={}){let n=String(e.chain||"").trim().toLowerCase(),r=null;if(n&&(r=Fw[n]||null,!r))return{ok:!1,provider:"news-digest",op:"latest",status:"refused",reason:`unknown chain '${n.slice(0,40)}'. Known: ${[...new Set(Object.values(Fw))].sort().join(", ")}`,items:[],sources:[]};let o=pee(e.hours),i=fee(e.limit),s=e.nowIso?Date.parse(e.nowIso):Date.now();if(!Number.isFinite(s))return{ok:!1,provider:"news-digest",op:"latest",status:"refused",reason:`nowIso is not a parseable date: ${String(e.nowIso).slice(0,60)}`,items:[],sources:[]};let a=new Date(s-o*36e5).toISOString(),c=r||String(e.q||"crypto").trim()||"crypto",[l,u,d]=await Promise.all([_l({sinceIso:a,limit:200},t).catch(v=>({ok:!1,reason:String(v?.message||v)})),Sf({q:c,limit:100},t).catch(v=>({ok:!1,reason:String(v?.message||v)})),Cl({q:c,limit:100},t).catch(v=>({ok:!1,reason:String(v?.message||v)}))]),p=[];if(l?.ok&&Array.isArray(l.sources))for(let v of l.sources)p.push({id:`news-rss:${v.id}`,status:v.status,items:v.items,...v.error?{reason:v.error}:{}});else p.push(Xw("news-rss",l));p.push(Xw("social-farcaster",u)),p.push(Xw("social-x-public",d));let h=[...l?.ok?l.items||[]:[],...u?.ok?u.items||[]:[],...d?.ok?d.items||[]:[]].filter(v=>v?.publishedAt&&v.publishedAt>=a).filter(v=>mee(v,r)),g=Si(qw(h)),y=vi(g.slice(0,i)),b=p.filter(v=>v.status==="unavailable").map(v=>v.id),w=p.filter(v=>v.status==="ok").length,S=p.some(v=>v.status!=="ok");return{ok:w>0,provider:"news-digest",op:"latest",status:w===0?"unavailable":S?"degraded":"ok",chain:r,hours:o,sinceIso:a,asOf:new Date(s).toISOString(),items:y.items,count:y.items.length,complete:y.complete,rowsOmitted:y.rowsOmitted,degraded:S,sources:p,unavailableSources:b,basis:{sample:"curated-wires-plus-public-social",planes:["news-rss","social-farcaster","social-x-public"],note:"Curated roster plus keyless public social. Not a complete firehose. Per-source status is authoritative: an unavailable source means we could not look, not that nothing happened.",...b.includes("social-x-public")?{xNote:Tl}:{}},...w===0?{reason:"every ingestion plane is unavailable"}:{}}}async function s$(e={}){let[t,n,r]=await Promise.all([_l({limit:1},e).catch(i=>({ok:!1,reason:String(i?.message||i)})),wf(e).catch(i=>({ok:!1,error:String(i?.message||i)})),vf(e).catch(i=>({ok:!1,error:String(i?.message||i)}))]),o=[{id:"news-rss",ok:t?.ok===!0,...t?.ok?{}:{error:String(t?.reason||"unavailable").slice(0,200)}},{id:"social-farcaster",ok:n?.ok===!0,...n?.ok?{}:{error:String(n?.error||"unavailable").slice(0,200)}},{id:"social-x-public",ok:r?.ok===!0,configured:r?.configured===!0,...r?.ok?{}:{error:String(r?.reason||r?.error||Tl).slice(0,200)}}];return{ok:o.some(i=>i.ok),provider:"news-digest",planes:o}}var lee,uee,dee,a$=_(()=>{Ol();Ww();Yw();lee=6,uee=720,dee=100});function Pl(e){if(e==null||e==="")return yee;let t=gee.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!kr[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(kr).join(", ")} / bob, rootstock)`);return n}function Jw(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Pl(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||kr[n].url).replace(/\/$/,"")}function c$(e,t="address"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`bob-rootstock: ${t} must be a 0x EVM address`);return n}function Ef(e,t,n={}){return x(`${Jw(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function l$(e={},t={}){let n;try{n=Pl(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=kr[n];try{let o=await Ef(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Jw(n,e),totalBlocks:o?.total_blocks??null,averageBlockTimeMs:o?.average_block_time??null,exec:!1}}catch(o){return{ok:!1,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Jw(n,e),error:String(o?.message||o),exec:!1}}}async function Qw(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let s=Object.keys(kr).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(s.map(async c=>{try{return await Qw({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:kr[c].name,error:String(l?.message||l)}}}))}}let r=Pl(n),o=kr[r],i=await Ef(r,"/api/v2/stats",t);return{provider:"bob-rootstock",chainId:r,chain:o.name,label:o.label,nativeSymbol:o.nativeSymbol,averageBlockTimeMs:i.average_block_time??null,averageBlockTimeSec:i.average_block_time==null?null:Number(i.average_block_time)/1e3,gasPrices:i.gas_prices??null,gasPriceUpdatedAt:i.gas_price_updated_at??null,gasUsedToday:i.gas_used_today??null,coinPrice:i.coin_price??null,coinPriceChangePct:i.coin_price_change_percentage??null,marketCap:i.market_cap??null,tvl:i.tvl??null,totalBlocks:i.total_blocks??null,totalAddresses:i.total_addresses??null,totalTransactions:i.total_transactions??null,transactionsToday:i.transactions_today??null,networkUtilizationPct:i.network_utilization_percentage??null,raw:i}}async function u$(e={},t={}){let n=Pl(e.chainId??e.chain),r=c$(e.address||e.addr,"address"),o=kr[n],i=await Ef(n,`/api/v2/addresses/${encodeURIComponent(r)}`,t);return{provider:"bob-rootstock",chainId:n,chain:o.name,address:r,nativeSymbol:o.nativeSymbol,coinBalanceWei:i.coin_balance==null?null:String(i.coin_balance),coinBalance:i.coin_balance==null?null:Number(i.coin_balance)/1e18,isContract:i.is_contract??null,isVerified:i.is_verified??null,name:i.name??null,blockNumberBalanceUpdatedAt:i.block_number_balance_updated_at??null,raw:i}}async function d$(e={},t={}){let n=Pl(e.chainId??e.chain),r=c$(e.address||e.addr,"address"),o=await Ef(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],s=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:kr[n].name,address:r,count:i.length,tokens:i.slice(0,s).map(a=>({symbol:a.token?.symbol??null,name:a.token?.name??null,address:a.token?.address??a.token?.address_hash??null,type:a.token?.type??null,decimals:a.token?.decimals??null,rawBalance:a.value==null?null:String(a.value),balance:a.value==null||a.token?.decimals==null?null:Number(a.value)/10**Number(a.token.decimals),exchangeRate:a.token?.exchange_rate??null}))}}var kr,gee,yee,p$=_(()=>{q();kr=Object.freeze({60808:{name:"bob",label:"BOB (Build on Bitcoin)",url:"https://explorer.gobob.xyz",nativeSymbol:"ETH"},30:{name:"rootstock",label:"Rootstock (RSK)",url:"https://rootstock.blockscout.com",nativeSymbol:"RBTC"}}),gee=new Map([["bob",60808],["rootstock",30],["rsk",30]]),yee=60808});function Zw(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||wee).replace(/\/$/,"")}function eS(e,t={}){return x(`${Zw(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function f$(e={}){try{let t=await eS("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Zw(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Zw(e),error:String(t?.message||t),exec:!1}}}async function m$(e={},t={}){let n=await eS("/price-stats",t);return{provider:"braiins-insights",btcUsd:n?.price==null?null:Number(n.price),percentChange24h:n?.percent_change_24h??null,timestamp:n?.timestamp??null,raw:n}}async function h$(e={},t={}){let n=await eS("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,s=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),a=Math.min(200,Math.max(1,Number(e.limit||s.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:s.length,pools:s.slice(0,a).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:s.slice(0,a)}}var wee,g$=_(()=>{q();wee="https://insights.braiins.com/api/v1.0"});function b$(e={}){return(e.baseUrl||process.env.COW_API_URL||vee).replace(/\/$/,"")}function Eee(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=y$[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(y$).join(", ")})`);return n}function tS(e,t,n){return`${b$(n)}/${Eee(e)}/api/v1${t}`}function w$(e,t){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error(`cow-protocol: ${t} must be an EVM address`);return n}function S$(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function v$(e={},t={}){return x(tS(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function E$(e={},t={}){let n=w$(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(S$(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await x(`${tS(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],s=e.openOnly===!1?i:i.filter(a=>String(a?.status||"").toLowerCase()==="open");return{owner:n,count:s.length,total:i.length,orders:s}}async function x$(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",w$(e.owner||e.address||e.user,"owner"));let r=await x(`${tS(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,S$(e))}}async function A$(e={}){let t=await x(`${b$(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}var vee,y$,I$=_(()=>{q();vee="https://api.cow.fi",y$=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"})});function nS(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||Aee).replace(/\/$/,"")}function kee(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Rl(e,t={}){return x(`${nS(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:kee(t)})}async function k$(e={}){try{let t=await Rl("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:nS(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:Iee,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:nS(e),error:String(t?.message||t),exec:!1}}}async function _$(e={},t={}){let n=await Rl("/v2/info",t);return{provider:"hiro-stacks",peerVersion:n.peer_version??null,serverVersion:n.server_version??null,networkId:n.network_id??null,burnBlockHeight:n.burn_block_height??null,stableBurnBlockHeight:n.stable_burn_block_height??null,stacksTipHeight:n.stacks_tip_height??null,stacksTip:n.stacks_tip??null,poxConsensus:n.pox_consensus??null,raw:n}}async function O$(e={},t={}){let n=await Rl("/v2/pox",t),r=Number(n.total_liquid_supply_ustx||0),o=Number(n.current_cycle?.stacked_ustx||0);return{provider:"hiro-stacks",contractId:n.contract_id??null,currentCycleId:n.current_cycle?.id??null,currentCycleStackedUstx:n.current_cycle?.stacked_ustx==null?null:String(n.current_cycle.stacked_ustx),currentCycleIsPoX:n.current_cycle?.is_pox_active??null,nextCycleId:n.next_cycle?.id??null,nextCycleStackedUstx:n.next_cycle?.stacked_ustx==null?null:String(n.next_cycle.stacked_ustx),nextCycleMinThresholdUstx:n.next_cycle?.min_threshold_ustx==null?null:String(n.next_cycle.min_threshold_ustx),blocksUntilNextCycle:n.next_cycle?.blocks_until_prepare_phase??null,minAmountUstx:n.min_amount_ustx==null?null:String(n.min_amount_ustx),totalLiquidSupplyUstx:n.total_liquid_supply_ustx==null?null:String(n.total_liquid_supply_ustx),participationPct:r>0?o/r*100:null,rewardCycleLength:n.reward_cycle_length??null,rewardSlots:n.reward_slots??null,currentBurnchainBlockHeight:n.current_burnchain_block_height??null,raw:n}}async function N$(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Rl(`/extended/v2/pox/cycles?limit=${n}&offset=${r}`,t),i=Array.isArray(o?.results)?o.results:[];return{provider:"hiro-stacks",total:o?.total??null,limit:n,offset:r,cycles:i.map(s=>({cycleNumber:s.cycle_number??null,blockHeight:s.block_height??null,totalStackedAmount:s.total_stacked_amount==null?null:String(s.total_stacked_amount),totalWeight:s.total_weight??null,totalSigners:s.total_signers??null}))}}async function T$(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Rl(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}var Aee,Iee,C$=_(()=>{q();Aee="https://api.hiro.so",Iee=20});function P$(e={}){return Me({provider:"tron-public",defaultUrl:oS,hosts:Oee,url:e.baseUrl||process.env.TRON_API_URL||""})}function R$(e={}){let t=e.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return pn(t)}function Tee(e,t){return Ue({Accept:"application/json"},{"TRON-PRO-API-KEY":t},e)}async function Ll(e,t={}){let n=P$(t),r=R$(t),o=Fe(await x(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Tee(n.trusted,r)}),"tron-public response");return ur(o,n.trusted?r:"","tron-public response")}function xf(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 Af(e){return Zi({error:"tron-public request failed"},e)}function iS(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"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}async function L$(e={}){try{let t=P$(e),n=await Ll("/wallet/getnowblock",e),r=Number(n?.block_header?.raw_data?.number??0);return{ok:Number.isFinite(r)&&r>0,provider:"tron-public",baseUrl:t.baseUrl,blockHeight:Number.isFinite(r)&&r>0?r:null,blockId:n?.blockID??null,keyed:t.trusted&&!!R$(e),exec:!1}}catch{return{ok:!1,provider:"tron-public",error:"tron-public request failed",exec:!1}}}async function M$(e={},t={}){try{let n=xf(e.address||e.account,"address"),r=await Ll(`/v1/accounts/${n}`,t),o=Array.isArray(r?.data)?r.data[0]:null;if(!o)return{provider:"tron-public",address:n,found:!1,balanceSun:"0",trx:"0",note:"address not seen on chain (never funded)"};let i=String(o.balance??0);return{provider:"tron-public",address:n,found:!0,balanceSun:i,trx:iS(i,Nee),createTime:o.create_time??null,latestOpTime:o.latest_opration_time??null,accountResource:o.account_resource??null,freeNetUsed:o.free_net_usage??null,freeNetLimit:o.free_net_limit??null,trc20Count:Array.isArray(o.trc20)?o.trc20.length:0}}catch(n){return Af(n)}}async function $$(e={},t={}){try{let n=xf(e.address||e.owner,"address"),r=await Ll(`/v1/accounts/${n}`,t),o=Array.isArray(r?.data)?r.data[0]:null,i=Array.isArray(o?.trc20)?o.trc20:[],s=[];for(let c of i)if(!(!c||typeof c!="object"))for(let[l,u]of Object.entries(c)){let d=l===rS;s.push({contract:l,raw:String(u??"0"),symbol:d?"USDT":null,decimals:d?6:null,amount:d?iS(u,6):null})}let a=e.contract?String(e.contract).trim():"";return a&&(s=s.filter(c=>c.contract===a)),{provider:"tron-public",address:n,count:s.length,usdtContract:rS,tokens:s}}catch(n){return Af(n)}}async function If(e={},t={}){try{let n=xf(e.address||e.account,"address"),r=Math.min(200,Math.max(1,Math.trunc(Number(e.limit||20)))),o=Math.min(200,r+1),i=new URLSearchParams({limit:String(o)}),s=e.contract===void 0?rS:e.contract;s&&String(s).toLowerCase()!=="all"&&i.set("contract_address",xf(s,"contract")),e.onlyConfirmed!==!1&&i.set("only_confirmed","true"),e.minTimestamp&&i.set("min_timestamp",String(Number(e.minTimestamp))),e.maxTimestamp&&i.set("max_timestamp",String(Number(e.maxTimestamp)));let a=await Ll(`/v1/accounts/${n}/transactions/trc20?${i.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),l=c.slice(0,r);return{provider:"tron-public",address:n,contract:s&&String(s).toLowerCase()!=="all"?String(s):null,limit:r,count:l.length,truncated:c.length>r||!!a.meta?.links?.next,pageComplete:c.length<o&&!a.meta?.links?.next,transfers:l.map(u=>({txId:u.transaction_id??null,from:u.from??null,to:u.to??null,direction:u.from===n?"out":u.to===n?"in":null,raw:u.value==null?null:String(u.value),amount:u.value==null?null:iS(u.value,u.token_info?.decimals),symbol:u.token_info?.symbol??null,decimals:u.token_info?.decimals??null,tokenAddress:u.token_info?.address??null,blockTimestamp:u.block_timestamp??null,type:u.type??null}))}}catch(n){return Af(n)}}async function B$(e={},t={}){try{let n=await Ll("/wallet/getchainparameters",t),r=Array.isArray(n?.chainParameter)?n.chainParameter:[],o={};for(let s of r)s&&typeof s.key=="string"&&(o[s.key]=s.value??null);let i=e.key?String(e.key):"";return{provider:"tron-public",count:r.length,energyFee:o.getEnergyFee??null,transactionFee:o.getTransactionFee??null,createAccountFee:o.getCreateAccountFee??null,...i?{key:i,value:o[i]??null}:{},params:o}}catch(n){return Af(n)}}var oS,Oee,rS,Nee,sS=_(()=>{q();mn();vt();oS="https://api.trongrid.io",Oee=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],rS="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",Nee=6});function D$(e={}){return Me({provider:"ton-public",defaultUrl:lS,hosts:Pee,url:e.baseUrl||process.env.TON_API_URL||""})}function U$(e={}){let t=e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return pn(t)}function Lee(e,t){return Ue({Accept:"application/json"},{"X-API-Key":t},e)}async function kf(e,t={}){let n=D$(t),r=U$(t),o=Fe(await x(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:Lee(n.trusted,r)}),"ton-public response");return ur(o,n.trusted?r:"","ton-public response")}function uS(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 dS(e){return Zi({error:"ton-public request failed"},e)}function F$(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"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function pS(e,t){if(!qt(e))throw new Error(`ton-public: ${t} returned an invalid response envelope`);if(Nt(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 Nt(e,"result")}async function q$(e={}){try{let t=D$(e),n=pS(await kf("/v2/getMasterchainInfo",e),"getMasterchainInfo"),r=Number(n?.last?.seqno??0);return{ok:Number.isFinite(r)&&r>0,provider:"ton-public",baseUrl:t.baseUrl,masterchainSeqno:Number.isFinite(r)&&r>0?r:null,workchain:n?.last?.workchain??null,keyed:t.trusted&&!!U$(e),exec:!1}}catch{return{ok:!1,provider:"ton-public",error:"ton-public request failed",exec:!1}}}async function j$(e={},t={}){try{let n=uS(e.address||e.account,"address"),r=pS(await kf(`/v2/getAddressInformation?address=${encodeURIComponent(n)}`,t),"getAddressInformation"),o=String(r?.balance??"0");return{provider:"ton-public",address:n,state:r?.state??null,balanceNano:o,ton:F$(o,Ree),hasCode:!!r?.code,lastTransactionLt:r?.last_transaction_id?.lt??null,lastTransactionHash:r?.last_transaction_id?.hash??null,blockSeqno:r?.block_id?.seqno??null}}catch(n){return dS(n)}}async function H$(e={},t={}){try{let n=uS(e.owner||e.address,"owner"),r=Math.min(200,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({owner_address:n,limit:String(r)});e.jettonMaster&&o.set("jetton_address",String(e.jettonMaster).trim());let i=await kf(`/v3/jetton/wallets?${o.toString()}`,t),s=Array.isArray(i?.jetton_wallets)?i.jetton_wallets:[],a=i?.metadata&&typeof i.metadata=="object"?i.metadata:{};return{provider:"ton-public",owner:n,limit:r,count:s.length,jettons:s.map(c=>{let l=c.jetton??null,u=l&&a[l]?.token_info?.[0]||null,d=u?.extra?.decimals!=null?Number(u.extra.decimals):null;return{walletAddress:c.address??null,jettonMaster:l,raw:String(c.balance??"0"),symbol:u?.symbol??null,name:u?.name??null,decimals:d,amount:d==null?null:F$(c.balance,d),lastTransactionLt:c.last_transaction_lt??null}})}}catch(n){return dS(n)}}function aS(e){let t=String(e??"").trim();if(to(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||no(n))throw new Error("ton-public: transaction hash is invalid");return n.toString("base64")}function cS(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 _f(e={},t={}){try{let n=uS(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 i=o?{lt:String(e.lt),hash:aS(e.hash)}:null;if(i&&!/^\d+$/u.test(i.lt))throw new Error("ton-public: transaction cursor lt is invalid");let s=i?Math.min(100,r+1):r,a=new URLSearchParams({address:n,limit:String(s)});i&&(a.set("lt",i.lt),a.set("hash",i.hash));let c=pS(await kf(`/v2/getTransactions?${a.toString()}`,t),"getTransactions");if(!Array.isArray(c))throw new Error("ton-public: getTransactions returned an invalid response");let l=c.slice(0,s);if(i){let h=l[0]?.transaction_id,g=h?.hash==null?null:aS(h.hash);if(String(h?.lt??"")!==i.lt||g!==i.hash)throw new Error("ton-public: cursor boundary was not returned exactly");l.shift()}let d=l.slice(0,r).map(h=>{if(!h||typeof h!="object"||!h.transaction_id||typeof h.transaction_id!="object")throw new Error("ton-public: malformed transaction row");let g=aS(h.transaction_id.hash),y=String(h.transaction_id.lt??"");if(y.length>100||!/^\d+$/u.test(y))throw new Error("ton-public: malformed transaction logical time");if(h.in_msg!=null&&(typeof h.in_msg!="object"||Array.isArray(h.in_msg)))throw new Error("ton-public: malformed inbound message");if(h.out_msgs!=null&&!Array.isArray(h.out_msgs))throw new Error("ton-public: malformed outbound messages");let b=Array.isArray(h.out_msgs),w=h.out_msgs??[];if(w.length>256)throw new Error("ton-public: outbound message count exceeds the bound");let S=0n;for(let I of w){if(!I||typeof I!="object"||Array.isArray(I))throw new Error("ton-public: malformed outbound message");S+=BigInt(cS(I.value??"0","outbound message value",{nullable:!1}))}let v=b?String(S):null;if(v!=null&&v.length>100)throw new Error("ton-public: outbound amount exceeds the bound");return{hash:g,lt:y,utime:h.utime??null,feeNano:cS(h.fee,"transaction fee"),inMessageValueNano:cS(h.in_msg?.value,"inbound message value"),inMessageSource:h.in_msg?.source||null,inMessageDestination:h.in_msg?.destination||null,outMessageCount:w.length,outMessageValueNano:v}}),p=c.length>=s,m=d.length>0?d[d.length-1]:null,f=p&&m?{lt:m.lt,hash:m.hash}:null;return{provider:"ton-public",address:n,limit:r,count:d.length,cursor:i,nextCursor:f,pageComplete:!p,continuationUnknown:p&&!f,transactions:d}}catch(n){return dS(n)}}var lS,Pee,Ree,fS=_(()=>{q();mn();vt();ro();lS="https://toncenter.com/api",Pee=["toncenter.com","testnet.toncenter.com"],Ree=9});function $ee(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function Of(e={},t={}){let n=(c,l)=>c!=null&&Object.hasOwn(Object(c),l)?c[l]:void 0,r=String(n(e,"chain")||n(t,"chain")||process.env.COSMOS_CHAIN||mS).trim().toLowerCase(),o=Object.hasOwn(Bn,r)?Bn[r]:null,i=String(n(t,"baseUrl")||n(e,"lcdUrl")||n(t,"lcdUrl")||"").trim(),s=$ee(r)||r===mS&&process.env.COSMOS_LCD_URL||"",a=(i||s||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(Bn).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 Ei(e,t,n={}){return Fe(await x(`${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 z$(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 gS(e){return{error:String(e?.message||e).slice(0,200)}}function hS(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"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function V$(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function Bee(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:V$(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o&&r!=null?hS(r,t.decimals):null}}async function W$(e={}){let t=null;try{t=Of(e.args||{},e);let n=await Ei(t,"/cosmos/base/tendermint/v1beta1/blocks/latest",e),r=Number(n?.block?.header?.height??0);return{ok:Number.isFinite(r)&&r>0,provider:"cosmos-lcd",chain:t.chain,lcd:t.lcd,chainId:n?.block?.header?.chain_id??null,height:Number.isFinite(r)&&r>0?String(r):null,blockTime:n?.block?.header?.time??null,exec:!1}}catch(n){return{ok:!1,provider:"cosmos-lcd",chain:t?.chain??null,error:String(n?.message||n).slice(0,160),exec:!1}}}async function G$(e={},t={}){return{provider:"cosmos-lcd",default:mS,count:Object.keys(Bn).length,chains:Object.entries(Bn).map(([n,r])=>({chain:n,lcd:r.lcd,nativeDenom:r.denom,symbol:r.symbol,decimals:r.decimals,prefix:r.prefix,envOverride:`COSMOS_LCD_URL_${n.toUpperCase()}`}))}}async function Nf(e={},t={}){try{let n=Of(e,t),r=z$(e.address||e.account,"address"),o=Math.min(500,Math.max(1,Math.trunc(Number(e.limit||100)))),i=Math.min(501,o+1),s=await Ei(n,`/cosmos/bank/v1beta1/balances/${r}?pagination.limit=${i}`,t);if(!s||typeof s!="object"||Array.isArray(s)||!Array.isArray(s.balances))throw new Error("cosmos-lcd: balances returned an invalid response");let a=s.balances.slice(0,o+1),l=a.slice(0,o).map(d=>Bee(d,n)),u=l.find(d=>d.native)||null;return{provider:"cosmos-lcd",chain:n.chain,lcd:n.lcd,address:r,count:l.length,truncated:a.length>o||!!s.pagination?.next_key,nativeDenom:n.nativeDenom,nativeAmount:u?.amount??"0",native:u?.display??null,ibcDenomCount:l.filter(d=>d.ibcHash).length,balances:l,nextKey:s?.pagination?.next_key??null}}catch(n){return gS(n)}}async function K$(e={},t={}){try{let n=Of(e,t),r=z$(e.address||e.delegator,"address"),[o,i,s]=await Promise.all([Ei(n,`/cosmos/staking/v1beta1/delegations/${r}`,t),Ei(n,`/cosmos/staking/v1beta1/delegators/${r}/unbonding_delegations`,t).catch(()=>null),e.includeRewards===!1?Promise.resolve(null):Ei(n,`/cosmos/distribution/v1beta1/delegators/${r}/rewards`,t).catch(()=>null)]),a=Array.isArray(o?.delegation_responses)?o.delegation_responses:[],c=0n;for(let u of a){let d=String(u?.balance?.amount??"0");/^\d+$/.test(d)&&(c+=BigInt(d))}let l=Array.isArray(i?.unbonding_responses)?i.unbonding_responses:[];return{provider:"cosmos-lcd",chain:n.chain,address:r,count:a.length,nativeDenom:n.nativeDenom,totalStaked:c.toString(),totalStakedDisplay:hS(c.toString(),n.decimals),delegations:a.map(u=>({validator:u?.delegation?.validator_address??null,shares:u?.delegation?.shares??null,denom:u?.balance?.denom??null,amount:String(u?.balance?.amount??"0"),display:hS(u?.balance?.amount,n.decimals)})),unbonding:l.map(u=>({validator:u?.validator_address??null,entries:(Array.isArray(u?.entries)?u.entries:[]).map(d=>({balance:String(d?.balance??"0"),completionTime:d?.completion_time??null}))})),rewards:s==null?null:{total:(Array.isArray(s?.total)?s.total:[]).map(u=>({denom:u?.denom??null,amount:String(u?.amount??"0")})),byValidator:(Array.isArray(s?.rewards)?s.rewards:[]).map(u=>({validator:u?.validator_address??null,reward:(Array.isArray(u?.reward)?u.reward:[]).map(d=>({denom:d?.denom??null,amount:String(d?.amount??"0")}))}))}}}catch(n){return gS(n)}}async function Y$(e={},t={}){try{let n=Of(e,t),r=String(e.hash||e.denom||"").trim();if(r){let a=V$(r)||(/^[0-9A-Fa-f]{64}$/.test(r)?r.toUpperCase():null);if(!a)throw new Error("cosmos-lcd: hash must be an ibc/<64-hex> denom or a bare 64-hex hash");let l=(await Ei(n,`/ibc/apps/transfer/v1/denom_traces/${a}`,t))?.denom_trace||null;return{provider:"cosmos-lcd",chain:n.chain,hash:a,denom:`ibc/${a}`,path:l?.path??null,baseDenom:l?.base_denom??null,resolved:!!l?.base_denom}}let o=Math.min(500,Math.max(1,Number(e.limit||100))),i=await Ei(n,`/ibc/apps/transfer/v1/denom_traces?pagination.limit=${o}`,t),s=Array.isArray(i?.denom_traces)?i.denom_traces:[];return{provider:"cosmos-lcd",chain:n.chain,limit:o,count:s.length,traces:s.map(a=>({path:a?.path??null,baseDenom:a?.base_denom??null})),nextKey:i?.pagination?.next_key??null}}catch(n){return gS(n)}}var Bn,mS,yS=_(()=>{q();mn();Bn=Object.freeze({cosmoshub:Object.freeze({lcd:"https://cosmos-rest.publicnode.com",denom:"uatom",symbol:"ATOM",decimals:6,prefix:"cosmos"}),osmosis:Object.freeze({lcd:"https://osmosis-rest.publicnode.com",denom:"uosmo",symbol:"OSMO",decimals:6,prefix:"osmo"}),celestia:Object.freeze({lcd:"https://celestia-rest.publicnode.com",denom:"utia",symbol:"TIA",decimals:6,prefix:"celestia"}),injective:Object.freeze({lcd:"https://injective-rest.publicnode.com",denom:"inj",symbol:"INJ",decimals:18,prefix:"inj"}),neutron:Object.freeze({lcd:"https://rest.cosmos.directory/neutron",denom:"untrn",symbol:"NTRN",decimals:6,prefix:"neutron"}),dydx:Object.freeze({lcd:"https://dydx-rest.publicnode.com",denom:"adydx",symbol:"DYDX",decimals:18,prefix:"dydx"}),noble:Object.freeze({lcd:"https://rest.cosmos.directory/noble",denom:"uusdc",symbol:"USDC",decimals:6,prefix:"noble"}),kava:Object.freeze({lcd:"https://kava-rest.publicnode.com",denom:"ukava",symbol:"KAVA",decimals:6,prefix:"kava"})}),mS="cosmoshub"});function J$(e={}){return String(e.rpcUrl||e.baseUrl||process.env.SUI_RPC_URL||Uee).trim().replace(/\/$/,"")}function bS(e){return{error:String(e?.message||e).slice(0,200)}}function X$(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"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function Q$(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`sui-public: ${t} must be a 0x-prefixed Sui address`);return`0x${n.slice(2).padStart(64,"0")}`}async function Ml(e,t=[],n={}){let r=String(e||"");if(!r)throw new Error("sui-public: method required");if(Fee.test(r))throw new Error(`sui-public: ${r} refused \u2014 this provider is read-only (no sign, no submit, no dry-run)`);let o=await x(J$(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:r,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,headers:{Accept:"application/json"}});if(o?.error)throw new Error(`sui-public ${r}: ${String(o.error.message||JSON.stringify(o.error)).slice(0,140)}`);return o?.result}async function Z$(e={}){try{let t=await Ml("sui_getLatestCheckpointSequenceNumber",[],e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"sui-public",rpcUrl:J$(e),checkpoint:t==null?null:String(t),exec:!1}}catch(t){return{ok:!1,provider:"sui-public",error:String(t?.message||t).slice(0,160),exec:!1}}}async function eB(e={},t={}){try{let n=Q$(e.owner||e.address,"owner");if(e.coinType){let a=String(e.coinType).trim(),c=await Ml("suix_getBalance",[n,a],t),l=String(c?.totalBalance??"0"),u=a===Cf;return{provider:"sui-public",owner:n,count:1,balances:[{coinType:a,totalBalance:l,coinObjectCount:c?.coinObjectCount??null,decimals:u?Tf:null,symbol:u?"SUI":null,amount:u?X$(l,Tf):null}]}}let r=await Ml("suix_getAllBalances",[n],t),i=(Array.isArray(r)?r:[]).map(a=>{let c=a?.coinType??null,l=String(a?.totalBalance??"0"),u=c===Cf;return{coinType:c,totalBalance:l,coinObjectCount:a?.coinObjectCount??null,decimals:u?Tf:null,symbol:u?"SUI":null,amount:u?X$(l,Tf):null}}),s=i.find(a=>a.coinType===Cf)||null;return{provider:"sui-public",owner:n,count:i.length,suiBalance:s?.totalBalance??"0",sui:s?.amount??"0",balances:i}}catch(n){return bS(n)}}async function tB(e={},t={}){try{let n=Q$(e.owner||e.address,"owner"),r=Math.min(50,Math.max(1,Number(e.limit||25))),o={options:{showType:!0,showOwner:!0,showDisplay:!0,showContent:!1}};e.structType&&(o.filter={StructType:String(e.structType)});let i=[n,o,e.cursor??null,r],s=await Ml("suix_getOwnedObjects",i,t),a=Array.isArray(s?.data)?s.data:[];return{provider:"sui-public",owner:n,limit:r,count:a.length,hasNextPage:!!s?.hasNextPage,nextCursor:s?.nextCursor??null,objects:a.map(c=>{let l=c?.data||{},u=l.display?.data||null;return{objectId:l.objectId??null,version:l.version==null?null:String(l.version),digest:l.digest??null,type:l.type??null,owner:l.owner??null,name:u?.name??null,description:u?.description??null,imageUrl:u?.image_url??null}})}}catch(n){return bS(n)}}async function nB(e={},t={}){try{let n=String(e.coinType||Cf).trim();if(!n)throw new Error("sui-public: coinType required");let r=await Ml("suix_getCoinMetadata",[n],t);return r?{provider:"sui-public",coinType:n,found:!0,decimals:r.decimals??null,symbol:r.symbol??null,name:r.name??null,description:r.description??null,iconUrl:r.iconUrl??null,id:r.id??null}:{provider:"sui-public",coinType:n,found:!1,note:"no registered CoinMetadata for this type"}}catch(n){return bS(n)}}var Uee,Cf,Tf,Fee,rB=_(()=>{q();Uee="https://fullnode.mainnet.sui.io:443",Cf="0x2::sui::SUI",Tf=9,Fee=/execute|sign|broadcast|submit|dryRun|dry_run|devInspect|faucet/i});function vS(e={}){return Me({provider:"aptos-public",defaultUrl:SS,hosts:["fullnode.mainnet.aptoslabs.com"],url:e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||""})}function iB(e={}){let t=e.apiKey||process.env.APTOS_API_KEY||"";return pn(t)}function sB(e,t){return Ue({Accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},e)}async function Js(e,t={}){let n=vS(t),r=iB(t),o=Fe(await x(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:sB(n.trusted,r)}),"aptos-public response");return ur(o,n.trusted?r:"","aptos-public response")}function ES(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 xS(e){return Zi({error:"aptos-public request failed"},e)}function oB(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"),i=o.slice(0,o.length-n),s=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return s?`${i}.${s}`:i}function aB(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function cB(e={}){try{let t=await Js("/v1",e),n=Number(t?.ledger_version??0);return{ok:Number.isFinite(n)&&n>0,provider:"aptos-public",baseUrl:vS(e).baseUrl,chainId:t?.chain_id??null,ledgerVersion:t?.ledger_version==null?null:String(t.ledger_version),blockHeight:t?.block_height==null?null:String(t.block_height),nodeRole:t?.node_role??null,exec:!1}}catch{return{ok:!1,provider:"aptos-public",error:"aptos-public request failed",exec:!1}}}async function lB(e={},t={}){try{let n=ES(e.address||e.account,"address"),r=await Js(`/v1/accounts/${n}`,t);return{provider:"aptos-public",address:n,sequenceNumber:r?.sequence_number==null?null:String(r.sequence_number),authenticationKey:r?.authentication_key??null}}catch(n){return xS(n)}}async function uB(e={},t={}){try{let n=ES(e.address||e.account,"address"),r=e.resourceType?String(e.resourceType).trim():"";if(r){let c=await Js(`/v1/accounts/${n}/resource/${encodeURIComponent(r)}`,t);return{provider:"aptos-public",address:n,count:c?1:0,resources:c?[{type:c.type??r,data:c.data??null}]:[]}}let o=Math.min(200,Math.max(1,Number(e.limit||100))),i=new URLSearchParams({limit:String(o)});e.start&&i.set("start",String(e.start)),e.ledgerVersion&&i.set("ledger_version",String(e.ledgerVersion));let s=await Js(`/v1/accounts/${n}/resources?${i.toString()}`,t),a=Array.isArray(s)?s:[];return{provider:"aptos-public",address:n,limit:o,count:a.length,coinStoreCount:a.filter(c=>aB(c?.type)).length,resources:a.map(c=>({type:c?.type??null,data:c?.data??null}))}}catch(n){return xS(n)}}async function Rf(e={},t={}){try{let n=ES(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 d=null,p="view";try{let f=vS(t),h=iB(t),g=ur(Fe(await x(`${f.baseUrl}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:!0,headers:sB(f.trusted,h)}),"aptos-public view response"),f.trusted?h:"","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");d=String(g[0])}catch{p="coinstore";let f=await Js(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);if(!/^\d+$/u.test(String(f?.data?.coin?.value??"")))throw new Error("aptos-public: coin store returned an invalid response");d=String(f.data.coin.value)}let m=r===wS;return{provider:"aptos-public",address:n,source:p,count:1,balances:[{coinType:r,raw:d??"0",decimals:m?Pf:null,symbol:m?"APT":null,amount:m?oB(d??"0",Pf):null}]}}let i=Math.min(201,o+1),s=await Js(`/v1/accounts/${n}/resources?limit=${i}`,t);if(!Array.isArray(s))throw new Error("aptos-public: account resources returned an invalid response");let a=s.slice(0,i),c=[];for(let d of a){if(!d||typeof d!="object"||Array.isArray(d)||typeof d.type!="string"||d.type.length===0||d.type.length>512||!d.data||typeof d.data!="object"||Array.isArray(d.data))throw new Error("aptos-public: account resources contained a malformed row");let p=aB(d.type);if(!p)continue;let m=String(d.data?.coin?.value??"");if(!/^\d+$/u.test(m))throw new Error("aptos-public: coin store contained an invalid balance");let f=p===wS;c.push({coinType:p,raw:m,decimals:f?Pf:null,symbol:f?"APT":null,amount:f?oB(m,Pf):null,frozen:d?.data?.frozen??null})}let l=c.slice(0,o),u=l.find(d=>d.coinType===wS)||null;return{provider:"aptos-public",address:n,source:"coinstore",count:l.length,truncated:s.length>o||c.length>o,aptRaw:u?.raw??"0",apt:u?.amount??"0",balances:l}}catch(n){return xS(n)}}var SS,wS,Pf,AS=_(()=>{q();mn();vt();SS="https://fullnode.mainnet.aptoslabs.com",wS="0x1::aptos_coin::AptosCoin",Pf=8});function _r(e={}){let t=String(e.network||process.env.CANTON_NETWORK||"mainnet").trim().toLowerCase();return t==="devnet"||t==="dev"?"devnet":t==="testnet"||t==="test"?"testnet":"mainnet"}function Kee(e={}){let t=_r(e);return t==="devnet"?zee:t==="testnet"?Vee:Hee}function IS(e={}){return Me({provider:"canton-scan",defaultUrl:Kee(e),hosts:Wee,url:e.baseUrl||process.env.CANTON_SCAN_URL||""})}function Ao(e){let t=Number(e?.status);return{error:String(e?.message||e).slice(0,200),...Number.isFinite(t)?{httpStatus:t}:{}}}function $l(e,t={}){return{available:!1,evidence:"UNAVAILABLE",reason:e,...t}}function pB(e,t="party"){let n=String(e??"").trim();if(!Gee.test(n))throw new Error(`canton-scan: ${t} must look like a Canton party (name::fingerprint), not an 0x address`);return n}function fB(){return{provider:"canton-scan",execution:"read-only",evidence:"STATIC",network:"canton",native:{symbol:"CC",name:"Canton Coin",ledgerName:"Amulet",standard:"CIP-0056"},notEvm:!0,capabilities:{read:["guide","health","dso","party","holdings","rounds"],quote:!1,prepare:!1,sign:!1,broadcast:!1},summary:"Canton Network is a public privacy L1 for regulated markets. It is not an EVM chain. Oracle can read Canton Coin (CC) facts from Scan and explain how to get started. It cannot quote, prepare, or sign Canton txs.",model:{ledger:"eUTXO (create/archive Daml contracts)",identity:"parties (name::fingerprint), not 0x addresses",contracts:"Daml templates, not Solidity",fees:"traffic, paid in Canton Coin",privacy:"sub-transaction views; Scan sees CC + DSO, not private app contracts",consensus:"validators store only hosted parties; Global Synchronizer orders encrypted messages"},steps:[{n:1,title:"Do not treat Canton as Ethereum",body:"There is no MetaMask RPC, no chainId, no ERC-20, and no Uniswap router. Wallets connect to the validator that hosts your party. Read the Ethereum-developer mapping before copying EVM habits.",href:xi.ethereumDevs},{n:2,title:"Learn the privacy model in five minutes",body:"Data goes only to entitled parties. The Global Synchronizer orders transactions but never sees plaintext. That is why a public RPC cannot answer 'show me every balance'.",href:xi.fiveMin},{n:3,title:"Understand Canton Coin",body:"CC (ledger name Amulet) pays traffic fees, validator activity rewards, and Super Validator governance stake. Fees are burned. Holdings are CIP-0056 token-standard contracts, not ERC-20.",href:xi.cantonCoin},{n:4,title:"Pick a Canton wallet, not MetaMask",body:"Use a Canton wallet / Wallet Gateway that speaks CIP-0103. External parties hold keys off the validator; local parties let the validator sign. Oracle never holds those keys.",href:xi.wallets},{n:5,title:"Get on a network",body:"LocalNet is free with the Daml SDK. DevNet/TestNet need faucet CC. MainNet CC has value and validator join currently needs sponsorship via the Canton Foundation.",href:xi.validators},{n:6,title:"What Oracle will do from here",body:"Read Scan health, DSO id, ANS names, CC holdings, and mining-round context. If Scan is unreachable, Oracle reports UNAVAILABLE \u2014 never a fake zero. Ask a Canton wallet to transfer. Do not ask Oracle to prepare a swap.",href:xi.docs}],links:xi,failClosed:["quote","prepareUnsignedTx","swap","bridge","sign","broadcast"]}}async function Lf(e,t={}){let n=IS(t);return x(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:t.retries??2})}async function mB(e,t,n={}){let r=IS(n);return x(`${r.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,retries:n.retries??0})}async function hB(e={}){let t=IS(e),n=_r(e);try{let r=await Lf("/version",e);return{ok:!0,provider:"canton-scan",network:n,baseUrl:t.baseUrl,version:r?.version??null,commitTs:r?.commit_ts??null,exec:!1,signing:"none",note:"Scan health only. Private Daml apps are not visible here."}}catch(r){let o=Number(r?.status);return{ok:!1,provider:"canton-scan",network:n,baseUrl:t.baseUrl,error:String(r?.message||r).slice(0,160),...Number.isFinite(o)?{httpStatus:o}:{},exec:!1,signing:"none",evidence:"UNAVAILABLE",note:o===403?"Documented Scan host refused this client (HTTP 403). Override CANTON_SCAN_URL if you have a reachable Scan.":"Scan did not answer. Guide ops still work offline."}}}async function gB(e={}){try{let t=await Lf("/v0/dso-party-id",e),n=String(t?.dso_party_id||"").trim();return n?{provider:"canton-scan",network:_r(e),available:!0,evidence:"LIVE",dsoPartyId:n,exec:!1}:$l("Scan returned no dso_party_id",{provider:"canton-scan"})}catch(t){return{provider:"canton-scan",...$l(Ao(t).error,Ao(t)),exec:!1}}}async function yB(e={},t={}){try{let n=String(e.party||e.partyId||e.name||e.query||"").trim();if(!n)throw new Error("canton-scan: party or ANS name required");let r=!n.includes("::"),o=r?`/v0/ans-entries/by-name/${encodeURIComponent(n)}`:`/v0/ans-entries/by-party/${encodeURIComponent(pB(n))}`,i=await Lf(o,t),s=i?.entry||i;return{provider:"canton-scan",network:_r(t),available:!0,evidence:"LIVE",query:n,lookup:r?"name":"party",found:!!(s&&(s.name||s.party||s.user)),entry:s||null,exec:!1}}catch(n){return Number(n?.status)===404?{provider:"canton-scan",network:_r(t),available:!0,evidence:"LIVE",found:!1,entry:null,exec:!1}:{provider:"canton-scan",...$l(Ao(n).error,Ao(n)),found:!1,exec:!1}}}async function Yee(e={}){let t=e.migrationId??e.migration_id??process.env.CANTON_MIGRATION_ID;if(t!=null&&String(t).trim()!==""){let o=Number(t);if(!Number.isInteger(o)||o<0)throw new Error("canton-scan: migrationId must be a non-negative integer");return o}let n=await Lf("/v0/migrations/last",e),r=Number(n?.migration_id);if(!Number.isInteger(r)||r<0)throw new Error("canton-scan: Scan returned no migration_id");return r}async function bB(e={},t={}){try{let n=pB(e.party||e.partyId||e.owner,"party"),r=await Yee({...t,...e}),o=String(e.recordTime||e.record_time||new Date().toISOString()),i=await mB("/v1/holdings/summary",{migration_id:r,record_time:o,record_time_match:"at_or_before",owner_party_ids:[n]},t),s=Array.isArray(i?.summaries)?i.summaries:[],a=s.find(c=>c?.party_id===n)||s[0]||null;return{provider:"canton-scan",network:_r(t),available:!0,evidence:"LIVE",party:n,migrationId:r,recordTime:i?.record_time||o,summary:a,totalAvailableCoin:a?.total_available_coin??a?.total_coin_holdings??null,totalCoinHoldings:a?.total_coin_holdings??null,totalLockedCoin:a?.total_locked_coin??null,note:"CC holdings as seen by Scan (Amulet). Private application contracts are not included. total_available_coin is the transferable amount when Scan reports it.",exec:!1}}catch(n){return{provider:"canton-scan",network:_r(t),...$l(Ao(n).error,{...Ao(n),hint:"Holdings need a reachable Scan plus a migration id (CANTON_MIGRATION_ID or /v0/migrations/last)."}),exec:!1}}}function dB(e){let t=e?.contract?.payload||e?.payload||e||{};return{contractId:e?.contract?.contract_id||e?.contract_id||null,round:t?.round?.number??t?.round??null,amuletPrice:t?.amuletPrice??null,opensAt:t?.opensAt??null,targetClosesAt:t?.targetClosesAt??null}}async function wB(e={}){try{let t=await mB("/v0/open-and-issuing-mining-rounds",{cached_open_mining_round_contract_ids:[],cached_issuing_round_contract_ids:[]},e),n=Object.values(t?.open_mining_rounds||{}).map(dB),r=Object.values(t?.issuing_mining_rounds||{}).map(dB),o=n.map(i=>i.amuletPrice).filter(i=>i!=null);return{provider:"canton-scan",network:_r(e),available:!0,evidence:"LIVE",openCount:n.length,issuingCount:r.length,amuletPrice:o[0]??null,open:n,issuing:r,note:"amuletPrice is the CC/USD conversion used for traffic, not a DEX quote Oracle can trade.",exec:!1}}catch(t){return{provider:"canton-scan",network:_r(e),...$l(Ao(t).error,Ao(t)),exec:!1}}}var Hee,zee,Vee,Wee,xi,Gee,SB=_(()=>{q();vt();Hee="https://scan.sv-1.global.canton.network.sync.global/api/scan",zee="https://scan.sv-1.dev.global.canton.network.sync.global/api/scan",Vee="https://scan.sv-1.test.global.canton.network.sync.global/api/scan",Wee=["scan.sv-1.global.canton.network.sync.global","scan.sv-1.dev.global.canton.network.sync.global","scan.sv-1.test.global.canton.network.sync.global","scan.sv.dev.global.canton.network.digitalasset.com"],xi={network:"https://www.canton.network/",docs:"https://docs.canton.network/",whatIs:"https://docs.canton.network/overview/understand/what-is-canton",fiveMin:"https://docs.canton.network/overview/understand/five-minute-overview",cantonCoin:"https://docs.canton.network/overview/understand/canton-coin",ethereumDevs:"https://docs.canton.network/appdev/modules/m2-canton-for-ethereum-devs",wallets:"https://docs.canton.network/integrations/wallets/for-users",walletGuide:"https://www.canton.network/blog/a-guide-to-wallets-exchanges-and-custody-providers",tokenStandard:"https://docs.canton.network/overview/reference/cip-0056",validators:"https://canton.foundation/validators/",faq:"https://www.canton.network/faq"},Gee=/^(?!.*::.*::)[A-Za-z0-9][A-Za-z0-9:_ -]{0,184}::[0-9A-Fa-f]{16,}$/});function ete(e={}){return String(e.baseUrl||process.env.SNAPSHOT_API_URL||Jee).replace(/\/$/,"")}function kS(e,t=20){let n=Number(e??t);return Number.isFinite(n)?Math.min(Math.max(Math.trunc(n),1),Zee):t}function _S(e){let t=Number(e??0);return!Number.isFinite(t)||t<0?0:Math.min(Math.trunc(t),1e4)}async function Qs(e,t,n={}){let r=await x(ete(n),{method:"POST",body:{query:e,variables:t},headers:{"Content-Type":"application/json"},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4,signal:n.signal});if(Array.isArray(r?.errors)&&r.errors.length)throw new Error(`snapshot: ${String(r.errors[0]?.message||"graphql error").slice(0,160)}`);return r?.data??{}}function Mf(e,t="space"){let n=String(e??"").trim().toLowerCase();if(!n)throw new Error(`snapshot: ${t} is required`);if(!/^[a-z0-9][a-z0-9._-]{0,62}$/.test(n))throw new Error(`snapshot: ${t} must be a snapshot space id (e.g. aave.eth)`);return n}function OS(e,t="voter"){let n=String(e??"").trim();if(!Qee.test(n))throw new Error(`snapshot: ${t} must be a 0x EVM address`);return n.toLowerCase()}function xB(e){if(!e)return null;let t=Array.isArray(e.choices)?e.choices:[],n=Array.isArray(e.scores)?e.scores:[];return{id:e.id,title:e.title,state:e.state,type:e.type,author:e.author,space:e.space?.id??null,spaceName:e.space?.name??null,createdMs:e.created==null?null:Number(e.created)*1e3,startMs:e.start==null?null:Number(e.start)*1e3,endMs:e.end==null?null:Number(e.end)*1e3,snapshotBlock:e.snapshot??null,quorum:e.quorum??null,scoresTotal:e.scores_total??null,scoresState:e.scores_state??null,quorumMet:e.quorum==null||Number(e.quorum)===0?null:Number(e.scores_total??0)>=Number(e.quorum),link:e.link??null,choices:t,tally:t.map((r,o)=>({choice:r,index:o+1,score:n[o]??null})),leadingChoice:n.length===0?null:t[n.indexOf(Math.max(...n.map(r=>Number(r)||0)))]??null,...e.body?{body:String(e.body).slice(0,4e3)}:{},...e.discussion?{discussion:e.discussion}:{},...Array.isArray(e.strategies)?{strategies:e.strategies}:{}}}async function AB(e={},t={}){try{let n={};if(e.ids||e.space){let i=(Array.isArray(e.ids)?e.ids:[e.ids??e.space]).filter(Boolean).map(s=>Mf(s,"space id"));i.length&&(n.id_in=i)}let o=((await Qs(EB,{first:kS(e.first??e.limit,20),skip:_S(e.skip),where:n},t)).spaces||[]).map(i=>({id:i.id,name:i.name,network:i.network,symbol:i.symbol,followersCount:i.followersCount??null,proposalsCount:i.proposalsCount??null,adminCount:Array.isArray(i.admins)?i.admins.length:null,memberCount:Array.isArray(i.members)?i.members.length:null,strategies:Array.isArray(i.strategies)?i.strategies.map(s=>s?.name).filter(Boolean):[],about:i.about?String(i.about).slice(0,500):null}));return{ok:!0,provider:"snapshot-governance",execution:"read-only",count:o.length,spaces:o}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function NS(e={},t={}){try{let n={},r=e.spaces??e.space;if(r){let a=(Array.isArray(r)?r:[r]).filter(Boolean).map(c=>Mf(c));a.length===1?n.space=a[0]:a.length>1&&(n.space_in=a)}let o=e.state==null?"active":String(e.state).trim().toLowerCase();if(o&&o!=="all"){if(!vB.includes(o))throw new Error(`state must be one of ${vB.join(", ")}, or all`);n.state=o}e.author&&(n.author=OS(e.author,"author"));let s=((await Qs(tte,{first:kS(e.first??e.limit,20),skip:_S(e.skip),where:n},t)).proposals||[]).map(xB);return{ok:!0,provider:"snapshot-governance",execution:"read-only",state:o||"all",count:s.length,proposals:s}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function IB(e={},t={}){return NS({...e,state:"active"},t)}async function kB(e={},t={}){try{let n=String(e.id??e.proposal??"").trim();if(!n)throw new Error("snapshot: proposal id is required");if(!/^[0-9a-zA-Z._-]{1,120}$/.test(n))throw new Error("snapshot: proposal id has an unexpected shape");let r=await Qs(nte,{id:n},t),o=xB(r.proposal);return o?{ok:!0,provider:"snapshot-governance",execution:"read-only",proposal:o}:{ok:!1,provider:"snapshot-governance",error:`proposal not found: ${n}`}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function _B(e={},t={}){try{let n={};if((e.voter||e.address)&&(n.voter=OS(e.voter??e.address)),e.space&&(n.space=Mf(e.space)),e.proposal&&(n.proposal=String(e.proposal).trim()),!n.voter&&!n.space&&!n.proposal)throw new Error("snapshot: votes requires voter, space, or proposal");let o=((await Qs(rte,{first:kS(e.first??e.limit,25),skip:_S(e.skip),where:n},t)).votes||[]).map(i=>{let s=Array.isArray(i.proposal?.choices)?i.proposal.choices:[],a=typeof i.choice=="number"?s[i.choice-1]??null:null;return{id:i.id,voter:i.voter,createdMs:i.created==null?null:Number(i.created)*1e3,choice:i.choice,choiceLabel:a,votingPower:i.vp??null,vpState:i.vp_state??null,reason:i.reason?String(i.reason).slice(0,500):null,proposalId:i.proposal?.id??null,proposalTitle:i.proposal?.title??null,proposalState:i.proposal?.state??null,space:i.space?.id??null}});return{ok:!0,provider:"snapshot-governance",execution:"read-only",count:o.length,totalVotingPower:o.reduce((i,s)=>i+(Number(s.votingPower)||0),0),votes:o}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function OB(e={},t={}){try{let n=OS(e.voter??e.address),r=Mf(e.space),o=e.proposal?String(e.proposal).trim():null,s=(await Qs(ote,{voter:n,space:r,proposal:o},t)).vp||null;return{ok:!0,provider:"snapshot-governance",execution:"read-only",voter:n,space:r,proposal:o,votingPower:s?.vp??0,byStrategy:Array.isArray(s?.vp_by_strategy)?s.vp_by_strategy:[],state:s?.vp_state??null}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function NB(e={}){try{let t=await Qs(EB,{first:1,skip:0,where:{}},{...e,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.spaces),provider:"snapshot-governance",execution:"read-only"}}catch(t){return{ok:!1,provider:"snapshot-governance",error:String(t.message||t).slice(0,160)}}}var Jee,vB,Qee,Zee,EB,tte,nte,rte,ote,TB=_(()=>{q();Jee="https://hub.snapshot.org/graphql",vB=Object.freeze(["pending","active","closed"]),Qee=/^0x[0-9a-fA-F]{40}$/,Zee=200;EB=`query Spaces($first: Int!, $skip: Int!, $where: SpaceWhere) {
|
|
194
|
+
spaces(first: $first, skip: $skip, where: $where, orderBy: "followersCount", orderDirection: desc) {
|
|
195
|
+
id name about network symbol followersCount proposalsCount
|
|
196
|
+
admins members
|
|
197
|
+
strategies { name network }
|
|
198
|
+
}
|
|
199
|
+
}`,tte=`query Proposals($first: Int!, $skip: Int!, $where: ProposalWhere) {
|
|
200
|
+
proposals(first: $first, skip: $skip, where: $where, orderBy: "created", orderDirection: desc) {
|
|
201
|
+
id title body choices start end snapshot state author created type quorum
|
|
202
|
+
scores scores_total scores_state link
|
|
203
|
+
space { id name }
|
|
204
|
+
}
|
|
205
|
+
}`,nte=`query Proposal($id: String!) {
|
|
206
|
+
proposal(id: $id) {
|
|
207
|
+
id title body discussion choices start end snapshot state author created type quorum
|
|
208
|
+
scores scores_by_strategy scores_total scores_updated scores_state link privacy
|
|
209
|
+
strategies { name network }
|
|
210
|
+
space { id name network symbol }
|
|
211
|
+
}
|
|
212
|
+
}`,rte=`query Votes($first: Int!, $skip: Int!, $where: VoteWhere) {
|
|
213
|
+
votes(first: $first, skip: $skip, where: $where, orderBy: "created", orderDirection: desc) {
|
|
214
|
+
id voter created choice vp vp_by_strategy vp_state reason
|
|
215
|
+
proposal { id title state choices end }
|
|
216
|
+
space { id name }
|
|
217
|
+
}
|
|
218
|
+
}`,ote=`query Vp($voter: String!, $space: String!, $proposal: String) {
|
|
219
|
+
vp(voter: $voter, space: $space, proposal: $proposal) { vp vp_by_strategy vp_state }
|
|
220
|
+
}`});import{Interface as ste,getAddress as PB,isAddress as CS}from"ethers";function $f(e={}){let t=String(e.dao??e.governorKey??"").trim().toLowerCase();if(t){let i=Zs[t];if(!i)throw new Error(`tally: unknown dao ${JSON.stringify(t)} \u2014 known: ${Object.keys(Zs).join(", ")}`);return{...i,key:t}}let n=String(e.governor??e.address??"").trim();if(!CS(n))throw new Error("tally: dao or governor address is required");let r=Number(e.chainId??1);if(!Number.isSafeInteger(r)||r<=0)throw new Error("tally: chainId must be a positive integer");let o=String(e.kind??"bravo").toLowerCase();if(o!=="bravo"&&o!=="oz")throw new Error("tally: kind must be bravo or oz");return{chainId:r,address:PB(n),kind:o,key:null,name:null,token:null}}function TS(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("tally: proposalId must be a decimal integer string");return BigInt(t)}async function nn(e,t,n,r={}){let o=r.rpcCall||J,i=CB.encodeFunctionData(t,n),s=await o(e.chainId,"eth_call",[{to:e.address,data:i},r.blockTag||"latest"],r);return CB.decodeFunctionResult(t,s)}function tn(e){return e==null?null:String(e)}async function PS(e={},t={}){try{let n=$f(e),r=await Promise.allSettled([nn(n,"proposalCount",[],t),nn(n,"votingDelay",[],t),nn(n,"votingPeriod",[],t),nn(n,"proposalThreshold",[],t),nn(n,"quorumVotes",[],t)]),o=i=>r[i].status==="fulfilled"?tn(r[i].value[0]):null;return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,name:n.name,chainId:n.chainId,governor:n.address,kind:n.kind,token:n.token,proposalCount:o(0),votingDelay:o(1),votingPeriod:o(2),proposalThreshold:o(3),quorumVotes:o(4)}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function RS(e={},t={}){try{let n=$f(e),r=TS(e.proposalId??e.id),o=await nn(n,"state",[r],t),i=Number(o[0]),s=RB[i]??"Unknown",a=null,c=null;if(n.kind==="bravo"){let[m]=[await nn(n,"proposals",[r],t)];a={forVotes:tn(m.forVotes),againstVotes:tn(m.againstVotes),abstainVotes:tn(m.abstainVotes)},c={proposer:m.proposer,eta:tn(m.eta),startBlock:tn(m.startBlock),endBlock:tn(m.endBlock),canceled:m.canceled===!0,executed:m.executed===!0}}else{let[m,f,h]=await Promise.all([nn(n,"proposalVotes",[r],t),nn(n,"proposalSnapshot",[r],t).catch(()=>null),nn(n,"proposalDeadline",[r],t).catch(()=>null)]);a={forVotes:tn(m.forVotes),againstVotes:tn(m.againstVotes),abstainVotes:tn(m.abstainVotes)},c={startBlock:f?tn(f[0]):null,endBlock:h?tn(h[0]):null}}let l=BigInt(a.forVotes??"0"),u=BigInt(a.againstVotes??"0"),d=BigInt(a.abstainVotes??"0"),p=l+u+d;return{ok:!0,provider:"tally-governance",execution:"read-only",source:"onchain",dao:n.key,chainId:n.chainId,governor:n.address,kind:n.kind,proposalId:r.toString(),state:s,stateIndex:i,votes:a,totalVotes:p.toString(),leading:p===0n?null:l>u?"for":l<u?"against":"tied",...c}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function LB(e={},t={}){try{let n=$f(e),r=Number(e.limit??e.first??5),o=Number.isFinite(r)?Math.min(Math.max(Math.trunc(r),1),25):5,i=await nn(n,"proposalCount",[],t),s=BigInt(i[0]);if(s===0n)return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,count:"0",proposals:[]};let a=[];for(let u=0n;u<BigInt(o)&&s-u>0n;u++)a.push(s-u);let l=(await Promise.allSettled(a.map(u=>RS({...e,proposalId:u.toString()},t)))).map((u,d)=>u.status==="fulfilled"&&!u.value.error?u.value:{proposalId:a[d].toString(),error:u.status==="rejected"?String(u.reason?.message||u.reason).slice(0,200):u.value.error});return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,chainId:n.chainId,governor:n.address,proposalCount:s.toString(),count:l.length,proposals:l}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function MB(e={},t={}){try{let n=$f(e),r=TS(e.proposalId??e.id),o=String(e.account??e.voter??e.address??"").trim();if(!CS(o))throw new Error("tally: account must be a 0x EVM address");let i=PB(o),s=await nn(n,"hasVoted",[r,i],t),a=null;if(e.snapshotBlock!=null){let c=TS(e.snapshotBlock),l=await nn(n,"getVotes",[i,c],t).catch(()=>null);a=l?tn(l[0]):null}return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,chainId:n.chainId,governor:n.address,proposalId:r.toString(),account:i,hasVoted:s[0]===!0,votingWeight:a}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}function $B(){return{ok:!0,provider:"tally-governance",execution:"read-only",governors:Object.entries(Zs).map(([e,t])=>({key:e,...t})),states:RB}}function ute(e={}){return Me({provider:"tally-governance",defaultUrl:ate,hosts:cte,url:e.baseUrl||process.env.TALLY_API_URL})}async function BB(e={},t={}){try{let n=String(t.apiKey||process.env.TALLY_API_KEY||"").trim();if(!n)return{ok:!1,configured:!1,provider:"tally-governance",execution:"read-only",error:"TALLY_API_KEY is not set \u2014 use governorProposals for keyless on-chain reads"};let r=ute(t),o=e.organizationId?String(e.organizationId):null,i=e.governorId?String(e.governorId):null;if(!o&&!i)throw new Error("tally: organizationId or governorId is required");let s=Number(e.limit??10),a=Number.isFinite(s)?Math.min(Math.max(Math.trunc(s),1),50):10,c=await x(r.baseUrl,{method:"POST",headers:Ue({"Content-Type":"application/json"},{"Api-Key":n},r.trusted),body:{query:lte,variables:{input:{filters:o?{organizationId:o}:{governorId:i},page:{limit:a},sort:{isDescending:!0,sortBy:"id"}}}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,signal:t.signal});if(Array.isArray(c?.errors)&&c.errors.length)throw new Error(String(c.errors[0]?.message||"graphql error").slice(0,160));let l=c?.data?.proposals?.nodes||[];return{ok:!0,configured:!0,provider:"tally-governance",execution:"read-only",source:"tally",credentialed:r.trusted,count:l.length,proposals:l.map(u=>({id:u.id,onchainId:u.onchainId??null,status:u.status??null,title:u.metadata?.title??null,governor:u.governor?.id??null,governorName:u.governor?.name??null,chainId:u.governor?.chainId??null,startTs:u.start?.timestamp??null,endTs:u.end?.timestamp??null,voteStats:Array.isArray(u.voteStats)?u.voteStats:[]}))}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function DB(e={}){try{let t=Object.keys(Zs).length>0&&Object.values(Zs).every(r=>CS(r.address)&&Number.isSafeInteger(r.chainId)),n=null;return(e.rpcCall||e.probeOnchain)&&(n=(await PS({dao:"compound"},e))?.ok===!0),{ok:t&&n!==!1,provider:"tally-governance",execution:"read-only",governors:Object.keys(Zs).length,tallyConfigured:!!String(process.env.TALLY_API_KEY||"").trim(),...n==null?{}:{onchain:n}}}catch(t){return{ok:!1,provider:"tally-governance",error:String(t.message||t).slice(0,160)}}}var ate,cte,RB,Zs,CB,lte,UB=_(()=>{q();vt();Ne();ate="https://api.tally.xyz/query",cte=Object.freeze(["api.tally.xyz"]),RB=Object.freeze(["Pending","Active","Canceled","Defeated","Succeeded","Queued","Expired","Executed"]),Zs=Object.freeze({compound:{chainId:1,address:"0xc0Da02939E1441F497fd74F78cE7Decb17B66529",kind:"bravo",token:"COMP",name:"Compound"},uniswap:{chainId:1,address:"0x408ED6354d4973f66138C91495F2f2FCbd8724C3",kind:"bravo",token:"UNI",name:"Uniswap"},ens:{chainId:1,address:"0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",kind:"oz",token:"ENS",name:"ENS"},aave:{chainId:1,address:"0x9AEE0B04504CeF83A65AC3f0e838D0593BCb2BC7",kind:"oz",token:"AAVE",name:"Aave Governance v3"},gitcoin:{chainId:1,address:"0xDbD27635A534A3d3169Ef0498beB56Fb9c937489",kind:"bravo",token:"GTC",name:"Gitcoin"},arbitrum:{chainId:42161,address:"0xf07DeD9dC292157749B6Fd268E37DF6EA38395B9",kind:"oz",token:"ARB",name:"Arbitrum Core"},optimism:{chainId:10,address:"0xcDF27F107725988f2261Ce2256bDfCdE8B382B10",kind:"oz",token:"OP",name:"Optimism"}}),CB=new ste(["function state(uint256 proposalId) view returns (uint8)","function proposalCount() view returns (uint256)","function quorumVotes() view returns (uint256)","function proposalThreshold() view returns (uint256)","function votingDelay() view returns (uint256)","function votingPeriod() view returns (uint256)","function proposalSnapshot(uint256 proposalId) view returns (uint256)","function proposalDeadline(uint256 proposalId) view returns (uint256)","function proposalVotes(uint256 proposalId) view returns (uint256 againstVotes,uint256 forVotes,uint256 abstainVotes)","function proposals(uint256 proposalId) view returns (uint256 id,address proposer,uint256 eta,uint256 startBlock,uint256 endBlock,uint256 forVotes,uint256 againstVotes,uint256 abstainVotes,bool canceled,bool executed)","function hasVoted(uint256 proposalId,address account) view returns (bool)","function getVotes(address account,uint256 blockNumber) view returns (uint256)"]);lte=`query Proposals($input: ProposalsInput!) {
|
|
221
|
+
proposals(input: $input) {
|
|
222
|
+
nodes {
|
|
223
|
+
... on Proposal {
|
|
224
|
+
id onchainId status
|
|
225
|
+
metadata { title description }
|
|
226
|
+
governor { id name chainId }
|
|
227
|
+
voteStats { type votesCount votersCount percent }
|
|
228
|
+
start { ... on Block { timestamp } }
|
|
229
|
+
end { ... on Block { timestamp } }
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}`});function FB(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||pte).replace(/\/$/,"")}function qB(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=ea[n.toUpperCase()]||ea[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!fte.test(o))throw new Error(`pyth-price-feeds: ${t} must be a 32-byte hex feed id or a known symbol`);return o.toLowerCase()}function LS(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function MS(e={}){let t=LS({price:Number(e.price?.conf),expo:e.price?.expo}),n=LS(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:LS(e.ema_price),publishTime:e.price?.publish_time??null,publishTimeIso:e.price?.publish_time?new Date(e.price.publish_time*1e3).toISOString():null,ageSeconds:e.price?.publish_time?Math.max(0,Math.round(Date.now()/1e3-e.price.publish_time)):null,expo:e.price?.expo??null,raw:{price:e.price??null,emaPrice:e.ema_price??null,metadata:e.metadata??null}}}async function $S(e,t={}){let n=new URL(`${FB(t)}/v2/updates/price/latest`);for(let r of e)n.searchParams.append("ids[]",r);return n.searchParams.set("encoding","hex"),n.searchParams.set("parsed","true"),n.searchParams.set("ignore_invalid_price_ids","true"),x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function jB(e={}){try{let t=await $S([ea["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(MS):[])[0]||null;return{ok:!!(r&&Number.isFinite(r.price)&&r.price>0),provider:"pyth-price-feeds",solUsd:r?.price??null,ageSeconds:r?.ageSeconds??null,exec:!1}}catch(t){return{ok:!1,provider:"pyth-price-feeds",error:String(t?.message||t),exec:!1}}}async function HB(e={},t={}){let n=qB(e.feedId||e.id||e.symbol,"feedId"),r=await $S([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(MS):[],i=o.find(s=>String(s.id).toLowerCase()===n)||o[0]||null;if(!i)throw new Error(`pyth-price-feeds: no price returned for feed ${n}`);return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",feedId:n,...i,binaryUpdate:r?.binary?.data?.[0]||null,binaryEncoding:r?.binary?.encoding||null}}async function Bf(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>qB(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let a=(await Ge(i,3,l=>$S(l,t))).flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(MS):[]),c=Object.fromEntries(a.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:a.length,missing:r.filter(l=>!c[l]),prices:a,byId:c}}async function zB(e={},t={}){let n=new URL(`${FB(t)}/v2/price_feeds`);e.query&&n.searchParams.set("query",String(e.query)),n.searchParams.set("asset_type",String(e.assetType||"crypto"));let r=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}var pte,ea,fte,BS=_(()=>{q();pte="https://hermes.pyth.network",ea={"SOL/USD":"ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d","BTC/USD":"e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43","ETH/USD":"ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace","USDC/USD":"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a","USDT/USD":"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b","JUP/USD":"0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996","JTO/USD":"b43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2","BONK/USD":"72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419","PYTH/USD":"0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff","HYPE/USD":"4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b"},fte=/^[0-9a-fA-F]{64}$/});function Vt(e){let t=Number(e);return Number.isFinite(t)?t:null}function hte(e,t=Df){let n=Vt(e);return n==null||n<=0?null:Math.round((n-t)/t*1e4*100)/100}function gte(e,t=VB){let n=WB(t),r=Vt(e);return r==null?"unknown":r>=n.depegBps?"depeg":r>=n.warnBps?"warn":r>=n.watchBps?"watch":"normal"}function WB(e={}){let t=e&&typeof e=="object"?e:{},n=s=>{let a=Vt(t[s]);return a!=null&&a>=0?a:VB[s]},r=n("watchBps"),o=Math.max(r,n("warnBps")),i=Math.max(o,n("depegBps"));return{watchBps:r,warnBps:o,depegBps:i}}function yte(e){if(!Array.isArray(e)||!e.length)return DS;let t=new Set(e.map(r=>String(r).toUpperCase())),n=DS.filter(r=>t.has(r.symbol.toUpperCase()));return n.length?n:DS}async function bte(e,t){let n=[...new Set(e.map(r=>r.llamaKey).filter(Boolean))];if(!n.length)return{prices:{},error:null};try{let o=(await Kt(n,t))?.coins||{},i={};for(let s of n){let a=Vt(o[s]?.price);a!=null&&(i[s]={price:a,confidence:Vt(o[s]?.confidence),timestamp:o[s]?.timestamp??null})}return{prices:i,error:null}}catch(r){return{prices:{},error:String(r.message||r).slice(0,200)}}}async function wte(e,t){let n=[...new Set(e.map(r=>r.pythSymbol).filter(r=>r&&ea[r]))];if(!n.length)return{prices:{},error:null};try{let o=(await Bf({symbols:n},t))?.byId||{},i={};for(let s of n){let a=String(ea[s]).toLowerCase(),c=o[a],l=Vt(c?.price);l!=null&&(i[s]={price:l,confidenceBps:Vt(c?.confidenceBps),ageSeconds:Vt(c?.ageSeconds)})}return{prices:i,error:null}}catch(r){return{prices:{},error:String(r.message||r).slice(0,200)}}}async function Ste(e,t){if(!e.dex?.address)return null;try{let n=await jn(e.dex.address,t),r=Array.isArray(n?.pairs)?n.pairs:[],o=r.filter(a=>String(a?.chainId||"").toLowerCase()===String(e.dex.chain).toLowerCase()),s=(o.length?o:r).filter(a=>String(a?.baseToken?.address||"").toLowerCase()===String(e.dex.address).toLowerCase()).filter(a=>Vt(a?.priceUsd)!=null).sort((a,c)=>(Vt(c?.liquidity?.usd)??0)-(Vt(a?.liquidity?.usd)??0))[0];return s?{price:Vt(s.priceUsd),liquidityUsd:Vt(s?.liquidity?.usd),pairAddress:s?.pairAddress||null,dexId:s?.dexId||null,chain:s?.chainId||null}:null}catch{return null}}function vte(e,{llama:t,pyth:n,dex:r},o){let i=[];t?.price!=null&&i.push({source:"defillama",price:t.price,confidence:t.confidence??null}),n?.price!=null&&i.push({source:"pyth",price:n.price,confidenceBps:n.confidenceBps??null,ageSeconds:n.ageSeconds??null}),r?.price!=null&&i.push({source:"dexscreener",price:r.price,liquidityUsd:r.liquidityUsd??null,pair:r.pairAddress??null,dexId:r.dexId??null});let s=i.find(p=>p.source==="defillama")||i.find(p=>p.source==="pyth")||i[0]||null,a=s?.price??null,c=hte(a),l=c==null?null:Math.abs(c),u=null,d=i.map(p=>p.price).filter(p=>Vt(p)!=null);if(d.length>1){let p=Math.min(...d),m=Math.max(...d);u=Math.round((m-p)/Df*1e4*100)/100}return{symbol:e.symbol,name:e.name,hyperliquid:e.hyperliquid===!0,pegMechanism:e.pegMechanism||null,pegTargetUsd:Df,priceUsd:a,deviationBps:c,absDeviationBps:l,direction:c==null?null:c<0?"below":c>0?"above":"at-peg",severity:a==null?"unknown":gte(l,o),primarySource:s?.source||null,sourceSpreadBps:u,sources:i,priced:a!=null}}async function US(e={},t={}){try{let n=WB(e.thresholds),r=yte(e.symbols),o=e.usePyth!==!1,i=e.useDex!==!1,[s,a]=await Promise.all([bte(r,t),o?wte(r,t):Promise.resolve({prices:{},error:null})]),c=r.filter(g=>i&&g.dex?.address&&(e.forceDex===!0||s.prices[g.llamaKey]?.price==null)),l=await Promise.all(c.map(g=>Ste(g,t))),u=new Map(c.map((g,y)=>[g.symbol,l[y]])),d=r.map(g=>vte(g,{llama:s.prices[g.llamaKey]||null,pyth:g.pythSymbol&&a.prices[g.pythSymbol]||null,dex:u.get(g.symbol)||null},n)),p=d.filter(g=>g.priced),m=d.filter(g=>!g.priced);p.sort((g,y)=>(y.absDeviationBps??0)-(g.absDeviationBps??0));let f={normal:0,watch:0,warn:0,depeg:0,unknown:m.length};for(let g of p)f[g.severity]=(f[g.severity]||0)+1;let h=p.filter(g=>g.severity!=="normal");return{provider:"stablecoin-peg",execution:"read-only",generatedAt:new Date().toISOString(),pegTargetUsd:Df,thresholds:n,counts:f,scanned:d.length,priced:p.length,worst:p[0]||null,alerting:h,stables:[...p,...m],upstreamErrors:[...s.error?[{source:"defillama",error:s.error}]:[],...a.error?[{source:"pyth",error:a.error}]:[]]}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function GB(e={}){try{let t=await US({symbols:["USDT","USDC"],useDex:!1},e);return t?.error?{ok:!1,provider:"stablecoin-peg",error:String(t.error).slice(0,160)}:{ok:Number(t?.priced||0)>0,provider:"stablecoin-peg",priced:t?.priced??0,worstBps:t?.worst?.absDeviationBps??null,exec:!1}}catch(t){return{ok:!1,provider:"stablecoin-peg",error:String(t.message||t).slice(0,160)}}}var VB,Fye,DS,Df,KB=_(()=>{Ho();BS();nr();VB=Object.freeze({watchBps:25,warnBps:50,depegBps:200}),Fye=Object.freeze(["normal","watch","warn","depeg"]),DS=Object.freeze([{symbol:"USDT",name:"Tether",llamaKey:"coingecko:tether",pythSymbol:"USDT/USD",pegMechanism:"fiat-backed"},{symbol:"USDC",name:"USD Coin",llamaKey:"coingecko:usd-coin",pythSymbol:"USDC/USD",pegMechanism:"fiat-backed"},{symbol:"DAI",name:"Dai",llamaKey:"coingecko:dai",pegMechanism:"crypto-backed"},{symbol:"USDS",name:"Sky Dollar",llamaKey:"coingecko:usds",pegMechanism:"crypto-backed"},{symbol:"USDe",name:"Ethena USDe",llamaKey:"coingecko:ethena-usde",pegMechanism:"crypto-backed"},{symbol:"FRAX",name:"Frax",llamaKey:"coingecko:frax",pegMechanism:"crypto-backed"},{symbol:"crvUSD",name:"Curve USD",llamaKey:"coingecko:crvusd",pegMechanism:"crypto-backed"},{symbol:"USDT0",name:"USDT0 (LayerZero OFT)",llamaKey:"coingecko:usdt0",hyperliquid:!0,pegMechanism:"fiat-backed",dex:{chain:"hyperevm",address:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"}},{symbol:"feUSD",name:"Felix feUSD",llamaKey:"coingecko:felix-feusd",hyperliquid:!0,pegMechanism:"crypto-backed",dex:{chain:"hyperevm",address:"0x02c6a2fA58cC01A18B8D9E00eA48d65E4dF26c70"}},{symbol:"USDXL",name:"Last USD (USDXL)",llamaKey:"coingecko:last-usd",hyperliquid:!0,pegMechanism:"crypto-backed",dex:{chain:"hyperevm",address:"0xca79db4b49f608ef54a5cb813fbed3a6387bc645"}},{symbol:"USDHL",name:"USDHL",llamaKey:"hyperliquid:0xb50A96253aBDF803D85efcDce07Ad8becBc52BD5",hyperliquid:!0,pegMechanism:"fiat-backed",dex:{chain:"hyperevm",address:"0xb50A96253aBDF803D85efcDce07Ad8becBc52BD5"}},{symbol:"USDH",name:"Hyperliquid USDH",llamaKey:"coingecko:usdh",hyperliquid:!0,pegMechanism:"fiat-backed"}]),Df=1});function FS(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||xte).replace(/\/$/,"")}function Ate(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function YB(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*XB):null}function Ite(e={}){let t=Number(e.landedTipLamports);return{bundleId:e.bundleId||null,timestamp:e.timestamp||null,validator:e.validator||null,tippers:e.tippers||[],transactions:e.transactions||[],transactionCount:Array.isArray(e.transactions)?e.transactions.length:0,landedTipLamports:Number.isFinite(t)?t:null,landedTipSol:Number.isFinite(t)?t/XB:null,raw:e}}async function JB(e={}){try{let t=await x(`${FS(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=Array.isArray(t)?t[0]:t,r=Number(n?.landed_tips_50th_percentile);return{ok:Number.isFinite(r),provider:"jito-mev",tipFloorP50Sol:Number.isFinite(r)?r:null,asOf:n?.time||null,exec:!1}}catch(t){return{ok:!1,provider:"jito-mev",error:String(t?.message||t),exec:!1}}}async function QB(e={},t={}){let n=Ate(e.limit,5,100),r=new URL(`${FS(t)}/api/v1/bundles/recent`);r.searchParams.set("limit",String(n)),r.searchParams.set("sort",String(e.sort||"Time")),r.searchParams.set("asc",String(!!e.asc));let o=await x(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(Ite),a=s.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:s.length,totalTipLamports:a.reduce((c,l)=>c+l,0),maxTipLamports:a.length?Math.max(...a):null,bundles:s}}async function ZB(e={}){let t=await x(`${FS(e)}/api/v1/bundles/tip_floor`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=(Array.isArray(t)?t[0]:t)||{},r={p25:Number(n.landed_tips_25th_percentile)||0,p50:Number(n.landed_tips_50th_percentile)||0,p75:Number(n.landed_tips_75th_percentile)||0,p95:Number(n.landed_tips_95th_percentile)||0,p99:Number(n.landed_tips_99th_percentile)||0,ema50:Number(n.ema_landed_tips_50th_percentile)||0};return{provider:"jito-mev",chain:"solana-mainnet-beta",asOf:n.time||null,tipFloorSol:r,tipFloorLamports:Object.fromEntries(Object.entries(r).map(([o,i])=>[o,YB(i)])),suggestedTipLamports:YB(r.p75||r.p50),raw:n}}var xte,XB,eD=_(()=>{q();xte="https://bundles.jito.wtf",XB=1e9});function Ote(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||_te).replace(/\/$/,"")}function rn(e){let t=Number(e);return Number.isFinite(t)?t:null}function tD(e={}){let t=rn(e.totalValueLocked)??0,n=rn(e.apy?.totalApy)??0,r=rn(e.kaminoApy?.totalApy)??0;return{strategy:e.strategy||null,pair:e.tokenA&&e.tokenB?`${e.tokenA}-${e.tokenB}`:null,tokenA:e.tokenA||null,tokenB:e.tokenB||null,tokenAMint:e.tokenAMint||null,tokenBMint:e.tokenBMint||null,tvlUsd:t,sharePrice:rn(e.sharePrice),sharesIssued:rn(e.sharesIssued),profitAndLoss:rn(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:rn(e.apy?.vault?.totalApr),apy24h:rn(e.kaminoApy?.vault?.apy24h),apy7d:rn(e.kaminoApy?.vault?.apy7d),apy30d:rn(e.kaminoApy?.vault?.apy30d),poolPrice:rn(e.apy?.vault?.poolPrice),priceLower:rn(e.apy?.vault?.priceLower),priceUpper:rn(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function qS(e={},t={}){let n=new URL(`${Ote(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function nD(e={}){try{let t=await qS({},e),n=t.filter(r=>(Number(r.totalValueLocked)||0)>0).length;return{ok:t.length>0,provider:"kamino-strategies",strategies:t.length,funded:n,exec:!1}}catch(t){return{ok:!1,provider:"kamino-strategies",error:String(t?.message||t),exec:!1}}}async function rD(e={},t={}){let r=(await qS(e,t)).map(tD),o=r.length,i=Number.isFinite(Number(e.minTvlUsd))?Number(e.minTvlUsd):1e4;if(r=r.filter(l=>l.tvlUsd>=i),e.token){let l=String(e.token).toLowerCase();r=r.filter(u=>String(u.tokenA||"").toLowerCase()===l||String(u.tokenB||"").toLowerCase()===l||u.tokenAMint===e.token||u.tokenBMint===e.token)}if(e.pair){let l=String(e.pair).toLowerCase().replace(/[/_]/g,"-");r=r.filter(u=>String(u.pair||"").toLowerCase()===l)}e.inRangeOnly===!0&&(r=r.filter(l=>!l.outOfRange));let s=String(e.sortBy||"apy");r.sort((l,u)=>s==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let a=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,a);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",env:e.env||"mainnet-beta",status:e.status||"LIVE",totalStrategies:o,matched:r.length,count:c.length,minTvlUsd:i,tvlUsdMatched:r.reduce((l,u)=>l+u.tvlUsd,0),strategies:c}}async function oD(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await qS({...e,status:e.status||"ALL"},t)).find(i=>i.strategy===n);if(!o)throw new Error(`kamino-strategies: strategy ${n} not found`);return{provider:"kamino-strategies",chain:"solana-mainnet-beta",...tD(o),raw:o}}var _te,iD=_(()=>{q();_te="https://api.kamino.finance"});import{createHash as sD}from"node:crypto";function Uf(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||jS).replace(/\/$/,"")}function Cte(e){let t=0n;for(let i of e){let s=Tte.indexOf(i);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"),o=e.length-e.replace(/^1+/u,"").length;return Buffer.concat([Buffer.alloc(o),r])}function Pte(e){if(!e||e.length<5)return!1;let t=e.subarray(0,-4);return sD("sha256").update(sD("sha256").update(t).digest()).digest().subarray(0,4).equals(e.subarray(-4))}function Lte(e){let t=1n;for(let n of e){let r=t>>55n;t=(t&0x7fffffffffffffn)<<5n^BigInt(n);for(let o=0;o<cD.length;o+=1)r>>BigInt(o)&1n&&(t^=cD[o])}return t}function Mte(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 Ff(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 i=[];for(let d of n.slice(r+1)){let p=Rte.indexOf(d);if(p<0)return!1;i.push(p)}let s=[...o].map(d=>d.charCodeAt(0)>>5).concat([0],[...o].map(d=>d.charCodeAt(0)&31),i),a=i[0],c=a===0?1n:0x455972a3350f7a1n;if(a>16||Lte(s)!==c)return!1;let l=Mte(i.slice(1,-12));if(!l||l.length<35||l.length>73||![2,3].includes(l[0]))return!1;let u=l.length-33;return u>=2&&u<=40&&(a!==0||[20,32].includes(u))}function Bl(e){let t=String(e??"").trim();if(Ff(t))return!0;if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(t))return!1;let n=Cte(t);return!!(n&&n.length===59&&Pte(n)&&n[0]===12&&[39,57].includes(n[1])&&[2,3].includes(n[2]))}function $te(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)||Ff(n),i=/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/.test(n)||Bl(n);if(!o&&!i)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}function Bte(e,t="assetId"){let n=String(e||"").trim().toLowerCase().replace(/^0x/,"");if(!/^[0-9a-f]{64}$/.test(n))throw new Error(`liquid-esplora: ${t} must be 64-char hex`);return n}async function lD(e,t={}){let n=`${Uf(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`liquid-esplora GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i}async function uD(e,t={}){return Fe(await x(`${Uf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"liquid-esplora response")}async function dD(e={}){try{let t=await lD("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Uf(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Uf(e),error:String(t?.message||t),exec:!1}}}async function pD(e={},t={}){let n=await lD("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function qf(e={},t={}){let n=$te(e.address||e.addr,"address"),r=await uD(`/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,i=r.mempool_stats,s=h=>{if(Number.isSafeInteger(h)&&h>=0)return h;if(typeof h!="string"||!/^\d+$/u.test(h))return null;let g=Number(h);return Number.isSafeInteger(g)&&g>=0?g:null},a=s(o.tx_count),c=s(i.tx_count);if(a==null||c==null)throw new Error("liquid-esplora: address info returned invalid transaction counts");let l=a+c;if(!Number.isSafeInteger(l))throw new Error("liquid-esplora: address info returned invalid transaction counts");let u=[o.funded_txo_sum,o.spent_txo_sum,i.funded_txo_sum,i.spent_txo_sum],d=u.some(h=>h!=null),p=d?u.map(s):[];if(d&&p.some(h=>h==null))throw new Error("liquid-esplora: address info returned invalid amount sums");let m=d?p[0]+p[2]:null,f=d?p[1]+p[3]:null;if(d&&(!Number.isSafeInteger(m)||!Number.isSafeInteger(f)||f>m))throw new Error("liquid-esplora: address info returned invalid amount sums");return{provider:"liquid-esplora",address:n,txCount:l,balanceSats:d?String(m-f):null,confidential:Bl(n),note:d?void 0:Bl(n)?"Liquid amounts are blinded; unblind locally with the wallet's blinding key.":"Liquid balance sums were unavailable from Esplora.",chainStats:o,mempoolStats:i,raw:r}}async function fD(e={},t={}){let n=Bte(e.assetId||e.asset||aD,"assetId"),r=await uD(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===aD,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}var jS,aD,Tte,Rte,cD,jf=_(()=>{q();mn();jS="https://blockstream.info/liquid/api",aD="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";Tte="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";Rte="qpzry9x8gf2tvdw0s3jn54khce6mua7l",cD=[0x7d52fba40bd886n,0x5e8dbf1a03950cn,0x1c3a3c74072a18n,0x385d72fa0e5139n,0x7093e5a608865bn]});function HS(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||Ute).replace(/\/$/,"")}function qte(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function mD(e,t="collectionSymbol"){let n=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(n))throw new Error(`magiceden-ordinals: ${t} must be a slug like "nodemonkes"`);return n}function hD(e,t={}){return x(`${HS(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:qte(t),retries:t.retries??1})}async function gD(e={}){let t=mD(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await hD(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:HS(e),probeCollection:t,rateLimitRpm:Fte,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:HS(e),probeCollection:t,status:r,upstreamDown:r===503||r===502||r===504,error:String(n?.message||n),fallback:"satflow",note:r===503?"Magic Eden ordinals API returned 503 'no healthy upstream'. Use the satflow provider for BTC NFT market data.":void 0,exec:!1}}}async function yD(e={},t={}){let n=mD(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await hD(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}var Ute,Fte,bD=_(()=>{q();Ute="https://api-mainnet.magiceden.dev/v2/ord/btc",Fte=600});function zS(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||Hte).replace(/\/$/,"")}function Hf(e,t={}){return x(`${zS(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function wD(e){if(!e)return{ageDays:null,stale:null};let t=new Date(e).getTime();if(!Number.isFinite(t))return{ageDays:null,stale:null};let n=(Date.now()-t)/864e5;return{ageDays:Math.round(n*10)/10,stale:n>zte}}async function SD(e={}){try{let n=(await Hf("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=wD(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:zS(e),snapshotAt:n.added??null,ageDays:r,stale:o,nodeCount:n.node_count??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-lightning",baseUrl:zS(e),error:String(t?.message||t),exec:!1}}}async function vD(e={},t={}){let r=(await Hf("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=wD(r.added);return{provider:"mempool-lightning",snapshotAt:r.added??null,ageDays:o,stale:i,staleNote:i?`mempool.space Lightning snapshot is ${o} days old \u2014 trend only, not live state`:void 0,nodeCount:r.node_count??null,channelCount:r.channel_count??null,totalCapacitySats:r.total_capacity==null?null:String(r.total_capacity),totalCapacityBtc:r.total_capacity==null?null:Number(r.total_capacity)/1e8,avgCapacitySats:r.avg_capacity==null?null:String(r.avg_capacity),avgFeeRatePpm:r.avg_fee_rate??null,avgBaseFeeMsat:r.avg_base_fee_mtokens??null,torNodes:r.tor_nodes??null,clearnetNodes:r.clearnet_nodes??null,unannouncedNodes:r.unannounced_nodes??null,raw:r}}async function ED(e={},t={}){let n=String(e.metric||e.ranking||"connectivity").trim().toLowerCase(),r=new Set(["connectivity","liquidity","channels"]);if(!r.has(n))throw new Error(`mempool-lightning: metric must be one of ${[...r].join(", ")}`);let o=await Hf(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],s=Math.min(100,Math.max(1,Number(e.limit||i.length||1)));return{provider:"mempool-lightning",metric:n,count:i.length,nodes:i.slice(0,s).map(a=>({publicKey:a.publicKey??null,alias:a.alias??null,channels:a.channels??null,capacitySats:a.capacity==null?null:String(a.capacity),firstSeen:a.firstSeen??null,updatedAt:a.updatedAt??null,city:a.city?.en??a.city??null,country:a.country?.en??a.country??null,iso:a.iso_code??null}))}}async function xD(e={},t={}){let n=await Hf("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((s,a)=>s+Number(a.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(s=>({name:s.name?.en??s.name??null,iso:s.iso??null,count:s.count??null,sharePct:s.share??null,capacitySats:s.capacity==null?null:String(s.capacity)}))}}var Hte,zte,AD=_(()=>{q();Hte="https://mempool.space/api",zte=7});function VS(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||Wte).replace(/\/$/,"")}function kD(e,t){let n=String(e||t).trim().toLowerCase();if(!ID.has(n))throw new Error(`mempool-mining: window must be one of ${[...ID].join(", ")}`);return n}function Dl(e,t={}){return x(`${VS(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function _D(e={}){try{let t=await Dl("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:VS(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:VS(e),error:String(t?.message||t),exec:!1}}}async function OD(e={},t={}){let n=await Dl("/v1/difficulty-adjustment",t);return{provider:"mempool-mining",progressPercent:n.progressPercent??null,difficultyChangePct:n.difficultyChange??null,estimatedRetargetDate:n.estimatedRetargetDate??null,remainingBlocks:n.remainingBlocks??null,remainingTimeMs:n.remainingTime??null,previousRetargetPct:n.previousRetarget??null,nextRetargetHeight:n.nextRetargetHeight??null,timeAvgMs:n.timeAvg??null,raw:n}}async function ND(e={},t={}){let n=kD(e.window||e.timeframe,"1w"),r=await Dl(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),s=l=>i>0?Number(l.blockCount||0)/i*100:null,a=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||a.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:a[0]?s(a[0]):null,top3SharePct:a.slice(0,3).reduce((l,u)=>l+(s(u)||0),0)||null,pools:a.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:s(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function TD(e={},t={}){let n=kD(e.window||e.timeframe,"3d"),r=await Dl(`/v1/mining/hashrate/${n}`,t),o=Array.isArray(r?.hashrates)?r.hashrates:[];return{provider:"mempool-mining",window:n,currentHashrate:r?.currentHashrate??null,currentHashrateEhs:r?.currentHashrate==null?null:Number(r.currentHashrate)/1e18,currentDifficulty:r?.currentDifficulty??null,points:o.length,hashrates:o,difficulty:Array.isArray(r?.difficulty)?r.difficulty:[]}}async function CD(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Dl(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}var Wte,ID,PD=_(()=>{q();Wte="https://mempool.space/api",ID=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"])});function Xte(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||Kte).replace(/\/$/,"")}function Lt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Jte(e={}){return{address:e.pool_address||null,name:e.pool_name||null,type:e.pool_type||null,version:e.pool_version??null,mints:e.pool_token_mints||[],tokenAmounts:e.pool_token_amounts||[],tokenUsdAmounts:e.pool_token_usd_amounts||[],lpMint:e.lp_mint||null,lpDecimals:e.lp_decimal??null,lpPriceUsd:Lt(e.pool_lp_price_in_usd),tvlUsd:Lt(e.pool_tvl),farmTvlUsd:Lt(e.farm_tvl),volume24hUsd:Lt(e.trading_volume),volume7dUsd:Lt(e.weekly_trading_volume),fee24hUsd:Lt(e.fee_volume),fee7dUsd:Lt(e.weekly_fee_volume),tradeApyPct:Lt(e.trade_apy),weeklyTradeApyPct:Lt(e.weekly_trade_apy),baseApyPct:Lt(e.daily_base_apy),farmingApyPct:Lt(e.farming_apy),totalApyPct:(Lt(e.trade_apy)??0)+(Lt(e.farming_apy)??0),aprPct:Lt(e.apr),feePct:Lt(e.total_fee_pct),farmingPool:e.farming_pool||null,isLst:!!e.is_lst,isMeme:!!e.is_meme,permissioned:!!e.permissioned,unknownTokens:!!e.unknown,createdAt:e.created_at??null}}function Qte(e={},t={}){let n=new URL(`${Xte(t)}/pools/search`),r=Math.max(0,Number(e.page)||0),o=Math.max(1,Math.min(Number(e.size??e.limit)||20,100));if(n.searchParams.set("page",String(r)),n.searchParams.set("size",String(o)),e.sortKey!=null){let a=String(e.sortKey);if(!RD.has(a))throw new Error(`meteora-dlmm: sortKey must be one of ${[...RD].join(", ")}`);n.searchParams.set("sort_key",a),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let a=String(e.poolType);if(!LD.has(a))throw new Error(`meteora-dlmm: poolType must be one of ${[...LD].join(", ")}`);n.searchParams.set("pool_type",a)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let s=e.mints||e.includeTokenMints;if(s){let a=(Array.isArray(s)?s:[s]).map(c=>String(c).trim());for(let c of a)if(!Yte.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",a.join(","))}return{url:n,page:r,size:o}}async function WS(e={},t={}){let{url:n,page:r,size:o}=Qte(e,t),i=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(Jte),totalCount:i?.total_count??null,page:r,size:o}}async function MD(e={}){try{let{pools:t,totalCount:n}=await WS({size:3},e);return{ok:t.length>0,provider:"meteora-dlmm",poolsIndexed:n,sample:t.length,exec:!1}}catch(t){return{ok:!1,provider:"meteora-dlmm",error:String(t?.message||t),exec:!1}}}async function $D(e={},t={}){let n=await WS({sortKey:e.sortKey||"tvl",orderBy:e.orderBy||"desc",...e},t),r=n.pools,o=Number(e.minTvlUsd);return Number.isFinite(o)&&(r=r.filter(i=>(i.tvlUsd??0)>=o)),e.excludeUnknown===!0&&(r=r.filter(i=>!i.unknownTokens)),{provider:"meteora-dlmm",chain:"solana-mainnet-beta",page:n.page,size:n.size,totalCount:n.totalCount,count:r.length,tvlUsd:r.reduce((i,s)=>i+(s.tvlUsd??0),0),pools:r}}async function BD(e={},t={}){let n=e.filter??e.query??e.search,r=e.mints||e.includeTokenMints;if((n==null||!String(n).trim())&&!r)throw new Error("meteora-dlmm: poolSearch requires filter text or mints[]");let o=await WS({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}var Kte,RD,LD,Yte,DD=_(()=>{q();Kte="https://amm-v2.meteora.ag",RD=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),LD=new Set(["dynamic","multitoken","lst","farms"]),Yte=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/});function zf(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||ene).replace(/\/$/,"")}function tne(e,t="name"){let n=String(e||"").trim().toUpperCase().replace(/[•.\s_-]/g,"");if(!/^[A-Z]{1,28}$/.test(n))throw new Error(`ordinals-runes: ${t} must be 1-28 letters (spacers are stripped automatically)`);return n}async function UD(e,t={}){let n=`${zf(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function GS(e,t={}){return x(`${zf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function FD(e={}){try{let t=await UD("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:zf(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:zf(e),error:String(t?.message||t),exec:!1}}}async function qD(e={},t={}){let n=await UD("/r/blockheight",t),r=Number(n);if(!Number.isFinite(r))throw new Error(`ordinals-runes: unexpected blockheight response ${n.slice(0,60)}`);return{provider:"ordinals-runes",blockHeight:r}}async function jD(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await GS(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function HD(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,s=await GS(i,t),a=Array.isArray(s?.ids)?s.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:a.length,inscriptionIds:a,more:!!s?.more,raw:s}}async function zD(e={},t={}){let n=tne(e.name||e.rune||e.runeName,"name"),r=await GS(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},s=i.cap==null?null:Number(i.cap),a=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:a==null?null:String(a),burned:o.burned==null?null:String(o.burned),mintCap:s==null?null:String(s),mintProgressPct:s&&s>0&&a!=null?a/s*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}var ene,VD=_(()=>{q();ene="https://ordinals.com"});function KS(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||rne).replace(/\/$/,"")}function GD(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!WD.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...WD].join(", ")}`);return t}function one(e={}){let t=e.date||e.day;if(t==null)return new Date(Date.now()-864e5).toISOString().slice(0,10);let n=String(t).trim();if(!/^\d{4}-\d{2}-\d{2}$/.test(n))throw new Error("relayscan-mev: date must be YYYY-MM-DD");return n}async function YS(e={},t={}){return x(`${KS(t)}/overview/json?t=${GD(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function KD(e={},t={}){return x(`${KS(t)}/builder-profit/json?t=${GD(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function YD(e={},t={}){let n=one(e);return x(`${KS(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function XD(e={}){let t=await YS({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}var rne,WD,JD=_(()=>{q();rne="https://relayscan.io",WD=new Set(["1h","12h","24h","7d"])});function XS(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||sne).replace(/\/$/,"")}function QD(e,t="lst"){let n=String(e??"").trim();if(!n||/[?&=\s]/.test(n))throw new Error(`sanctum-lst: ${t} must be an LST symbol or mint`);return n}function lne(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Ai(e,t,n={}){let r={},o={},i=await Ge(lne(t,ane),3,async s=>{let a=new URL(`${XS(n)}/v1/${e}`);for(let c of s)a.searchParams.append("lst",c);return x(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})});for(let s of i){let a=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,a),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function ZD(e={}){try{let[t,n]=await Promise.all([x(`${XS(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Ai("apy/inception",["jitoSOL"],e)]),r=Array.isArray(t?.lsts)?t.lsts:[];return{ok:r.length>0&&Number.isFinite(Number(n.values.jitoSOL)),provider:"sanctum-lst",lstCount:r.length,jitoSolApyInception:Number(n.values.jitoSOL)??null,exec:!1}}catch(t){return{ok:!1,provider:"sanctum-lst",error:String(t?.message||t),exec:!1}}}async function JS(e={},t={}){let n=await x(`${XS(t)}/v1/lsts`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),r=(Array.isArray(n?.lsts)?n.lsts:[]).map(i=>({symbol:i.symbol||null,name:i.name||null,mint:i.mint||null,decimals:i.decimals??null,pool:i.pool?.pool||null,poolProgram:i.pool?.program||null,voteAccount:i.pool?.vote_account||null,logoUri:i.logo_uri||null}));if(e.symbol){let i=String(e.symbol).toLowerCase();r=r.filter(s=>String(s.symbol||"").toLowerCase()===i||s.mint===e.symbol)}let o=Number(e.limit);return Number.isFinite(o)&&o>0&&(r=r.slice(0,o)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:r.length,lsts:r}}async function eU(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await JS({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=cne);let r=[...new Set(n.map(a=>QD(a,"lsts[]")))],[o,i]=await Promise.all([Ai("apy/latest",r,t),Ai("apy/inception",r,t)]),s=r.map(a=>{let c=Number(o.values[a]),l=Number(i.values[a]);return{lst:a,apyLatest:Number.isFinite(c)?c:null,apyLatestPct:Number.isFinite(c)?c*100:null,apyInception:Number.isFinite(l)?l:null,apyInceptionPct:Number.isFinite(l)?l*100:null,error:o.errs[a]||i.errs[a]||null}});return s.sort((a,c)=>(c.apyInception??-1)-(a.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:s.length,apys:s,byLst:Object.fromEntries(s.map(a=>[a.lst,a]))}}async function tU(e={},t={}){let n=QD(e.lst||e.mint||e.symbol,"lst"),[r,o,i,s]=await Promise.all([Ai("apy/latest",[n],t),Ai("apy/inception",[n],t),Ai("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Ai("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),a=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(a)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=s.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(a)?a:null,apyLatestPct:Number.isFinite(a)?a*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}var sne,ane,cne,nU=_(()=>{q();sne="https://extra-api.sanctum.so",ane=30,cne=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"]});function QS(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||dne).replace(/\/$/,"")}function oU(e,t="address"){let n=String(e??"").trim();if(!fne.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function iU(e){let t=Number(e);return Number.isFinite(t)?t:null}function mne(e={}){return{address:e.address||null,name:e.name||null,description:e.description||"",isPrimary:!!e.isPrimary,isPermissionless:!!e.isPermissionless,hidden:!!e.hidden,owner:e.owner||null,authorityAddress:e.authorityAddress||null,lookupTableAddress:e.lookupTableAddress||null,reserveCount:Array.isArray(e.reserves)?e.reserves.length:0,reserves:(e.reserves||[]).map(t=>({address:t.address||null,symbol:t.liquidityToken?.symbol||null,name:t.liquidityToken?.name||null,mint:t.liquidityToken?.mint||null,decimals:t.liquidityToken?.decimals??null,collateralMint:t.collateralMintAddress||null,pythOracle:t.pythOracle||null,switchboardOracle:t.switchboardOracle||null,volume24h:t.liquidityToken?.volume24h??null}))}}function hne(e={}){let t=e.reserve||{},n=t.liquidity||{},r=t.collateral||{};return{address:e.address||t.address||null,lendingMarket:t.lendingMarket||null,mint:n.mintPubkey||null,mintDecimals:n.mintDecimals??null,supplyApyPct:iU(e.rates?.supplyInterest),borrowApyPct:iU(e.rates?.borrowInterest),cTokenExchangeRate:e.cTokenExchangeRate??null,availableAmount:n.availableAmount??null,borrowedAmountWads:n.borrowedAmountWads??null,marketPrice:n.marketPrice??null,collateralMint:r.mintPubkey||null,collateralTotalSupply:r.mintTotalSupply??null,rewards:e.rewards||[],lastUpdateSlot:t.lastUpdate?.slot??null,stale:t.lastUpdate?.stale===1,raw:e}}async function sU(e={}){try{let t=await x(`${QS(e)}/v1/reserves?ids=${rU}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:rU,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function ZS(e={},t={}){let n=new URL(`${QS(t)}/v1/markets/configs`);e.scope&&n.searchParams.set("scope",String(e.scope)),e.deployment&&n.searchParams.set("deployment",String(e.deployment));let r=await x(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(mne);if(e.includeHidden!==!0&&(o=o.filter(s=>!s.hidden)),e.name){let s=String(e.name).toLowerCase();o=o.filter(a=>String(a.name||"").toLowerCase()===s)}let i=Number(e.limit);return Number.isFinite(i)&&i>0&&(o=o.slice(0,i)),{provider:"solend-lending",chain:"solana-mainnet-beta",scope:e.scope||"default",count:o.length,markets:o}}async function aU(e={},t={}){let n=[];if(e.ids||e.reserves)n=(Array.isArray(e.ids||e.reserves)?e.ids||e.reserves:String(e.ids||e.reserves).split(",")).map(a=>oU(String(a).trim(),"reserve"));else{let s=oU(e.market||e.marketAddress||pne,"market"),c=(await ZS({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===s);if(!c)throw new Error(`solend-lending: market ${s} not found`);n=c.reserves.map(l=>l.address).filter(Boolean)}if(!n.length)throw new Error("solend-lending: no reserves to query");let r=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):50;n=n.slice(0,r);let o=await x(`${QS(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((s,a)=>({...hne(s),address:s.address||s.reserve?.address||n[a]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}var dne,pne,rU,fne,cU=_(()=>{q();dne="https://api.save.finance",pne="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",rU="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",fne=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/});function ev(e,t){let n;try{n=BigInt(e)}catch{throw new Error(`${t} must be a positive integer amount`)}if(n<=0n)throw new Error(`${t} must be a positive integer amount`);return n}function Ii(e,t,n,r){let o=Number(e);if(!Number.isInteger(o)||o<n||o>r)throw new Error(`${t} must be an integer between ${n} and ${r}`);return o}function Ul(e={}){if(!Number.isInteger(Number(e.chainId))||Number(e.chainId)<=0)throw new Error("strategy requires chainId");if(!String(e.tokenIn||"").trim()||!String(e.tokenOut||"").trim())throw new Error("strategy requires tokenIn and tokenOut");if(!String(e.taker||"").trim())throw new Error("strategy requires taker");return{chainId:Number(e.chainId),tokenIn:String(e.tokenIn),tokenOut:String(e.tokenOut),taker:String(e.taker),total:ev(e.amount,"amount")}}function tv(e,t){let n=t.map(s=>BigInt(s)),r=n.reduce((s,a)=>s+a,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(s=>e*s/r),i=e-o.reduce((s,a)=>s+a,0n);for(let s=0;i>0n;s=(s+1)%o.length)o[s]+=1n,i-=1n;return o}function Fl(e,t,n,r={}){return{kind:"execution-strategy-plan",strategy:t,chainId:e.chainId,tokenIn:e.tokenIn,tokenOut:e.tokenOut,taker:e.taker,totalAmount:String(e.total),slices:n,executable:!1,signs:!1,broadcasts:!1,requiresFreshQuotePerSlice:!0,requiresPolicyCheckPerSlice:!0,requiresSimulationPerSlice:!0,requiresUserConfirmationPerSlice:!0,receiptRequiredPerSlice:!0,...r}}function nv(e,t,n=Date.now()){let r=Math.floor(t/e.length);return e.map((o,i)=>({index:i+1,amount:String(o),offsetSec:i*r,executeAfter:new Date(n+i*r*1e3).toISOString()}))}function yne(e={},t={}){let n=Ul(e),r=Ii(e.slices??10,"slices",2,100),o=Ii(e.durationSec??3600,"durationSec",r,604800),i=tv(n.total,Array(r).fill(1));return Fl(n,"TWAP",nv(i,o,t.nowMs),{durationSec:o})}function bne(e={},t={}){let n=Ul(e);if(!Array.isArray(e.volumeProfile)||e.volumeProfile.length<2||e.volumeProfile.length>100)throw new Error("volumeProfile must contain 2-100 positive weights");let r=e.volumeProfile.map(c=>{let l=Number(c);if(!Number.isFinite(l)||l<=0)throw new Error("volumeProfile must contain positive weights");return BigInt(Math.round(l*1e6))}),o=Ii(e.durationSec??3600,"durationSec",r.length,604800),i=tv(n.total,r),s=r.reduce((c,l)=>c+l,0n),a=nv(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/s)}));return Fl(n,"VWAP",a,{durationSec:o,requiresLiveVolumeValidation:!0})}function wne(e={}){let t=Ul(e),n=Ii(e.participationBps,"participationBps",1,1e4);if(!Array.isArray(e.observedMarketVolumes)||e.observedMarketVolumes.length===0||e.observedMarketVolumes.length>100)throw new Error("observedMarketVolumes must contain 1-100 positive integer amounts");let r=t.total,o=[];for(let[i,s]of e.observedMarketVolumes.entries()){let a=ev(s,"observedMarketVolumes"),c=a*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(a)}),r-=l,r===0n)break}return Fl(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function Sne(e={}){let t=Ul(e),n=ev(e.displayAmount,"displayAmount");if(n>t.total)throw new Error("displayAmount cannot exceed total amount");let r=[],o=t.total;for(;o>0n;){if(r.length>=100)throw new Error("iceberg requires more than 100 refills");let i=o>n?n:o;r.push({index:r.length+1,amount:String(i),displayAmount:String(n)}),o-=i}return Fl(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function vne(e={},t={}){let n=Ul(e),r=Ii(e.slices??10,"slices",2,100),o=Ii(e.durationSec??3600,"durationSec",r,604800),i=Ii(e.urgencyBps??5e3,"urgencyBps",1,1e4),s=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),a=tv(n.total,s);return Fl(n,"IS",nv(a,o,t.nowMs),{durationSec:o,urgencyBps:i})}function lU(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return yne(e,t);if(n==="VWAP")return bne(e,t);if(n==="POV")return wne(e,t);if(n==="ICEBERG")return Sne(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return vne(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function uU(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var dU=_(()=>{});import{TypedDataEncoder as xne,getAddress as Ane,isAddress as Ine}from"ethers";function Vf(e,t){let n=String(e||"").trim();if(!Ine(n))throw new Error(`limit-order: ${t} must be an address`);return Ane(n)}function ov(e,t){let n=String(e??"").trim();if(!fU.test(n))throw new Error(`limit-order: ${t} must be a canonical integer`);if(n==="0")throw new Error(`limit-order: ${t} must be positive`);return n}function mU(){return{ok:!0,provider:"limit-order",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["evm-order"],note:"capability only \u2014 1inch LOP v4 posts after owner Allow on the loopback signer"}}function kne(e){let t=Number(e),n=pU[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function _ne(e){let t=Number(e);if(!pU[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function One(e={}){let t=Vf(e.maker,"maker"),n=e.receiver?Vf(e.receiver,"receiver"):t,r=Vf(e.makerAsset,"makerAsset"),o=Vf(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=ov(e.makingAmount,"makingAmount"),s=ov(e.takingAmount,"takingAmount"),a=ov(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!fU.test(c))throw new Error("limit-order: makerTraits must be a canonical integer");return Object.freeze({salt:a,maker:t,receiver:n,makerAsset:r,takerAsset:o,makingAmount:i,takingAmount:s,makerTraits:c})}function hU(e={},t={}){let n=Number(e.chainId),r=kne(n),o=One(e),i={types:rv,domain:r,primaryType:"Order",message:o},s=xne.hash(r,rv,o),a=Number(t.nowMs??Date.now()),c=Number(e.expiresAtMs??a+15*6e4);return Object.freeze({tradeId:`1inch:${n}:${s.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:o.maker,destination:"1inch-lop",chainId:n,expiresAtMs:c,slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"1inch-limit",chainId:n,submitTo:_ne(n),domain:r,types:rv,message:o,typedData:i,digest:s})})}function gU(e={},t={}){let n=hU(e,t);return U({provider:"limit-order",kind:"typed-data-order",chainId:n.chainId,artifactKind:"TYPED_DATA_ORDER",venue:"1inch-lop-v4",typedData:n.artifact.typedData,digest:n.artifact.digest,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["evm-order"],envelope:n},{nowMs:t.nowMs,env:t.env})}async function yU(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Lu(),Ru)),r=hU(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}var pU,rv,fU,bU=_(()=>{oe();pU=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),rv=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]}),fU=/^(?:0|[1-9][0-9]*)$/});function iv(e,t){let n=String(e||"").trim();if(!Tne.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function Pne(e,t){let n=String(e??"").trim();if(!Cne.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function wU(){return{ok:!0,provider:"jupiter-dca",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["sol"],note:"capability only \u2014 one-shot Jupiter tx submits after owner Allow"}}function SU(e={}){let t=iv(e.owner,"owner"),n=iv(e.inputMint,"inputMint"),r=iv(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=Pne(e.inAmount,"inAmount"),i=Number(e.slices??1);if(!Number.isInteger(i)||i<1||i>365)throw new Error("jupiter-dca: slices must be 1-365");let s=Number(e.intervalSeconds??86400);if(!Number.isInteger(s)||s<60||s>720*3600)throw new Error("jupiter-dca: intervalSeconds out of range");let a=(BigInt(o)/BigInt(i)).toString();if(a==="0")throw new Error("jupiter-dca: inAmount too small for slice count");return Object.freeze({kind:i===1?"limit":"dca",owner:t,inputMint:n,outputMint:r,inAmount:o,slices:i,intervalSeconds:s,perSlice:a})}function vU(e={},t={}){let n=SU(e);if(!e.unsignedTx)throw new Error("jupiter-dca: unsignedTx required to arm");if(n.slices!==1)throw new Error("jupiter-dca: armed submit is one-shot (slices=1)");let r=Number(t.nowMs??Date.now()),o=ac({inputMint:n.inputMint,outputMint:n.outputMint,inAmount:n.inAmount,outAmount:e.outAmount,otherAmountThreshold:e.otherAmountThreshold,slippageBps:e.slippageBps??50},{quotedAtMs:r,ttlMs:e.ttlMs});return By({userPublicKey:n.owner,guard:o,swapTransaction:e.unsignedTx,args:{cluster:e.cluster||"mainnet",jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports,tradeId:e.tradeId},response:{prioritizationFeeLamports:0,jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports}})}function EU(e={},t={}){let n=SU(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=vU(e,t)),U({provider:"jupiter-dca",kind:n.kind==="limit"?"solana-limit":"solana-dca",chain:"solana",artifactKind:"SOLANA_VERSIONED_TX",plan:n,unsignedTx:e.unsignedTx||null,envelope:r,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["sol"],note:r?"sol envelope ready \u2014 queue and Allow to submit":"plan only; attach unsignedTx + outAmount with slices=1 to arm"},{nowMs:t.nowMs,env:t.env})}async function xU(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Lu(),Ru)),r=vU(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}var Tne,Cne,AU=_(()=>{oe();Dy();Tne=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,Cne=/^(?:0|[1-9][0-9]*)$/});function ta(e,t={}){return{ok:!0,provider:Lne,op:e,alertOnly:!0,execution:Mne,exec:!1,...t}}function Mt(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function ql(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):x(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function Wf(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function Gne(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return Wne.test(r)||Mt("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=Wf(e.symbol),n=jne[t];return n||Mt("unknown symbol",t),n}function Kne(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=Wf(e.symbol);return Hne[t]||`coingecko:${t.toLowerCase()}`}function kU(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&Mt("thresholdBps must be a non-negative number"),n}function Yne(e){let t=Array.isArray(e?.parsed)?e.parsed[0]:e?.price?e:null,n=Number(t?.price?.price),r=Number(t?.price?.expo);return(!Number.isFinite(n)||!Number.isFinite(r))&&Mt("no pyth price returned"),r<0?n/10**-r:n*10**r}function Xne(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function Jne(e,t={}){let n=String(t.pythBaseUrl||Bne).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function Qne(e,t={}){return`${String(t.llamaCoinsBaseUrl||Dne).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function _U(e,t){let n=Gne(e),r=await ql(Jne(n,t),t),o=Yne(r);return o>0||Mt("pyth price must be positive"),{id:n,price:o}}async function OU(e,t){let n=Kne(e),r=await ql(Qne(n,t),t);return{coin:n,price:Xne(r,n)}}function NU(){return ta("health",{ok:!0,ops:[...$ne],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function sv(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&Mt("peg must be a positive number");let r=kU(e,50),o=await _U(e,t),i=Math.round(Math.abs(o.price-n)*1e4),s={required:!1,llamaPrice:null};try{let a=await OU(e,t);s={required:!1,llamaPrice:a.price,llamaCoin:a.coin}}catch{s={required:!1,llamaPrice:null}}return ta("depeg",{symbol:Wf(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:s})}async function av(e={},t={}){let n=kU(e,100),r=await _U(e,t),o=await OU(e,t);o.price>0||Mt("llama price required for oracleDeviation");let i=(r.price+o.price)/2,s=Math.round(Math.abs(r.price-o.price)/i*1e4);return ta("oracleDeviation",{symbol:Wf(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:s,alert:s>n})}function Zne(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function ere(e,t){return{id:Zne(e,t),name:String(e.name||e.protocol||"unknown"),classification:e.classification?String(e.classification):null,technique:e.technique?String(e.technique):null,amount:Number.isFinite(Number(e.amount))?Number(e.amount):null,chain:Array.isArray(e.chain)?e.chain.map(String):e.chain?[String(e.chain)]:[],source:e.source?String(e.source):null}}function tre(e){return(String(e).match(/<item\b[\s\S]*?<\/item>/gi)||[]).map((n,r)=>{let o=i=>{let s=n.match(new RegExp(`<${i}[^>]*>([\\s\\S]*?)</${i}>`,"i"));return s?s[1].replace(/<!\[CDATA\[|\]\]>/g,"").trim():""};return{id:o("guid")||o("link")||o("title")||`rss-${r}`,name:o("title")||"unknown",classification:"rss",technique:null,amount:null,chain:[],source:o("link")||null}})}function TU(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return tre(t);try{return TU(JSON.parse(t))}catch{Mt("exploitFeed payload is not JSON or RSS")}}return Array.isArray(e)?e:Array.isArray(e?.hacks)?e.hacks:Array.isArray(e?.items)?e.items:[]}function nre(e){return e.map((t,n)=>({item:t,index:n})).sort((t,n)=>{let r=String(t.item.id).localeCompare(String(n.item.id));return r!==0?r:t.index-n.index}).map(t=>t.item)}async function cv(e={},t={}){let n=Une,r=e.payload??await ql(n,t),o=nre(TU(r).map(ere));return ta("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function rre(e){return e===!0||e===1||e==="1"}function ore(e,t){let n=e?.result&&typeof e.result=="object"?e.result:e,r=String(t).toLowerCase();if(n&&typeof n=="object"){for(let[o,i]of Object.entries(n))if(String(o).toLowerCase()===r&&i&&typeof i=="object")return{address:o,token:i}}return null}async function lv(e={},t={}){e.asSoleGate===!0&&Mt("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();Vne.test(n)||Mt("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&Mt("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||Fne).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,s=e.payload??await ql(i,t),a=ore(s,n);a||Mt("goplus returned no result for",n);let c=zne.filter(l=>rre(a.token[l]));return ta("goplus",{chainId:r,address:n.toLowerCase(),role:"second-opinion",secondOpinion:!0,soleGate:!1,neverSoleGate:!0,token:{address:a.address,name:a.token.token_name||null,symbol:a.token.token_symbol||null},findings:c,alert:c.length>0,note:"second opinion only \u2014 never the sole gate"})}function ire(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&Mt("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function sre(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||Mt("position healthFactor required");let r=ire(n);return{id:String(e.id||e.protocol||`pos-${t}`),protocol:String(e.protocol||"unknown"),healthFactor:n,collateralUsd:e.collateralUsd!=null?Number(e.collateralUsd):null,debtUsd:e.debtUsd!=null?Number(e.debtUsd):null,rung:r}}async function uv(e={},t={}){let n=null;if(Array.isArray(e.positions))n=e;else if(Array.isArray(e))n={positions:e};else{let s=String(e.user||"").trim();s||Mt("liquidationLadder requires user or positions");let a=String(t.aaveUrl||`${qne}/${s}`);n=await ql(a,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(sre),i=o.reduce((s,a)=>s?IU[a.rung]<IU[s]?a.rung:s:a.rung,null);return ta("liquidationLadder",{user:n?.user||e.user||null,chainId:n?.chainId??e.chainId??null,ladder:o,worstRung:i,alert:o.some(s=>s.rung!=="healthy")})}var Lne,Mne,$ne,Bne,Dne,Une,Fne,qne,jne,Hne,zne,IU,Vne,Wne,ibe,CU=_(()=>{q();Lne="protective-monitors",Mne="read-only",$ne=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),Bne="https://hermes.pyth.network",Dne="https://coins.llama.fi",Une="https://api.llama.fi/hacks",Fne="https://api.gopluslabs.io/api/v1/token_security",qne="https://api.v3.aave.com/user",jne=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),Hne=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),zne=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),IU=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),Vne=/^0x[0-9a-fA-F]{40}$/,Wne=/^[0-9a-fA-F]{64}$/;ibe=Object.freeze({depeg:sv,oracleDeviation:av,exploitFeed:cv,goplus:lv,liquidationLadder:uv})});import{existsSync as cre,readFileSync as lre}from"node:fs";import{dirname as ure,join as PU}from"node:path";import{fileURLToPath as dre}from"node:url";function LU(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...RU],note:"Public payload/fixture scan. CEX legs never live-call. Missing venue is FAILED, never 0-funding."}}function Dn(e){if(e==null||e==="")return null;let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function mre(e){let t=Dn(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function hre(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=Dn(t[e]);if(n!=null&&n>=0)return n}return Dn(pre[e])}function pv(e){let t=String(e||"").trim().toUpperCase();return t?(t=t.replace(/[-_]/g,""),t.endsWith("USDT")||t.endsWith("USDC")?t.slice(0,-4):t.endsWith("USD")?t.slice(0,-3):t):""}function gre({venue:e,coin:t,hourly:n,feeDragBps:r}){let o=Dn(n),i=Dn(r);if(!e||!t||o==null||i==null||i<0)throw new Error("funding-scanner: unified row requires venue, coin, hourly, feeDragBps");let s=mre(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:s,feeDragBps:i,netAnnualizedPct:s-i/100,quality:Gf.OK})}function dv(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:Dn(n),netAnnualizedPct:null,quality:Gf.FAILED,error:String(t||"missing venue")})}function yre(e){let t=Array.isArray(e?.[0]?.universe)?e[0].universe:[],n=Array.isArray(e?.[1])?e[1]:[],r=[];for(let o=0;o<t.length;o+=1){let i=pv(t[o]?.name),s=Dn(n[o]?.funding);!i||s==null||r.push({venue:"hl",coin:i,hourly:s})}return r}function bre(e){let t=e?.markets,n=Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[],r=[];for(let o of n){let i=pv(o?.ticker||o?.market||o?.symbol),s=Dn(o?.nextFundingRate??o?.fundingRate);!i||s==null||o?.status&&String(o.status).toUpperCase()!=="ACTIVE"||r.push({venue:"dydx",coin:i,hourly:s})}return r}function wre(e){if(Array.isArray(e))return{intervalHours:null,entries:e};if(e&&typeof e=="object"){let t=Array.isArray(e.premiumIndex)?e.premiumIndex:Array.isArray(e.data)?e.data:[];return{intervalHours:Dn(e.fundingIntervalHours),entries:t}}return{intervalHours:null,entries:[]}}function Sre(e){let{intervalHours:t,entries:n}=wre(e),r=[];for(let o of n){let i=pv(o?.symbol||o?.pair),s=Dn(o?.fundingIntervalHours)??t,a=Dn(o?.lastFundingRate??o?.lastFundingRatePeriod??o?.fundingRate);!i||a==null||!(s>0)||r.push({venue:"binance",coin:i,hourly:a/s})}return r}function Ere(e,t){let n=PU(e,`${t}.json`);if(!cre(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(lre(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function xre(e,t,n){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];return r==null?{missing:!0,error:`missing venue payload: ${e}`}:{payload:r}}return Ere(n,e)}function Are(e,t){let n=vre[e];if(!n)return{error:`no public parser for venue ${e}`};try{return{parsed:n(t)}}catch(r){return{error:String(r.message||r)}}}function Ire(e,t){let n=e.quality===Gf.FAILED||e.netAnnualizedPct==null,r=t.quality===Gf.FAILED||t.netAnnualizedPct==null;if(n!==r)return n?1:-1;if(!n&&e.netAnnualizedPct!==t.netAnnualizedPct)return t.netAnnualizedPct-e.netAnnualizedPct;let o=String(e.venue).localeCompare(String(t.venue));return o||String(e.coin||"").localeCompare(String(t.coin||""))}function MU(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:RU).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||fre,i=e.feeDragBps||t.feeDragBps||null,s=[];for(let a of n){let c=hre(a,i),l=xre(a,r,o);if(l.missing){s.push(dv(a,l.error,c));continue}let u=Are(a,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){s.push(dv(a,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{s.push(gre({venue:a,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){s.push(dv(a,p.message,c))}}return s.sort(Ire),Object.freeze({ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",live:!1,rankedOn:"net-after-fees",count:s.length,rows:Object.freeze(s)})}var Gf,pre,RU,fre,vre,$U=_(()=>{Gf=Object.freeze({OK:"OK",FAILED:"FAILED"}),pre=Object.freeze({hl:9,dydx:10,binance:8}),RU=Object.freeze(["hl","dydx","binance"]),fre=PU(ure(dre(import.meta.url)),"../../../fixtures/funding-scanner");vre=Object.freeze({hl:yre,dydx:bre,binance:Sre})});function jl(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ore(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function BU(e=50,t={}){try{let n=await x(`${_re}/v4/perpetualMarkets?limit=${e}`,t);return Ore(n).map(o=>{let i=jl(o?.nextFundingRate),s=jl(o?.oraclePrice),a=jl(o?.openInterest),c=jl(o?.volume24H),l=jl(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:s,oraclePx:s,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:a,dayNtlVolumeUsd:c,change24hPct:s&&l!=null?l/s*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}var _re,DU=_(()=>{q();_re="https://indexer.dydx.trade"});async function FU(e={}){try{let n=(await x(`${Nre}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:UU,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${UU} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var Nre,UU,qU=_(()=>{q();Nre="https://dlob.drift.trade",UU="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified."});async function HU(e={}){try{let n=(await x(`${Tre}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:jU,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${jU} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}var Tre,jU,zU=_(()=>{q();Tre="https://gateway.prod.vertexprotocol.com/v2",jU="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified."});async function VU(e={}){try{return(await x(`${Cre}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}var Cre,WU=_(()=>{q();Cre="https://api.aevo.xyz"});function KU(){return{ok:!0,provider:"perp-universal",execution:"prepare-only",exec:!1,signed:!1,broadcast:!1,venues:[...GU],note:"fundingAll ranks LIVE rows by |APR|. FAILED venues stay in failed[]. prepareOrder is unsigned."}}function Kf(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Io(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function Hl({venue:e,coin:t,markPx:n,fundingRateAprPct:r,dayNtlVolumeUsd:o,extra:i={}}){let s=String(t||"").replace(/[-_]/g,"").replace(/USDT$|USDC$|USD$/,"");return Object.freeze({venue:e,coin:s,markPx:Kf(n),fundingRateAprPct:Kf(r),dayNtlVolumeUsd:Kf(o),quality:"LIVE",...i})}async function Pre(e,t){try{let n=await t();return n&&n.quality==="FAILED"?Io(e,n.error||"FAILED"):n}catch(n){return Io(e,n.message||n)}}async function Rre(e={}){return{venue:"hl",quality:"LIVE",markets:((await As({},e)).markets||[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Hl({venue:"hl",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd,extra:{openInterestUsd:r.openInterestUsd??null,change24hPct:r.change24hPct??null}}))}}async function Lre(e={}){let t=await BU(50,e);return t?.quality==="FAILED"||t?.error?Io("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Hl({venue:"dydx",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd}))}}async function Mre(e={}){let t=await lo({chainId:42161},e);return!Array.isArray(t)||t.length===0?Io("gmx","gmx tickers empty or not an array"):{venue:"gmx",quality:"LIVE",markets:t.map(r=>{let o=r.tokenSymbol||r.symbol||r.tokenAddress||"",i=Kf(r.fundingRate??r.funding??r.borrowingRateLong);return Hl({venue:"gmx",coin:o,markPx:r.maxPrice??r.minPrice??r.price,fundingRateAprPct:i==null?null:Math.abs(i)<1?i*24*365*100:i,dayNtlVolumeUsd:null,extra:{quality:i==null?"PARTIAL":"LIVE",note:i==null?"price live; funding not on ticker":void 0}})}).filter(r=>r.coin)}}async function $re(e={}){let t=await FU(e);return t?.quality==="FAILED"||t?.error?Io("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function Bre(e={}){let t=await HU(e);return t?.quality==="FAILED"||t?.error?Io("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function Dre(e={}){let t=await Ik(e);return t?.error?Io("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(r=>Hl({venue:"lighter",coin:r.coin||r.symbol,markPx:r.markPx,fundingRateAprPct:r.fundingAprPct,dayNtlVolumeUsd:null,extra:{marketIndex:r.marketIndex??null}})).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}async function Ure(e={}){let t=await VU(e);return t?.error?Io("aevo",t.error):{venue:"aevo",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>String(r.type||"").toLowerCase()==="perpetual"&&r.instrument).map(r=>{let o=String(r.instrument).split("-")[0],i=r.fundingRate==null?null:Number(String(r.fundingRate).replace("%",""));return Hl({venue:"aevo",coin:o,markPx:r.markPrice,fundingRateAprPct:Number.isFinite(i)?i*24*365:null,dayNtlVolumeUsd:r.volume24h})}).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}async function YU(e={},t={}){let n=Array.isArray(e.venues)&&e.venues.length?e.venues.map(l=>String(l).toLowerCase()).filter(l=>fv[l]):[...GU],r=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),i=t.readers||fv,s=await Promise.all(n.map(l=>Pre(l,()=>(i[l]||fv[l])(t)))),a=s.filter(l=>l.quality==="FAILED"),c=s.filter(l=>l.quality!=="FAILED").flatMap(l=>l.markets||[]).filter(l=>l.fundingRateAprPct!=null);return r&&(c=c.filter(l=>l.coin===r)),c.sort((l,u)=>Math.abs(u.fundingRateAprPct)-Math.abs(l.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:c.slice(0,o),failed:a,venuesTried:n,sourcesAnswered:s.filter(l=>l.quality!=="FAILED").length,sourcesTried:n.length,custody:"prepare-only"})}async function XU(e={},t={}){let n=String(e.venue||"hl").toLowerCase(),r=String(e.coin||e.symbol||"").toUpperCase(),o=String(e.side||"").toLowerCase(),i=o==="long"||o==="buy"?"buy":o==="short"||o==="sell"?"sell":null;if(!r)return{ok:!1,failureKind:"missing-coin",venue:n,unsigned:!0,broadcast:!1};if(!i)return{ok:!1,failureKind:"missing-side",venue:n,coin:r,unsigned:!0,broadcast:!1,note:"side must be long|short|buy|sell"};if(n==="dydx"||n==="drift"||n==="vertex")return{ok:!1,failureKind:"read-only-venue",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:`${n} is read-only until a grant-bound decoder exists. Use venue=hl for an unsigned ticket.`};if(n==="gmx"){if(!e.account&&!e.recipient)return{ok:!1,failureKind:"missing-account",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"gmx prepare needs account"};let c=await yp({...e,coin:r,side:i},t);return U({ok:!0,venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,artifact:c},{provider:"perp-universal",kind:"perp-order"})}if(n!=="hl")return{ok:!1,failureKind:"unknown-venue",venue:n,coin:r,unsigned:!0,broadcast:!1};let s=e.size??e.sz;if(s==null||Number(s)<=0)return{ok:!1,failureKind:"missing-size",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"HL prepare needs a positive size (coin units). Reply: arm long|short COIN <size>"};let a=await Qr({coin:r,side:i,size:String(s),type:e.type||"market",maxSlippageBps:e.maxSlippageBps??50,reduceOnly:e.reduceOnly===!0},t);return U({ok:!0,venue:"hl",coin:r,side:i,unsigned:!0,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,artifact:a,note:"Unsigned. Allow/Deny still required. Nothing broadcast."},{provider:"perp-universal",kind:"perp-order"})}var GU,fv,JU=_(()=>{oe();Db();ec();DU();qU();zU();bp();WU();xy();GU=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);fv={hl:Rre,lighter:Dre,gmx:Mre,dydx:Lre,aevo:Ure,drift:$re,vertex:Bre}});function Yf(e){return Math.exp(-.5*e*e)/qre}function jre(e){let t=.254829592,n=-.284496736,r=1.421413741,o=-1.453152027,i=1.061405429,s=.3275911,a=e<0?-1:1,c=1/(1+s*Math.abs(e)),l=1-((((i*c+o)*c+r)*c+n)*c+t)*c*Math.exp(-e*e);return a*l}function ko(e){return .5*(1+jre(e/Math.SQRT2))}function QU({spot:e,strike:t,rate:n=0,vol:r,years:o,kind:i="call"}){let s=Number(e),a=Number(t),c=Number(n),l=Number(r),u=Number(o);if(!(s>0)||!(a>0)||!(l>0)||!(u>0))throw new Error("greeks: spot, strike, vol, years must be > 0");let d=Math.sqrt(u),p=(Math.log(s/a)+(c+.5*l*l)*u)/(l*d),m=p-l*d,f=Math.exp(-c*u),h=s*ko(p)-a*f*ko(m),g=a*f*ko(-m)-s*ko(-p),y=i==="put"?g:h,b=i==="put"?ko(p)-1:ko(p),w=Yf(p)/(s*l*d),S=s*Yf(p)*d/100,v=i==="put"?(-(s*Yf(p)*l)/(2*d)+c*a*f*ko(-m))/365:(-(s*Yf(p)*l)/(2*d)-c*a*f*ko(m))/365;return Object.freeze({kind:i,price:y,delta:b,gamma:w,vega:S,theta:v,d1:p,d2:m})}var qre,ZU=_(()=>{qre=Math.sqrt(2*Math.PI)});function eF(){return{ok:!0,provider:"onchain-options",exec:!1,execution:"read-only",note:"Ranks listed options with local Black-Scholes. No arm until official Derive/Lyra domain is pinned."}}function Xf(e=[],{spot:t,rate:n=0,nowMs:r=Date.now()}={}){if(!(Number(t)>0))throw new Error("onchain-options: spot required");let o=[];for(let i of Array.isArray(e)?e:[]){let s=Number(i.strike),a=Number(i.expiryMs),c=Number(i.mark),l=i.kind==="put"?"put":"call";if(!(s>0)||!(a>r)||!(c>0))continue;let u=(a-r)/(365.25*24*3600*1e3),d=Number(i.iv);d>0||(d=.5);let p=QU({spot:t,strike:s,rate:n,vol:d,years:u,kind:l});o.push(Object.freeze({venue:String(i.venue||"unknown"),instrument:String(i.instrument||`${l}-${s}`),kind:l,strike:s,expiryMs:a,mark:c,model:p.price,edgeBps:Math.round((p.price-c)/c*1e4),delta:p.delta,gamma:p.gamma,vega:p.vega}))}return o.sort((i,s)=>s.edgeBps-i.edgeBps),Object.freeze({ok:!0,execution:"read-only",exec:!1,spot:Number(t),count:o.length,rows:Object.freeze(o)})}var Obe,mv=_(()=>{ZU();Obe=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"])});function tF(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function zl(e){return String(e||"").trim().toLowerCase()}function zre(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function nF({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=zl(d.from),m=zl(d.to),f=Number(d.amount);!(f>0)||!p||!m||(r.set(p,(r.get(p)||0)-f),r.set(m,(r.get(m)||0)+f))}let o=[...r.entries()].filter(([,d])=>d>0).sort((d,p)=>p[1]-d[1]),i=Number(n)>0?Number(n):o.reduce((d,[,p])=>d+p,0),s=i>0?o.map(([,d])=>d/i):[],a=zre(s),c=new Map;for(let d of t){let p=zl(d.funder),m=zl(d.wallet);!p||!m||(c.has(p)||c.set(p,new Set),c.get(p).add(m))}let l=[...c.entries()].map(([d,p])=>({funder:d,size:p.size,wallets:[...p].sort()})).filter(d=>d.size>=2).sort((d,p)=>p.size-d.size),u=t[0]?zl(t[0].funder):null;return Object.freeze({ok:!0,execution:"read-only",exec:!1,holderCount:o.length,topShare:s[0]??0,hhi:a,concentrated:a>=.15,clusterCount:l.length,largestCluster:l[0]?.size??0,firstFunder:u,clusters:Object.freeze(l.slice(0,20))})}var rF=_(()=>{});import{base58 as oF}from"@scure/base";function iF(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)||to(e))return!1;try{let i=oF.decode(e);return i.length===r&&(!o||!no(i))&&oF.encode(i)===e}catch{return!1}}function Jf(e){return iF(e,32,44,32)}function Qf(e){return iF(e,64,88,64,!0)}var hv=_(()=>{ro()});import{types as lF}from"node:util";function Yre(e){return e&&Object.hasOwn(e,"value")&&e.value===void 0&&e.enumerable===!1}function uF(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")&&uF(r.value,t)}return Object.hasOwn(e,"toJSON")||Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e),e}function ve(e){throw new yv(e)}function dF(e,t){return(!e||typeof e!="object"||lF.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ve(`${t} must be a plain object`),e}function Zf(e,t,n){dF(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&ve(`${n} fields are invalid`);let o=Object.getOwnPropertyNames(e).filter(s=>{if(s!=="toJSON")return!0;let a=Object.getOwnPropertyDescriptor(e,s);return Yre(a)||ve(`${n}.toJSON is invalid`),!1}),i=t.filter(s=>!Object.hasOwn(e,s));(o.length!==t.length||o.some(s=>!r.has(s))||i.length)&&ve(`${n} fields are invalid`);for(let s of o){let a=Object.getOwnPropertyDescriptor(e,s);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&ve(`${n} fields must be enumerable own data`)}}function It(e,t,n){let r=e&&typeof e=="object"?Object.getOwnPropertyDescriptor(e,t):null;return(!r||!Object.hasOwn(r,"value"))&&ve(`${n} fields must be own data`),r.value}function Or(e,t,n){return(typeof e!="string"||e.length===0||e.length>n||/[\u0000-\u001f\u007f]/u.test(e))&&ve(`${t} is invalid`),e}function aF(e){if(Number.isSafeInteger(e)&&e>0)return e;let t=Or(e,"chain",96);return(/:\/\//u.test(t)||/^[0-9a-f]{64}$/iu.test(t)||je(t))&&ve("chain is invalid"),t}function Xre(e){return e===e.toLowerCase()||e===e.toUpperCase()}function Jre(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 Qre(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||Jre(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function cF(e,t,n){let r=Or(n,"address",256);if(e==="evm")return(!Number.isSafeInteger(t)||!/^0x[0-9a-f]{40}$/iu.test(r))&&ve("address is invalid for the cursor family"),r.toLowerCase();if(e==="solana")return(t!=="mainnet-beta"||!Jf(r))&&ve("address is invalid for the cursor family"),r;if(e==="bitcoin"){let o=/^(?:bc1|tb1)[a-z0-9]{20,90}$/iu.test(r)&&Xre(r),i=/^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(r),s=t==="mainnet"?/^bc1/iu.test(r)||/^[13]/u.test(r):t==="testnet"&&(/^tb1/iu.test(r)||/^[mn2]/u.test(r));return(!o&&!i||!s)&&ve("address is invalid for the cursor family"),o?r.toLowerCase():r}if(e==="ton"){let o=t==="ton-mainnet"?Qre(r):null;return o||ve("address is invalid for the cursor family"),o}ve("family does not support cursors")}function Zre(e){Zf(e,Kre,"EVM payload");let t=It(e,"block_number","cursor"),n=It(e,"index","cursor");return(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0)&&ve("EVM payload values are invalid"),{block_number:t,index:n}}function eoe(e){Zf(e,["lt","hash"],"TON payload");let t=Or(It(e,"lt","cursor"),"TON payload.lt",40),n=Or(It(e,"hash","cursor"),"TON payload.hash",128);(!/^\d+$/u.test(t)||!/^[A-Za-z0-9+/_-]{43}=?$/u.test(n)||to(n))&&ve("TON payload is invalid");let r=Buffer.from(n.replace(/-/g,"+").replace(/_/g,"/"),"base64");(r.length!==32||no(r))&&ve("TON payload is invalid");let o=r.toString("base64");return{lt:t,hash:o}}function toe(e,t){if(e==="evm")return Zre(t);if(e==="ton")return eoe(t);let n=Or(t,"payload",256);return e==="bitcoin"&&!/^[0-9a-f]{64}$/iu.test(n)&&ve("Bitcoin payload must be a transaction id"),e==="solana"&&!Qf(n)&&ve("Solana payload must be a signature"),["bitcoin","solana"].includes(e)||ve(`${e} does not support cursors`),n}function noe(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"||lF.isProxy(r))&&ve("envelope is not own-data JSON"),Array.isArray(r)){let i=[];for(let s=0;s<r.length;s+=1){let a=Object.getOwnPropertyDescriptor(r,String(s));(!a||!Object.hasOwn(a,"value"))&&ve("envelope is not own-data JSON"),i.push(t(a.value))}return`[${i.join(",")}]`}let o=[];for(let i of Object.keys(r))o.push(`${JSON.stringify(i)}:${t(It(r,i,"envelope"))}`);return`{${o.join(",")}}`},n=t(e);Buffer.byteLength(n,"utf8")>Wre&&ve("envelope exceeds the byte limit")}function na(e,t={}){if(e==null)return null;Zf(e,Gre,"envelope"),It(e,"schemaVersion","cursor")!==gv&&ve("schemaVersion is unsupported");let n=Or(It(e,"family","cursor"),"family",64).toLowerCase();(!/^[a-z][a-z0-9-]*$/u.test(n)||!Object.hasOwn(sF,n)||/^[0-9a-f]{64}$/iu.test(n)||je(n))&&ve("family is invalid");let r=aF(It(e,"chain","cursor"));(n==="evm"&&!Number.isSafeInteger(r)||n==="solana"&&r!=="mainnet-beta"||n==="bitcoin"&&!["mainnet","testnet"].includes(r)||n==="ton"&&r!=="ton-mainnet")&&ve("chain is invalid for the cursor family");let o=cF(n,r,It(e,"address","cursor")),i=Or(It(e,"provider","cursor"),"provider",64);(!/^[a-z][a-z0-9-]*$/u.test(i)||i!==sF[n]||je(i))&&ve("provider is invalid"),dF(t,"expected binding");let s=m=>Object.hasOwn(t,m)?It(t,m,"expected binding"):void 0,a=s("family")===void 0?void 0:Or(s("family"),"expected family",64).toLowerCase(),c=s("chain")===void 0?void 0:aF(s("chain")),l=s("address")===void 0?void 0:cF(n,r,s("address")),u=s("provider")===void 0?void 0:Or(s("provider"),"expected provider",64);a!==void 0&&n!==a&&ve("family binding does not match the request"),c!==void 0&&r!==c&&ve("chain binding does not match the request"),l!==void 0&&o!==l&&ve("address binding does not match the request"),u!==void 0&&i!==u&&ve("provider binding does not match the request");let d=toe(n,It(e,"payload","cursor")),p={schemaVersion:gv,family:n,chain:r,address:o,provider:i,payload:d};return noe(p),uF(p)}function pF(e,t){return Zf(e,["family","chain","address","provider"],"binding"),na({schemaVersion:gv,family:It(e,"family","binding"),chain:It(e,"chain","binding"),address:It(e,"address","binding"),provider:It(e,"provider","binding"),payload:t},e)}var gv,Wre,Gre,sF,Kre,yv,bv=_(()=>{ro();hv();gv="oracle.investigator-cursor/1",Wre=2*1024,Gre=Object.freeze(["schemaVersion","family","chain","address","provider","payload"]),sF=Object.freeze({evm:"blockscout",solana:"solana-rpc",bitcoin:"bitcoin-esplora",ton:"ton-public"}),Kre=Object.freeze(["block_number","index"]),yv=class extends Error{constructor(t){super(`onchain-investigator cursor: ${t}`),this.name="InvestigatorCursorError",this.code="invalid-cursor"}}});import{createHash as Sv}from"node:crypto";import{types as Wl}from"node:util";function _i(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))_i(t);return Object.defineProperty(e,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(e)}function G(e,t){throw new ki(e,t)}function nm(e,t){return(!e||typeof e!="object"||Wl.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&G(`${t} must be a plain object`,"invalid-object"),e}function kv(e,t,n){nm(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&G(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0)});(o.length>r.size||o.some(i=>!r.has(i)))&&G(`${n} has unknown field(s)`,"unknown-field");for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);(!s||!s.enumerable||!Object.hasOwn(s,"value"))&&G(`${n}.${i} must be enumerable own data`,"invalid-component")}return e}function bF(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!je(t)}function yoe(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 _v(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])||yoe(t.subarray(0,34))!==(t[34]<<8|t[35])?null:`${t[1]===0?"0":"-1"}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function boe(e){return _v(e)!==null}function Soe(e){let t=0n;for(let o of e){let i=woe.indexOf(o);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");return Buffer.concat([Buffer.alloc(e.length-e.replace(/^1+/u,"").length),r])}function voe(e){if(!/^V[a-km-zA-HJ-NP-Z1-9]{70,90}$/u.test(e))return!1;let t=Soe(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 Sv("sha256").update(Sv("sha256").update(n).digest()).digest().subarray(0,4).equals(t.subarray(-4))}function Eoe(e){return/^0x[0-9a-fA-F]{1,64}$/u.test(e)||/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)||Ff(e)||/^[13mn2PQGH][a-km-zA-HJ-NP-Z1-9]{25,44}$/u.test(e)||voe(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)||boe(e)}function xoe(e,t){return["address","inMessageDestinationAddress","inMessageSourceAddress"].includes(t)?Eoe(e):t==="coinType"?bF(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):gF.test(e)}function Ev(e,t,n){if(n>12&&G("value exceeds the freeze depth limit","data-limit"),t.nodes+=1,t.nodes>yF&&G("value exceeds the freeze node limit","data-limit"),e===null||["string","number","boolean","undefined"].includes(typeof e))return e;(typeof e!="object"||Wl.isProxy(e))&&G("value is not freezeable own-data JSON","invalid-component"),t.active.has(e)&&G("value is cyclic","invalid-component"),Object.getOwnPropertySymbols(e).length>0&&G("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)||G("array contains named or hidden fields","invalid-component"));t.fields+=e.length,t.fields>tm&&G("value exceeds the freeze field limit","data-limit");let a=new Array(e.length);for(let c=0;c<e.length;c+=1){let l=Object.getOwnPropertyDescriptor(e,String(c));(!l||!Object.hasOwn(l,"value"))&&G("array must contain dense own data","invalid-component"),Object.defineProperty(a,String(c),{value:Ev(l.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&&G("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"))&&G(`${a} must be enumerable own data`,"invalid-component")}let i=Object.keys(e);t.fields+=i.length,t.fields>tm&&G("value exceeds the freeze field limit","data-limit");let s=r===null?Object.create(null):{};for(let a of i){let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&G(`${a} must be an own data field`,"invalid-component"),Object.defineProperty(s,a,{value:Ev(c.value,t,n+1),enumerable:!0,configurable:!0,writable:!0})}return Object.defineProperty(s,"toJSON",{value:void 0,enumerable:!1}),Object.freeze(s)}finally{t.active.delete(e)}}function on(e){return Ev(e,{nodes:0,fields:0,active:new Set},0)}function $e(e,t){if(!e||!Object.hasOwn(e,t))return;let n=Object.getOwnPropertyDescriptor(e,t);return(!n||!Object.hasOwn(n,"value"))&&G(`${t} must be an own data field`,"invalid-component"),n.value}function xv(e,t,n){let r=t.filter(o=>!Object.hasOwn(e,o));r.length>0&&G(`${n} is missing required field(s): ${r.join(", ")}`,"unknown-field")}function wF(e,t,{max:n=hoe,allowPublicIdentifier:r=!1,publicIdentifierField:o=null,allowDeterministicRecordId:i=!1}={}){(typeof e!="string"||e.length===0||e.length>n||/[\x00-\x1f\x7f]/.test(e))&&G(`${t} must be a non-empty string no longer than ${n}`,"invalid-string");let s=(i&&coe.test(e)||r&&(gF.test(e)||bF(e))||o&&xoe(e,o))&&!aoe.test(e);return je(e)&&!s&&G(`${t} contains secret-shaped material`,"secret-material"),e}function Aoe(e,t){(!ioe.test(e)||/^[0-9a-f]{64}$/iu.test(e)||je(e))&&G(`${t} key is invalid`,"invalid-key");let n=e.replace(/[^a-z0-9]/gi,"").toLowerCase(),r=["auth","session","token"].some(o=>n.includes(o))&&!poe.has(n);return(doe.has(n)||r||foe.some(o=>n.includes(o)))&&G(`${t} key is forbidden because it may carry a secret`,"secret-material"),e}function im(e,t,n,r="data-limit"){Wl.isProxy(e)&&G(`${t} must not be a proxy`,"invalid-component"),Array.isArray(e)||G(`${t} must be an array`,"invalid-component"),e.length>n&&G(`${t} exceeds the array limit`,r);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){Object.hasOwn(e,i)||G(`${t} must contain dense own entries`,"invalid-component");let s=Object.getOwnPropertyDescriptor(e,String(i));(!s||!Object.hasOwn(s,"value"))&&G(`${t} entries must be own data`,"invalid-component"),o[i]=s.value}return o}function Av(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 Ioe(e){let t=Av(e,1);return typeof t=="string"&&soe.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 koe(e){let t=Av(e,1);return typeof t=="string"&&loe.has(t)?!0:Number.isInteger(t)&&uoe.has(Av(e,2))}function Vl(e,t,n,r,o){if(n>moe&&G(`${t} exceeds the nesting limit`,"data-limit"),r.nodes+=1,r.nodes>goe&&G(`${t} exceeds the cumulative node limit`,"data-limit"),typeof e=="string")return wF(e,t,{publicIdentifierField:Ioe(o),allowDeterministicRecordId:koe(o)});if(e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;(!e||typeof e!="object"||Wl.isProxy(e))&&G(`${t} must be own-data JSON`,"invalid-component"),Object.getOwnPropertySymbols(e).length>0&&G(`${t} contains symbol fields`,"invalid-component"),r.active.has(e)&&G(`${t} must not be cyclic`,"invalid-component"),r.active.add(e);try{if(Array.isArray(e))return e.length>fF&&G(`${t} exceeds the array limit`,"data-limit"),r.fields+=e.length,r.fields>vv&&G(`${t} exceeds the cumulative field limit`,"data-limit"),im(e,t,fF).map((a,c)=>Vl(a,`${t}[${c}]`,n+1,r,[...o,c]));nm(e,t);let i=Object.keys(e);i.length>om&&G(`${t} exceeds the field limit`,"data-limit"),r.fields+=i.length,r.fields>vv&&G(`${t} exceeds the cumulative field limit`,"data-limit"),i.sort();let s=[];for(let a of i){Aoe(a,t);let c=Object.getOwnPropertyDescriptor(e,a);(!c||!Object.hasOwn(c,"value"))&&G(`${t}.${a} must be an own data field`,"invalid-component"),s.push([a,Vl(c.value,`${t}.${a}`,n+1,r,[...o,a])])}return Object.fromEntries(s)}finally{r.active.delete(e)}}function Iv(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(n>8&&G("value exceeds canonical JSON depth","invalid-json"),r.nodes+=1,r.nodes>yF&&G("value exceeds canonical JSON node limit","invalid-json"),e&&(typeof e=="object"||typeof e=="function")&&Wl.isProxy(e)&&G("value is not canonical JSON","invalid-json"),e&&typeof e=="object"&&Object.getOwnPropertySymbols(e).length>0&&G("value contains symbol fields","invalid-json"),e&&typeof e=="object"){r.active.has(e)&&G("value is cyclic canonical JSON","invalid-json"),r.active.add(e);try{if(Array.isArray(e)){let c=im(e,"canonical value",Ze.evidence,"invalid-json");return r.fields+=c.length,r.fields>tm&&G("value exceeds canonical JSON field limit","invalid-json"),`[${c.map(l=>Iv(l,r,n+1)).join(",")}]`}let i=Object.getPrototypeOf(e);i!==Object.prototype&&i!==null&&G("value is not canonical JSON","invalid-json");let s=Object.keys(e);return s.length>om&&G("value exceeds canonical JSON object field limit","invalid-json"),r.fields+=s.length,r.fields>tm&&G("value exceeds canonical JSON field limit","invalid-json"),s.sort(),`{${s.map(c=>{let l=Object.getOwnPropertyDescriptor(e,c);return(!l||!Object.hasOwn(l,"value"))&&G("value is not canonical own-data JSON","invalid-json"),`${JSON.stringify(c)}:${Iv(l.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))&&G("value is not canonical JSON","invalid-json");let o=JSON.stringify(e);return o===void 0&&G("value is not canonical JSON","invalid-json"),o}function _o(e){return`sha256:${Sv("sha256").update(Iv(e)).digest("hex")}`}function Oo(e,t){let n=wF(e,"id kind",{max:24});return/^[a-z][a-z0-9-]*$/.test(n)||G("id kind must be a lowercase slug","invalid-id"),`${n}_${_o(t).slice(7)}`}function em(e,t,n,r){let o=im(e,t,n,"component-limit");return r.fields+=o.length,r.fields>vv&&G(`${t} exceeds the cumulative field limit`,"data-limit"),o.map((i,s)=>Vl(i,`${t}[${s}]`,0,r,[t,s]))}function Ov(e){let t=["subject","entities","events","evidence","coverage","gaps"];kv(e,t,"components"),xv(e,t,"components");let n={nodes:0,fields:0,active:new Set},r=Vl($e(e,"subject"),"subject",0,n,["subject"]),o=em($e(e,"entities"),"entities",An.maxNodes,n),i=em($e(e,"events"),"events",An.maxEdges,n),s=em($e(e,"evidence"),"evidence",Ze.evidence,n),a=Vl($e(e,"coverage"),"coverage",0,n,["coverage"]),c=em($e(e,"gaps"),"gaps",An.maxNodes,n);return on({subject:r,entities:o,events:i,evidence:s,coverage:a,gaps:c})}function Ooe(e,t,n){if(e===null)return null;if(kv(e,["requested","next"],"collector output.cursor"),(!Object.hasOwn(e,"requested")||!Object.hasOwn(e,"next"))&&G("collector output.cursor fields are invalid","invalid-cursor"),$e(e,"requested")===null&&$e(e,"next")===null)return{requested:null,next:null};(typeof n!="string"||n.length===0)&&G("collector cursor requires a source binding","invalid-cursor");let r={family:t.family,chain:t.chain,address:t.address,provider:n};try{return{requested:na($e(e,"requested"),r),next:na($e(e,"next"),r)}}catch{G("collector cursor binding or payload is invalid","invalid-cursor")}}function wv(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)&&G(`collector ${t} record is missing an id`,"invalid-reference"),n.has(r.id)&&G(`collector ${t} ids must be unique`,"invalid-reference"),n.add(r.id);return n}function Noe(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)&&G("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)&&G("collector coverage source is invalid","invalid-reference");let o=wv(e.entities,"entity");e.entities.some(s=>Object.hasOwn(s,"family")&&s.family===t.family&&Object.hasOwn(s,"chain")&&s.chain===t.chain&&Object.hasOwn(s,"address")&&s.address===t.address)||G("collector subject entity reference is missing","invalid-reference"),wv(e.events,"event");let i=wv(e.evidence,"evidence");for(let s of e.events){for(let a of["from","to"])(!Object.hasOwn(s,a)||s[a]!=null&&(typeof s[a]!="string"||!o.has(s[a])))&&G(`collector event ${a} reference is invalid`,"invalid-reference");(!Object.hasOwn(s,"evidenceRefs")||!Array.isArray(s.evidenceRefs)||s.evidenceRefs.some(a=>typeof a!="string"||!i.has(a))||new Set(s.evidenceRefs).size!==s.evidenceRefs.length)&&G("collector event evidence references are invalid","invalid-reference")}}function hF(e,t,n=om){let r=Object.keys(e);r.length>n&&G(`${t} exceeds the field limit`,"data-limit");let o=[];for(let i of r){let s=Object.getOwnPropertyDescriptor(e,i);(!s||!Object.hasOwn(s,"value"))&&G(`${t}.${i} must be an own data field`,"invalid-component"),o.push([i,s.value])}return Object.fromEntries(o)}function Nv(e){let t=["schemaVersion","execution","status","subject","entities","events","evidence","coverage","gaps","cursor"];kv(e,t,"collector output"),xv(e,t,"collector output"),$e(e,"schemaVersion")!==rm&&G("collector output.schemaVersion is unsupported","invalid-schema-version"),$e(e,"execution")!=="read-only"&&$e(e,"execution")!=="READ_ONLY"&&G("collector output must be read-only","invalid-posture"),_oe.has($e(e,"status"))||G("collector output.status is invalid","invalid-status"),Array.isArray($e(e,"evidence"))||G("collector output.evidence must be an array","invalid-component"),nm($e(e,"coverage"),"collector output.coverage");let n=Ov({subject:$e(e,"subject"),entities:$e(e,"entities"),events:$e(e,"events"),evidence:im($e(e,"evidence"),"collector output.evidence",An.maxEdges,"component-limit").map(o=>{nm(o,"collector evidence"),xv(o,["status"],"collector evidence");let i=$e(o,"status"),s=typeof i=="string"&&Object.hasOwn(mF,i)?mF[i]:null;return s||G("collector evidence status is invalid","invalid-status"),{...hF(o,"collector evidence"),status:s}}),coverage:{...hF($e(e,"coverage"),"collector coverage",om-1),collectorStatus:$e(e,"status")},gaps:$e(e,"gaps")});Noe(n);let r=Ooe($e(e,"cursor"),n.subject,n.coverage.source);return on({...n,cursor:r})}var rm,roe,Gl,ooe,An,qbe,Ze,jbe,Hbe,zbe,ioe,gF,soe,aoe,coe,loe,uoe,doe,poe,foe,om,fF,moe,hoe,goe,vv,yF,tm,ki,woe,mF,_oe,Kl=_(()=>{ro();jf();bv();rm="oracle.investigator-collection/1",roe=_i(["wallet","token","tx","launch"]),Gl=_i(["LIVE","INDEXED","DERIVED","UNKNOWN","UNAVAILABLE"]),ooe=_i(["COMPLETE","PARTIAL","UNKNOWN"]),An=_i({maxDepth:3,maxNodes:250,maxEdges:1e3}),qbe=_i({depth:2,nodes:100,edges:400}),Ze=_i({evidence:2e3,findings:250,gaps:250,dataArray:64,dataFields:32,dataDepth:5,dataNodes:262144,dataTotalFields:262144,string:512}),jbe=new Set(roe),Hbe=new Set(Gl),zbe=new Set(ooe),ioe=/^[A-Za-z][A-Za-z0-9_.-]{0,63}$/,gF=/^(?: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})$/,soe=new Set(["address","assetId","blockHash","blockId","coinType","denom","digest","evidenceHash","hash","ibcHash","inMessageDestinationAddress","inMessageSourceAddress","locator","signature","transactionHash","transactionId","txId","txid"]),aoe=/^(?:xprv|sk-|gh[pousr]_|github_pat_|AKIA|ASIA)/i,coe=/^(?:request|evidence|entity|event|finding|gap)_[0-9a-f]{64}$/u,loe=new Set(["id","requestId","entityId","nodeId","fromEntityId","toEntityId"]),uoe=new Set(["evidenceRefs","evidenceIds","nodeIds","edgeIds"]),doe=new Set(["auth","key","token","xapikey"]),poe=new Set(["feetoken","tokenaddress","tokenid","tokensymboluntrusted","tokentype"]),foe=Object.freeze(["authorization","apikey","accesskey","accesstoken","cookie","credential","password","passphrase","secret","privatekey","seed","mnemonic","keystore","bearer","refreshtoken","signer"]),om=32,fF=64,moe=5,hoe=512,goe=262144,vv=262144,yF=524288,tm=524288,ki=class extends Error{constructor(t,n="invalid-investigation"){super(`onchain-investigator: ${t}`),this.name="InvestigatorError",this.code=n}};woe="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";mF=Object.freeze({OBSERVED:"INDEXED",ERROR:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE",LIVE:"LIVE",INDEXED:"INDEXED",DERIVED:"DERIVED",UNKNOWN:"UNKNOWN"}),_oe=new Set(["COMPLETE","PARTIAL","UNKNOWN","UNAVAILABLE"])});import{types as Pv}from"node:util";function sn(e){return on(e)}function Coe(e){let t=typeof e=="string"||typeof e=="number"?String(e).trim().toLowerCase():"";return(Object.hasOwn(SF,t)?SF[t]:t)||"unsupported"}function fm(e){return qt(e)&&Object.getPrototypeOf(e)===Object.prototype}function Ie(e,t){return Nt(e,t)}function Pr(e){return qt(e)}function Cv(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(Pv.isProxy(e)||e.length>1e4)throw new Error("investigator collector: provider array exceeds the length bound");let o=new Array(e.length);for(let i=0;i<e.length;i+=1){if(!Object.hasOwn(e,i))throw new Error("investigator collector: provider array must contain dense own entries");let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: provider array entries must be own data");o[i]=Cv(s.value,t+1)}return o}if(!Pr(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 i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider row fields must be own data");r[o]=Cv(i.value,t+1)}return r}function Poe(e){if(!fm(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 Roe(e){if(!Pr(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(i=>!t.has(i)).length)throw new Error("investigator collector: internal options have unknown fields");let r=Ie(e,"fetchImpl"),o=Ie(e,"transports");if(r!==void 0&&typeof r!="function")throw new Error("investigator collector: fetchImpl must be a function");if(o!==void 0){if(!fm(o))throw new Error("investigator collector: transports must be a plain object");for(let i of Object.keys(o)){let s=Object.getOwnPropertyDescriptor(o,i);if(!s||!Object.hasOwn(s,"value")||typeof s.value!="function")throw new Error("investigator collector: transports must contain own data functions")}}}function Loe(e){let t=Ie(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 Moe(e,t,n){let r=Object.hasOwn(vF,t)?vF[t]:void 0,o=Object.hasOwn(EF,e)?EF[e]:void 0,i=n??r??o??"unspecified";if(e==="evm"){if(!Number.isSafeInteger(i)||i<1)throw new Error("investigator collector: EVM chainId must be a positive integer");return i}if(typeof i!="string"||i.length===0||i.length>96||/[\u0000-\u001f\u007f]/u.test(i)||/:\/\//u.test(i)||/^[0-9a-f]{64}$/iu.test(i)||je(i))throw new Error("investigator collector: chainId is invalid");return i}function am(e){return e===e.toLowerCase()||e===e.toUpperCase()}function $oe(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 _F(e){if(/^(?:-1|0):[0-9a-fA-F]{64}$/u.test(e)){let[o,i]=e.split(":");return`${o}:${i.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 $oe(t.subarray(0,34))!==r?null:`${n}:${Buffer.from(t.subarray(2,34)).toString("hex")}`}function Lv(e){return(/^lq1/iu.test(e)||/^V/u.test(e))&&Bl(e)}function an(e,t,n){if(e==="evm"||e==="hyperliquid")return/^0x[0-9a-fA-F]{40}$/u.test(n);if(e==="solana")return Jf(n);if(e==="bitcoin"){let r=/^bc1[a-z0-9]{20,90}$/iu.test(n)&&am(n),o=/^tb1[a-z0-9]{20,90}$/iu.test(n)&&am(n),i=r||/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n),s=o||/^[mn2][a-km-zA-HJ-NP-Z1-9]{25,34}$/u.test(n);return t==="mainnet"?i:t==="testnet"?s:!1}if(e==="tron")return/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(n);if(e==="ton")return _F(n)!==null;if(e==="cosmos"){if(!am(n))return!1;let r=Object.hasOwn(Bn,t)?Bn[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)&&am(n)||/^[PQGH][a-km-zA-HJ-NP-Z1-9]{25,40}$/u.test(n)||Lv(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 Un(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"?_F(t)??t:t}function Boe(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)||!an(e,t,r))throw new Error(`investigator collector: address does not match ${e} on ${String(t)}`);let o=["aptos","sui","ton"].includes(e)&&an(e,t,r)||e==="liquid"&&Lv(r);if(je(r)&&!o)throw new Error("investigator collector: address contains secret-shaped material");return Un(e,r)}function Doe(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 Uoe(e,t,n){if(t===Cr.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 OF(e={}){Poe(e);let t=Ie(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)||je(n))throw new Error("investigator collector: family is invalid");let r=Coe(n),o=Object.hasOwn(Cr,r)?Cr[r]:Cr.unsupported,i=Moe(r,n,Ie(e,"chainId"));Uoe(r,o,i);let s=Boe(r,i,Ie(e,"address")),a=Doe(Ie(e,"limit"),o),c=Ie(e,"cursor"),l=c===void 0?null:na(c,{family:r,chain:i,address:s,provider:o.source});if(l&&!o.cursor)throw new Error(`investigator collector: ${r} does not support cursors`);return{requestedFamily:n,family:r,chain:i,address:s,limits:a,cursor:l,capability:o}}function Yl(e,t){return`${e}_${_o(t).slice(7,55)}`}function NF(e,t,n){return Yl("entity",{family:e,chain:t,address:n,kind:"address"})}function Foe(e){return{id:NF(e.family,e.chain,e.address),family:e.family,chain:e.chain,address:e.address,kind:"address"}}function mm(e,t,n,r=[]){return{schemaVersion:rm,execution:"read-only",status:t,subject:e,entities:[Foe(e)],events:[],evidence:[],coverage:n,gaps:r,cursor:null}}function Tr(e,t){return{code:e,message:t}}function lm(e,t="provider-unavailable"){let n=s=>Nt(e,s),r=n("status"),o=Number.isInteger(r)&&r>=400&&r<=599?r:null,i=t;return n("oversize")===!0?i="provider-response-too-large":o===401||o===403?i="provider-auth":o===408||n("oracleTimeout")===!0||n("name")==="AbortError"||n("name")==="TimeoutError"?i="provider-timeout":o===429?i="provider-rate-limited":o!==null&&o<500?i="provider-rejected":Object.hasOwn(dm,i)||(i="provider-unavailable"),Object.freeze({code:i,httpStatus:o,message:dm[i]})}function TF(e,t,n,r,o,i=!1){return{id:Yl("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:Rv,kind:"bounded-public-facts",family:r.family,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!1,truncated:i,selectedFieldCount:Object.keys(o).length,omittedTopLevelFieldCount:0}}}function Tv(e,t,n,r,o,i){let s=t?.source||null,a=Nt(r,"code"),c=a&&Object.hasOwn(dm,a)?Object.freeze({code:a,httpStatus:Nt(r,"httpStatus")??null,message:dm[a]}):lm(r),l={source:s,failureCode:c.code,httpStatus:c.httpStatus},u=mm(e,"UNKNOWN",{mode:t?.mode||"none",source:s,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:s,status:"UNKNOWN",httpStatus:c.httpStatus,message:c.message}]);return u.evidence.push(TF("ERROR",s,o,e,l,!0)),u.cursor=t?.cursor?{requested:i,next:null}:null,u}function cm(e,t,n){let r=String(t?.reason||"wallet evidence collection is unavailable").slice(0,240),o=mm(e,"UNAVAILABLE",{mode:"none",source:t?.source||null,requestedLimit:null,appliedLimit:0,returned:0,historyAvailable:!1,cursorSupported:!1},[Tr("unavailable",r)]);return o.evidence.push(TF("UNAVAILABLE",t?.source||null,n,e,{reason:r})),o}function qoe(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=pn(process.env[n]);if(r)return r}return null}function Nr(e,t,n,r){let o=Object.assign(Object.create(null),{fetchImpl:typeof Ie(n,"fetchImpl")=="function"?Ie(n,"fetchImpl"):void 0,timeoutMs:Ie(n,"timeoutMs"),apiKey:r??void 0,maxResponseBytes:kF,sameOriginRedirectsOnly:!0}),i=(s={})=>Object.assign(Object.create(null),o,s);return e==="evm"?i({baseUrl:$p[Number(t.chainId)]}):e==="solana"?i({rpcUrl:Iy}):e==="bitcoin"?i({network:t.chainId,baseUrl:t.chainId==="testnet"?Ny:Oy}):e==="hyperliquid"?i({testnet:t.chainId==="hyperliquid-testnet",baseUrl:t.chainId==="hyperliquid-testnet"?$g:Mg}):e==="tron"?i({baseUrl:oS}):e==="ton"?i({baseUrl:lS}):e==="cosmos"?i({chain:t.chainId,baseUrl:Object.hasOwn(Bn,t.chainId)?Bn[t.chainId]?.lcd:void 0}):e==="aptos"?i({baseUrl:SS}):e==="liquid"?i({baseUrl:jS}):o}function joe(e,t,n,r){let o=Ie(n,"transports"),i=o&&Object.hasOwn(o,e)?o[e]:null,s=o&&t?.source&&Object.hasOwn(o,t.source)?o[t.source]:null,a=i||s;if(a)return l=>a(l,n);let c=Object.hasOwn(xF,e)?xF[e]:null;return c?l=>c(l,n,r):void 0}function pt(e){return typeof e=="string"?e||null:Ie(e,"hash")||Ie(e,"address")||null}function CF(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 um;let r=Toe.has(t)||/Address$/u.test(t),o=t==="coinType"?e.replace(/0x[0-9a-fA-F]{1,64}/gu,"0x1"):e,i=t==="denom"&&/^ibc\/[0-9a-fA-F]{64}$/u.test(e),s=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)&&!je(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)||i||s);return je(e)&&!a?um:e}function fe(e,t,n,r,o){let i=CF(r,n,o);return i===um||r===void 0?!1:(e[n]=i,t.push(n),!0)}function Mv(e,t,n,r={}){let{sourceFields:o=[],...i}=r,s=Pr(t)?Object.keys(t):[],a=new Set(o.filter(u=>Object.hasOwn(t,u))),c=Math.max(0,s.length-a.size),l=!!(i.inputsTruncated||i.outputsTruncated);return{schemaVersion:Rv,kind:"bounded-public-facts",family:e,projected:!0,upstreamRowPreserved:!1,sourceLocatorPreserved:!0,truncated:c>0||l,selectedFieldCount:n.length,omittedTopLevelFieldCount:c,...i}}function Hoe(e,t){let n={},r=[];fe(n,r,"transactionHash",e.hash),fe(n,r,"blockNumber",e.block_number),fe(n,r,"timestamp",e.timestamp),fe(n,r,"fromAddress",pt(e.from)),fe(n,r,"toAddress",pt(e.to)),fe(n,r,"createdContractAddress",oa("evm",t,pt(e.created_contract))?pt(e.created_contract):void 0),fe(n,r,"value",e.value),fe(n,r,"status",e.status),fe(n,r,"fee",Pr(e.fee)?e.fee.value:e.fee),fe(n,r,"gasUsed",e.gas_used),fe(n,r,"gasLimit",e.gas_limit),fe(n,r,"nonce",e.nonce);let o=pt(e.token);return fe(n,r,"tokenAddress",typeof o=="string"&&an("evm",t,o)?o:void 0),fe(n,r,"tokenSymbolUntrusted",e.token?.symbol,64),{facts:n,projection:Mv("evm",e,r,{sourceFields:["hash","block_number","timestamp","from","to","created_contract","value","status","fee","gas_used","gas_limit","nonce","token"]})}}function zoe(e,t){if(!Pr(e))return null;let n={},r=[];return fe(n,r,"transactionId",/^[0-9a-f]{64}$/iu.test(String(e.txid??""))?e.txid:void 0),fe(n,r,"outputIndex",e.vout),fe(n,r,"coinbase",e.is_coinbase),fe(n,r,"sequence",e.sequence),fe(n,r,"address",typeof e.prevout?.scriptpubkey_address=="string"&&an("bitcoin",t,e.prevout.scriptpubkey_address)?e.prevout.scriptpubkey_address:void 0),fe(n,r,"value",e.prevout?.value),Object.keys(n).length?n:null}function Voe(e,t,n){if(!Pr(e))return null;let r={index:t},o=[];return fe(r,o,"address",typeof e.scriptpubkey_address=="string"&&an("bitcoin",n,e.scriptpubkey_address)?e.scriptpubkey_address:void 0),fe(r,o,"value",e.value),fe(r,o,"scriptType",e.scriptpubkey_type,64),r}function Woe(e,t){let n={},r=[];fe(n,r,"transactionId",e.txid),fe(n,r,"version",e.version),fe(n,r,"locktime",e.locktime),fe(n,r,"size",e.size),fe(n,r,"weight",e.weight),fe(n,r,"fee",e.fee);let o={},i=[];fe(o,i,"confirmed",e.status?.confirmed),fe(o,i,"blockHeight",e.status?.block_height),fe(o,i,"blockHash",/^[0-9a-f]{64}$/iu.test(String(e.status?.block_hash??""))?e.status.block_hash:void 0),fe(o,i,"blockTime",e.status?.block_time),Object.keys(o).length&&(n.status=o,r.push("status"));let s=Array.isArray(e.vin)?e.vin:[],a=Array.isArray(e.vout)?e.vout:[],c=s.slice(0,sm).map(u=>zoe(u,t)).filter(Boolean),l=a.slice(0,sm).map((u,d)=>Voe(u,d,t)).filter(Boolean);return c.length&&(n.inputs=c,r.push("inputs")),l.length&&(n.outputs=l,r.push("outputs")),{facts:n,projection:Mv("bitcoin",e,r,{sourceFields:["txid","version","locktime","size","weight","fee","status","vin","vout"],inputCount:s.length,inputSelected:c.length,inputsTruncated:s.length>sm,outputCount:a.length,outputSelected:l.length,outputsTruncated:a.length>sm})}}function Oi(e,t,n){let r={},o=[],i=[];for(let[s,a,c,l]of n){let u=typeof a=="function"?a(t):Ie(t,a);fe(r,o,s,u,c),typeof a=="string"?i.push(a):typeof l=="string"&&i.push(l)}return{facts:r,projection:Mv(e,t,o,{sourceFields:i})}}function pm(e,t,n){return e==="evm"?Hoe(n,t):e==="bitcoin"?Woe(n,t):e==="solana"?Oi(e,n,[["signature","signature"],["slot","slot"],["blockTime","blockTime"],["confirmationStatus","confirmationStatus",64],["errorPresent",r=>Ie(r,"err")!==null&&Ie(r,"err")!==void 0,void 0,"err"]]):e==="hyperliquid"?Oi(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"?Oi(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"?Oi(e,n,[["transactionHash","hash"],["logicalTime","lt"],["unixTime","utime"],["feeNano","feeNano"],["inMessageValueNano","inMessageValueNano"],["inMessageSourceAddress","inMessageSource"],["inMessageDestinationAddress","inMessageDestination"],["outMessageCount","outMessageCount"],["outMessageValueNano","outMessageValueNano"]]):e==="cosmos"?Oi(e,n,[["denom","denom"],["amount","amount"],["ibcHash","ibcHash"],["native","native"],["symbol","symbol",64],["decimals","decimals"],["display","display"]]):e==="aptos"?Oi(e,n,[["coinType","coinType"],["rawAmount","raw"],["decimals","decimals"],["symbol","symbol",64],["amount","amount"],["frozen","frozen"]]):Oi(e,n,[["provider","provider",64],["address","address"],["transactionCount","txCount"],["balanceSats","balanceSats"],["confidential","confidential"]])}function ia(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"||Pv.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 i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");ia(s.value,t,o,r+1)}return}for(let i of Object.keys(e)){if(i.includes(t))throw new Error("investigator collector: provider response reflected its attached credential");let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!Object.hasOwn(s,"value"))throw new Error("investigator collector: projected provider response is not own-data JSON");ia(s.value,t,o,r+1)}}finally{o.active.delete(e)}}}function PF(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t&&!/[\u0000-\u001f\u007f]/u.test(e)&&!je(e)}function Jn(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)&&!je(e)}function Goe(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)&&!je(e)}function ra(e,{nullable:t=!0,iso:n=!1}={}){return e==null?t:Number.isSafeInteger(e)&&e>=0?!0:PF(e,64)?/^\d{1,20}$/u.test(e)?!0:n&&Number.isFinite(Date.parse(e)):!1}function Koe(e){if(typeof e!="string"||to(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&&!no(t)}catch{return!1}}function oa(e,t,n){return n==null||typeof n=="string"&&an(e,t,n)}function RF(e,t,n){return`${e}:${String(t)}:${n}`}function AF(e,t,n){let r=pt(n);return typeof r=="string"&&an(e,t,r)?RF(e,t,Un(e,r)):null}function sa(e,t,n){return typeof t=="string"&&typeof n=="string"&&Un(e,t)===Un(e,n)}function Yoe(e,t,n){let r=Array.isArray(e.vin)?e.vin:[],o=Array.isArray(e.vout)?e.vout:[];return r.some(i=>{let s=i?.prevout?.scriptpubkey_address;return typeof s=="string"&&an("bitcoin",t,s)&&sa("bitcoin",s,n)})||o.some(i=>{let s=i?.scriptpubkey_address;return typeof s=="string"&&an("bitcoin",t,s)&&sa("bitcoin",s,n)})}function Xoe(e,t,n,r){if(!Pr(r))return!1;if(e==="evm")return/^0x[0-9a-fA-F]{64}$/u.test(String(r.hash||""))&&oa("evm",t,pt(r.from))&&oa("evm",t,pt(r.to))&&oa("evm",t,pt(r.created_contract))&&[pt(r.from),pt(r.to),pt(r.created_contract)].some(o=>sa("evm",o,n))&&Jn(r.block_number,32)&&Jn(r.value,100)&&ra(r.timestamp,{iso:!0});if(e==="solana")return Qf(r.signature)&&Number.isSafeInteger(r.slot)&&r.slot>=0&&ra(r.blockTime);if(e==="bitcoin")return/^[0-9a-f]{64}$/iu.test(String(r.txid||""))&&Pr(r.status)&&Yoe(r,t,n)&&(r.status.confirmed==null||typeof r.status.confirmed=="boolean")&&Jn(r.status.block_height,32)&&(r.status.block_hash==null||/^[0-9a-f]{64}$/iu.test(String(r.status.block_hash)))&&ra(r.status.block_time);if(e==="hyperliquid"){let o=PF(r.coin,64)&&/^[A-Za-z0-9@._:/-]+$/u.test(r.coin),i=r.hash==null||/^0x[0-9a-f]{64}$/iu.test(String(r.hash)),s=r.tid==null||Jn(r.tid,32,{nullable:!1});return o&&i&&s&&(r.hash!=null||r.tid!=null)&&Goe(r.sz,100,{nullable:!1})&&!String(r.sz).startsWith("-")&&ra(r.time)}return e==="tron"?/^[0-9a-f]{64}$/iu.test(String(r.txId||""))&&typeof r.from=="string"&&an("tron",t,r.from)&&typeof r.to=="string"&&an("tron",t,r.to)&&[r.from,r.to].some(o=>sa("tron",o,n))&&typeof r.tokenAddress=="string"&&an("tron",t,r.tokenAddress)&&Jn(r.raw,100,{nullable:!1})&&ra(r.blockTimestamp):e==="ton"?Koe(r.hash)&&Jn(r.lt,40,{nullable:!1})&&oa("ton",t,r.inMessageSource)&&oa("ton",t,r.inMessageDestination)&&[r.inMessageSource,r.inMessageDestination].some(o=>sa("ton",o,n))&&Jn(r.inMessageValueNano,100)&&ra(r.utime):!1}function Joe(e,t){return e==="hyperliquid"?Array.isArray(t)?t:null:fm(t)?e==="evm"||e==="bitcoin"||e==="ton"?Ie(t,"transactions")??null:e==="solana"?Ie(t,"signatures")??null:e==="tron"?Ie(t,"transfers")??null:null:null}function IF(e,t,n){if(e==="evm")return{type:"transaction",from:pt(n.from)?Un("evm",pt(n.from)):null,to:pt(n.to)??pt(n.created_contract)?Un("evm",pt(n.to)??pt(n.created_contract)):null,asset:AF("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=CF(n.coin,"coin",64);return{type:"fill",from:null,to:null,asset:r===um?null:RF("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?Un("tron",n.from):null,to:n.to?Un("tron",n.to):null,asset:AF("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?Un("ton",n.inMessageSource):null,to:n.inMessageDestination?Un("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 Qoe(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 i=r[o];if(!i)continue;let s=Un(e.subject.family,i),a=n.get(s);a||(a=NF(e.subject.family,e.subject.chain,s),n.set(s,a),e.entities.push({id:a,family:e.subject.family,chain:e.subject.chain,address:s,kind:"address"})),r[o]=a}}function LF(e,t){if(Pv.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 i=Object.getOwnPropertyDescriptor(e,String(o));if(!i||!Object.hasOwn(i,"value"))throw new Error("investigator collector: provider rows must contain dense own data");r[o]=Cv(i.value)}return r}function Zoe(e,t,n,r,o,i,s,a){let c=LF(o,n.applied+1);if(c.some(A=>!Xoe(e.family,e.chain,e.address,A)))throw new Error(`${t.source} returned a malformed history row`);let l=c.length>n.applied,u=c.slice(0,n.applied),d=!!(!Array.isArray(r)&&Ie(r,"truncated")),p=Array.isArray(r)?null:Ie(r,"nextCursor")??null;for(let A of u)ia(pm(e.family,e.chain,A).facts,a),ia(IF(e.family,e.chain,A),a);ia(p,a);let m=!!(!Array.isArray(r)&&Ie(r,"continuationUnknown")),f=!Array.isArray(r)&&Ie(r,"pageComplete")===!0,h=p!=null&&!t.cursor,g=u.length===n.applied&&p==null&&!f,y=[];(d||l)&&y.push(Tr("response-truncated","provider facts exceeded the safe record bound; omitted facts are not represented as complete")),(m||g||h)&&y.push(Tr("continuation-unknown","the page reached its bound without a usable continuation")),e.family==="tron"&&y.push(Tr("native-history-not-covered","this source covers TRC20 transfers, not native TRX transactions"));let b=d||l||m||h||g||e.family==="tron",w=null;if(t.cursor&&p!=null&&!l)try{w=pF({family:e.family,chain:e.chain,address:e.address,provider:t.source},p)}catch{y.push(Tr("invalid-provider-cursor","the provider returned an invalid next cursor; collected facts were retained without continuation")),b=!0}let S=mm(e,b?"PARTIAL":"COMPLETE",{mode:t.mode,source:t.source,requestedLimit:n.requested,appliedLimit:n.applied,returned:u.length,historyAvailable:!0,cursorSupported:t.cursor},y),v=new Set,I=new Set;return u.forEach(A=>{let E=IF(e.family,e.chain,A),k=pm(e.family,e.chain,A),O=Yl("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:E.locator,publicFacts:k.facts}),T=Yl("event",{family:e.family,chain:e.chain,address:e.address,source:t.source,type:E.type,locator:E.locator,from:E.from,to:E.to,asset:E.asset,amount:E.amount,transactionId:E.transactionId,blockHeight:E.blockHeight,timestamp:E.timestamp});if(v.has(T))throw new Error(`${t.source} returned duplicate event identity`);if(I.has(O))throw new Error(`${t.source} returned duplicate evidence identity`);v.add(T),I.add(O),S.evidence.push({id:O,status:"OBSERVED",source:t.source,observedAt:i,locator:E.locator,publicFacts:k.facts,projection:k.projection}),S.events.push({id:T,type:E.type,from:E.from,to:E.to,asset:E.asset,amount:E.amount,transactionId:E.transactionId,blockHeight:E.blockHeight,timestamp:E.timestamp,evidenceRefs:[O]})}),Qoe(S),t.cursor&&(S.cursor={requested:s,next:w}),S}function eie(e,t){return fm(t)?e==="liquid"?Ie(t,"provider")==="liquid-esplora"&&Number.isFinite(Ie(t,"txCount"))?[t]:null:Ie(t,"balances")??null:null}function tie(e,t,n,r){if(!Pr(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)&&(!je(r.denom)||o)&&Jn(r.amount,100,{nullable:!1})}if(e==="aptos"){let o=String(r.coinType??""),i=/^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),s=o.replace(/0x[0-9a-f]{1,64}/gu,"0x1");return i&&!je(s)&&Jn(r.raw,100,{nullable:!1})}return e==="liquid"?r.provider==="liquid-esplora"&&Number.isSafeInteger(r.txCount)&&r.txCount>=0&&typeof r.address=="string"&&an("liquid",t,r.address)&&sa("liquid",r.address,n)&&r.confidential===Lv(r.address)&&(r.balanceSats===null||Jn(r.balanceSats,100,{nullable:!1})):!1}function nie(e,t,n,r,o,i,s){let a=LF(o,n.applied+1);if(a.some(m=>!tie(e.family,e.chain,e.address,m)))throw new Error(`${t.source} returned a malformed evidence row`);let c=a.slice(0,n.applied);for(let m of c)ia(pm(e.family,e.chain,m).facts,s);let l=!!Ie(r,"truncated")||a.length>n.applied,u=[Tr("history-unavailable",`${e.family} collection is evidence-only; no transaction events were collected`)];if(e.family==="aptos"&&u.push(Tr("fungible-assets-unavailable","Aptos collection enumerates legacy CoinStore resources only; Fungible Asset balances were not checked")),e.family==="liquid"&&c.some(m=>m.balanceSats===null)){let m=c.some(f=>f.confidential===!0);u.push(Tr("asset-balances-unavailable",m?"Liquid balance values are blinded for this confidential address":"Liquid Esplora did not expose per-asset sums for this unconfidential multi-asset address"))}l&&u.push(Tr("response-truncated","provider evidence exceeded the safe record bound"));let d=mm(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(m=>m.balanceSats===null)?"unavailable":"provider-supplied"}:{}},u),p=new Set;return c.forEach(m=>{let f=pm(e.family,e.chain,m),h=Yl("evidence",{family:e.family,chain:e.chain,address:e.address,source:t.source,locator:{address:e.address},publicFacts:f.facts});if(p.has(h))throw new Error(`${t.source} returned duplicate evidence identity`);p.add(h),d.evidence.push({id:h,status:"OBSERVED",source:t.source,observedAt:i,locator:{address:e.address},publicFacts:f.facts,projection:f.projection})}),d}async function MF(e={},t={}){Roe(t);let n=OF(e),{family:r,chain:o,address:i,limits:s,cursor:a,capability:c}=n,l={family:r,chain:o,address:i},u=Loe(t);if(c.status==="UNAVAILABLE"||c===Cr.unsupported)return cm(l,c,u);if(!c.chainIds.some(g=>String(g)===String(o)))return cm(l,{...c,reason:`${r} wallet evidence is not available for chainId ${String(o)}`},u);if(r==="evm"&&!Bp(o))return cm(l,{...c,reason:`Blockscout transaction history is not configured for EVM chainId ${o}`},u);let d=qoe(r),p=joe(r,c,t,d);if(typeof p!="function")return cm(l,{...c,reason:"collector transport is unavailable"},u);let m=a?.payload??null,f=Object.assign(Object.create(null),{address:i,chainId:o,limit:s.applied,cursor:m});r==="solana"&&(f.before=m),r==="tron"&&(f.contract="all",f.onlyConfirmed=!0),r==="ton"&&m&&(f.lt=m.lt,f.hash=m.hash);let h;try{h=await p(f)}catch(g){return Tv(l,c,s,lm(g),u,a)}if(Ie(h,"error")){let g=PI(h),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,b=g?.status!==null&&g?.status!==void 0?"provider-unavailable":"provider-rejected";return Tv(l,c,s,lm(y,b),u,a)}try{if(["cosmos","aptos","liquid"].includes(r)){let y=eie(r,h);if(!Array.isArray(y))throw new Error("invalid evidence-only response");return nie(l,c,s,h,y,u,d)}let g=Joe(r,h);if(!Array.isArray(g))throw new Error("invalid history response");return Zoe(l,c,s,h,g,u,a,d)}catch{return Tv(l,c,s,lm(null,"provider-invalid-response"),u,a)}}var Rv,kF,Cr,SF,vF,EF,Toe,um,sm,dm,xF,$v=_(()=>{rl();Zo();is();Xt();sS();fS();yS();AS();jf();mn();vt();ro();Kl();bv();hv();Rv="oracle.investigator-fact-projection/1",kF=4*1024*1024;Cr=on({evm:sn({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:sn({status:"AVAILABLE",mode:"signature-history",source:"solana-rpc",chainIds:Object.freeze(["mainnet-beta"]),maxLimit:1e3,cursor:!0,facts:"Bounded getSignaturesForAddress fact projections"}),bitcoin:sn({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:sn({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:sn({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:sn({status:"AVAILABLE",mode:"transaction-history",source:"ton-public",chainIds:Object.freeze(["ton-mainnet"]),maxLimit:100,cursor:!0,facts:"Bounded toncenter transaction fact projections"}),cosmos:sn({status:"EVIDENCE_ONLY",mode:"holdings",source:"cosmos-lcd",chainIds:Object.freeze(Object.keys(Bn)),maxLimit:500,cursor:!1,facts:"Bounded bank-balance facts only; transaction history is not collected"}),aptos:sn({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:sn({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:sn({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["sui-mainnet"]),maxLimit:0,cursor:!1,reason:"wallet history collector is quarantined and unavailable"}),stacks:sn({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze(["stacks-mainnet"]),maxLimit:0,cursor:!1,reason:"address history collector is not implemented"}),"celestia-da":sn({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:sn({status:"UNAVAILABLE",mode:"none",source:null,chainIds:Object.freeze([]),maxLimit:0,cursor:!1,reason:"chain family is not supported"})}),SF=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"}),vF=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"}),EF=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"}),Toe=new Set(["address","assetId","blockHash","coinType","denom","hash","ibcHash","signature","transactionHash","transactionId","txid"]),um=Symbol("missing-public-fact"),sm=8;dm=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."});xF=Object.freeze({evm:(e,t,n)=>Up(e,Nr("evm",e,t,n)),solana:(e,t,n)=>qk(e,Nr("solana",e,t,n)),bitcoin:(e,t,n)=>Kk(e,Nr("bitcoin",e,t,n)),hyperliquid:(e,t,n)=>ad(e.address,Nr("hyperliquid",e,t,n)),tron:(e,t,n)=>If(e,Nr("tron",e,t,n)),ton:(e,t,n)=>_f(e,Nr("ton",e,t,n)),cosmos:(e,t,n)=>Nf(Object.assign(Object.create(null),e,{chain:e.chainId}),Nr("cosmos",e,t,n)),aptos:(e,t,n)=>Rf(e,Nr("aptos",e,t,n)),liquid:(e,t,n)=>qf(e,Nr("liquid",e,t,n))})});async function $F(e={},...t){if(t.length!==0)throw new Error("onchain-investigator: collector options are not accepted on the public surface");return MF(e,rie)}var rie,BF=_(()=>{$v();$v();rie=Object.freeze(Object.create(null))});import{createHash as oie}from"node:crypto";import{types as Wt}from"node:util";function KF(e){return ft([cn(M(e,"kind")),...Ve(M(e,"roles")).map(cn),...Ve(M(e,"tags")).map(t=>cn(!t||typeof t!="object"?t:M(t,"name")??M(t,"value")))])}function zv(e){return e?M(e,"isService")===!0?!0:KF(e).some(t=>aie.has(t)||t.endsWith("_SERVICE")||t.endsWith("_EXCHANGE")):!1}function YF(e){return cie.has(e)||e.endsWith("_DEPLOYER")||e.endsWith("_CREATOR")}function hm(e){return KF(e).some(YF)}function bie(e){if(!hm(e)||zv(e))return!1;for(let r of["isService","fresh","txCount","firstSeenAt","createdAt","supplyShare"])if(M(e,r)!==void 0)return!1;let t=Ve(M(e,"roles")).map(cn),n=Ve(M(e,"tags")).map(r=>cn(r&&typeof r=="object"?M(r,"name")??M(r,"value"):r));return[...t,...n].every(YF)}function ln(e){if(typeof e=="string"&&e.length<=512&&/^\d+(?:\.\d+)?$/u.test(e)){let[i,s=""]=e.split(".");return{raw:`${i}${s}`.replace(/^0+(?=\d)/u,""),decimals:s.length}}if(!e||typeof e!="object"||Wt.isProxy(e)||Array.isArray(e))return null;let t=i=>{if(!Object.hasOwn(e,i))return{present:!1,value:void 0};let s=Object.getOwnPropertyDescriptor(e,i);return!s||!Object.hasOwn(s,"value")?{present:!0,invalid:!0}:{present:!0,value:s.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 i of["raw","atoms","baseUnits"]){let s=t(i);if(s.invalid)return null;if(!(!s.present||s.value==null)){if(typeof s.value!="string"||!/^\d+$/u.test(s.value)||s.value.length>512)return null;o.push(s.value.replace(/^0+(?=\d)/u,""))}}for(let i of["value","decimal","amount"]){let s=t(i);if(s.invalid)return null;if(!s.present||s.value==null)continue;if(typeof s.value!="string"||!/^\d+(?:\.\d+)?$/u.test(s.value)||s.value.length>512)return null;let[a,c=""]=s.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 ca(e,t){return!e||e.decimals>t?null:BigInt(e.raw)*10n**BigInt(t-e.decimals)}function XF(e,t){if(!e||!t)return null;let n=Math.max(e.decimals,t.decimals),r=ca(e,n),o=ca(t,n);return r===null||o===null||o<=0n||r<0n||r>o?null:{numerator:r,denominator:o}}function wie(e,t){let n=XF(e,t);return n?Number(n.numerator*10000n/n.denominator):null}function Sie(e,t){if(!e||t.length===0)return!1;let n=Math.max(e.decimals,...t.map(i=>i.balance.decimals)),r=ca(e,n);if(r===null||r<=0n)return!1;let o=0n;for(let i of t){let s=ca(i.balance,n);if(s===null||s<0n||s>r||(o+=s,o>r))return!1}return!0}function JF(e){if(e&&typeof e=="object"){if(Wt.isProxy(e)||Array.isArray(e)||!ua(e,hie)||Object.keys(e).some(m=>!["numerator","denominator","bps"].includes(m)))return null;let a=M(e,"numerator"),c=M(e,"denominator"),l=M(e,"bps"),u=a!=null||c!=null,d=null;if(u&&(a==null||c==null||(d=XF(ln(a),ln(c)),!d)))return null;let p=null;if(l!=null){if(!Number.isInteger(l)||l<0||l>1e4)return null;p={numerator:BigInt(l),denominator:10000n}}return!d&&!p||d&&p&&Number(d.numerator*10000n/d.denominator)!==l?null:d??p}let t=at(e);if(!t||!/^\d+(?:\.\d+)?$/u.test(t))return null;let[n,r=""]=t.split("."),o=10n**BigInt(r.length),i=BigInt(`${n}${r}`),s=i<=o?o:o*100n;return i<=s?{numerator:i,denominator:s}:null}function vie(e){if(!Array.isArray(e)||e.length>An.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],i=t[r+1],s=o.numerator*i.denominator+i.numerator*o.denominator,a=o.denominator*i.denominator;if(s>a)return!1;n.push({numerator:s,denominator:a})}t=n}return t.length===0||t[0].numerator<=t[0].denominator}function Eie(e){let t=JF(e);return t?Number(t.numerator*10000n/t.denominator):null}function In(e,t,n){let r=null,o=null;for(let i of t){if(!Object.hasOwn(e,i))continue;let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!Object.hasOwn(s,"value"))return aa;let a=s.value;if(a==null)continue;let c=n(a);if(c==null)return aa;let l=typeof c=="object"?c.identity:c,u=typeof c=="object"&&Object.hasOwn(c,"value")?c.value:c;if(o!==null&&l!==o)return aa;r=u,o=l}return r}function Vv(e,t=64){if(e===void 0)return[];if(No(e,t))return null;let n=Ve(e,t).map(kt);return n.some(r=>!r)||new Set(n).size!==n.length?null:n.sort(st)}function QF(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 jv(e,t){return In(e,t,n=>{let r=ln(n);return r?{identity:QF(r),value:n}:null})}function Uv(e,t){return In(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 ua(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(s=>{let a=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});if(r.length>t.length)return!1;let o=new Set(t),i={nodes:0,fields:0,active:new Set([e])};for(let s of r){if(!o.has(s))return!1;let a=Object.getOwnPropertyDescriptor(e,s);if(!a||!a.enumerable||!Object.hasOwn(a,"value")||!la(a.value,i,0))return!1}return!0}function la(e,t=null,n=0){let r=t??{nodes:0,fields:0,active:new Set};if(r.nodes+=1,r.nodes>Ze.dataNodes||n>Ze.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<=Ze.string;if(!e||typeof e!="object"||Wt.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>Ze.dataArray)return!1;let a=Reflect.ownKeys(e),c=new Set(["length"]);for(let l=0;l<e.length;l+=1)c.add(String(l));for(let l of a){let u=Object.getOwnPropertyDescriptor(e,l);if(!(l==="toJSON"&&u&&Object.hasOwn(u,"value")&&u.value===void 0&&u.enumerable===!1)&&(typeof l!="string"||!c.has(l)))return!1}if(r.fields+=e.length,r.fields>Ze.dataTotalFields)return!1;for(let l=0;l<e.length;l+=1){let u=Object.getOwnPropertyDescriptor(e,String(l));if(!u||!u.enumerable||!Object.hasOwn(u,"value")||!la(u.value,r,n+1))return!1}return!0}let o=Object.getPrototypeOf(e);if(o!==Object.prototype&&o!==null)return!1;let i=Reflect.ownKeys(e),s=[];for(let a of i){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;s.push([a,c.value])}}return s.length>Ze.dataFields||(r.fields+=s.length,r.fields>Ze.dataTotalFields)?!1:s.every(([,a])=>la(a,r,n+1))}finally{r.active.delete(e)}}function ZF(e,t){let n=M(e,"data");if(n===void 0)return e;if(!n||typeof n!="object"||Wt.isProxy(n)||Array.isArray(n)||!la(n)||Object.getOwnPropertySymbols(n).length>0)return null;let r=Object.keys(n);if(r.length>Ze.dataFields)return null;let o=gm(e,t);for(let i of r){let s=Object.getOwnPropertyDescriptor(n,i);if(!s||!Object.hasOwn(s,"value"))return null;if(!(!t.includes(i)||i==="data")){if(Object.hasOwn(o,i))return null;o[i]=s.value}}return o}function xie(e){if(!e||typeof e!="object"||Wt.isProxy(e)||Array.isArray(e)||!ua(e,mie))return null;let t=In(e,["entityId","entity","holder"],kt),n=jv(e,["balance","amount"]),r=Vv(M(e,"evidenceRefs"));return!t||t===aa||n===aa||n===null||r===null?null:Rr({},{entityId:t,balance:n,evidenceRefs:r})}function Aie(e){if(!e||typeof e!="object"||Wt.isProxy(e)||Array.isArray(e)||!ua(e,Bv))return null;let t=ZF(e,Bv);if(!t||Object.hasOwn(t,"isService")&&typeof M(t,"isService")!="boolean")return null;let n=kt(M(t,"id"));if(!n)return null;for(let l of["firstSeenAt","createdAt"]){let u=M(t,l);if(u!=null&&Hv(u)===null)return null}let r=M(t,"roles"),o=M(t,"tags"),i=M(t,"evidenceRefs");if([r,o,i].some(l=>No(l)))return null;let s=M(t,"supplyShare");if(s!==void 0&&Eie(s)===null)return null;let a=gm(t,Bv);a.roles=Ve(r),a.tags=Ve(o);let c=Vv(i);return c===null?null:(a.evidenceRefs=c,Rr(a,{id:n}))}function Iie(e){if(!e||typeof e!="object"||Wt.isProxy(e)||Array.isArray(e)||!ua(e,gie))return null;let t=kt(M(e,"id"));if(!t)return null;let n=M(e,"status"),r=typeof n=="string"?n:"MISSING";return Rr(gm(e,fie),{id:t,status:r})}function kie(e){if(!e||typeof e!="object"||Wt.isProxy(e)||Array.isArray(e)||!ua(e,Dv))return null;let t=ZF(e,Dv);if(!t)return null;let n=kt(M(t,"id"));if(!n||No(M(t,"holders"))||No(M(t,"evidenceRefs")))return null;let r=In(t,["from","fromEntityId","funderId"],kt),o=In(t,["to","toEntityId","recipientId"],kt),i=In(t,["actor","actorEntityId","buyerId"],kt),s=In(t,["asset","assetId","tokenId"],kt),a=In(t,["pool","poolId"],kt),c=In(t,["sourceChain","fromChain"],at),l=In(t,["destinationChain","toChain"],at),u=In(t,["transactionId","transactionHash","txId","txid","hash"],kt),d=In(t,["bridgeTransferId"],kt),p=Uv(t,["blockHeight","blockNumber"]),m=Uv(t,["transactionIndex"]),f=Uv(t,["eventIndex","logIndex","index"]),h=jv(t,["amount","value","quantity"]),g=jv(t,["totalSupply","supply"]);if([r,o,i,s,a,c,l,u,d,p,m,f,h,g].includes(aa))return null;let y=Vv(M(t,"evidenceRefs"));if(y===null)return null;let b=M(t,"timestamp"),w=Hv(b);if(b!=null&&w===null)return null;let v=Ve(M(t,"holders")).map(xie);if(v.some(E=>E===null))return null;let I=v.map(E=>E.entityId);if(new Set(I).size!==I.length)return null;let A=gm(t,Dv);return A.holders=v,Rr(A,{id:n,type:cn(M(t,"type")),from:r,to:o,actor:i,asset:s,pool:a,sourceChain:c,destinationChain:l,bridgeTransferId:d,transactionId:u,blockPosition:p,transactionPosition:m,eventPosition:f,amount:h,totalSupply:g,timestampMs:w,evidenceRefs:y})}function Fv(e,t,n,r,o,i){if(Wt.isProxy(e))return i(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 i(o,`Input exceeded the deterministic limit of ${n} record(s).`),{records:[],overflow:!0,malformed:!1};if(No(e,n))return i(r,"The record array must be an ordinary dense own-data array."),{records:[],overflow:!1,malformed:!0};let s=[],a=0;for(let c=0;c<e.length;c+=1){let l=Object.getOwnPropertyDescriptor(e,String(c));if(!l||!Object.hasOwn(l,"value")){a+=1;continue}let u=t(l.value);u?s.push(u):a+=1}return s.sort(die),a>0&&i(r,`${a} malformed record(s) were ignored.`),{records:s,overflow:!1,malformed:a>0}}function Xl(e){for(let t=1;t<e.length;t+=1)if(e[t-1].id===e[t].id)return!0;return!1}function _ie(e){let t=at(M(e,"family")),n=at(M(e,"address")),r=M(e,"chain"),o=Number.isSafeInteger(r)&&r>=0?String(r):at(r);if(!t||!o||!n)return null;let i=t.toLowerCase(),s=["evm","ethereum","eth","eip155"].includes(i)?"eip155":i,a=n;["eip155","hyperliquid"].includes(s)&&/^0x[0-9a-f]{1,40}$/iu.test(a)?a=`0x${a.slice(2).toLowerCase().padStart(40,"0")}`:(s==="cosmos"||/^0x[0-9a-f]+$/iu.test(a))&&(a=a.toLowerCase()),["aptos","sui"].includes(s)&&/^0x[0-9a-f]{1,64}$/iu.test(a)&&(a=`0x${a.slice(2).toLowerCase().padStart(64,"0")}`),s==="ton"&&(a=_v(a)??a);let c=o.toLowerCase();if(s==="eip155"){let l=c.match(/^(?:eip155:)?(\d+)$/u)?.[1];l&&(c=BigInt(l).toString())}return`${s.length}:${s}|${c.length}:${c}|${a.length}:${a}`}function Oie(e){let t=new Map;for(let n of e){let r=_ie(n);if(!r)continue;let o=t.get(r);if(o&&o!==n.id)return!0;t.set(r,n.id)}return!1}function qF(e){let t=e==null?"-":String(e);return`${t.length}:${t}`}function qv(e){let t=ln(e);return t?QF(t):"-"}function Nie(e){let t=Ve(M(e,"holders")).map(n=>`${qF(M(n,"entityId"))}:${qv(M(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,qv(M(e,"amount")),qv(M(e,"totalSupply")),e.transactionId,e.blockPosition,e.transactionPosition,e.eventPosition,t].map(qF).join("|")}function Tie(e){let t=new Set;for(let n of e){let r=Nie(n);if(t.has(r))return!0;t.add(r)}return!1}function Lr(e,t,n,r,o,i,s=[]){let a=oie("sha256").update(String(t)).digest("hex");return{id:`coordination:${e.toLowerCase()}:${a}`,kind:e,factConfidence:i.fact,coordinationConfidence:i.coordination,entities:ft(n),reasons:o,caveats:ft(s),evidenceRefs:ft(r),score:sie[e]}}function Cie(e,t,n){let r=[...e].sort((u,d)=>u.timestampMs-d.timestampMs||st(u.id,d.id)),o=[],i=new Map,s=0,a=0,c=u=>{let d=u.actor??u.from;d&&i.set(d,(i.get(d)??0)+1)},l=u=>{let d=u.actor??u.from;if(!d)return;let p=(i.get(d)??0)-1;p<=0?i.delete(d):i.set(d,p)};for(;s<r.length;){for(;a<r.length&&r[a].timestampMs-r[s].timestampMs<=t;)c(r[a]),a+=1;i.size>=n?(o.push(r.slice(s,a)),s=a,i.clear()):(l(r[s]),s+=1,a<s&&(a=s))}return o}function Be(e,t){let n=Ve(M(e,"evidenceRefs"));return n.length===0||n.some(r=>!t.has(r))?[]:n}function jF(e,t){let n=Ve(M(e,"evidenceRefs"));return n.length>0&&n.every(r=>t.has(r))}function it(e,t){return typeof e=="string"&&t.has(e)}function HF(e){let t=M(e,"type");if(!WF.has(t))return!1;let n=M(e,"from"),r=M(e,"to"),o=M(e,"actor")??n,i=M(e,"asset"),s=M(e,"timestampMs");if(Ql.has(t))return!!(n&&r);if(Jl.has(t))return!!(o&&i&&(t==="BUY"||s!==null));if(t==="BRIDGE")return!!(at(M(e,"sourceChain"))&&at(M(e,"destinationChain")));if(t==="DEPLOY")return!!o;if(t==="SUPPLY_SNAPSHOT"){let a=Ve(M(e,"holders")).some(c=>kt(M(c,"entityId"))&&ln(M(c,"balance")));return!!(i&&ln(M(e,"totalSupply"))&&a)}return t==="TRANSFER"?!!(n&&r&&i&&s!==null&&ln(M(e,"amount"))):t==="LIQUIDITY_REMOVE"||t==="LP_REMOVE"}function Zl(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 Pie(e,t,n,r,o){let i=e.filter(l=>Ql.has(l.type)&&it(l.from,t)&&it(l.to,t)&&Be(l,n).length),s=Zl(i,l=>l.from),a=[],c=new Set;for(let[l,u]of[...s].sort(([d],[p])=>st(d,p))){let d=t.get(l);if(zv(d))continue;let p=ft(u.map(g=>g.to).filter(g=>g!==l));if(p.length<r.minCommonRecipients)continue;let m=Be(d,n);if(m.length===0){c.add(l);continue}let f=new Set(p),h=u.filter(g=>f.has(g.to));a.push(Lr("COMMON_NON_SERVICE_FUNDER",l,[l,...p],[...m,...h.flatMap(g=>Be(g,n))],[{funder:l,funderEvidenceRefs:m,recipientCount:p.length,eventIds:ft(h.map(g=>g.id))}],{fact:"HIGH",coordination:p.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 Rie(e,t,n,r){let o=e.filter(a=>Jl.has(a.type)&&it(a.actor??a.from,t)&&a.asset&&a.timestampMs!==null&&Be(a,n).length).map(a=>Rr(a,{actor:a.actor??a.from})),i=Zl(o,a=>`${a.type}\0${a.asset}`),s=[];for(let[a,c]of[...i].sort(([l],[u])=>st(l,u)))for(let l of Cie(c,r.syncWindowSeconds*1e3,r.minClusterSize)){let u=ft(l.map(m=>m.actor)),[d,p]=a.split("\0");s.push(Lr("SYNCHRONIZED_ACTIVITY",`${d.toLowerCase()}:${p}:${l[0].id}`,u,l.flatMap(m=>Be(m,n)),[{activityType:d,asset:p,actorCount:u.length,windowSeconds:Math.floor((l[l.length-1].timestampMs-l[0].timestampMs)/1e3),eventIds:l.map(m=>m.id)}],{fact:"HIGH",coordination:u.length>=4?"HIGH":"MEDIUM"},["Timing proximity alone does not establish common control."]))}return s}function Lie(e,t,n){if(!e)return null;if(M(e,"fresh")===!0)return"fresh";let r=M(e,"txCount");if(Number.isInteger(r)&&r>=0&&r<=2)return"txCount";let o=M(e,"firstSeenAt"),i=M(e,"createdAt"),s=o!=null?"firstSeenAt":"createdAt",a=Hv(s==="firstSeenAt"?o:i);return a!==null&&t!==null&&t>=a&&t-a<=n.freshWalletSeconds*1e3?s:null}function Mie(e,t,n,r,o){let i=e.filter(u=>Jl.has(u.type)&&it(u.actor??u.from,t)&&u.asset&&u.timestampMs!==null&&Be(u,n).length).map(u=>Rr(u,{actor:u.actor??u.from})),s=[],a=new Set;for(let u of i){let d=t.get(u.actor),p=Lie(d,u.timestampMs,r);if(!p)continue;let m=Be(d,n);if(m.length===0){a.add(u.actor);continue}s.push(Rr(u,{freshnessBasis:p,freshnessEvidenceRefs:m}))}a.size>0&&o("FRESHNESS_EVIDENCE_UNRESOLVED",`${a.size} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let c=Zl(s,u=>u.asset),l=[];for(let[u,d]of[...c].sort(([p],[m])=>st(p,m))){let p=ft(d.map(f=>f.actor));if(p.length<r.minClusterSize)continue;let m=p.map(f=>{let h=d.filter(g=>g.actor===f);return{entityId:f,bases:ft(h.map(g=>g.freshnessBasis)),evidenceRefs:ft(h.flatMap(g=>g.freshnessEvidenceRefs))}});l.push(Lr("FRESH_WALLET_CLUSTER",u,p,[...d.flatMap(f=>Be(f,n)),...m.flatMap(f=>f.evidenceRefs)],[{asset:u,walletCount:p.length,eventIds:ft(d.map(f=>f.id)),freshnessWindowSeconds:r.freshWalletSeconds,freshness:m}],{fact:"HIGH",coordination:p.length>=4?"HIGH":"MEDIUM"},["Wallet freshness does not establish ownership or identity."]))}return l}function $ie(e,t,n,r,o){let i=new Map,s=new Set,a=(f,h)=>{if(!(!it(f,t)||h.length===0)){i.has(f)||i.set(f,new Set);for(let g of h)i.get(f).add(g)}};for(let f of t.values()){if(!hm(f))continue;let h=Be(f,n);h.length===0?s.add(f.id):a(f.id,h)}for(let f of e)f.type==="DEPLOY"&&a(f.from??f.actor,Be(f,n));let c=[...s].filter(f=>!i.has(f));c.length>0&&o("DEPLOYER_EVIDENCE_UNRESOLVED",`${c.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`);let l=e.filter(f=>Ql.has(f.type)&&i.has(f.from)&&it(f.to,t)&&Be(f,n).length),u=Zl(l,f=>f.to),d=e.filter(f=>f.type==="BUY"&&it(f.actor??f.from,t)&&f.asset&&Be(f,n).length).map(f=>Rr(f,{actor:f.actor??f.from})),p=new Map;for(let f of d){let h=ft(GF(u.get(f.actor)).map(g=>g.from));if(h.length>uie)return o("DEPLOYER_RELATION_LIMIT_REACHED","Deployer-to-buyer branching exceeded the deterministic analysis bound.",{fatal:!0}),[];for(let g of h){let y=`${g}\0${f.asset}`;p.has(y)||p.set(y,[]),p.get(y).push(f)}}let m=[];for(let[f,h]of[...p].sort(([g],[y])=>st(g,y))){let g=ft(h.map(I=>I.actor));if(g.length<Math.min(2,r.minClusterSize))continue;let[y,b]=f.split("\0"),w=new Set(g),S=l.filter(I=>I.from===y&&w.has(I.to)),v=ft([...i.get(y)??[]]);m.push(Lr("DEPLOYER_LINKED_BUYERS",`${y}:${b}`,[y,...g],[...v,...S.flatMap(I=>Be(I,n)),...h.flatMap(I=>Be(I,n))],[{deployer:y,asset:b,buyerCount:g.length,deployerEvidenceRefs:v,fundingEventIds:ft(S.map(I=>I.id)),buyEventIds:ft(h.map(I=>I.id))}],{fact:"HIGH",coordination:"HIGH"},["The link is transactional and does not establish real-world identity."]))}return m}function Bie(e,t,n,r,o,i){let s=[],a=e.filter(d=>d.type==="SUPPLY_SNAPSHOT"&&d.asset&&Be(d,r).length),c=0;for(let d of a){let p=ln(M(d,"totalSupply")??M(d,"supply")),m=Ve(M(d,"holders")),f=m.map(y=>{if(!y||typeof y!="object"||Array.isArray(y)||No(M(y,"evidenceRefs")))return null;let b=Ve(M(y,"evidenceRefs")).map(kt);return b.length===0||b.some(w=>!r.has(w))?null:{entityId:kt(M(y,"entityId")),balance:ln(M(y,"balance")),evidenceRefs:ft(b)}}).filter(y=>y?.entityId&&n.has(y.entityId)&&y.balance);if(f.length!==m.length||!Sie(p,f)){c+=1;continue}let g=f.map(y=>({...y,shareBps:wie(y.balance,p)})).filter(y=>y.shareBps!==null).sort((y,b)=>b.shareBps-y.shareBps||st(y.entityId,b.entityId))[0];!g||g.shareBps<o.concentrationThresholdBps||s.push(Lr("SUPPLY_CONCENTRATION",`${d.asset}:${d.id}`,[g.entityId],[...Be(d,r),...g.evidenceRefs],[{asset:d.asset,topHolder:g.entityId,topHolderShareBps:g.shareBps,balance:g.balance,totalSupply:p,snapshotEventId:d.id}],{fact:"HIGH",coordination:"LOW"},["Supply concentration is a structural fact and is not proof of coordinated control."]))}if(c>0&&i("SUPPLY_SEMANTICS_UNRESOLVED",`${c} supply snapshot(s) had impossible or incomplete total/holder arithmetic and were excluded.`),a.length)return s;let l=t.map(d=>{let p=JF(d.supplyShare);return p?{entity:d,fraction:p,shareBps:Number(p.numerator*10000n/p.denominator)}:null}).filter(Boolean).sort((d,p)=>p.shareBps-d.shareBps||st(d.entity.id,p.entity.id));if(!vie(l.map(d=>d.fraction)))return i("SUPPLY_SEMANTICS_UNRESOLVED","Entity supply shares exceeded the total and were excluded."),s;let u=l[0];if(u&&u.shareBps>=o.concentrationThresholdBps){let d=Ve(M(u.entity,"evidenceRefs")).map(kt),p=d.length>0&&d.every(m=>r.has(m))?ft(d):[];p.length&&s.push(Lr("SUPPLY_CONCENTRATION",u.entity.id,[u.entity.id],p,[{topHolder:u.entity.id,topHolderShareBps:u.shareBps}],{fact:"MEDIUM",coordination:"LOW"},["No total-supply snapshot was supplied; the exact caller-provided share was used."]))}return s}function Die(e,t,n){return e.filter(r=>["LP_REMOVE","LIQUIDITY_REMOVE"].includes(r.type)&&Be(r,n).length).filter(r=>it(r.actor??r.from??r.to,t)).map(r=>Lr("LP_REMOVAL",r.id,[r.actor??r.from??r.to],Be(r,n),[{eventId:r.id,pool:r.pool,asset:r.asset,amount:ln(r.amount)}],{fact:"HIGH",coordination:"LOW"},["LP removal can be routine treasury or liquidity management."]))}function Uie(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 Fie(e,t,n,r,o){let i=e.filter(p=>p.type==="TRANSFER"&&it(p.from,t)&&it(p.to,t)&&p.from!==p.to&&at(p.asset)&&p.timestampMs!==null&&ln(p.amount)&&Be(p,n).length).map(p=>Rr(p,{parsedAmount:ln(p.amount)})).sort((p,m)=>p.timestampMs-m.timestampMs||st(p.id,m.id)),s=Zl(i,p=>`${p.from}\0${p.asset}`),a=[],c=new Set,l=!1;function u(p,m,f,h){let g=GF(s.get(`${p.to}\0${p.asset}`)),y=Uie(g,p.timestampMs),b=[],w=0,S=y;for(;S<g.length&&w<lie;S+=1){let v=g[S];if(v.timestampMs-m.timestampMs>r.peelWindowSeconds*1e3)break;if(w+=1,c.has(v.id)||f.has(v.id)||h.has(v.to)||v.from!==p.to||v.asset!==p.asset)continue;let I=Math.max(p.parsedAmount.decimals,v.parsedAmount.decimals),A=ca(p.parsedAmount,I),E=ca(v.parsedAmount,I);A!==null&&E!==null&&E>0n&&E<A&&b.push(v)}return S<g.length&&g[S].timestampMs-m.timestampMs<=r.peelWindowSeconds*1e3&&(l=!0),b}function d(p){if(p.length>=3)return p;let m=new Set(p.map(h=>h.id)),f=new Set([p[0].from,...p.map(h=>h.to)]);for(let h of u(p[p.length-1],p[0],m,f)){let g=d([...p,h]);if(g)return g}return null}for(let p of i){if(c.has(p.id))continue;let m=d([p]);if(!m)continue;let f=[...m];for(;f.length<r.maxPeelDepth;){let h=new Set(f.map(b=>b.id)),g=new Set([f[0].from,...f.map(b=>b.to)]),[y]=u(f[f.length-1],f[0],h,g);if(!y)break;f.push(y)}f.forEach(h=>c.add(h.id)),a.push(f)}return l&&o("PEEL_CANDIDATE_LIMIT_REACHED","Peel candidate branching exceeded the deterministic traversal bound.",{fatal:!0}),a.map(p=>Lr("PEEL_CHAIN",p[0].id,[p[0].from,...p.map(m=>m.to)],p.flatMap(m=>Be(m,n)),[{hopCount:p.length,asset:p[0].asset,eventIds:p.map(m=>m.id),amounts:p.map(m=>m.parsedAmount)}],{fact:"HIGH",coordination:"MEDIUM"},["A peel pattern is transactional behavior and does not establish common ownership."]))}function qie(e,t,n){return e.filter(r=>r.type==="BRIDGE"&&at(r.sourceChain)&&at(r.destinationChain)&&Be(r,n).length).filter(r=>it(r.actor??r.from??r.to,t)).map(r=>Lr("EXPLICIT_BRIDGE_LINK",r.id,[r.actor??r.from??r.to],Be(r,n),[{eventId:r.id,sourceChain:at(r.sourceChain),destinationChain:at(r.destinationChain),bridgeTransferId:r.bridgeTransferId,asset:r.asset,amount:ln(r.amount)}],{fact:"HIGH",coordination:"LOW"},["Only the explicit bridge record is reported; no link was inferred from timing or amount similarity."]))}function jie(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])=>st(n,r)))}function zF(e,t){return Ve(M(e,"holders")).some(n=>!it(M(n,"entityId"),t))?!1:Ql.has(e.type)||e.type==="TRANSFER"?it(e.from,t)&&it(e.to,t):Jl.has(e.type)?it(e.actor??e.from,t):e.type==="DEPLOY"?it(e.from,t):["LP_REMOVE","LIQUIDITY_REMOVE","BRIDGE"].includes(e.type)?it(e.actor??e.from??e.to,t):e.type==="SUPPLY_SNAPSHOT"?Ve(M(e,"holders")).every(n=>it(M(n,"entityId"),t)):!0}function Hie(e,t){if(e==null){t("COVERAGE_UNKNOWN","Coverage was not supplied.");return}if(typeof e!="object"||Array.isArray(e)||Wt.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(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0&&s.enumerable===!1)});if(o.length>64){t("COVERAGE_FIELD_LIMIT_REACHED","Coverage input exceeded the deterministic field limit.",{fatal:!0});return}for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!s.enumerable||!Object.hasOwn(s,"value")){t("MALFORMED_COVERAGE","Coverage must contain enumerable own data fields.",{fatal:!0});return}n.push([i,s.value])}for(let[i,s]of n.sort(([a],[c])=>st(a,c))){let a=s;if(s&&typeof s=="object"&&!la(s)){t("MALFORMED_COVERAGE","Coverage status objects must contain bounded ordinary acyclic own data.",{fatal:!0});return}if(s&&typeof s=="object"&&!Array.isArray(s)){let u=Object.getOwnPropertyDescriptor(s,"status");if(u&&!Object.hasOwn(u,"value")){t("MALFORMED_COVERAGE","Coverage status objects must contain own data.",{fatal:!0});return}a=u?u.value:void 0}if(typeof a!="string")continue;let c=cn(a),l=cn(i);c==="UNKNOWN"||c==="UNAVAILABLE"?t(`${l}_COVERAGE_${c}`,`${i} coverage is ${c}.`):c==="PARTIAL"&&t(`${l}_COVERAGE_PARTIAL`,`${i} coverage is PARTIAL.`)}}function VF(e,t,{numeric:n=!1}={}){if(!e||typeof e!="object"||Wt.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(i=>{let s=Object.getOwnPropertyDescriptor(e,i);return!(i==="toJSON"&&s&&Object.hasOwn(s,"value")&&s.value===void 0)});if(o.length>t.length||o.some(i=>!t.includes(i)))return!1;for(let i of o){let s=Object.getOwnPropertyDescriptor(e,i);if(!s||!s.enumerable||!Object.hasOwn(s,"value")||n&&(typeof s.value!="number"||!Number.isFinite(s.value)))return!1}return!0}function Wv(e,t={}){let n=VF(t,zie,{numeric:!0}),r=n?t:{},o={maxEntities:Qn(M(r,"maxEntities"),Fn.maxEntities,1,An.maxNodes),maxEvents:Qn(M(r,"maxEvents"),Fn.maxEvents,1,An.maxEdges),maxEvidence:Qn(M(r,"maxEvidence"),Fn.maxEvidence,1,Ze.evidence),minClusterSize:Qn(M(r,"minClusterSize"),Fn.minClusterSize,2,10),minCommonRecipients:Qn(M(r,"minCommonRecipients"),Fn.minCommonRecipients,2,10),syncWindowSeconds:Qn(M(r,"syncWindowSeconds"),Fn.syncWindowSeconds,1,3600),freshWalletSeconds:Qn(M(r,"freshWalletSeconds"),Fn.freshWalletSeconds,60,2592e3),peelWindowSeconds:Qn(M(r,"peelWindowSeconds"),Fn.peelWindowSeconds,60,604800),maxPeelDepth:Qn(M(r,"maxPeelDepth"),Fn.maxPeelDepth,3,8),concentrationThresholdBps:Qn(M(r,"concentrationThresholdBps"),Fn.concentrationThresholdBps,1,1e4)},i=new Map,s=!1,a=(C,B,{fatal:V=!1}={})=>{V&&(s=!0);let K=cn(C||"UNSPECIFIED_GAP"),Oe=at(B)??"Input is incomplete.",Ee=i.get(K);if(Ee){st(Oe,Ee.message)<0&&i.set(K,{code:K,status:"UNKNOWN",message:Oe});return}if(i.size>=FF-1){s=!0,i.has("GAP_LIMIT_REACHED")||i.set("GAP_LIMIT_REACHED",{code:"GAP_LIMIT_REACHED",status:"UNKNOWN",message:`Gap output exceeded the deterministic limit of ${FF}.`});return}i.set(K,{code:K,status:"UNKNOWN",message:Oe})},c=({entities:C=[],events:B=[],evidenceById:V=new Map,eventWithEvidence:K=[],analyzableEvents:Oe=[],findings:Ee=[]}={})=>{let xe=s?[]:Ee;xe.length>Ze.findings&&(a("FINDING_LIMIT_REACHED",`Findings exceeded the deterministic limit of ${Ze.findings}.`,{fatal:!0}),xe=[]);let qe=[...i.values()].sort((F,z)=>st(F.code,z.code)),$t=s||qe.some(F=>F.code.includes("COVERAGE_UNKNOWN")||["COVERAGE_FIELD_LIMIT_REACHED","INVALID_INPUT","EVIDENCE_UNAVAILABLE","EVENTS_UNAVAILABLE","ENTITIES_UNAVAILABLE","NO_ANALYZABLE_EVENTS"].includes(F.code))?"UNKNOWN":qe.length?"PARTIAL":"OK",W=Math.min(100,xe.reduce((F,z)=>F+z.score,0)),R=W>=60?"HIGH":W>=25?"MEDIUM":$t==="OK"?"LOW":"UNKNOWN";return on({schemaVersion:iie,execution:"read-only",reportOnly:!0,status:$t,risk:{score:W,level:R},metrics:{entityCount:C.length,eventCount:B.length,evidenceCount:V.size,evidencedEventCount:K.length,eligibleEventCount:Oe.length,findingCounts:jie(xe),bounds:o},findings:xe,gaps:qe})};if(!n)return a("INVALID_OPTIONS","Coordination options must contain only reviewed numeric own data fields.",{fatal:!0}),c();if(!VF(e,Vie))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 C of["subject","chain"]){let B=M(e,C);if(B!==void 0&&!la(B))return a("INVALID_INPUT",`${C} must contain bounded ordinary acyclic own data.`,{fatal:!0}),c()}let l=Fv(M(e,"entities"),Aie,o.maxEntities,"MALFORMED_ENTITIES","ENTITY_LIMIT_REACHED",a),u=Fv(M(e,"events"),kie,o.maxEvents,"MALFORMED_EVENTS","EVENT_LIMIT_REACHED",a),d=Fv(M(e,"evidence"),Iie,o.maxEvidence,"MALFORMED_EVIDENCE","EVIDENCE_LIMIT_REACHED",a),p=l.records,m=u.records,f=d.records;(l.overflow||u.overflow||d.overflow||l.malformed||u.malformed||d.malformed)&&(s=!0),Array.isArray(M(e,"entities"))||a("ENTITIES_UNAVAILABLE","entities must be an array.",{fatal:!0}),Array.isArray(M(e,"events"))||a("EVENTS_UNAVAILABLE","events must be an array.",{fatal:!0}),Array.isArray(M(e,"evidence"))||a("EVIDENCE_UNAVAILABLE","evidence must be an array.",{fatal:!0}),Xl(p)&&a("DUPLICATE_ENTITY_IDS","Entity ids must be unique.",{fatal:!0}),Xl(m)&&a("DUPLICATE_EVENT_IDS","Event ids must be unique.",{fatal:!0}),Xl(f)&&a("DUPLICATE_EVIDENCE_IDS","Evidence ids must be unique.",{fatal:!0}),Tie(m)&&a("DUPLICATE_EVENT_FACTS","Duplicate event facts are ambiguous.",{fatal:!0}),Oie(p)&&a("AMBIGUOUS_ENTITY_IDENTITY","Multiple entity ids name one canonical chain address.",{fatal:!0});let h=Xl(p)?new Map:new Map(p.map(C=>[C.id,C])),g=f.filter(C=>!DF.has(C.status)),y=f.filter(C=>DF.has(C.status)&&!UF.has(C.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 b=Xl(f)?new Map:new Map(f.filter(C=>UF.has(C.status)).map(C=>[C.id,C]));b.size===0&&a("EVIDENCE_UNAVAILABLE","No exact LIVE or INDEXED evidence records were supplied.");let w=p.filter(C=>{let B=Ve(M(C,"evidenceRefs"));return B.length>0&&B.some(V=>!b.has(V))});w.length&&a("ENTITY_EVIDENCE_UNRESOLVED",`${w.length} entity record(s) cited unsupported or missing evidence.`,{fatal:!0});let S=new Set(m.filter(C=>C.type==="DEPLOY"&&it(C.from??C.actor,h)&&Be(C,b).length>0).map(C=>C.from??C.actor)),v=p.filter(C=>{let B=Ve(M(C,"roles")).length>0||Ve(M(C,"tags")).length>0||zv(C)||hm(C)||M(C,"isService")!==void 0||M(C,"fresh")!==void 0||M(C,"txCount")!==void 0||M(C,"firstSeenAt")!==void 0||M(C,"createdAt")!==void 0||M(C,"supplyShare")!==void 0,V=jF(C,b)||bie(C)&&S.has(C.id);return B&&!V}),I=v.filter(C=>M(C,"fresh")!==void 0||M(C,"txCount")!==void 0||M(C,"firstSeenAt")!==void 0||M(C,"createdAt")!==void 0);I.length>0&&a("FRESHNESS_EVIDENCE_UNRESOLVED",`${I.length} wallet freshness premise(s) lacked fully usable evidence and were excluded where necessary.`);let A=p.filter(C=>hm(C)&&!jF(C,b)&&!S.has(C.id));A.length>0&&a("DEPLOYER_EVIDENCE_UNRESOLVED",`${A.length} deployer role premise(s) lacked usable entity or DEPLOY-event evidence and were excluded.`),v.length&&a("ENTITY_SEMANTIC_EVIDENCE_UNRESOLVED",`${v.length} entity semantic record(s) lacked exact evidence.`,{fatal:!0});let E=m.filter(C=>Ve(M(C,"holders")).some(B=>{let V=Ve(M(B,"evidenceRefs"));return V.length===0||V.some(K=>!b.has(K))}));E.length&&a("HOLDER_EVIDENCE_UNRESOLVED",`${E.length} event(s) contained holder facts without fully resolved exact evidence.`,{fatal:!0}),Hie(M(e,"coverage"),a);let k=M(e,"gaps");if(No(k,Ze.gaps))a("UPSTREAM_GAP_LIMIT_REACHED",`Upstream gaps must be a dense array of at most ${Ze.gaps}.`,{fatal:!0});else{let C=[];for(let B of Ve(k,Ze.gaps)){if(!B||typeof B!="object"||Wt.isProxy(B)||Array.isArray(B)||!ua(B,yie)){a("MALFORMED_UPSTREAM_GAP","An upstream gap record was malformed.",{fatal:!0});continue}let V=M(B,"code"),K=M(B,"message");if(V!==void 0&&at(V)===null||K!==void 0&&at(K)===null){a("MALFORMED_UPSTREAM_GAP","An upstream gap record contained a malformed scalar.",{fatal:!0});continue}C.push({code:V??"UPSTREAM_GAP",message:K??"An upstream normalization gap was reported."})}C.sort((B,V)=>st(cn(B.code),cn(V.code))||st(B.message,V.message));for(let B of C)a(B.code,B.message)}let O=m.filter(C=>Be(C,b).length>0),T=m.filter(C=>Be(C,b).length===0);T.length&&a("EVENT_EVIDENCE_UNRESOLVED",`${T.length} event(s) lacked fully resolved exact LIVE or INDEXED evidence references.`,{fatal:!0});let D=O.filter(C=>!WF.has(C.type)||!HF(C));D.length>0&&a("EVENT_SEMANTICS_UNRESOLVED",`${D.length} evidence-backed event(s) lacked complete analyzable semantics.`);let X=O.filter(HF),H=X.filter(C=>!zF(C,h));H.length&&a("EVENT_ENTITY_UNRESOLVED",`${H.length} event(s) contained unresolved entity references.`,{fatal:!0});let $=X.filter(C=>zF(C,h));$.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 j=[];return s||(j=[...Pie($,h,b,o,a),...$ie($,h,b,o,a),...Mie($,h,b,o,a),...Bie($,p,h,b,o,a),...Rie($,h,b,o),...Die($,h,b),...Fie($,h,b,o,a),...qie($,h,b)].filter(C=>C.evidenceRefs.length>0).sort((C,B)=>st(C.kind,B.kind)||st(C.id,B.id)),new Set(j.map(C=>C.id)).size!==j.length&&(a("DUPLICATE_FINDING_IDS","Finding ids must be unique.",{fatal:!0}),j=[])),c({entities:p,events:m,evidenceById:b,eventWithEvidence:O,analyzableEvents:$,findings:j})}var iie,b0e,w0e,sie,Fn,Jl,Ql,WF,aie,cie,DF,UF,FF,lie,uie,st,at,cn,kt,ft,die,Qn,pie,Hv,GF,M,Ve,No,Rr,gm,Bv,fie,Dv,mie,hie,gie,yie,aa,zie,Vie,eq=_(()=>{Kl();iie="oracle.coordination/1",b0e=on({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),w0e=on({UNKNOWN:"UNKNOWN",LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH"}),sie=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}),Fn=Object.freeze({maxEntities:An.maxNodes,maxEvents:An.maxEdges,maxEvidence:Ze.evidence,minClusterSize:3,minCommonRecipients:2,syncWindowSeconds:60,freshWalletSeconds:86400,peelWindowSeconds:86400,maxPeelDepth:6,concentrationThresholdBps:5e3}),Jl=new Set(["BUY","SELL","SWAP","MINT","ORDER"]),Ql=new Set(["FUND","FUNDING"]),WF=new Set([...Jl,...Ql,"BRIDGE","DEPLOY","LIQUIDITY_REMOVE","LP_REMOVE","SUPPLY_SNAPSHOT","TRANSFER"]),aie=new Set(["BRIDGE","BURN","CEX","EXCHANGE","LP","POOL","ROUTER","SERVICE"]),cie=new Set(["CREATOR","DEPLOYER"]),DF=new Set(Gl),UF=new Set(["LIVE","INDEXED"]),FF=250,lie=32,uie=32,st=(e,t)=>e<t?-1:e>t?1:0,at=e=>{if(typeof e!="string")return null;let t=e.trim();return t&&t.length<=512&&!/[\u0000-\u001f\u007f]/u.test(t)?t:null},cn=e=>(at(e)??"UNKNOWN").toUpperCase().replace(/[^A-Z0-9]+/gu,"_").replace(/^_+|_+$/gu,"")||"UNKNOWN",kt=e=>at(typeof e=="object"&&e!==null?M(e,"id"):e),ft=e=>[...new Set(e.filter(Boolean))].sort(st),die=(e,t)=>st(e.id,t.id),Qn=(e,t,n,r)=>{let o=typeof e=="number"&&Number.isFinite(e)?Math.trunc(e):t;return Math.max(n,Math.min(r,o))},pie=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:\d{2})$/u,Hv=e=>{if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);let t=at(e);if(!t)return null;let n=pie.exec(t);if(!n)return null;let[,r,o,i,s,a,c,l="",u]=n,[d,p,m,f,h,g]=[r,o,i,s,a,c].map(Number);if(p<1||p>12||m<1||f>23||h>59||g>59)return null;if(u!=="Z"){let[S,v]=u.slice(1).split(":").map(Number);if(S>23||v>59)return null}let y=Number(l.padEnd(3,"0")),b=new Date(0);if(b.setUTCFullYear(d,p-1,m),b.setUTCHours(f,h,g,y),b.getUTCFullYear()!==d||b.getUTCMonth()!==p-1||b.getUTCDate()!==m||b.getUTCHours()!==f||b.getUTCMinutes()!==h||b.getUTCSeconds()!==g)return null;let w=Date.parse(t);return Number.isFinite(w)?w:null},GF=e=>Array.isArray(e)?e:[],M=(e,t)=>{if(e==null||(typeof e=="object"||typeof e=="function")&&Wt.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},Ve=(e,t=64)=>{if(No(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 i=Object.getOwnPropertyDescriptor(e,String(o));i&&Object.hasOwn(i,"value")&&n.push(i.value)}return n},No=(e,t=64)=>{if(e==null)return!1;if(Wt.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},Rr=(e,t={})=>Object.assign(Object.create(null),e,t),gm=(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},Bv=Object.freeze(["id","family","chain","address","kind","roles","tags","isService","fresh","txCount","firstSeenAt","createdAt","supplyShare","evidenceRefs","data"]),fie=Object.freeze(["id","status"]),Dv=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"]),mie=Object.freeze(["entityId","entity","holder","balance","amount","evidenceRefs"]),hie=Object.freeze(["numerator","denominator","bps"]),gie=Object.freeze(["id","kind","status","source","observedAt","subject","locator","data","raw","digest","publicFacts","projection"]),yie=Object.freeze(["id","code","message","reason","status","evidenceIds","evidenceRefs","nodeId","depth","data"]);aa=Symbol("alias-conflict");zie=Object.freeze(Object.keys(Fn)),Vie=Object.freeze(["subject","chain","entities","events","evidence","coverage","gaps"])});import{types as sq}from"node:util";function L(e,t="invalid-nft-overlap"){throw new ki(`nft-overlap: ${e}`,t)}function uq(e){return!!(e&&"value"in e&&e.value===void 0&&e.enumerable===!1)}function dq(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 We(){return dq([])}function ye(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function bt(e,t=new Set){if(!e||typeof e!="object"||t.has(e))return e;t.add(e),!Object.hasOwn(e,"toJSON")&&Object.isExtensible(e)&&dq(e);let n;try{n=Reflect.ownKeys(e)}catch{L("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{L("normalized output could not be frozen safely","invalid-object")}o&&"value"in o&&bt(o.value,t)}return Object.freeze(e),e}function tt(e,t,n){(!e||typeof e!="object"||Array.isArray(e)||sq.isProxy(e))&&L(`${n} must be a non-Proxy object`,"invalid-object");let r,o;try{r=Object.getPrototypeOf(e),o=Reflect.ownKeys(e)}catch{L(`${n} could not be inspected safely`,"invalid-object")}r!==Object.prototype&&r!==null&&L(`${n} must be a plain object`,"invalid-object");let i=new Set(t),s=new Map;for(let a of o){let c;try{c=Object.getOwnPropertyDescriptor(e,a)}catch{L(`${n}.${String(a)} could not be inspected safely`,"invalid-object")}a==="toJSON"&&uq(c)||((typeof a!="string"||!i.has(a))&&L(`${n} has an unknown field`,"unknown-field"),(!c||!("value"in c))&&L(`${n}.${a} must be an own data field`,"invalid-object"),s.set(a,c.value))}return Object.freeze({has:a=>s.has(a),get:a=>s.get(a)})}function kn(e,t,n,r=0){(!Array.isArray(e)||sq.isProxy(e))&&L(`${t} must be a non-Proxy array`,"invalid-array");let o;try{o=Object.getOwnPropertyDescriptor(e,"length")}catch{L(`${t} could not be inspected safely`,"invalid-array")}let i=o?.value;(!Number.isInteger(i)||i<r||i>n)&&L(`${t} must contain from ${r} through ${n} items`,"array-limit");let s;try{s=Reflect.ownKeys(e)}catch{L(`${t} could not be inspected safely`,"invalid-array")}let a=new Set(["length"]);for(let l=0;l<i;l+=1)a.add(String(l));let c=We();for(let l of s){let u;try{u=Object.getOwnPropertyDescriptor(e,l)}catch{L(`${t} could not be inspected safely`,"invalid-array")}l==="toJSON"&&uq(u)||(typeof l!="string"||!a.has(l))&&L(`${t} must be dense and own-indexed without extra fields`,"invalid-array")}for(let l=0;l<i;l+=1){let u;try{u=Object.getOwnPropertyDescriptor(e,String(l))}catch{L(`${t}[${l}] could not be inspected safely`,"invalid-array")}(!u||!("value"in u))&&L(`${t} must be dense and contain only own data items`,"invalid-array"),ye(c,u.value)}return c}function rse(e,t,n=256,{allowEmpty:r=!1}={}){return(typeof e!="string"||!r&&e.length===0||e.length>n||lq.test(e)||cq.test(e))&&L(`${t} is not safe bounded text`,"invalid-string"),e}function Ni(e,t,n){return(typeof e!="string"||!new RegExp(`^${t}_[0-9a-f]{64}$`,"u").test(e))&&L(`${n} is not a deterministic ID`,"invalid-id"),e}function pq(e,t){return(typeof e!="string"||!/^sha256:[0-9a-f]{64}$/u.test(e))&&L(`${t} is not a canonical digest`,"invalid-digest"),e}function Xv(e,t="chainId"){return(!Number.isSafeInteger(e)||e<=0)&&L(`${t} must be a positive safe integer`,"invalid-chain"),e}function Ti(e){return(typeof e!="string"||!Qie.test(e))&&L("address must be a 20-byte EVM address","invalid-address"),e.toLowerCase()}function ose(e){(typeof e!="string"||e.length===0||e.length>78||!Zie.test(e))&&L("tokenId must be a bounded unsigned decimal string","invalid-token-id");let t;try{t=BigInt(e)}catch{L("tokenId must be uint256","invalid-token-id")}return(t<0n||t>nse)&&L("tokenId must be uint256","invalid-token-id"),t.toString(10)}function ise(e){return(typeof e!="string"||!ese.test(e))&&L("OpenSea collection slug must already be strictly normalized","invalid-collection-slug"),e}function Jv(e={}){let t=tt(e,["chainId","contract","tokenId"],"canonical NFT input");["chainId","contract","tokenId"].every(r=>t.has(r))||L("canonical NFT input is missing a field","missing-field");let n={chainId:Xv(t.get("chainId"),"nft.chainId"),contract:Ti(t.get("contract")),tokenId:ose(t.get("tokenId"))};return bt({id:Oo("nft",n),...n})}function Qv(e={}){let t=tt(e,["chainId","slug"],"canonical collection input");["chainId","slug"].every(r=>t.has(r))||L("canonical collection input is missing a field","missing-field");let n={chainId:Xv(t.get("chainId"),"collection.chainId"),slug:ise(t.get("slug"))};return bt({id:Oo("collection",n),...n})}function Sm(e={}){let t=tt(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,i=rse(n,"wallet.family",64).toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(i)||L("wallet.family is invalid","invalid-family");let s=r===null?null:Xv(r,"wallet.chainId");if(o===null)return bt({id:null,family:i,chainId:s,address:null});i!=="evm"&&L("only EVM OpenSea wallets can be canonical","invalid-wallet");let a=Ti(o);return bt({id:Oo("wallet",{family:"evm",address:a}),family:"evm",chainId:s,address:a})}function Zv(e){return e==null||typeof e!="string"||e.length===0||e.length>64||!tse.test(e)||lq.test(e)||cq.test(e)||je(e)?null:e}function sse(e,t="snapshot.wallet"){let n=tt(e,["id","family","chainId","address"],t);["id","family","chainId","address"].every(o=>n.has(o))||L(`${t} is missing a required field`,"missing-field");let r=Sm({family:n.get("family"),chainId:n.get("chainId"),address:n.get("address")});return n.get("id")!==r.id&&L(`${t}.id does not match its canonical wallet`,"id-mismatch"),r}function nq(e,t){let n=tt(e,["status","calls"],t);(!n.has("status")||!n.has("calls"))&&L(`${t} is missing a required field`,"missing-field");let r=n.get("status"),o=n.get("calls");return aq.has(r)||L(`${t}.status is invalid`,"invalid-status"),(!Number.isInteger(o)||o<0||o>1)&&L(`${t}.calls must be 0 or 1`,"invalid-count"),{status:r,calls:o}}function ase(e){let t=tt(e,["status","profile","inventory"],"snapshot.coverage");["status","profile","inventory"].every(a=>t.has(a))||L("snapshot.coverage is missing a required field","missing-field");let n=t.get("status");aq.has(n)||L("snapshot.coverage.status is invalid","invalid-status");let r=nq(t.get("profile"),"snapshot.coverage.profile"),o=nq(t.get("inventory"),"snapshot.coverage.inventory");o.calls>r.calls&&L("inventory cannot be called before profile","invalid-count");let i=(a,c,l,u,d)=>n===a&&r.status===c&&r.calls===l&&o.status===u&&o.calls===d;return i("NOT_REQUESTED","NOT_REQUESTED",0,"NOT_REQUESTED",0)||i("UNAVAILABLE","UNAVAILABLE",0,"UNAVAILABLE",0)||i("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")||i("COMPLETE","COMPLETE",1,"COMPLETE",1)||L("snapshot coverage phase statuses or call counts are inconsistent","invalid-coverage"),{status:n,profile:r,inventory:o}}function cse(e){let t=kn(e,"snapshot.gaps",Object.keys(To).length),n=We();for(let i=0;i<t.length;i+=1){let s=tt(t[i],["code","message"],`snapshot.gaps[${i}]`);(!s.has("code")||!s.has("message"))&&L("snapshot gap is missing a field","missing-field");let a=s.get("code");(!Object.hasOwn(To,a)||s.get("message")!==To[a])&&L("snapshot gap is not a fixed allowlisted gap","invalid-gap"),ye(n,a)}let r=We(),o=new Set;for(let i of n)o.has(i)||(o.add(i),ye(r,i));return r.sort(ct),r}function lse(e){return Object.hasOwn(To,e)||L("OpenSea gap code is invalid","invalid-gap"),bt({code:e,message:To[e]})}function use(e){let t=tt(e,["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],"OpenSea evidence input");for(let s of["status","source","kind","walletId"])t.has(s)||L("OpenSea evidence input is missing a required field","missing-field");let n=t.get("status"),r=t.get("source"),o=t.get("kind"),i=t.get("walletId");if(Jie.has(n)||L("OpenSea evidence status is invalid","invalid-status"),Ni(i,"wallet","evidence.walletId"),o==="PROFILE")return t.has("address")||L("profile evidence address is required","missing-field"),["assetId","collectionId","ownerBinding"].some(s=>t.has(s))&&L("profile evidence has holding-only fields","unknown-field"),r!=="opensea-v2-profile"&&L("profile evidence source is invalid","invalid-source"),{status:n,source:r,kind:"PROFILE",walletId:i,address:Ti(t.get("address"))};if(o==="HOLDING"){t.has("address")&&L("holding evidence has a profile-only field","unknown-field"),["assetId","collectionId","ownerBinding"].every(c=>t.has(c))||L("holding evidence is missing a required field","missing-field"),r!=="opensea-v2-account-nfts"&&L("holding evidence source is invalid","invalid-source");let s=Ni(t.get("assetId"),"nft","evidence.assetId"),a=t.get("collectionId")===null?null:Ni(t.get("collectionId"),"collection","evidence.collectionId");return t.get("ownerBinding")!==Mr&&L("holding owner binding is invalid","invalid-owner-binding"),{status:n,source:r,kind:"HOLDING",walletId:i,assetId:s,collectionId:a,ownerBinding:Mr}}L("OpenSea evidence kind is invalid","invalid-kind")}function eu(e={}){let t=use(e);return bt({id:Oo("evidence",t),digest:_o(t),...t})}function dse(e,t){let n=tt(e,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${t}]`);["id","digest","status","source","kind","walletId"].every(s=>n.has(s))||L("OpenSea evidence is missing a required field","missing-field");let o=Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(s=>n.has(s)).map(s=>[s,n.get(s)])),i=eu(o);return Ni(n.get("id"),"evidence","evidence.id"),pq(n.get("digest"),"evidence.digest"),(n.get("id")!==i.id||n.get("digest")!==i.digest)&&L("OpenSea evidence ID or digest does not match its content","digest-mismatch"),i}function pse(e,t){if(e===null)return null;let n=tt(e,["address","evidenceRef","username"],"snapshot.profile");(!n.has("address")||!n.has("evidenceRef"))&&L("snapshot.profile is missing a required field","missing-field");let r=Ti(n.get("address"));(!t.address||r!==t.address)&&L("profile address does not match snapshot wallet","profile-mismatch");let o=Ni(n.get("evidenceRef"),"evidence","profile.evidenceRef");if(n.has("username")){let i=Zv(n.get("username"));return(i===null||i!==n.get("username"))&&L("profile username is not safely sanitized","invalid-username"),{address:r,evidenceRef:o,username:i}}return{address:r,evidenceRef:o}}function fse(e,t,n){let r=tt(e,["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`snapshot.holdings[${t}]`);["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"].every(l=>r.has(l))||L("snapshot holding is missing a required field","missing-field");let i=Jv({chainId:r.get("chainId"),contract:r.get("contract"),tokenId:r.get("tokenId")});r.get("id")!==i.id&&L("holding ID does not match canonical NFT","id-mismatch"),n.chainId!==i.chainId&&L("holding chain does not match snapshot wallet","chain-mismatch");let s=null;if(r.get("collection")!==null){let l=tt(r.get("collection"),["id","chainId","slug"],`snapshot.holdings[${t}].collection`);["id","chainId","slug"].every(u=>l.has(u))||L("holding collection is missing a required field","missing-field"),s=Qv({chainId:l.get("chainId"),slug:l.get("slug")}),(l.get("id")!==s.id||s.chainId!==i.chainId)&&L("holding collection does not match its canonical chain-bound identity","id-mismatch")}r.get("ownerBinding")!==Mr&&L("holding owner binding is invalid","invalid-owner-binding");let a=kn(r.get("evidenceRefs"),`snapshot.holdings[${t}].evidenceRefs`,et.citationsPerFinding,1).map(l=>Ni(l,"evidence","holding.evidenceRef")),c=[...new Set(a)].sort(ct);return c.length!==a.length&&L("holding evidence references must be unique","duplicate-reference"),{...i,collection:s,ownerBinding:Mr,evidenceRefs:c}}function mse(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 hse(e){let{requested:t,wallet:n,coverage:r,profile:o,holdings:i,evidence:s,gaps:a}=e;!t&&r.status!=="NOT_REQUESTED"&&L("unrequested snapshot coverage must be NOT_REQUESTED","invalid-coverage"),t&&r.status==="NOT_REQUESTED"&&L("requested snapshot coverage cannot be NOT_REQUESTED","invalid-coverage"),n.address===null&&(o!==null||i.length>0||s.length>0)&&L("noncanonical wallet snapshot cannot contain OpenSea facts","invalid-wallet"),(r.profile.calls>0||r.inventory.calls>0||o!==null||i.length>0||s.length>0)&&(!n.chainId||!Object.hasOwn(pa,n.chainId))&&L("OpenSea attempts and facts require a reviewed chain mapping","invalid-chain"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(o!==null||i.length>0||s.length>0)&&L(`${r.status} snapshot cannot contain OpenSea facts`,"invalid-coverage"),["PARTIAL","COMPLETE"].includes(r.status)&&o===null&&L(`${r.status} snapshot requires a matched profile`,"invalid-profile"),o!==null&&r.profile.calls!==1&&L("matched profile requires one profile call","invalid-count"),r.inventory.calls===1&&o===null&&L("inventory call requires a matched profile","invalid-profile"),i.length>0&&(o===null||r.inventory.calls!==1)&&L("holdings require a matched profile and inventory call","invalid-profile");let l=new Map;for(let y of s)l.has(y.id)&&L("snapshot evidence IDs must be unique","duplicate-evidence"),l.set(y.id,y),n.id&&y.walletId!==n.id&&L("evidence is not bound to snapshot wallet","wallet-mismatch");if(o){let y=l.get(o.evidenceRef);(!y||y.kind!=="PROFILE"||y.address!==o.address)&&L("profile citation does not reference its matched profile evidence","invalid-reference")}let u=new Set,d=0;for(let y of i){u.has(y.id)&&L("snapshot holdings must be unique","duplicate-holding"),u.add(y.id),y.collection===null&&(d+=1);for(let b of y.evidenceRefs)l.has(b)||L("holding cites unknown evidence","invalid-reference")}let p=new Set,m=We(),f=We();for(let y of a)p.add(y.code),y.code.startsWith("PROFILE_")&&ye(m,y.code),y.code.startsWith("INVENTORY_")&&ye(f,y.code);let h=new Set(["UNSUPPORTED_CHAIN_FAMILY","UNSUPPORTED_CHAIN","INVALID_EVM_ADDRESS","API_KEY_UNAVAILABLE"]);r.status==="NOT_REQUESTED"&&(t||a.length!==1||!p.has("NOT_REQUESTED"))&&L("NOT_REQUESTED coverage requires its exact reason","invalid-coverage"),r.status==="UNAVAILABLE"&&(!t||a.length!==1||!h.has(a[0].code))&&L("UNAVAILABLE coverage requires one exact availability reason","invalid-coverage"),!["NOT_REQUESTED","UNAVAILABLE"].includes(r.status)&&(p.has("NOT_REQUESTED")||[...h].some(y=>p.has(y)))&&L("attempted coverage cannot contain an availability reason","invalid-coverage"),d>0&&!p.has("INVENTORY_COLLECTION_REJECTED")&&!p.has("INVENTORY_CONFLICTING_HOLDING")&&L("holding without a collection requires incomplete collection coverage","invalid-coverage"),["COMPLETE","PARTIAL"].includes(r.profile.status)&&o===null&&L("completed profile phase requires a matched profile","invalid-profile"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.profile.status)&&o!==null&&L("unmatched profile phase cannot contain a profile","invalid-profile"),r.profile.status==="COMPLETE"&&m.length>0&&L("complete profile coverage cannot contain a profile gap","invalid-coverage"),r.profile.status==="PARTIAL"&&(m.length!==1||m[0]!=="PROFILE_USERNAME_REJECTED")&&L("partial profile coverage requires only its fixed username gap","invalid-coverage"),r.profile.status==="UNKNOWN"&&(m.length===0||m.some(y=>y==="PROFILE_USERNAME_REJECTED"))&&L("unknown profile coverage requires a fixed profile failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.profile.status)&&m.length>0&&L("uncalled profile coverage cannot contain a profile response gap","invalid-coverage");let g=new Set(["INVENTORY_CURSOR_PRESENT","INVENTORY_ROW_LIMIT","INVENTORY_ROW_REJECTED","INVENTORY_COLLECTION_REJECTED","INVENTORY_DUPLICATE_HOLDING","INVENTORY_CONFLICTING_HOLDING"]);r.inventory.status==="COMPLETE"&&f.length>0&&L("complete inventory coverage cannot contain an inventory gap","invalid-coverage"),r.inventory.status==="PARTIAL"&&(f.length===0||f.some(y=>!g.has(y)))&&L("partial inventory coverage requires only fixed inventory quality gaps","invalid-coverage"),r.inventory.status==="UNKNOWN"&&(f.length===0||f.some(y=>g.has(y)))&&L("unknown inventory coverage requires a fixed inventory failure gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE"].includes(r.inventory.status)&&f.length>0&&L("uncalled inventory coverage cannot contain an inventory response gap","invalid-coverage"),["NOT_REQUESTED","UNAVAILABLE","UNKNOWN"].includes(r.inventory.status)&&i.length>0&&L("incomplete inventory attempt cannot contain holdings","invalid-coverage"),r.status==="COMPLETE"&&a.length>0&&L("COMPLETE snapshot cannot contain gaps","invalid-coverage"),r.status!=="COMPLETE"&&a.length===0&&L("incomplete snapshot must contain a fixed gap","invalid-coverage")}function eE(e={}){let t=tt(e,["requested","wallet","coverage","profile","holdings","evidence","gapCodes"],"OpenSea snapshot input");["requested","wallet","coverage","profile","holdings","evidence","gapCodes"].every(b=>t.has(b))||L("OpenSea snapshot input is missing a required field","missing-field"),typeof t.get("requested")!="boolean"&&L("snapshot.requested must be boolean","invalid-boolean");let r=t.get("wallet"),o=tt(r,["id","family","chainId","address"],"snapshot.wallet"),i=o.has("id")?sse(r,"snapshot.wallet"):Sm(Object.fromEntries(["family","chainId","address"].filter(b=>o.has(b)).map(b=>[b,o.get(b)]))),s=ase(t.get("coverage")),c=kn(t.get("evidence"),"snapshot.evidence",et.evidencePerSnapshot).map((b,w)=>{try{let S=tt(b,["id","digest","status","source","kind","walletId","address","assetId","collectionId","ownerBinding"],`snapshot.evidence[${w}]`);return S.has("id")||S.has("digest")?dse(b,w):eu(Object.fromEntries(["status","source","kind","walletId","address","assetId","collectionId","ownerBinding"].filter(v=>S.has(v)).map(v=>[v,S.get(v)])))}catch(S){throw S}}).sort((b,w)=>ct(b.id,w.id)),l=t.get("profile"),u=null;if(l!==null){let b=tt(l,["address","evidenceRef","username"],"snapshot.profile");u=pse(Object.fromEntries(["address","evidenceRef","username"].filter(w=>b.has(w)).map(w=>[w,b.get(w)])),i)}let p=kn(t.get("holdings"),"snapshot.holdings",et.holdingsPerSnapshot).map((b,w)=>fse(b,w,i)).sort((b,w)=>ct(b.id,w.id)),m=kn(t.get("gapCodes"),"snapshot.gapCodes",Object.keys(To).length).map(b=>(Object.hasOwn(To,b)||L("snapshot gap code is invalid","invalid-gap"),b)),f=[...new Set(m)].sort(ct).map(lse),h={schemaVersion:wm,execution:"read-only",reportOnly:!0,identityInference:!1,requested:t.get("requested"),wallet:i,coverage:s,profile:u,holdings:p,evidence:c,gaps:f,caveats:[...da]};hse(h);let g=Oo("opensea-snapshot",mse(h)),y=_o(h);return bt({...h,snapshotId:g,digest:y})}function gse(e){let t=tt(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(s=>t.has(s))||L("OpenSea snapshot is missing a required field","missing-field"),(t.get("schemaVersion")!==wm||t.get("execution")!=="read-only"||t.get("reportOnly")!==!0||t.get("identityInference")!==!1)&&L("OpenSea snapshot envelope is invalid","invalid-envelope"),kn(t.get("caveats"),"snapshot.caveats",da.length,da.length).some((s,a)=>s!==da[a])&&L("snapshot caveats are invalid","invalid-caveat");let o=cse(t.get("gaps")),i=eE({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 Ni(t.get("snapshotId"),"opensea-snapshot","snapshot.snapshotId"),pq(t.get("digest"),"snapshot.digest"),(t.get("snapshotId")!==i.snapshotId||t.get("digest")!==i.digest)&&L("snapshot ID or digest does not match normalized content","digest-mismatch"),i}function yse(e){return{code:e,message:Xie[e]}}function bse(e,t,n,r){let o=e.profile;if(!o||!e.wallet.id)return null;let i=!1;for(let c of t.evidenceRefs)c===o.evidenceRef&&(i=!0);if(!i)return null;let s=n.get(o.evidenceRef);if(!s||s.kind!=="PROFILE"||!Yv.has(s.status)||s.walletId!==e.wallet.id||s.address!==e.wallet.address||r.has(s.id))return null;let a=null;for(let c of t.evidenceRefs){let l=n.get(c);!l||l.id===s.id||l.kind!=="HOLDING"||!Yv.has(l.status)||l.walletId!==e.wallet.id||l.assetId!==t.id||l.collectionId!==(t.collection?.id??null)||l.ownerBinding!==Mr||r.has(l.id)||(!a||ct(l.id,a.id)<0)&&(a=l)}return a?{walletId:e.wallet.id,chainId:e.wallet.chainId,address:e.wallet.address,snapshotId:e.snapshotId,ownerBinding:Mr,profileEvidence:{id:s.id,status:s.status},holdingEvidence:{id:a.id,status:a.status}}:null}function rq(e,t,n,r){let o=e.get(t);o||(o={canonical:n,byWallet:new Map},e.set(t,o));let i=o.byWallet.get(r.walletId);(!i||ct(`${r.snapshotId}:${r.holdingEvidence.id}`,`${i.snapshotId}:${i.holdingEvidence.id}`)<0)&&o.byWallet.set(r.walletId,r)}function wse(e,t,n){(!Array.isArray(n)||n.length<2||n.length>et.snapshots||n.length*2>et.citationsPerFinding)&&L("finding citations exceeded the fixed limit","citation-limit");let r=We();for(let u=0;u<n.length;u+=1)ye(r,n[u]);r.sort((u,d)=>ct(u.walletId,d.walletId)||ct(u.snapshotId,d.snapshotId)||ct(u.holdingEvidence.id,d.holdingEvidence.id));let o=We(),i=We(),s=new Set;for(let u of r)ye(o,u.walletId),s.add(u.profileEvidence.id),s.add(u.holdingEvidence.id),s.size>et.citationsPerFinding&&L("finding citations exceeded the fixed limit","citation-limit"),ye(i,{walletId:u.walletId,chainId:u.chainId,address:u.address,snapshotId:u.snapshotId,ownerBinding:u.ownerBinding,profileEvidence:u.profileEvidence,holdingEvidence:u.holdingEvidence});let a=We();for(let u of s)ye(a,u);a.sort(ct);let c={kind:e,status:Kv,...e==="EXACT_NFT_OVERLAP"?{asset:t}:{collection:t},walletIds:o,citations:i,evidenceRefs:a};return{id:Oo(e==="EXACT_NFT_OVERLAP"?"nft-overlap":"collection-overlap",c),digest:_o(c),...c}}function Gv(e,t){return`${e}:${t.canonical.id}`}function oq(e){let t=null;for(let n of e.values())n.byWallet.size<2||(!t||ct(n.canonical.id,t.canonical.id)<0)&&(t=n);return t}function Sse(e,t,n){if(n<=0)return;if(e.length<n){ye(e,t);return}let r=0;for(let o=1;o<e.length;o+=1)ct(e[o].key,e[r].key)>0&&(r=o);ct(t.key,e[r].key)<0&&Object.defineProperty(e,String(r),{value:t,writable:!0,enumerable:!0,configurable:!0})}function vse(e,t){let n=0,r=0;for(let h of e.values())h.byWallet.size>=2&&(n+=1);for(let h of t.values())h.byWallet.size>=2&&(r+=1);let o=n+r,i=We(),s=new Set,a=oq(e),c=oq(t);if(a){let h={section:"exact",group:a,key:Gv("exact",a)};ye(i,h),s.add(h.key)}if(c){let h={section:"collection",group:c,key:Gv("collection",c)};ye(i,h),s.add(h.key)}let l=We(),u=et.findings-i.length,d=(h,g)=>{for(let y of g.values()){if(y.byWallet.size<2)continue;let b=Gv(h,y);s.has(b)||Sse(l,{section:h,group:y,key:b},u)}};d("exact",e),d("collection",t);let p=We();for(let h of i)ye(p,h);for(let h of l)ye(p,h);p.length>et.findings&&L("finding selection exceeded the fixed limit","finding-limit"),p.sort((h,g)=>ct(h.key,g.key));let m=We(),f=We();for(let h of p)ye(h.section==="exact"?m:f,h.group);return{exact:m,collections:f,exactCount:n,collectionCount:r,truncated:o>et.findings}}function bm(e){return e.coverage.inventory.status==="COMPLETE"}function Ese(e){e.byWallet.size>et.snapshots&&L("finding wallet citations exceeded the snapshot limit","citation-limit");let t=We();for(let n of e.byWallet.values())ye(t,n);return t.length*2>et.citationsPerFinding&&L("finding citations exceeded the fixed limit","citation-limit"),t}function iq(e,t){let n=We();for(let r of t)ye(n,wse(e,r.canonical,Ese(r)));return n.sort((r,o)=>ct(r.id,o.id)),n}function fq(e){arguments.length!==1&&L("analyzeNftOverlap requires exactly one input object","second-options-forbidden");let t=tt(e,["schemaVersion","snapshots"],"NFT overlap input");(!t.has("schemaVersion")||!t.has("snapshots"))&&L("NFT overlap input is missing a required field","missing-field"),t.get("schemaVersion")!==Wie&&L("NFT overlap input schema is invalid","invalid-schema");let n=kn(t.get("snapshots"),"NFT overlap snapshots",et.snapshots,2),r=0;for(let W=0;W<n.length;W+=1){let R=tt(n[W],["schemaVersion","snapshotId","digest","execution","reportOnly","identityInference","requested","wallet","coverage","profile","holdings","evidence","gaps","caveats"],`NFT overlap snapshots[${W}]`);for(let z of["holdings","evidence","gaps","caveats"])R.has(z)||L(`snapshot ${z} is required`,"missing-field");let F=kn(R.get("holdings"),`NFT overlap snapshots[${W}].holdings`,et.holdingsPerSnapshot);kn(R.get("evidence"),`NFT overlap snapshots[${W}].evidence`,et.evidencePerSnapshot),kn(R.get("gaps"),`NFT overlap snapshots[${W}].gaps`,Object.keys(To).length),kn(R.get("caveats"),`NFT overlap snapshots[${W}].caveats`,da.length,da.length),r+=F.length,r>et.totalHoldings&&L("total holdings exceed the fixed limit","holding-limit");for(let z=0;z<F.length;z+=1){let Z=tt(F[z],["id","chainId","contract","tokenId","collection","ownerBinding","evidenceRefs"],`NFT overlap snapshots[${W}].holdings[${z}]`);Z.has("evidenceRefs")||L("holding evidenceRefs are required","missing-field"),kn(Z.get("evidenceRefs"),`NFT overlap snapshots[${W}].holdings[${z}].evidenceRefs`,et.citationsPerFinding,1)}}let o=We();for(let W of n)ye(o,gse(W));let i=new Map;for(let W of o){let R=W.wallet.id&&W.wallet.chainId?`${W.wallet.id}:${W.wallet.chainId}`:`noncanonical:${W.snapshotId}`;i.has(R)||i.set(R,We()),ye(i.get(R),W)}let s=We(),a=0,c=0,l=We();for(let W of i.keys())ye(l,W);l.sort(ct);for(let W of l){let R=i.get(W),F=new Set;for(let z of R)F.add(z.digest);if(F.size>1&&!W.startsWith("noncanonical:")){c+=1;continue}R.sort((z,Z)=>ct(z.snapshotId,Z.snapshotId)),ye(s,R[0]),a+=R.length-1}let u=new Map;for(let W of s)for(let R of W.evidence)u.has(R.id)||u.set(R.id,new Set),W.wallet.id&&u.get(R.id).add(W.wallet.id);let d=new Set;for(let[W,R]of u)R.size>1&&d.add(W);let p=new Map,m=new Map,f=new Set,h=new Map,g=new Map,y=0,b=0,w=!1,S=c>0,v=c>0;for(let W of s){let R=W.wallet.id;R&&f.add(R),W.coverage.profile.status==="PARTIAL"&&(w=!0);let F=new Map;for(let ue of W.evidence)F.set(ue.id,ue);let z=W.profile?F.get(W.profile.evidenceRef):null,Z=!!(W.profile&&R&&z&&z.kind==="PROFILE"&&Yv.has(z.status)&&z.walletId===R&&z.address===W.wallet.address&&!d.has(z.id)),re=Z&&bm(W),me=Z&&bm(W);(bm(W)||bm(W))&&!Z&&(y+=1);let be=new Set;W.profile&&be.add(W.profile.evidenceRef);for(let ue of W.holdings){let le=bse(W,ue,F,d);if(!le){b+=1,re=!1,me=!1;continue}be.add(le.profileEvidence.id),be.add(le.holdingEvidence.id),rq(p,ue.id,{id:ue.id,chainId:ue.chainId,contract:ue.contract,tokenId:ue.tokenId},le),ue.collection?rq(m,ue.collection.id,ue.collection,le):me=!1}for(let ue of W.evidence)be.has(ue.id)||(b+=1,re=!1,me=!1);R?(h.set(R,(h.has(R)?h.get(R):!0)&&re),g.set(R,(g.has(R)?g.get(R):!0)&&me)):(re=!1,me=!1),re||(S=!0),me||(v=!0)}let I=new Set,A=new Set;for(let[W,R]of h)R&&I.add(W);for(let[W,R]of g)R&&A.add(W);let E=new Set;for(let W of I)A.has(W)&&E.add(W);let k=vse(p,m),O=iq("EXACT_NFT_OVERLAP",k.exact),T=iq("EXACT_OPENSEA_COLLECTION_SLUG_OVERLAP",k.collections),D=!S&&f.size>=2&&I.size>=2,X=!v&&f.size>=2&&A.size>=2,H=k.exactCount>0?Kv:D?tq:ym,$=k.collectionCount>0?Kv:X?tq:ym,j=We();c>0&&ye(j,"CONFLICTING_DUPLICATE_SNAPSHOT"),(S||v)&&ye(j,"INPUT_COVERAGE_INCOMPLETE"),S&&ye(j,"EXACT_NFT_COVERAGE_INCOMPLETE"),v&&ye(j,"COLLECTION_COVERAGE_INCOMPLETE"),w&&ye(j,"PROFILE_METADATA_INCOMPLETE"),(y>0||b>0||d.size>0)&&ye(j,"INELIGIBLE_HOLDING_EVIDENCE"),f.size<2&&k.exactCount===0&&k.collectionCount===0&&ye(j,"INSUFFICIENT_DISTINCT_WALLETS"),k.truncated&&ye(j,"FINDINGS_TRUNCATED");let C=We(),B=new Set;for(let W of j)B.has(W)||(B.add(W),ye(C,W));C.sort(ct);let V=We();for(let W of C)ye(V,yse(W));let K=0;for(let W of p.values())K+=W.byWallet.size;let xe=!S&&!v&&!w&&!k.truncated&&f.size>=2?"COMPLETE":H!==ym||$!==ym?"PARTIAL":"UNKNOWN",qe={schemaVersion:Gie,operation:"nftOverlap",execution:"read-only",networkAccess:!1,reportOnly:!0,identityInference:!1,status:xe,input:{suppliedSnapshots:n.length,includedSnapshots:s.length,collapsedDuplicateSnapshots:a,excludedConflictingSnapshotGroups:c,distinctWallets:f.size,completeDistinctWallets:E.size,completeExactNftWallets:I.size,completeCollectionWallets:A.size,qualifyingHoldings:K},exactNft:{state:H,findings:O},collection:{state:$,findings:T},gaps:V,caveats:[...Yie],limits:et},un=Oo("nft-overlap-report",qe),$t=_o(qe);return bt({...qe,reportId:un,digest:$t})}var wm,Wie,Gie,Mr,Kie,A0e,Kv,tq,ym,et,pa,da,Yie,To,Xie,aq,Jie,Yv,ct,Qie,Zie,ese,tse,cq,lq,nse,tE=_(()=>{ro();Kl();wm="oracle.opensea-wallet-enrichment/1",Wie="oracle.nft-overlap-input/1",Gie="oracle.nft-overlap/1",Mr="REQUEST_PATH_PLUS_MATCHED_PROFILE",Kie=bt(["NOT_REQUESTED","UNAVAILABLE","UNKNOWN","PARTIAL","COMPLETE"]),A0e=bt(["COMPLETE","PARTIAL","UNKNOWN"]),Kv="OBSERVED",tq="NOT_OBSERVED_IN_COMPLETE_INDEXED_INVENTORIES",ym="UNKNOWN",et=bt({snapshots:32,holdingsPerSnapshot:20,totalHoldings:640,evidencePerSnapshot:64,findings:250,citationsPerFinding:64}),pa=bt({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"}),da=bt(["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."]),Yie=bt(["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."]),To=bt({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."}),Xie=bt({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."}),aq=new Set(Kie),Jie=new Set(Gl),Yv=new Set(["LIVE","INDEXED"]),ct=(e,t)=>e<t?-1:e>t?1:0,Qie=/^0x[0-9a-fA-F]{40}$/u,Zie=/^(?:0|[1-9][0-9]*|0[0-9]+)$/u,ese=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/u,tse=/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,63})$/u,cq=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,lq=/[\u0000-\u001f\u007f-\u009f]/u,nse=(1n<<256n)-1n});import{types as Ci}from"node:util";function nE(){let e=[];return Object.defineProperty(e,"toJSON",{value:void 0,writable:!1,enumerable:!1,configurable:!1}),e}function qn(e,t){return Object.defineProperty(e,String(e.length),{value:t,writable:!0,enumerable:!0,configurable:!0}),e}function _t(e,t="invalid-opensea-request"){let n=new TypeError(`opensea enrichment: ${e}`);throw n.code=t,n}function Nse(e){(!e||typeof e!="object"||Array.isArray(e)||Ci.isProxy(e))&&_t("one non-Proxy args object is required","invalid-object");let t,n;try{t=Object.getPrototypeOf(e),n=Reflect.ownKeys(e)}catch{_t("args could not be inspected safely","invalid-object")}t!==Object.prototype&&t!==null&&_t("args must be a plain object","invalid-object");let r=new Set(_se),o=new Map;for(let i of n){if(typeof i!="string"||!r.has(i)){let a=typeof i=="string"?i.replace(/[^a-z0-9]/giu,"").toLowerCase():"symbol";Ose.some(c=>a.includes(c))&&_t("args expose a forbidden key, environment, header, URL, transport, or clock seam","forbidden-surface"),_t("args have an unknown own field","unknown-field")}let s;try{s=Object.getOwnPropertyDescriptor(e,i)}catch{_t(`args.${i} could not be inspected safely`,"invalid-object")}(!s||!("value"in s))&&_t(`args.${i} must be an own data field`,"invalid-object"),o.set(i,s.value)}return o}function Tse(e){let t=Nse(e);for(let l of["family","address"])t.has(l)||_t(`args.${l} is required`,"missing-field");let n=t.get("family");(typeof n!="string"||n.length===0||n.length>64||vm.test(n))&&_t("args.family is invalid","invalid-family");let r=n.trim().toLowerCase();/^[a-z][a-z0-9-]{0,63}$/u.test(r)||_t("args.family is invalid","invalid-family");let o=t.get("address");(typeof o!="string"||o.length===0||o.length>256||vm.test(o))&&_t("args.address is invalid","invalid-address");let i=o.trim();(!i||/:\/\//u.test(i))&&_t("args.address must not be a URL","invalid-address");let s=Sq.has(r),a=t.has("chainId")?t.get("chainId"):Object.hasOwn(mq,r)?mq[r]:null;s?a!==null&&(!Number.isSafeInteger(a)||a<=0)&&_t("args.chainId must be a positive safe integer","invalid-chain"):(a!=null&&!(typeof a=="string"&&a.length>0&&a.length<=96&&!vm.test(a)||Number.isSafeInteger(a)&&a>0)&&_t("args.chainId is invalid","invalid-chain"),a=null);let c=t.has("includeOpenSea")?t.get("includeOpenSea"):!1;return typeof c!="boolean"&&_t("args.includeOpenSea must be a literal boolean","invalid-boolean"),{family:r,chainId:a,address:i,includeOpenSea:c}}function Cse(e){let t=Sq.has(e.family),n=t?"evm":e.family,r=null;if(t)try{r=Ti(e.address)}catch{r=null}return{family:n,chainId:e.chainId,address:r,wallet:Sm({family:n,chainId:e.chainId,address:r}),evm:t}}function Co({requested:e,target:t,status:n,profileStatus:r,inventoryStatus:o,profileCalls:i=0,inventoryCalls:s=0,profile:a=null,holdings:c=[],evidence:l=[],gaps:u=[]}){return eE({requested:e,wallet:t.wallet,coverage:{status:n,profile:{status:r,calls:i},inventory:{status:o,calls:s}},profile:a,holdings:c,evidence:l,gapCodes:u})}function Pse(){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 vq(e){let t=pn(e);return t&&t.length<=Ise?t:null}function rE(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Ci.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 i;try{i=Object.getOwnPropertyDescriptor(e,o)}catch{throw new Error("malformed-response")}if(i){if(!("value"in i))throw new Error("malformed-response");r.set(o,i.value)}}return r}function Rse(e,t){if(!Array.isArray(e)||Ci.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),i=nE();for(let s=0;s<o;s+=1){let a;try{a=Object.getOwnPropertyDescriptor(e,String(s))}catch{throw new Error("malformed-response")}qn(i,a&&"value"in a?a.value:Symbol.for("opensea.invalid-row"))}return{rows:i,overflow:r>t}}function tu(e,t){return typeof e=="string"&&typeof t=="string"&&t.length>0&&e.includes(t)}function Lse(e,t,n){let r=rE(e,["address","username"]);if(!r.has("address")||typeof r.get("address")!="string")throw new Error("malformed-response");let o;try{o=Ti(r.get("address"))}catch{throw new Error("malformed-response")}if(o!==t){let a=new Error("profile-mismatch");throw a.profileMismatch=!0,a}let i,s=!1;if(r.has("username")&&r.get("username")!==null&&r.get("username")!==void 0){let a=r.get("username");i=tu(a,n)?null:Zv(a),(i===null||i!==a)&&(i=void 0,s=!0)}return{address:o,...i!==void 0?{username:i}:{},usernameRejected:s}}function Mse(e,t,n,r){let o=rE(e,["nfts","next"]);if(!o.has("nfts"))throw new Error("malformed-response");let i=o.has("next")?o.get("next"):null;if(i!==null&&(typeof i!="string"||i.length===0||i.length>Ase||vm.test(i)||kse.test(i)||tu(i,r)))throw new Error("malformed-response");let{rows:s,overflow:a}=Rse(o.get("nfts"),xse),c=nE();a&&qn(c,"INVENTORY_ROW_LIMIT"),typeof i=="string"&&qn(c,"INVENTORY_CURSOR_PRESENT");let l=new Map,u=new Set;for(let m of s){let f,h;try{if(typeof m=="symbol")throw new Error("invalid-row");if(f=rE(m,["identifier","contract","collection"]),!["identifier","contract"].every(b=>f.has(b)))throw new Error("invalid-row");if(![f.get("identifier"),f.get("contract")].every(b=>typeof b=="string"))throw new Error("invalid-row");if(tu(f.get("identifier"),r)||tu(f.get("contract"),r))throw new Error("invalid-row");h=Jv({chainId:t.chainId,contract:f.get("contract"),tokenId:f.get("identifier")})}catch{qn(c,"INVENTORY_ROW_REJECTED");continue}let g=null;if(f.has("collection")&&typeof f.get("collection")=="string"&&!tu(f.get("collection"),r))try{g=Qv({chainId:t.chainId,slug:f.get("collection")})}catch{g=null}if(g===null&&qn(c,"INVENTORY_COLLECTION_REJECTED"),u.has(h.id)){qn(c,"INVENTORY_CONFLICTING_HOLDING");continue}let y=l.get(h.id);if(y){let b=y.collection?.id??null,w=g?.id??null;b===null&&w!==null?(l.set(h.id,{nft:h,collection:g}),qn(c,"INVENTORY_DUPLICATE_HOLDING")):w===null||b===w?qn(c,"INVENTORY_DUPLICATE_HOLDING"):(l.set(h.id,{nft:h,collection:null}),u.add(h.id),qn(c,"INVENTORY_CONFLICTING_HOLDING"));continue}l.set(h.id,{nft:h,collection:g})}let d=nE(),p=[n];for(let{nft:m,collection:f}of[...l.values()].sort((h,g)=>Em(h.nft.id,g.nft.id))){let h=eu({status:"INDEXED",source:"opensea-v2-account-nfts",kind:"HOLDING",walletId:t.wallet.id,assetId:m.id,collectionId:f?.id??null,ownerBinding:Mr});qn(p,h),qn(d,{...m,collection:f,ownerBinding:Mr,evidenceRefs:[n.id,h.id].sort(Em)})}return{holdings:d,evidence:p,gaps:[...new Set(c)].sort(Em)}}function Po(e,t){if(typeof e!="object"&&typeof e!="function"||e===null||Ci.isProxy(e))return;let n;try{n=Object.getOwnPropertyDescriptor(e,t)}catch{return}return n&&"value"in n?n.value:void 0}function hq(e,t){let n=t==="profile"?"PROFILE":"INVENTORY",r=Po(e,"status"),o=Po(e,"name"),i=Po(e,"message");return Po(e,"profileMismatch")===!0?"PROFILE_ADDRESS_MISMATCH":Po(e,"redirectRefused")===!0||Number.isInteger(r)&&r>=300&&r<400?`${n}_REDIRECT_REFUSED`:Po(e,"oversize")===!0?`${n}_RESPONSE_TOO_LARGE`:Po(e,"oracleTimeout")===!0||Po(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`:i==="malformed-response"?`${n}_MALFORMED`:`${n}_TRANSPORT_FAILED`}function oE(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 $se(e){if(!e||typeof e!="object"||Array.isArray(e)||Ci.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 i;try{i=Object.getOwnPropertyDescriptor(e,o)}catch{throw new TypeError("OpenSea transport could not inspect headers")}if(!i||!("value"in i))throw new TypeError("OpenSea transport requires own-data headers");r.set(o,i.value)}if(r.get("Accept")!=="application/json"||vq(r.get("x-api-key"))!==r.get("x-api-key"))throw new TypeError("OpenSea transport fixed headers are invalid");return oE([["Accept","application/json"],["x-api-key",r.get("x-api-key")]])}async function Bse(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"||Ci.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"?$se(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 gq(e,t){let n=oE([["x-api-key",e]]);return oE([["method","GET"],["headers",n],["fetchImpl",Bse],["timeoutMs",wq],["retries",0],["dedupe",!1],["maxResponseBytes",t],["redirectPolicy","error"],["maxRedirects",0]])}function Dse(e){if(e===void 0)return new Map;if(!e||typeof e!="object"||Array.isArray(e)||Ci.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 i of n){if(typeof i!="string"||!r.has(i))throw new TypeError("OpenSea internal client dependencies have an unknown field");let s;try{s=Object.getOwnPropertyDescriptor(e,i)}catch{throw new TypeError("OpenSea internal client dependencies could not be inspected safely")}if(!s||!("value"in s))throw new TypeError(`OpenSea internal client dependency ${i} must be an own data field`);o.set(i,s.value)}return o}function Eq(e){if(arguments.length>1)throw new TypeError("OpenSea internal client accepts at most one dependency object");let t=Dse(e),n=t.has("requestJson")?t.get("requestJson"):x,r=t.has("readApiKey")?t.get("readApiKey"):Pse;if(typeof n!="function"||typeof r!="function")throw new TypeError("OpenSea internal client dependencies must be functions");async function o(i){arguments.length!==1&&_t("exactly one args object is required","second-options-forbidden");let s=Tse(i),a=Cse(s);if(!s.includeOpenSea)return Co({requested:!1,target:a,status:"NOT_REQUESTED",profileStatus:"NOT_REQUESTED",inventoryStatus:"NOT_REQUESTED",gaps:["NOT_REQUESTED"]});if(!a.evm)return Co({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN_FAMILY"]});if(a.chainId===null||!Object.hasOwn(pa,a.chainId))return Co({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["UNSUPPORTED_CHAIN"]});if(!a.address||!a.wallet.id)return Co({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["INVALID_EVM_ADDRESS"]});let c;try{c=vq(r())}catch{c=null}if(!c)return Co({requested:!0,target:a,status:"UNAVAILABLE",profileStatus:"UNAVAILABLE",inventoryStatus:"UNAVAILABLE",gaps:["API_KEY_UNAVAILABLE"]});let l=`https://api.opensea.io/api/v2/accounts/${a.address}`,u;try{let b=await n(l,gq(c,yq));u=Lse(b,a.address,c)}catch(b){return Co({requested:!0,target:a,status:"UNKNOWN",profileStatus:"UNKNOWN",inventoryStatus:"UNAVAILABLE",profileCalls:1,inventoryCalls:0,gaps:[hq(b,"profile")]})}let d=eu({status:"INDEXED",source:"opensea-v2-profile",kind:"PROFILE",walletId:a.wallet.id,address:a.address}),p={address:a.address,evidenceRef:d.id,...u.username!==void 0?{username:u.username}:{}},m=u.usernameRejected?["PROFILE_USERNAME_REJECTED"]:[],h=`https://api.opensea.io/api/v2/chain/${pa[a.chainId]}/account/${a.address}/nfts?limit=20`,g;try{let b=await n(h,gq(c,bq));g=Mse(b,a,d,c)}catch(b){return Co({requested:!0,target:a,status:"PARTIAL",profileStatus:m.length===0?"COMPLETE":"PARTIAL",inventoryStatus:"UNKNOWN",profileCalls:1,inventoryCalls:1,profile:p,evidence:[d],gaps:[...m,hq(b,"inventory")]})}let y=[...new Set([...m,...g.gaps])].sort(Em);return Co({requested:!0,target:a,status:y.length===0?"COMPLETE":"PARTIAL",profileStatus:m.length===0?"COMPLETE":"PARTIAL",inventoryStatus:g.gaps.length===0?"COMPLETE":"PARTIAL",profileCalls:1,inventoryCalls:1,profile:p,holdings:g.holdings,evidence:g.evidence,gaps:y})}return Object.freeze({enrich:o})}var yq,bq,wq,xse,Ase,Ise,Sq,mq,vm,kse,_se,Ose,Em,T0e,xq=_(()=>{q();vt();tE();yq=128*1024,bq=1024*1024,wq=8e3,xse=20,Ase=512,Ise=1024,Sq=new Set(["evm","eth","ethereum","base","arbitrum","optimism","polygon","polymarket","bsc","avalanche","abstract","stable","robinhood","hyperevm"]),mq=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}),vm=/[\u0000-\u001f\u007f-\u009f]/u,kse=/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/u,_se=Object.freeze(["family","chainId","address","includeOpenSea"]),Ose=Object.freeze(["key","env","header","url","base","endpoint","fetch","transport","clock","now","option","rpc","signer","privatekey","secret","prepare","broadcast"]),Em=(e,t)=>e<t?-1:e>t?1:0;T0e=Object.freeze({profileMaxBytes:yq,inventoryMaxBytes:bq,timeoutMs:wq,retries:0,redirects:0,dedupe:!1})});async function Aq(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 Use.enrich(e)}var Use,Iq=_(()=>{xq();Use=Eq()});import{types as _q}from"node:util";function Ro(e,t="invalid-provider-request"){throw new ki(`provider: ${e}`,t)}function jse(e,t){return(!e||typeof e!="object"||_q.isProxy(e)||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&Ro(`${t} must be a plain object`,"invalid-object"),e}function xm(e,t,n){jse(e,n);let r=new Set(t);Object.getOwnPropertySymbols(e).length>0&&Ro(`${n} has unknown field(s)`,"unknown-field");let o=Object.getOwnPropertyNames(e).filter(s=>{let a=Object.getOwnPropertyDescriptor(e,s);return!(s==="toJSON"&&a&&Object.hasOwn(a,"value")&&a.value===void 0)});for(let s of o){let a=Object.getOwnPropertyDescriptor(e,s);(!a||!a.enumerable||!Object.hasOwn(a,"value"))&&Ro(`${n}.${s} must be enumerable own data`,"invalid-object")}let i=o.filter(s=>!r.has(s));i.length&&(i.some(s=>{let a=s.replace(/[^a-z0-9]/giu,"").toLowerCase();return qse.some(c=>a.includes(c))})&&Ro(`${n} exposes a forbidden URL, transport, signer, or transaction field`,"forbidden-surface"),Ro(`${n} has unknown field(s)`,"unknown-field"))}function mt(e,t){let n=e&&typeof e=="object"&&!_q.isProxy(e)?Object.getOwnPropertyDescriptor(e,t):null;return n&&Object.hasOwn(n,"value")?n.value:void 0}function nu(e,t){e.length!==0&&Ro(`${t} does not accept caller options`,"forbidden-surface")}function Hse(e){xm(e,kq,"wallet");let t=Object.fromEntries(kq.map(o=>[o,mt(e,o)]).filter(([,o])=>o!==void 0)),n=mt(e,"includeOpenSea"),r=n===void 0?!1:n;return typeof r!="boolean"&&Ro("wallet.includeOpenSea must be a literal boolean","invalid-boolean"),{...t,includeOpenSea:r}}function sE(e){let t=mt(e,"coverage"),n=mt(t,"collectorStatus"),r=mt(t,"status"),o=n??r;return["COMPLETE","PARTIAL","UNAVAILABLE","UNKNOWN"].includes(o)?o:"UNKNOWN"}function Nq(e){let t=sE(e);return{subject:mt(e,"subject"),entities:mt(e,"entities"),events:mt(e,"events"),evidence:mt(e,"evidence"),coverage:{history:{status:["COMPLETE","PARTIAL"].includes(t)?t:"UNKNOWN"}},gaps:mt(e,"gaps")}}function Tq(e,t,n,r,o){return on({schemaVersion:Oq,provider:iE,operation:e,execution:"read-only",reportOnly:!0,status:t,components:n,coordination:r,...o!==void 0?{openSea:o}:{},caveats:["Patterns are limited to supplied or collected public evidence.","Coordination signals do not establish identity, common control, fraud, or unlawful conduct."]})}function Cq(e={},...t){return nu(t,"health"),xm(e,[],"health"),on({ok:!0,provider:iE,execution:"read-only",reportOnly:!0,networkProbed:!1,status:"READY"})}function Pq(e={},...t){nu(t,"capabilities"),xm(e,[],"capabilities");let n=Object.fromEntries(Object.entries(Cr).filter(([r])=>r!=="unsupported").map(([r,o])=>[r,o.maxLimit]));return on({schemaVersion:Oq,provider:iE,operation:"capabilities",execution:"read-only",reportOnly:!0,networkProbed:!1,walletNetworkAccess:!0,status:"COMPLETE",walletEvidence:Cr,limits:{traversal:An,records:Ze,walletRequestLimit:1e3,walletRequestLimits:n,openSeaHoldings:et.holdingsPerSnapshot,nftOverlap:et},openSea:{schemaVersion:wm,optIn:!0,apiKeyEnvironment:"OPENSEA_API_KEY",chainSlugs:pa,pagination:!1,identityInference:!1,launchRadar:{status:"UNAVAILABLE",reason:"OpenSea enrichment is investigator-only and is not a Launch Radar evidence source."}},surfaces:{signer:!1,prepare:!1,broadcast:!1,arbitraryUrl:!1,arbitraryRpc:!1,callerTransport:!1,callerCredential:!1}})}async function Rq(e,...t){nu(t,"wallet");let n=Hse(e),r=Object.fromEntries(["family","chainId","address","limit","cursor"].map(c=>[c,mt(n,c)]).filter(([,c])=>c!==void 0)),o=await $F(r),i=Nv(o),s=Wv(Nq(i)),a=await Aq({family:mt(n,"family"),...mt(n,"chainId")!==void 0?{chainId:mt(n,"chainId")}:{},address:mt(n,"address"),includeOpenSea:mt(n,"includeOpenSea")});return Tq("wallet",sE(i),i,s,a)}function Lq(e={},...t){nu(t,"analyze"),xm(e,Fse,"analyze");let n=mt(e,"collection"),r=mt(e,"components"),o=n!==void 0,i=r!==void 0;Number(o)+Number(i)!==1&&Ro("analyze requires exactly one of collection or components","invalid-analysis-input");let a=o?Nv(n):Ov(r),c=Wv(Nq(a));return Tq("analyze",sE(a),a,c)}function Mq(e,...t){return nu(t,"nftOverlap"),fq(e)}var iE,Oq,kq,Fse,qse,$q=_(()=>{Kl();BF();eq();Iq();tE();iE="onchain-investigator",Oq="oracle.onchain-investigator-provider/2",kq=Object.freeze(["family","chainId","address","limit","cursor","includeOpenSea"]),Fse=Object.freeze(["collection","components"]),qse=Object.freeze(["url","rpc","lcd","endpoint","fetch","transport","signer","privatekey","secret","prepare","broadcast","key","env","header","base","option","clock","now","access","jwt","code"])});function Bq(){return{ok:!0,provider:"kalshi",exec:!1,execution:"read-only",restricted:!0,note:"Read-only market catalog. Trading may be US-restricted. Prepare refused."}}function Dq(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.ticker||r.id||"").trim(),i=Number(r.yes_bid??r.yesPrice??r.last_price);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"kalshi",ticker:o,title:String(r.title||r.subtitle||o),yes:i,no:Number.isFinite(Number(r.no_bid??r.noPrice))?Number(r.no_bid??r.noPrice):1-i,closeTime:r.close_time||r.closeTime||null}))}return n.sort((r,o)=>r.ticker.localeCompare(o.ticker)),Object.freeze({ok:!0,execution:"read-only",exec:!1,restricted:!0,count:n.length,markets:Object.freeze(n)})}var Uq=_(()=>{});function qq(){return Object.freeze({ok:!1,provider:"derive-options",exec:!1,execution:"unavailable",status:"unavailable",deprecated:Fq,error:Fq.reason})}function jq(e,t){return Xf(e,t)}var Fq,Hq=_(()=>{mv();Fq=Object.freeze({since:"2026-08-25",reason:"No official Derive EIP-712 domain or contract is pinned, so prepare remains unavailable",evidence:"prepareOption() in onchain-options.mjs refuses unconditionally"})});function zq(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function Vq(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.id||r.slug||"").trim(),i=Number(r.yes??r.yesPrice??r.last);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"limitless",id:o,title:String(r.title||o),yes:i,closeTime:r.closeTime||r.close_time||null}))}return Object.freeze({ok:!0,execution:"read-only",exec:!1,count:n.length,markets:Object.freeze(n)})}var Wq=_(()=>{});function Yq(){return Object.freeze({ok:!1,provider:"dov-vaults",exec:!1,execution:"unavailable",status:"unavailable",registry:Kq.length,deprecated:Gq,error:Gq.reason})}function Xq(e={}){let t=String(e.address||"").toLowerCase(),n=Kq.find(r=>r.address===t);if(!n)throw new Error("dov-vaults: unknown vault, registry empty until code hash is pinned");return Object.freeze({ok:!0,execution:"read-only",exec:!1,vault:n})}var Kq,Gq,Jq=_(()=>{Kq=Object.freeze([]),Gq=Object.freeze({since:"2026-08-25",reason:"The reviewed DOV vault registry is empty, so every vault read refuses",evidence:"REVIEWED_DOV_VAULTS.length is zero and no reviewed code hash is pinned"})});function Qq(e={},t={}){let n=[];String(e.resolutionSource||"")!==String(t.resolutionSource||"")&&n.push("resolution-source"),String(e.outcomeYes||"")!==String(t.outcomeYes||"")&&n.push("outcome-semantics"),String(e.denomination||"")!==String(t.denomination||"")&&n.push("denomination"),String(e.voidRule||"")!==String(t.voidRule||"")&&n.push("void-rule");let r=Number(e.closeMs),o=Number(t.closeMs);return(!(r>0)||!(o>0)||Math.abs(r-o)>6*3600*1e3)&&n.push("close-window"),Object.freeze({ok:n.length===0,matched:n.length===0,reasons:Object.freeze(n),execution:"read-only",exec:!1,note:n.length?"not comparable":"windows and resolution match"})}var Zq=_(()=>{});function e4(){return{ok:!0,provider:"tee-attestation",exec:!1,execution:"read-only",hardware:"unavailable",status:"unavailable",note:"Schema+stub only. No vendor trust root is installed."}}function t4(e={}){if(!e||typeof e!="object")return Object.freeze({ok:!1,status:"unverified",reason:"missing-report"});if(e.synthetic===!0)return Object.freeze({ok:!1,status:"unverified",reason:"synthetic-report"});let t=["verifierType","instancePublicKey","measurement","issuedAtMs","expiresAtMs"];for(let n of t)if(!e[n])return Object.freeze({ok:!1,status:"unverified",reason:`missing-${n}`});return Number(e.expiresAtMs)<=Number(e.nowMs||Date.now())?Object.freeze({ok:!1,status:"unverified",reason:"expired"}):Object.freeze({ok:!1,status:"unavailable",reason:"no-verified-trust-root",hardware:"unavailable"})}var n4=_(()=>{});function Yse(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function r4(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:Yse(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var o4=_(()=>{});function s4(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!i4.test(n))throw new Error("erc7715: account required");let r=Array.isArray(e.targets)?e.targets:[],o=Array.isArray(e.selectors)?e.selectors:[];if(r.length===0)throw new Error("erc7715: targets required");if(o.length===0)throw new Error("erc7715: selectors required");if(r.includes("*")||o.includes("*"))throw new Error("erc7715: wildcards refused");for(let c of r)if(!i4.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!Xse.test(c))throw new Error("erc7715: selector must be 4 bytes");let i=String(e.perCallCap??""),s=String(e.aggregateCap??"");if(!/^[1-9][0-9]*$/.test(i)||!/^[1-9][0-9]*$/.test(s))throw new Error("erc7715: caps required");let a=Number(e.expiresAtMs);if(!Number.isSafeInteger(a)||a<=Date.now())throw new Error("erc7715: expiry required");return Object.freeze({kind:"erc7715-v1",chainId:t,account:n,targets:Object.freeze(r.map(c=>c.toLowerCase())),selectors:Object.freeze(o.map(c=>c.toLowerCase())),perCallCap:i,aggregateCap:s,expiresAtMs:a,execution:"read-only",exec:!1,note:"Normalized only. aa surface allowlist is empty \u2014 cannot arm."})}var Xse,i4,a4=_(()=>{Xse=/^0x[0-9a-fA-F]{8}$/,i4=/^0x[0-9a-fA-F]{40}$/});function c4(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7710: chainId required");let n=String(e.delegator||""),r=String(e.delegate||"");if(!aE.test(n)||!aE.test(r))throw new Error("erc7710: parties required");if(!e.revocation)throw new Error("erc7710: revocation route required");let o=Number(e.expiresAtMs);if(!Number.isSafeInteger(o)||o<=Date.now())throw new Error("erc7710: expiry required");if(!e.target||!aE.test(String(e.target)))throw new Error("erc7710: target required");return Object.freeze({kind:"erc7710-v1",chainId:t,delegator:n.toLowerCase(),delegate:r.toLowerCase(),target:String(e.target).toLowerCase(),expiresAtMs:o,revocation:String(e.revocation),execution:"read-only",exec:!1,note:"Inspected only. aa surface allowlist is empty \u2014 cannot arm."})}var aE,l4=_(()=>{aE=/^0x[0-9a-fA-F]{40}$/});var d4={};ht(d4,{CONTRACTS_EVAL_HERE:()=>dae,runContractsEval:()=>uae});import Am from"node:fs";import Lo from"node:path";import{spawnSync as Jse}from"node:child_process";import{fileURLToPath as Qse}from"node:url";function sae(){let e=process.env.HOME||"";for(let t of["forge",Lo.join(e,".foundry/bin/forge")])if(Jse(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function u4(e,t=[]){if(!Am.existsSync(e))return t;for(let n of Am.readdirSync(e)){let r=Lo.join(e,n);if(Am.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;u4(r,t)}else n.endsWith(".sol")&&!r.includes(`${Lo.sep}lib${Lo.sep}`)&&t.push(r)}return t}function aae(){let e=[];for(let t of Object.keys(ui)){let n=Lo.join(Zse,t),r=u4(Lo.join(n,"src")),o=[];for(let i of r){let s=Am.readFileSync(i,"utf8");for(let a of eae)a.test(s)&&o.push(`${Lo.basename(i)}:${a}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function cae(){return sae()?Object.keys(ui).map(e=>{try{let t=Gc(e,{allowSkipStatic:!0});return{language:"Solidity",templateId:e,ok:t.ok===!0&&t.forgeTests?.ok===!0,forge:t.forgeTests,firmAudit:t.firmAudit===!1}}catch(t){return{language:"Solidity",templateId:e,ok:!1,error:String(t?.message||t).slice(0,240)}}}):Object.keys(ui).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function lae(){let e=[],t=Yc();e.push({language:"catalog",ok:t.some(o=>o.family==="solana")&&t.some(o=>o.family==="bitcoin"),templates:t.map(o=>o.id)});let n=await Xc({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:tae,programId:nae,unlockDelaySlots:1200});e.push({language:"Rust / Anchor",templateId:"solana-safe-vault",ok:n.oraclePrepared===!0&&n.signingReady===!1&&n.broadcastReady===!1&&n.firmAudit===!1,artifactHash:n.artifactHash});let r=await Xc({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[rae,oae],recoveryPubkey:iae,recoveryDelayBlocks:144});return e.push({language:"Miniscript / Tapscript",templateId:"bitcoin-tapscript-vault",ok:r.oraclePrepared===!0&&r.psbtPrepared===!1&&r.broadcastReady===!1&&r.firmAudit===!1,artifactHash:r.artifactHash}),e}async function uae(){let e=aae(),t=cae(),n=await lae(),r=[...e,...t,...n],o=r.filter(s=>s.ok!==!0&&s.skipped!==!0).length,i=r.filter(s=>s.skipped===!0).length;return{ok:o===0,total:r.length,pass:r.length-o-i,fail:o,skipped:i,languages:["Solidity","Rust / Anchor","Miniscript / Tapscript"],firmAudit:!1,cases:r}}var Zse,eae,tae,nae,rae,oae,iae,dae,p4=_(()=>{Ip();Np();Jb();Vb();Zse=xp("protocols/templates",import.meta.url),eae=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],tae="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",nae="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",rae="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",oae="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",iae="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";dae=Lo.dirname(Qse(import.meta.url))});var E4={};ht(E4,{EXECUTION_PROVIDERS:()=>fE,assertDataOpAllowed:()=>y4,data:()=>gae,dataCall:()=>N,dataCatalog:()=>v4,dataHealth:()=>b4,isExecutionProvider:()=>g4,routeUniversalNftLifecycle:()=>m4,universalNftLifecycleCapabilities:()=>pE});import{types as pae}from"node:util";function pE(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:G0,adapters:Object.freeze(K0.adapters.map(e=>{let t=f4[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function m4(e,t={}){let n=rL(e,t),r=f4[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new _e(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}function Im(e={}){let t=e.filePath||void 0,n=t||"__default__";return cE.has(n)||cE.set(n,pN(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),cE.get(n)}function uE(e={}){let t=e.filePath||void 0,n=t||"__default__";return lE.has(n)||lE.set(n,bN(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),lE.get(n)}function ru(e={}){let t=e.filePath||void 0,n=t||"__default__";return dE.has(n)||dE.set(n,aN(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),dE.get(n)}function km(e,t){if(typeof e!="string"||!h4.test(e))throw new TypeError(`data plane ${t} must be a bounded string`);return e}function g4(e){return typeof e=="string"&&h4.test(e)&&fE.has(e)}function y4(e,t,n={}){km(e,"providerId");let r=km(t,"op"),o=`${e}.${r}`,s=e==="dexscreener"&&new Set(["latestTokenProfiles","communityTakeovers","latestTokenBoosts","topTokenBoosts","tokenPairs","batchTokens"]).has(r)?"read":ja(r);if(fE.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let a=qa().find(c=>c.id===e);if(/^arm/i.test(r)||/settle|sign|execute|broadcast|submit|send|write|place/i.test(r))throw new Error(`data plane forbidden op: ${o}`);if(a&&Array.isArray(a.ops)&&a.ops.length>0&&!a.ops.includes(r))throw a.deprecated?new Error(`data plane: provider ${e} retracted op ${r} on ${a.deprecated.since}: ${a.deprecated.reason}`):new Error(`data plane: provider ${e} does not support op ${r}`);if(s==="unknown")throw new Error(`data plane unclassified op: ${o}`);if(s==="state"&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let c=String(n?.method||"").trim();if(!new Set(["eth_call","eth_getBalance","eth_blockNumber","eth_chainId","eth_getCode","eth_getLogs","eth_getTransactionByHash","eth_getTransactionReceipt","eth_getBlockByNumber","eth_getBlockByHash","eth_feeHistory","eth_gasPrice","eth_maxPriorityFeePerGas","net_version","web3_clientVersion"]).has(c))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${c||"<missing>"}`)}}function mae(e,t,n){if(e?.allowCallerOptions!==!1)return;if(!t||typeof t!="object"||Array.isArray(t)||pae.isProxy(t))throw new Error(`Provider ${n} does not accept caller options`);let r,o;try{r=Object.getPrototypeOf(t),o=Reflect.ownKeys(t)}catch{throw new Error(`Provider ${n} does not accept caller options`)}if(r!==Object.prototype&&r!==null)throw new Error(`Provider ${n} does not accept caller options`);if(o.length!==0)throw new Error(`Provider ${n} does not accept caller options`)}async function N(e,t,n={},r={}){if(km(e,"providerId"),km(t,"op"),e==="opensea"&&(e="opensea-nft"),g4(e))throw new Error(`${e} is an execution provider: it signs and submits with a real key. dataCall() is the public read plane and will not route to it.`);let o=Ji(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(mae(o,r,e),id(o)){let s=o.deprecated?.since?` since ${o.deprecated.since}`:"",a=o.deprecated?.reason||`${e} is unavailable`;throw new Error(`data plane: provider ${e} is unavailable${s}: ${a}`)}if(y4(e,t,n),!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=fae[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function b4({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:s}={}){let a=qa(),c=e||a.map(m=>m.id);!o&&!e&&(c=c.filter(m=>m!=="hl-ws"&&m!=="poly-ws"));let l={},u=new Set(c);for(let m of a.filter(f=>u.has(f.id)&&id(f)))l[m.id]={ok:!1,ms:0,reason:"deprecated",error:m.deprecated?.reason||`${m.id} is unavailable`,detail:{execution:m.execution,deprecated:m.deprecated||null}};c=c.filter(m=>!id(Ji(m)));let d={fetchImpl:t,timeoutMs:n??8e3},p=typeof s=="function"?s:(m,f,h)=>N(m,"health",f,h);return await Ge(c,i??8,async m=>{if(!Ji(m)){l[m]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let f=m==="evm-rpc"?{chainId:1}:{},h=Ji(m)?.allowCallerOptions===!1?{}:d,g=await Xe(()=>p(m,f,h));if(!g.ok){l[m]={ok:!1,ms:g.ms,reason:"transport",error:g.error};return}let y=g.data;if(y&&typeof y=="object"&&y.ok===!1){l[m]={ok:!1,ms:g.ms,reason:"provider",error:y.error||y.message||"provider reported unhealthy",detail:y};return}l[m]={ok:!0,ms:g.ms,detail:y}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:l}}function w4(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function hae(e){return e.execution==="prepare"&&w4(e).length?"armed-local":e.execution||"read-only"}function S4(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))S4(t);return Object.freeze(e)}function v4(){return Object.freeze(qa().map(e=>S4({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,...e.optionalAuth?{optionalAuth:e.optionalAuth}:{},ops:e.ops,execution:hae(e),localSignerSurfaces:w4(e),baseEnv:e.baseEnv||[],...e.opPolicies?{opPolicies:e.opPolicies}:{},...e.allowCallerOptions===!1?{allowCallerOptions:!1}:{},description:e.description,...e.deprecated?{deprecated:e.deprecated}:{}})))}var f4,cE,lE,dE,fae,fE,h4,gae,x4=_(()=>{Rg();q();TI();Lg();Xt();dd();HI();mk();xy();Dk();Ne();Zo();is();Id();My();Dy();Ho();ka();nr();j_();Mi();Ui();gg();K_();nO();pO();Oa();Vu();Pa();Vh();SO();_O();CO();LO();yc();Yy();Jy();ZO();Ki();cN();fN();wN();sT();yT();ET();Nb();DT();Db();d1();g1();L1();G1();Np();Jb();ec();iC();SC();bp();kC();$C();FC();VC();rl();Hp();PP();E0();Gp();BP();gR();L0();JR();oL();cL();mL();kL();NL();RL();VL();ZL();tw();r2();R0();vu();_a();w2();x2();_2();C2();M2();F2();z2();G2();J2();aM();dM();gM();vM();_M();RM();HM();Ol();Ww();Yw();a$();p$();g$();I$();C$();sS();fS();yS();rB();AS();SB();TB();UB();KB();eD();iD();jf();bD();AD();PD();DD();VD();BS();JD();nU();cU();dU();bU();AU();CU();$U();JU();mv();rF();$q();Uq();Hq();Wq();Jq();Zq();n4();o4();a4();l4();f4=Object.freeze({"opensea-evm-market":Object.freeze({provider:"opensea-nft",operations:Object.freeze({mint:"prepareMint",list:"prepareList",cancel_listing:"prepareCancel"})}),"evm-asset-safe-transfer":Object.freeze({provider:"universal-evm-nft-transfer",operations:Object.freeze({send:"prepare"})}),"magic-eden-solana-market":Object.freeze({provider:"magiceden-sol",operations:Object.freeze({buy:"prepareBuy",list:"prepareList"})}),"solana-nft-transfer":Object.freeze({provider:"universal-solana-nft-transfer",operations:Object.freeze({send:"prepare"})}),"satflow-ordinals-market":Object.freeze({provider:"satflow",operations:Object.freeze({buy:"preparePurchase",list:"prepareList"})}),"bitcoin-ordinal-transfer":Object.freeze({provider:"universal-ordinals-transfer",operations:Object.freeze({send:"prepare"})})});cE=new Map;lE=new Map;dE=new Map;fae={"hl-info":{health:e=>RI(e),allMids:e=>_n(e),l2Book:(e,t={})=>es(t.coin,e),outcomeMeta:e=>Ha(e),clearinghouse:(e,t={})=>sd(t.user,e),userFills:(e,t={})=>ad(t.user,e),meta:e=>LI(e),metaAndAssetCtxs:e=>jt(e),candleSnapshot:(e,t={})=>cd(t,e),openOrders:(e,t={})=>$I(t.user,e),frontendOpenOrders:(e,t={})=>BI(t.user,e),userState:(e,t={})=>ts(t.user,e),spotMeta:e=>ld(e)},"hl-vaults":{health:e=>FI(e),summaries:(e,t={})=>Fg(t,e),details:(e,t={})=>ud(t,e),userEquities:(e,t={})=>Va(t,e),tracker:(e,t={})=>qg(t,e)},"hl-precompiles":{health:e=>jI(e),read:(e,t={})=>qI(t,e),l1BlockNumber:e=>pd(e),markPx:(e,t={})=>zg(t,e),oraclePx:(e,t={})=>Vg(t,e),spotPx:(e,t={})=>Wg(t,e),position:(e,t={})=>Gg(t,e),spotBalance:(e,t={})=>Kg(t,e),vaultEquity:(e,t={})=>Yg(t,e),withdrawable:(e,t={})=>Xg(t,e)},"hl-delta-neutral":{health:()=>sk(),scan:(e,t={})=>fy(t,e),quote:(e,t={})=>my(t,e),prepare:(e,t={})=>hy(t,e),loop:(e,t={})=>fk(t,e)},"lighter-delta-neutral":{health:()=>Ek(),scan:(e,t={})=>Sy(t,e),quote:(e,t={})=>vy(t,e),prepare:(e,t={})=>Ey(t,e),loop:(e,t={})=>Nk(t,e)},"poly-public":{health:e=>Ck(e),time:e=>Ay(e),markets:(e,t={})=>Pk(t,e),book:(e,t={})=>Rk(t.tokenId,e),midpoint:(e,t={})=>Lk(t.tokenId,e),spread:(e,t={})=>Mk(t.tokenId,e),price:(e,t={})=>$k(t.tokenId,{side:t.side},e),events:(e,t={})=>Bk(t,e)},"evm-rpc":{health:(e,t={})=>Pi(t.chainId??1,e),healthAll:(e,t={})=>Wm({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>ga(t.chainId??1,e),chainId:(e,t={})=>Hm(t.chainId??1,e),getBalance:(e,t={})=>Do(t.chainId??1,t.address,e),call:(e,t={})=>J(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Vm(t,e),erc20Balance:(e,t={})=>ya(t,e),transactionReceipt:(e,t={})=>ba(t,e)},portfolio:{health:e=>iP(e),balances:(e,t={})=>jp(t,e),snapshot:(e,t={})=>TP(t,e),history:(e,t={})=>x0(t,e),valueGraph:(e,t={})=>CP(t,e)},"nft-portfolio":{health:e=>bP(e),inventory:(e,t={})=>Rs(t,e),gallery:(e,t={})=>EP(t,e),pnl:(e,t={})=>vP(t,e),prepareList:(e,t={})=>wP(t,e),traitSnipe:(e,t={})=>SP(t,e)},"contract-risk":{health:e=>RP(e),scan:(e,t={})=>mi(t,e)},"evm-token-sniper":{health:e=>$P(e),scan:(e,t={})=>MP(t,e)},"launch-radar":{health:()=>uR(),status:(e,t={})=>dR(t,e),snapshot:(e,t={})=>pR(t,e),candidates:(e,t={})=>fR(t),rpcHealth:(e,t={})=>mR(t),evaluateStrategy:(e,t={})=>hR(t)},"evm-simulate":{health:e=>Ax(e),simulate:(e,t={})=>qo(t,e)},"mint-race":{health:()=>PL(),probeOpen:(e,t={})=>J0(t,e),measureLatency:(e,t={})=>Q0(t,e),inclusionStrategy:(e,t={})=>Z0(t.chainId),raceIntel:(e,t={})=>CL(t,e)},"bitcoin-mint-funding":{health:e=>QL(e),annotateOutpoints:(e,t={})=>XL(t.outpoints,e),liveFeeRate:(e,t={})=>aw(t,e),selectFundingInputs:(e,t={})=>sw(t.annotatedUtxos,t),planInscriptionFunding:(e,t={})=>JL(t)},"solana-mint-submit":{health:e=>zL(e),freshBlockhash:e=>rw(e),deriveComputeUnitPrice:(e,t={})=>ow(t,e),planMintFee:(e,t={})=>jL(t,e),measureComputeUnits:(e,t={})=>HL(t,e),constraints:(e,t={})=>({presign:ML(),retry:{rebroadcastIdenticalBytes:ml({identicalBytes:!0}),resign:ml({identicalBytes:!1})},throughput:t.computeUnitsPerMint?$L({computeUnitsPerMint:t.computeUnitsPerMint}):{note:"supply computeUnitsPerMint for the per-block ceiling"},runtimeDerived:LL}),planRpcEnvelope:(e,t={})=>iw(t.base64Tx,t),planBundleEnvelope:(e,t={})=>UL(t.base64Txs,t),planRetryEnvelope:(e,t={})=>qL(t.base64Tx,t),bundleStatus:(e,t={})=>FL(t.bundleIds,e)},"nft-mint":{health:e=>wR(e),discover:(e,t={})=>ef(t,e),prepare:(e,t={})=>tf(t,e),priceGas:(e,t={})=>Zp(t,e),createTrigger:(e,t={})=>_L(t,e),checkOpen:(e,t={})=>X0(t,e),evaluateTrigger:(e,t={})=>OL(t.trigger??t,e),evaluateMancerOs:(e,t={})=>n2(t,e)},"universal-mint-router":{health:()=>YR(),capabilities:()=>V0(),prepare:(e,t={})=>XR(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:pE()}),capabilities:()=>pE(),route:(e,t={})=>m4(t,e)},"erc8004-identity":{health:()=>uT(),prepareIdentityRegistration:(e,t={})=>fT(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>mT(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>gT(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:af,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>aL(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:cf,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>fL(t,e)},"universal-ordinals-transfer":{health:()=>({provider:lf,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>IL(t,e)},"solana-rpc":{health:e=>Fk(e),latestBlockhash:(e,t={})=>rc(t,e),getBalance:(e,t={})=>Sd(t,e),tokenAccounts:(e,t={})=>oc(t,e),simulate:(e,t={})=>jk(t,e)},"bitcoin-esplora":{health:e=>zk(e),tipHeight:e=>Vk(e),fees:e=>Wk(e),address:(e,t={})=>Ed(t,e),utxos:(e,t={})=>Gk(t,e),tx:(e,t={})=>Yk(t,e),decode:(e,t={})=>Xk(t,e)},"bitcoin-meta":{health:e=>Qk(e),runeBalances:(e,t={})=>Ad(t,e),inscriptions:(e,t={})=>as(t,e),inscriptionInfo:(e,t={})=>Zk(t,e),inscriptionChildren:(e,t={})=>e_(t,e),ordBlockInfo:(e,t={})=>t_(t,e)},satflow:{health:e=>r_(e),collectionFloors:(e,t={})=>o_(t,e),collectionStats:(e,t={})=>i_(t,e),item:(e,t={})=>s_(t,e),walletContents:(e,t={})=>Od(t,e),floorListings:(e,t={})=>a_(t,e),preparePurchase:(e,t={})=>l_(t,e),prepareList:(e,t={})=>Nd(t,e)},jupiter:{health:e=>y_(e),venues:(e,t={})=>g_(t,e),quote:(e,t={})=>Pd(t,e),prepare:(e,t={})=>b_(t,e)},defillama:{health:e=>uA(e),prices:(e,t={})=>Kt(t.coins||[],e),pricesBySymbol:(e,t={})=>fA(t.symbols,e),protocols:e=>Fu(e),yields:(e,t={})=>dA(t,e),stablecoins:(e,t={})=>qu(t,e),dexVolumes:(e,t={})=>pA(t,e)},lifi:{health:e=>Ch(e),quote:(e,t={})=>ir(t,e),prepare:(e,t={})=>Ph(t,e),chains:e=>Rh(e)},dexscreener:{health:e=>GE(e),token:(e,t={})=>jn(t.address||t.tokenAddress,e),search:(e,t={})=>Sa(t.q||t.query,e),pair:(e,t={})=>KE(t.chainId,t.pairAddress,e),latestTokenProfiles:(e,t={})=>YE(t,e),communityTakeovers:(e,t={})=>XE(t,e),latestTokenBoosts:(e,t={})=>JE(t,e),topTokenBoosts:(e,t={})=>QE(t,e),tokenPairs:(e,t={})=>ZE(t,e),batchTokens:(e,t={})=>ex(t,e)},bubblemaps:{health:e=>M_(e),chains:e=>$_(e),search:(e,t={})=>B_(t,e),metadata:(e,t={})=>D_(t,e),holders:(e,t={})=>U_(t,e),metrics:(e,t={})=>F_(t,e),map:(e,t={})=>q_(t,e)},"uniswap-v3":{health:(e,t={})=>sh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>or(t,e),prepare:(e,t={})=>ih(t,e),quotePath:(e,t={})=>oh(t,e),ethUsdc:(e,t={})=>yu(t,e),chains:()=>ah()},"lp-exit":{health:(e,t={})=>jA(t,e),inspect:(e,t={})=>hg(t,e),prepareRemove:(e,t={})=>DA(t,e),prepareSettlement:(e,t={})=>UA(t,e),prepareUnwrap:(e,t={})=>FA(t,e),chains:()=>qA()},"lp-liquidity-ranker":{health:()=>G_(),rank:(e,t={})=>W_(t)},"lp-destination-discovery":{health:()=>tO(),discover:(e,t={})=>eO(t,e)},"uniswap-v4":{health:(e,t={})=>wh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Dr(t,e),inspectHook:(e,t={})=>hh(t,e),prepare:(e,t={})=>yh(t,e),chains:()=>bh()},x402:{health:()=>wO(),inspect:(e,t={})=>yO(t),prepare:(e,t={})=>bO(t,e)},bankr:{health:e=>kO(e),wallet:e=>Gy(e),portfolio:e=>AO(e),swapQuote:(e,t={})=>IO(t,e)},aerodrome:{health:(e,t={})=>uO({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ud(t,e),prepare:(e,t={})=>lO(t,e),chains:()=>dO()},zerox:{health:e=>Uh(e),price:(e,t={})=>Nu(t,e),quote:(e,t={})=>Fr(t,e),prepare:(e,t={})=>Fh(t,e)},across:{health:e=>rg(e),suggestedFees:(e,t={})=>ju(t,e)},hop:{health:e=>og(e),quote:(e,t={})=>Hu(t,e)},relay:{health:e=>sg(e),quote:(e,t={})=>Ra(t,e),prepare:(e,t={})=>ag(t,e)},cowswap:{health:e=>Qh(e),quote:(e,t={})=>cr(t,e),prepareOrder:(e,t={})=>Zh(t,e),order:(e,t={})=>Uu(t,e),status:(e,t={})=>Du(t,e),chains:()=>tg()},oneinch:{health:e=>Wx(e),quote:(e,t={})=>Ta(t,e),prepare:(e,t={})=>Gx(t,e),approveSpender:(e,t={})=>zh(t,e)},"hl-ws":{health:e=>OO(e),allMids:e=>NO(e),l2Book:(e,t={})=>TO(t.coin,e),snapshot:(e,t={})=>pc(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>PO({...e,assetId:t.assetId}),book:(e,t={})=>RO(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Fd(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>ZA(e),collection:(e,t={})=>$a(t.slug,e),floor:(e,t={})=>eI(t.slug,e),bestListings:(e,t={})=>Eg(t,e),bestListing:(e,t={})=>Qu(t,e),bestOffer:(e,t={})=>Zu(t,e),accountNfts:(e,t={})=>Ba(t,e),accountPnl:(e,t={})=>Xu(t,e),prepareBuy:(e,t={})=>pI(t,e),prepareSweep:(e,t={})=>fI(t,e),prepareMint:(e,t={})=>td(t,e),prepareList:(e,t={})=>nd(t,e),prepareCancel:(e,t={})=>mI(t,e)},"local-marketplace":{health:()=>({provider:"local-marketplace",status:"ok",armed:!0,execution:"armed-local",existingMarketplacesUnchanged:!0,refusesSignHash:!0,signed:!1,broadcast:!1}),createListing:(e,t={})=>ru(e).createListing(t),listListings:(e,t={})=>ru(e).listListings(t),cancelListing:(e,t={})=>ru(e).cancelListing(t),createOffer:(e,t={})=>ru(e).createOffer(t),armFill:(e,t={})=>ru(e).armFill(t)},"local-x402":{health:()=>({provider:"local-x402",status:"ok",armed:!0,execution:"armed-local",telegram:!1,refusesSignHash:!0,signed:!1,broadcast:!1}),createIntent:(e,t={})=>Im(e).createIntent(t),listIntents:(e,t={})=>Im(e).listIntents(t),cancelIntent:(e,t={})=>Im(e).cancelIntent(t),armPayment:(e,t={})=>Im(e).armPayment(t)},"local-pack-registry":{health:()=>({provider:"local-pack-registry",status:"ok",pluginExecution:!1,loaded:!1,telegram:!1,execution:"read-only"}),registerPack:(e,t={})=>uE(e).registerPack(t),listPacks:(e,t={})=>uE(e).listPacks(t),revokePack:(e,t={})=>uE(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>oT(t,e),markets:(e,t={})=>gs(t,e),quoteSpecificBuy:(e,t={})=>Rc(t,e),quoteSell:(e,t={})=>ap(t,e),scanCollection:(e,t={})=>cp(t,e),scanAllMarkets:(e,t={})=>XN(t,e),scanCrossVenueArb:(e,t={})=>vb(t,e),scanAllMarketsArb:(e,t={})=>JN(t,e),prepareSpecificBuy:(e,t={})=>HN(t,e),prepareSell:(e,t={})=>zN(t,e)},stonkbrokers:{health:(e,t={})=>iT(t,e),quoteBrokerBuy:(e,t={})=>lp(t,e),scanBrokerLoot:(e,t={})=>eT(t,e),prepareBrokerBuy:(e,t={})=>tT(t,e),brokerDesk:(e,t={})=>rT(t,e),clockInStatus:(e,t={})=>Lc(t,e),prepareClockIn:(e,t={})=>nT(t,e)},"hl-outcome":{list:e=>p1(e),prepareOrder:(e,t={})=>f1(t,e),prepareCancel:(e,t={})=>m1(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Op().map(e=>e.id),nativeTemplates:Yc().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Op(),listNative:()=>Yc(),gate:(e,t={})=>Gc(t.templateId||t.id,e),prepareDeploy:(e,t={})=>W1(t,e),buildNative:(e,t={})=>Xc(t),eval:async()=>(await Promise.resolve().then(()=>(p4(),d4))).runContractsEval()},"poly-clob":{health:()=>P1(),prepareOrder:(e,t={})=>R1(t||{},e)},"hl-perps":{health:e=>Bb(e),assetInfo:(e,t={})=>Jr(t,e),prepareOrder:(e,t={})=>Qr(t,e),prepareCancel:(e,t={})=>Za(t,e),prepareLeverage:(e,t={})=>ly(t,e),prepareIsolatedMargin:(e,t={})=>uy(t,e),prepareBracket:(e,t={})=>dy(t,e),prepareBuilderApproval:(e,t={})=>cy(t,e)},"hl-markets":{health:e=>Bb(e),markets:(e,t={})=>As(t,e),leaderboards:(e,t={})=>UT(t,e),coin:(e,t={})=>FT(t,e),spot:(e,t={})=>qT(t,e)},"hl-entry-state":{health:e=>a1(e),see:(e,t={})=>jc(t,e),qualify:(e,t={})=>c1(t,e),lock:(e,t={})=>l1(t,e),list:e=>qb(e),watch:(e,t={})=>u1(t,e)},"magiceden-sol":{health:e=>AT(e),stats:(e,t={})=>Ob(t,e),listings:(e,t={})=>kT(t,e),tokenListings:(e,t={})=>_T(t,e),prepareBuy:(e,t={})=>OT(t,e),prepareList:(e,t={})=>fp(t,e),prepareMint:(e,t={})=>NT(t,e)},"hl-staking":{health:e=>CT(e),validators:e=>Pb(e),delegatorSummary:(e,t={})=>Rb(t,e),delegations:(e,t={})=>Lb(t,e),rewards:(e,t={})=>PT(t,e),history:(e,t={})=>RT(t,e),preflight:(e,t={})=>BT(t,e),prepareStakeDeposit:(e,t={})=>LT(t,e),prepareStakeWithdraw:(e,t={})=>MT(t,e),prepareDelegate:(e,t={})=>$T(t,e)},"hyperevm-dex":{health:e=>wT(e),search:(e,t={})=>ST(t.q||t.query||"HYPE",e),token:(e,t={})=>vT(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>oC(e),networks:(e,t={})=>Qb(t,e),pool:(e,t={})=>tC(t,e),token:(e,t={})=>nC(t,e),ohlcv:(e,t={})=>rC(t,e)},curve:{health:e=>bC(e),openapi:e=>yC(e),pools:(e,t={})=>e0(t,e),quote:(e,t={})=>t0(t,e),prepare:(e,t={})=>wC(t,e)},gmx:{health:e=>ZT(e),tickers:(e,t={})=>lo(t,e),markets:(e,t={})=>JT(t,e),marketsInfo:(e,t={})=>Fb(t,e),tokens:(e,t={})=>QT(t,e),prepareOrder:(e,t={})=>yp(t,e),positions:(e,t={})=>e1(t,e),orderStatus:(e,t={})=>t1(t,e),verifyOrder:(e,t={})=>n1(t,e)},morpho:{health:e=>AC(e),markets:(e,t={})=>xC(t,e),vaults:(e,t={})=>o0(t,e),prepareVault:(e,t={})=>IC(t,e)},balancer:{health:e=>LC(e),pools:(e,t={})=>RC(t,e),quote:(e,t={})=>a0(t,e),prepare:(e,t={})=>MC(t,e)},pendle:{health:e=>DC(e),markets:(e,t={})=>l0(t,e),quote:(e,t={})=>UC(t,e),prepare:(e,t={})=>u0(t,e)},odos:{health:e=>zC(e),chains:e=>p0(e),quote:(e,t={})=>jC(t,e),prepare:(e,t={})=>HC(t,e)},blockscout:{health:e=>XC(e),stats:(e,t={})=>nl(t,e),address:(e,t={})=>KC(t,e),token:(e,t={})=>YC(t,e)},paraswap:{health:e=>Bh(e),tokens:(e,t={})=>_u(t,e),price:(e,t={})=>sr(t,e),quote:(e,t={})=>sr(t,e),prepare:(e,t={})=>$h(t,e)},rfq:{health:e=>b2(e),intent:(e,t={})=>g2(t,e),quote:(e,t={})=>y2(t,e)},"polygon-staking":{health:e=>hM(e),validators:(e,t={})=>fM(t,e),validatorDetail:(e,t={})=>mM(t,e)},"aave-v3":{health:e=>SM(e),markets:(e,t={})=>yM(t,e),marketReserves:(e,t={})=>bM(t,e),chains:e=>wM(e)},"babylon-staking":{health:e=>xM(e),stats:e=>AM(e),finalityProviders:e=>IM(e),delegations:(e,t={})=>kM(t,e)},"bisq-markets":{health:e=>NM(e),markets:e=>TM(e),ticker:(e,t={})=>CM(t,e),trades:(e,t={})=>PM(t,e)},"social-intel":{health:(e,t={})=>BM(t,e),trendingTokens:(e,t={})=>DM(t,e),trendingCas:(e,t={})=>UM(t,e),keywordMentions:(e,t={})=>FM(t,e),smartAccounts:(e,t={})=>qM(t,e),narratives:(e,t={})=>jM(t,e)},"bob-rootstock":{health:(e,t={})=>l$(t.chainId,e),stats:(e,t={})=>Qw(t,e),addressInfo:(e,t={})=>u$(t,e),tokenBalances:(e,t={})=>d$(t,e)},"braiins-insights":{health:e=>f$(e),priceStats:e=>m$(e),poolStats:e=>h$(e)},"cow-protocol":{health:e=>A$(e),auction:e=>v$(e),openOrders:(e,t={})=>E$(t,e),recentTrades:(e,t={})=>x$(t,e)},"hiro-stacks":{health:e=>k$(e),networkInfo:e=>_$(e),stackingInfo:e=>O$(e),poxCycles:e=>N$(e),blocks:(e,t={})=>T$(t,e)},"tron-public":{health:e=>L$(e),account:(e,t={})=>M$(t,e),trc20Balances:(e,t={})=>$$(t,e),trc20Transfers:(e,t={})=>If(t,e),chainParameters:(e,t={})=>B$(t,e)},"ton-public":{health:e=>q$(e),accountState:(e,t={})=>j$(t,e),jettonBalances:(e,t={})=>H$(t,e),transactions:(e,t={})=>_f(t,e)},"cosmos-lcd":{health:(e,t={})=>W$({...e,args:t}),chains:(e,t={})=>G$(t,e),balances:(e,t={})=>Nf(t,e),delegations:(e,t={})=>K$(t,e),denomTrace:(e,t={})=>Y$(t,e)},"sui-public":{health:e=>Z$(e),balances:(e,t={})=>eB(t,e),ownedObjects:(e,t={})=>tB(t,e),coinMetadata:(e,t={})=>nB(t,e)},"aptos-public":{health:e=>cB(e),account:(e,t={})=>lB(t,e),resources:(e,t={})=>uB(t,e),coinBalances:(e,t={})=>Rf(t,e)},"canton-scan":{health:(e,t={})=>hB({...e,...t}),guide:()=>fB(),dso:(e,t={})=>gB({...e,...t}),party:(e,t={})=>yB(t,{...e,...t}),holdings:(e,t={})=>bB(t,{...e,...t}),rounds:(e,t={})=>wB({...e,...t})},"snapshot-governance":{health:e=>NB(e),spaces:(e,t={})=>AB(t,e),proposals:(e,t={})=>NS(t,e),activeProposals:(e,t={})=>IB(t,e),proposal:(e,t={})=>kB(t,e),votes:(e,t={})=>_B(t,e),votingPower:(e,t={})=>OB(t,e)},"tally-governance":{health:e=>DB(e),governors:()=>$B(),info:(e,t={})=>PS(t,e),proposals:(e,t={})=>LB(t,e),proposal:(e,t={})=>RS(t,e),voterStatus:(e,t={})=>MB(t,e),tallyProposals:(e,t={})=>BB(t,e)},"stablecoin-peg":{health:e=>GB(e),scan:(e,t={})=>US(t,e)},"jito-mev":{health:e=>JB(e),recentBundles:(e,t={})=>QB(t,e),tipFloor:e=>ZB(e)},"kamino-strategies":{health:e=>nD(e),strategies:(e,t={})=>rD(t,e),strategyMetrics:(e,t={})=>oD(t,e)},"liquid-esplora":{health:e=>dD(e),tipHeight:e=>pD(e),addressInfo:(e,t={})=>qf(t,e),assetInfo:(e,t={})=>fD(t,e)},"magiceden-ordinals":{health:e=>gD(e),collectionStat:(e,t={})=>yD(t,e)},"mempool-lightning":{health:e=>SD(e),statistics:e=>vD(e),nodeRankings:(e,t={})=>ED(t,e),nodeCountries:e=>xD(e)},"mempool-mining":{health:e=>_D(e),difficulty:e=>OD(e),poolShare:(e,t={})=>ND(t,e),hashrate:(e,t={})=>TD(t,e),rewardStats:(e,t={})=>CD(t,e)},"meteora-dlmm":{health:e=>MD(e),pools:(e,t={})=>$D(t,e),poolSearch:(e,t={})=>BD(t,e)},"ordinals-runes":{health:e=>FD(e),blockHeight:e=>qD(e),blockInfo:(e,t={})=>jD(t,e),satInfo:(e,t={})=>HD(t,e),runeInfo:(e,t={})=>zD(t,e)},"pyth-price-feeds":{health:e=>jB(e),latestPrice:(e,t={})=>HB(t,e),latestPrices:(e,t={})=>Bf(t,e),feedDirectory:e=>zB(e)},"relayscan-mev":{health:e=>XD(e),overview:(e,t={})=>YS(t,e),builderProfit:(e,t={})=>KD(t,e),dailyStats:(e,t={})=>YD(t,e)},"sanctum-lst":{health:e=>ZD(e),lstList:e=>JS(e),apyAll:e=>eU(e),apyIndividual:(e,t={})=>tU(t,e)},"solend-lending":{health:e=>sU(e),markets:e=>ZS(e),reserves:(e,t={})=>aU(t,e)},"execution-strategies":{health:()=>uU(),plan:(e,t={})=>lU(t)},"across-bridge":{health:e=>S2(e),pools:(e,t={})=>v2(t,e),suggestedFees:(e,t={})=>E2(t,e)},"beefy-yields":{health:e=>A2(e),apy:(e,t={})=>I2(t,e),apyBreakdown:e=>k2(e)},"birdeye-tokens":{health:e=>N2(e),tokenList:(e,t={})=>T2(t,e)},"solana-token-risk":{health:e=>sM(e),scan:(e,t={})=>xw(t,e)},"robinhood-wallet-history":{health:e=>uM(e),transactions:(e,t={})=>Nw(t,e),tokenBalances:(e,t={})=>Tw(t,e),history:(e,t={})=>lM(t,e)},"celestia-da":{health:e=>P2(e),stats:e=>R2(e),blockStats:(e,t={})=>L2(t,e)},"das-assets":{health:e=>$2(e),assetsByOwner:(e,t={})=>B2(t,e),searchAssets:(e,t={})=>D2(t,e),assetProof:(e,t={})=>U2(t,e)},"l2beat-tvl":{health:e=>q2(e),tvl:(e,t={})=>j2(t,e),activity:(e,t={})=>H2(t,e)},"news-rss":{health:e=>ZM(e),latest:(e,t={})=>_l(t,e),search:(e,t={})=>e$(t,e)},"social-farcaster":{health:e=>wf(e),channel:(e,t={})=>t$(t,e),search:(e,t={})=>Sf(t,e),user:(e,t={})=>n$(t,e)},"social-x-public":{health:e=>vf(e),search:(e,t={})=>Cl(t,e)},"news-digest":{health:e=>s$(e),latest:(e,t={})=>i$(t,e)},"spark-lend":{health:e=>V2(e),markets:(e,t={})=>W2(t,e)},"symbiotic-restaking":{health:e=>K2(e),vaults:(e,t={})=>Y2(t,e),vaultDetail:(e,t={})=>X2(t,e)},"limit-order":{health:()=>mU(),prepare:(e,t={})=>gU(t,e),arm:(e,t={})=>yU(t,e)},"jupiter-dca":{health:()=>wU(),prepare:(e,t={})=>EU(t,e),arm:(e,t={})=>xU(t,e)},"protective-monitors":{health:()=>NU(),depeg:(e,t={})=>sv(t,e),oracleDeviation:(e,t={})=>av(t,e),exploitFeed:(e,t={})=>cv(t,e),goplus:(e,t={})=>lv(t,e),liquidationLadder:(e,t={})=>uv(t,e)},"funding-scanner":{health:()=>LU(),scan:(e,t={})=>MU(t,e)},"perp-universal":{health:()=>KU(),fundingAll:(e,t={})=>YU(t,e),prepareOrder:(e,t={})=>XU(t,e)},"onchain-options":{health:()=>eF(),rank:(e,t={})=>Xf(t.listings||t,t)},"holder-clusters":{health:()=>tF(),score:(e,t={})=>nF(t)},"onchain-investigator":{health:(e,t={})=>Cq(t),capabilities:(e,t={})=>Pq(t),wallet:(e,t={})=>Rq(t),analyze:(e,t={})=>Lq(t),nftOverlap:(e,t={})=>Mq(t)},kalshi:{health:()=>Bq(),markets:(e,t={})=>Dq(t)},"derive-options":{health:()=>qq(),rank:(e,t={})=>jq(t.listings||t,t)},limitless:{health:()=>zq(),markets:(e,t={})=>Vq(t)},"dov-vaults":{health:()=>Yq(),read:(e,t={})=>Xq(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>Qq(t.left||{},t.right||{})},"tee-attestation":{health:()=>e4(),verify:(e,t={})=>t4(t)},"keeper-mirror":{health:e=>r4(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>s4(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>c4(t)},"binance-public":{health:e=>jd(e),ticker:(e,t={})=>Hd(t,e),orderbook:(e,t={})=>MO(t,e),funding:(e,t={})=>hc(t,e),markPrice:(e,t={})=>$O(t,e),openInterest:(e,t={})=>BO(t,e),fundingHistory:(e,t={})=>DO(t,e)},"okx-public":{health:e=>zd(e),ticker:(e,t={})=>Vd(t,e),orderbook:(e,t={})=>FO(t,e),funding:(e,t={})=>Wd(t,e),markPrice:(e,t={})=>Gd(t,e),openInterest:(e,t={})=>qO(t,e)},"bybit-public":{health:e=>Yd(e),ticker:(e,t={})=>Xd(t,e),orderbook:(e,t={})=>zO(t,e),funding:(e,t={})=>xc(t,e),markPrice:(e,t={})=>VO(t,e),openInterest:(e,t={})=>WO(t,e),fundingHistory:(e,t={})=>GO(t,e)},"cex-basis":{health:e=>QO(e),basis:(e,t={})=>tb(t,e),fundingSpread:(e,t={})=>JO(t,e),legs:(e,t={})=>eb(t,e)}},fE=new Set(["hl-exec"]),h4=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;gae={catalog:v4,health:b4,call:N,hl:{health:e=>N("hl-info","health",{},e),allMids:e=>N("hl-info","allMids",{},e),l2Book:(e,t)=>N("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>N("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>N("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>N("hl-info","userFills",{user:e},t),meta:e=>N("hl-info","meta",{},e),metaAndAssetCtxs:e=>N("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>N("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>N("hl-info","openOrders",{user:e},t),userState:(e,t)=>N("hl-info","userState",{user:e},t),spotMeta:e=>N("hl-info","spotMeta",{},e),vaults:{health:e=>N("hl-vaults","health",{},e),summaries:(e,t)=>N("hl-vaults","summaries",e||{},t),details:(e,t)=>N("hl-vaults","details",e||{},t),mine:(e,t)=>N("hl-vaults","userEquities",{user:e},t),track:(e,t)=>N("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>N("hl-entry-state","see",e||{},t),qualify:(e,t)=>N("hl-entry-state","qualify",e||{},t),lock:(e,t)=>N("hl-entry-state","lock",e||{},t),list:e=>N("hl-entry-state","list",{},e),watch:(e,t)=>N("hl-entry-state","watch",e||{},t)},staking:{health:e=>N("hl-staking","health",{},e),validators:e=>N("hl-staking","validators",{},e),summary:(e,t)=>N("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>N("hl-staking","delegations",{user:e},t),rewards:(e,t)=>N("hl-staking","rewards",{user:e},t),history:(e,t)=>N("hl-staking","history",{user:e},t),preflight:(e,t)=>N("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>N("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>N("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>N("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>N("poly-public","health",{},e),time:e=>N("poly-public","time",{},e),markets:(e,t)=>N("poly-public","markets",e||{},t),book:(e,t)=>N("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>N("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>N("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>N("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>N("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>N("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>N("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>N("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>N("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>N("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>N("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>N("evm-token-sniper","health",{},e),scan:(e,t)=>N("evm-token-sniper","scan",e||{},t)},investigator:{health:function(){if(arguments.length!==0)throw new Error("onchain-investigator facade does not accept caller options");return N("onchain-investigator","health",{})},capabilities:function(){if(arguments.length!==0)throw new Error("onchain-investigator facade does not accept caller options");return N("onchain-investigator","capabilities",{})},wallet:function(t){if(arguments.length!==1)throw new Error("onchain-investigator.wallet does not accept caller options");return N("onchain-investigator","wallet",t)},analyze:function(t){if(arguments.length!==1)throw new Error("onchain-investigator.analyze does not accept caller options");return N("onchain-investigator","analyze",t)},nftOverlap:function(t){if(arguments.length!==1)throw new Error("onchain-investigator.nftOverlap does not accept caller options");return N("onchain-investigator","nftOverlap",t)}},launchRadar:{health:e=>N("launch-radar","health",{},e),status:(e,t)=>N("launch-radar","status",e||{},t),snapshot:(e,t)=>N("launch-radar","snapshot",e||{},t),candidates:(e,t)=>N("launch-radar","candidates",e||{},t),rpcHealth:(e,t)=>N("launch-radar","rpcHealth",e||{},t),evaluateStrategy:(e,t)=>N("launch-radar","evaluateStrategy",e||{},t)},portfolio:{balance:(e,t)=>N("portfolio","balances",e||{},t),snapshot:(e,t)=>N("portfolio","snapshot",e||{},t),history:(e,t)=>N("portfolio","history",e||{},t),valueGraph:(e,t)=>N("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>N("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>N("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>N("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>N("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>N("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>N("opensea-nft","floor",{slug:e},t),collection:(e,t)=>N("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>N("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>N("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>N("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>N("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>N("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>N("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>N("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>N("universal-mint-router","health",{},e),capabilities:e=>N("universal-mint-router","capabilities",{},e),prepare:(e,t)=>N("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>N("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>N("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>N("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>N("solana-rpc","health",{},e),latestBlockhash:(e,t)=>N("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>N("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>N("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>N("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>N("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>N("jupiter","prepare",e||{},t),nftStats:(e,t)=>N("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>N("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>N("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>N("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>N("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>N("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>N("bitcoin-esplora","health",{},e),tipHeight:e=>N("bitcoin-esplora","tipHeight",{},e),fees:e=>N("bitcoin-esplora","fees",{},e),address:(e,t)=>N("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>N("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>N("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>N("bitcoin-esplora","decode",e||{},t),metaHealth:e=>N("bitcoin-meta","health",{},e),runeBalances:(e,t)=>N("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>N("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>N("satflow","health",{},e),satflowFloors:(e,t)=>N("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>N("satflow","walletContents",{address:e},t)},tron:{health:e=>N("tron-public","health",{},e),account:(e,t)=>N("tron-public","account",{address:e},t),trc20Balances:(e,t)=>N("tron-public","trc20Balances",{address:e},t),usdtTransfers:(e,t)=>N("tron-public","trc20Transfers",e||{},t),chainParameters:e=>N("tron-public","chainParameters",{},e)},ton:{health:e=>N("ton-public","health",{},e),account:(e,t)=>N("ton-public","accountState",{address:e},t),jettons:(e,t)=>N("ton-public","jettonBalances",{owner:e},t),transactions:(e,t)=>N("ton-public","transactions",e||{},t)},cosmos:{health:(e,t)=>N("cosmos-lcd","health",e||{},t),chains:e=>N("cosmos-lcd","chains",{},e),balances:(e,t)=>N("cosmos-lcd","balances",e||{},t),delegations:(e,t)=>N("cosmos-lcd","delegations",e||{},t),denomTrace:(e,t)=>N("cosmos-lcd","denomTrace",e||{},t)},sui:{health:e=>N("sui-public","health",{},e),balances:(e,t)=>N("sui-public","balances",e||{},t),ownedObjects:(e,t)=>N("sui-public","ownedObjects",e||{},t),coinMetadata:(e,t)=>N("sui-public","coinMetadata",e||{},t)},aptos:{health:e=>N("aptos-public","health",{},e),account:(e,t)=>N("aptos-public","account",{address:e},t),resources:(e,t)=>N("aptos-public","resources",e||{},t),coinBalances:(e,t)=>N("aptos-public","coinBalances",e||{},t)},canton:{health:e=>N("canton-scan","health",{},e),guide:e=>N("canton-scan","guide",{},e),dso:e=>N("canton-scan","dso",{},e),party:(e,t)=>N("canton-scan","party",e||{},t),holdings:(e,t)=>N("canton-scan","holdings",e||{},t),rounds:e=>N("canton-scan","rounds",{},e)},prices:{health:e=>N("defillama","health",{},e),current:(e,t)=>N("defillama","prices",{coins:e},t),bySymbol:(e,t)=>N("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>N("defillama","protocols",{},e)},lifi:{health:e=>N("lifi","health",{},e),quote:(e,t)=>N("lifi","quote",e||{},t),chains:e=>N("lifi","chains",{},e)},dex:{health:e=>N("dexscreener","health",{},e),token:(e,t)=>N("dexscreener","token",{address:e},t),search:(e,t)=>N("dexscreener","search",{q:e},t),pair:(e,t,n)=>N("dexscreener","pair",{chainId:e,pairAddress:t},n),latestTokenProfiles:(e,t)=>N("dexscreener","latestTokenProfiles",e||{},t),communityTakeovers:(e,t)=>N("dexscreener","communityTakeovers",e||{},t),latestTokenBoosts:(e,t)=>N("dexscreener","latestTokenBoosts",e||{},t),topTokenBoosts:(e,t)=>N("dexscreener","topTokenBoosts",e||{},t),tokenPairs:(e,t)=>N("dexscreener","tokenPairs",e||{},t),batchTokens:(e,t)=>N("dexscreener","batchTokens",e||{},t)},uni:{health:(e,t)=>N("uniswap-v3","health",e||{},t),quote:(e,t)=>N("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>N("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>N("uniswap-v3","ethUsdc",e||{},t),chains:e=>N("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>N("uniswap-v4","health",e||{},t),quote:(e,t)=>N("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>N("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>N("uniswap-v4","prepare",e||{},t),chains:e=>N("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>N("x402","inspect",e||{},t),prepare:(e,t)=>N("x402","prepare",e||{},t)},bankr:{wallet:e=>N("bankr","wallet",{},e),portfolio:e=>N("bankr","portfolio",{},e),swapQuote:(e,t)=>N("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>N("across","suggestedFees",e||{},t),hop:(e,t)=>N("hop","quote",e||{},t),relay:(e,t)=>N("relay","quote",e||{},t)},cow:{quote:(e,t)=>N("cowswap","quote",e||{},t)},hlWs:{allMids:e=>N("hl-ws","allMids",{},e),l2Book:(e,t)=>N("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>N("poly-ws","book",{assetId:e},t)}}});import{parseArgs as I4}from"node:util";import{spawn as N4}from"node:child_process";var T4=["SIGINT","SIGTERM","SIGHUP"];function hE(e,t=[],n={},r=e){return new Promise(o=>{let i=N4(e,t,n),s=!1,a=null,c=new Map(T4.map(u=>[u,()=>{a||=u,i.exitCode===null&&i.signalCode===null&&i.kill(u)}]));for(let[u,d]of c)process.on(u,d);let l=()=>{for(let[u,d]of c)process.off(u,d)};i.once("error",u=>{s||(s=!0,l(),process.stderr.write(`oracle: could not start ${r}: ${u.message}
|
|
234
|
+
`),o(1))}),i.once("exit",(u,d)=>{if(s)return;s=!0,l();let p=a||d;if(p){process.kill(process.pid,p);return}o(u??1)})})}var yae="http://127.0.0.1:8787";function A4(){process.stderr.write(`usage: oracle data <serve|call|trace|catalog|health> [args]
|
|
3
235
|
oracle data serve [--port N]
|
|
4
236
|
oracle data call <provider> <op> [key=value ...] [--key value ...] [--args '<json>']
|
|
237
|
+
oracle data trace <provider> <op> [key=value ...] [--samples 1..10]
|
|
5
238
|
oracle data catalog
|
|
6
239
|
oracle data health [--cached [--max-age-ms N]]
|
|
7
240
|
|
|
@@ -9,9 +242,12 @@ examples:
|
|
|
9
242
|
oracle data call bitcoin-esplora tipHeight
|
|
10
243
|
oracle data call poly-public markets slug=will-oscar-piastri-be-the-2026-f1-drivers-champion
|
|
11
244
|
oracle data call hl-markets coin coin=HYPE
|
|
12
|
-
`)}function
|
|
13
|
-
`)?
|
|
14
|
-
`),
|
|
15
|
-
`),4):(process.stderr.write(`oracle data: ${
|
|
16
|
-
`),1)}}var
|
|
17
|
-
`),1)
|
|
245
|
+
`)}function k4(e){let t=e[0],n=e[1];if(!t||!n)return{ok:!1,error:"provider and op are required"};let r={};for(let o=2;o<e.length;o+=1){let i=e[o];if(i==="--args"){try{Object.assign(r,JSON.parse(e[++o]||"{}"))}catch(a){return{ok:!1,error:`invalid --args JSON: ${a.message}`}}continue}if(i.startsWith("--")){let a=i.slice(2),c=e[o+1];if(c==null||c.startsWith("--")){r[a]=!0;continue}r[a]=c,o+=1;continue}let s=i.indexOf("=");if(s>0){r[i.slice(0,s)]=i.slice(s+1);continue}return{ok:!1,error:`unexpected positional argument '${i}'. Pass parameters as key=value (e.g. slug=${i}), as --key value, or as --args '{"slug":"${i}"}'.`}}return{ok:!0,provider:t,op:n,args:r}}function bae(e=[]){if(!e.includes("--cached"))return"/data/health";let t=null;try{let{values:n}=I4({args:e,options:{cached:{type:"boolean"},"max-age-ms":{type:"string"}},allowPositionals:!0,strict:!1});t=n["max-age-ms"]||null}catch{}return`/data/health?cached=1${t?`&maxAgeMs=${encodeURIComponent(t)}`:""}`}async function mE(e,{method:t="GET",body:n}={}){let o=(process.env.ORACLE_DATA_URL||yae).replace(/\/$/,"")+e;try{let i=await fetch(o,{method:t,headers:n?{"content-type":"application/json"}:void 0,body:n?JSON.stringify(n):void 0}),s=await i.text();return process.stdout.write(s.endsWith(`
|
|
246
|
+
`)?s:s+`
|
|
247
|
+
`),i.ok?0:1}catch(i){return i&&(i.code==="ECONNREFUSED"||/fetch failed|ECONNREFUSED/i.test(String(i)))?(process.stderr.write(`oracle: data server not running \u2014 start it with 'oracle data serve'
|
|
248
|
+
`),4):(process.stderr.write(`oracle data: ${i.message||i}
|
|
249
|
+
`),1)}}function wae(e){let t=1,n=!1,r=e.slice(0,2);for(let i=2;i<e.length;i++)if(e[i]==="--args"){if(typeof e[i+1]!="string"||e[i+1].startsWith("--"))return{ok:!1,error:"trace requires valid provider arguments"};r.push(e[i],e[++i])}else if(e[i]==="--samples"){let s=e[++i];if(n||!/^(?:[1-9]|10)$/.test(s||""))return{ok:!1,error:"samples must be an integer from 1 through 10, supplied once"};n=!0,t=Number(s)}else{if(e[i].startsWith("--samples="))return{ok:!1,error:"use --samples followed by an integer from 1 through 10"};r.push(e[i])}let o=k4(r);return o.ok?{...o,samples:t}:{ok:!1,error:"trace requires valid provider arguments"}}async function Sae({provider:e,op:t,args:n,samples:r},{call:o}={}){if(!Number.isInteger(r)||r<1||r>10)throw new Error("invalid trace samples");let{getProvider:i}=await Promise.resolve().then(()=>(Rg(),kI)),{classifyDataOp:s}=await Promise.resolve().then(()=>(Lg(),NI)),a=typeof e=="string"?i(e):null;if(!a||typeof t!="string"||!a.ops.includes(t)||s(t)!=="read")throw new Error("trace requires a catalogued read-only provider operation");let{dataCall:c,assertDataOpAllowed:l,isExecutionProvider:u}=await Promise.resolve().then(()=>(x4(),E4));if(u(e))throw new Error("trace refuses execution providers");l(e,t,n);let{captureDataLatency:d}=await Promise.resolve().then(()=>(Om(),wE)),p=[];for(let g=0;g<r;g++){let y=await d(()=>(o||c)(e,t,n)),b=y.value&&typeof y.value=="object"?Object.getOwnPropertyDescriptor(y.value,"ok"):null;p.push({...y.trace,ok:y.trace.ok&&b?.value!==!1})}let m=p.filter(g=>g.ok).map(g=>g.totalMs).sort((g,y)=>g-y),f=g=>m.length?m[Math.ceil(m.length*g)-1]:null,h=p.filter(g=>g.ok).length;return{schemaVersion:1,provider:e,op:t,ok:h===r,scope:"local-provider-call",measurement:"HTTP includes request, response body and parsing. Stage times may overlap. Unattributed time is not proven overhead. Source age, model time and UI time are not measured. Percentiles cover successful calls only and small samples are not an SLA.",samples:p,summary:{completed:h,failed:r-h,p50Ms:f(.5),p95Ms:f(.95)}}}var bwe={name:"data",summary:"desk data plane",group:"read",usage:"oracle data serve|call|trace|catalog|health",async run(e){let t=e.argv[0];if(!t||t==="--help"||t==="-h")return A4(),t?0:1;if(t==="serve"){let n=null;try{let{values:i}=I4({args:e.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});n=i.port||null}catch{}let r={...process.env};n&&(r.ORACLE_DATA_PORT=String(n));let o=e.bin("desk-server.mjs");return hE(process.execPath,[o],{stdio:"inherit",env:r},"desk-server")}if(t==="health")return mE(bae(e.argv.slice(1)));if(t==="catalog")return mE("/data/catalog");if(t==="trace"){let n=wae(e.argv.slice(1));if(!n.ok)return process.stderr.write(`oracle data trace: ${n.error}
|
|
250
|
+
`),1;try{let r=await Sae(n);return process.stdout.write(`${JSON.stringify(r,null,2)}
|
|
251
|
+
`),r.ok?0:1}catch{return process.stderr.write(`oracle data trace: requires a supported read-only operation and valid arguments
|
|
252
|
+
`),1}}if(t==="call"){let n=k4(e.argv.slice(1));return n.ok?mE("/data/call",{method:"POST",body:{provider:n.provider,op:n.op,args:n.args}}):(process.stderr.write(`oracle data call: ${n.error}
|
|
253
|
+
`),1)}return A4(),1}};export{bae as dataHealthRoute,bwe as default,k4 as parseDataCallArgs,wae as parseDataTraceArgs,Sae as runDataTrace};
|