@oracle-agent/oracle 0.28.13 → 0.28.15

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/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
- var W1=Object.defineProperty;var be=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Ca=(e,t)=>{for(var n in t)W1(e,n,{get:t[n],enumerable:!0})};import{createHash as G1,createHmac as K1,timingSafeEqual as Y1}from"node:crypto";function Zf(e){let t=e==null||e===""?Kn:Number(e);return!Number.isFinite(t)||t<0?Kn:Math.min(t,Oa)}function Al(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Al).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Al(e[n])}`).join(",")}}`}function Jf(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function _l(e=process.env){return Jf(process.env)||Jf(e)}function X1(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function Je(e){let t=X1(e);return G1("sha256").update(Al(t)).digest("hex")}function Tl(e,t=_l()){return t?K1("sha256",t).update(String(e)).digest("hex"):""}function Q1(e,t){try{let n=Buffer.from(String(e),"hex"),r=Buffer.from(String(t),"hex");return n.length===0||n.length!==r.length?!1:Y1(n,r)}catch{return!1}}function O(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 a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Kn:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>Oa)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:Il},m=Je(p),f=_l(r),h=f?Tl(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}function Ra(e,{maxAgeMs:t=Kn,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)!==Il)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=Je(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let s=Number(e.preparedAt),c=Number(e.expiresAt),l=Zf(t),u=n-s,d=c-s;if(!Number.isFinite(u)||!Number.isFinite(c)||!Number.isFinite(d)||u<0||d<=0||d>Oa||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}function J1(e,t={}){Ra(e,t);let n=t.label||"operator",r=_l(t.env||process.env);if(!r)throw new Error(`${n}: trusted prepare stamp requires ORACLE_STAMP_HMAC_SECRET`);let o=Je(e),i=String(e.prepareMac||""),a=Tl(o,r);if(!i||!Q1(i,a))throw new Error(`${n}: prepareMac mismatch \u2014 stamp not from trusted preparer`);return!0}var Il,Kn,Oa,X=be(()=>{Il=2,Kn=300*1e3,Oa=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import Yn from"node:net";import Z1 from"node:dns";function $a(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),a=n(o);if(!i||!a)return null;let s=t.includes("::"),c=8-i.length-a.length;if(!s&&c!==0||s&&c<1)return null;let l=[...i,...Array(Math.max(0,c)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function Nl(e,t,n){let r=Math.floor(n/8),o=n%8;for(let a=0;a<r;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Pl(e){if(Yn.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(Yn.isIPv6(e)){let t=$a(e);if(!t)return!1;let n=$a("::ffff:0:0");return Nl(t,n,96)?Pl([...t.slice(12)].join(".")):Nl(t,$a("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Nl(t,$a(o),i)):!1}return!1}function t_(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(e_.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=Yn.isIP(n);return r!==0&&!Pl(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Cl(e,{lookupFn:t=Z1.promises.lookup}={}){let n=t_(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:Yn.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!Pl(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Ol({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(Yn.isIPv6(p.address)?6:4)})),s=(d,p,m)=>{i.set(o(d),a(typeof p=="string"?[{address:p,family:m}]:p))},c=d=>{let p=o(d);if(Yn.isIP(p))return[{address:p,family:Yn.isIPv6(p)?6:4}];let m=i.get(p);if(!m||!m.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return m},l=new n({connect:{lookup(d,p,m){let f;try{f=c(d)}catch(h){return m(h)}return p?.all?m(null,f):m(null,f[0].address,f[0].family)}}}),u=n_((d,p={})=>r(d,{...p,dispatcher:l}),s);return{dispatcher:l,fetch:u,pin:s,resolve:c,async close(){try{await l.destroy()}catch{}}}}function n_(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[Rl]=Object.freeze({pin:t}),e}function $l(e){return typeof e=="function"&&typeof e[Rl]?.pin=="function"}function eh(e,t,n){if(!$l(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Rl].pin(t,n)}var e_,Rl,th=be(()=>{e_=new Set(["localhost","metadata.google.internal","metadata.goog"]);Rl=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as r_}from"node:crypto";function c_(e){let t=String(e||"").toLowerCase();return sh.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function l_(e){let t={};for(let[n,r]of Object.entries(e||{}))c_(n)||(t[n]=r);return t}function u_(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 d_(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function p_(e,t,n,r={}){let o={};for(let[u,d]of Object.entries(n||{}))o[u.toLowerCase()]=d;let i=Object.keys(o).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...sh,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
2
- `),c=r_("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function m_(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,rh):Math.min(250*2**e,rh)+Math.floor(Math.random()*100)}function Lo(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Bl(e,t,n){return Lo(`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 h_(e){return e?e.byteLength??e.length??0:0}async function ih(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 Bl(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Bl(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let s=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await a.read();if(p)break;if(d&&(s.push(Buffer.from(d)),c+=h_(d),c>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Bl(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function ah(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function g_(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),f=null,h=t,g=a?{lookupFn:a}:{};if(c&&!s&&!$l(h))throw Lo(`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=async(x,{status:y=null}={})=>{let b=await Cl(x,g);if(!b.ok)throw Lo(y==null?`HTTP refused ${x}: ${b.error}`:`HTTP redirect to ${x} ${b.error}`,y==null?{}:{status:y});let S=new URL(x).hostname;if(s){if(f&&(await f.close(),f=null),!f)try{f=await Ol({requireUndici:!0,...u?{importUndici:u}:{}})}catch(_){throw Lo(y==null?`HTTP refused ${x}: ${_?.message||_}`:`HTTP redirect to ${x} refused: ${_?.message||_}`,y==null?{}:{status:y})}f.pin(S,b.addresses),h=f.fetch}else eh(h,S,b.addresses);return b};try{let x=String(e),y={...r||{}};c&&await w(x);for(let b=0;b<=oh;b+=1){let S=await h(x,{method:n,headers:y,body:o,signal:p.signal,redirect:"manual"});if(a_.has(S.status)){if(n!=="GET"&&n!=="HEAD"){let N=await ih(S,l??s_,{url:x,truncate:!0}),B=new Error(`HTTP ${S.status} ${n} ${x} redirected non-idempotent request`);throw B.status=S.status,B.body=ah(N)??N.slice(0,300),B}if(b===oh)throw Bo(S),new Error(`HTTP redirect loop for ${e}`);let E=S.headers?.get?.("location"),A;try{A=u_(E,x)}catch(N){throw Bo(S),N}let v=!d_(A,x);if(Bo(S),v&&(y=l_(y)),c)await w(A,{status:S.status});else if(v){let N=await Cl(A,g);if(!N.ok){let B=new Error(`HTTP redirect from ${x} ${N.error}`);throw B.status=S.status,B.retryable=!1,B}s&&N.addresses?.length&&(f||(f=await Ol(u?{importUndici:u}:{})),f&&(f.pin(new URL(A).hostname,N.addresses),h=f.fetch))}x=A;continue}if(typeof d=="function")try{await d(S,{url:x})}catch(E){throw Bo(S),Lo(E?.message||String(E))}let _=await ih(S,l,{url:x,onOversize:()=>p.abort()}),T=ah(_);if(!S.ok){let E=new Error(`HTTP ${S.status} ${n} ${x}`);throw E.status=S.status,E.retryAfter=S.headers?.get?.("retry-after")??null,E.body=T??_.slice(0,300),E}return T??_}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),f&&await f.close()}}async function k(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let s=Number.isInteger(t.retries)?Math.max(t.retries,0):i_,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=Number(t.maxResponseBytes),f=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let b;for(let S=0;S<=s;S++)try{return await g_(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:f,importUndici:d,validateResponse:p})}catch(_){b=_;let T=_?.status,E=_?.name==="AbortError",A=new Set([408,425,429]),v=_?.retryable===!1?!1:T!=null?A.has(T)||o_.has(T)&&nh.has(o):!E&&nh.has(o);if(S===s||!v)throw _;await f_(m_(S,_?.retryAfter))}throw b};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let w=p_(o,e,i,{untrustedUrl:u,maxResponseBytes:f}),x=Ll.get(w);if(x)return x;let y=h().finally(()=>Ll.delete(w));return Ll.set(w,y),y}async function Ie(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Ve(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let s=a++;i[s]=await n(r[s],s)}})),i}var o_,nh,i_,rh,sh,a_,oh,s_,Ll,f_,L=be(()=>{th();o_=new Set([408,425,429,500,502,503,504]),nh=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),i_=2,rh=4e3,sh=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],a_=new Set([301,302,303,307,308]),oh=3,s_=64*1024;Ll=new Map;f_=e=>new Promise(t=>setTimeout(t,e))});function La(e){return Ml.get(Number(e))||null}function y_({key:e,chainId:t,name:n,rpcEnv:r=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:n||e,rpcEnv:r,evm:!0};return Mo[e]=o,Ml.set(o.chainId,o),o}function Fl(e,t=process.env){let n=La(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Ul(e){return Ml.has(Number(e))}var Mo,Ml,ql=be(()=>{Mo={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}},Ml=new Map(Object.values(Mo).map(e=>[e.chainId,e]))});var Ma={};Ca(Ma,{PUBLIC_RPC_FALLBACKS:()=>Hl,erc20Allowance:()=>Wl,erc20BalanceOf:()=>Uo,resolveRpcUrl:()=>jl,rpcBlockNumber:()=>Fo,rpcCall:()=>q,rpcChainId:()=>zl,rpcGasPrice:()=>Vl,rpcGetBalance:()=>Xn,rpcHealth:()=>Ir,rpcHealthAll:()=>Gl,transactionReceipt:()=>qo});import{Interface as b_,getAddress as w_}from"ethers";function dn(e,t){try{return w_(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function x_(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 Dl(e){return e==null?null:Number.parseInt(String(e),16)}function jl(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Fl(e,n);return r||Hl[Number(e)]||null}function k_(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!S_.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function q(e,t,n=[],r={}){let o=String(t||"");k_(o);let i=jl(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await k(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function Ir(e,t={}){let n=await q(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await q(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:La(e)?.name||null}}async function Fo(e,t={}){let n=await q(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function zl(e,t={}){let n=await q(e,"eth_chainId",[],t);return parseInt(n,16)}async function Vl(e,t={}){let n=await q(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Xn(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await q(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Wl(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=dn(e.token||e.tokenAddress,"token"),o=dn(e.owner,"owner"),i=dn(e.spender,"spender"),a=Ba.encodeFunctionData("allowance",[o,i]),s=await q(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ba.decodeFunctionResult("allowance",s),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 Uo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=dn(e.token||e.tokenAddress,"token"),o=dn(e.account||e.owner||e.address,"account"),i=Ba.encodeFunctionData("balanceOf",[o]),a=await q(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ba.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function qo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=x_(e.txHash||e.hash||e.transactionHash),o=await q(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=Dl(o.status),a=i===1,s=i===1?"success":i===0?"reverted":"unknown",c=a?null:s==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?dn(e.expectedTo,"expectedTo"):null,u=o.to?dn(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:s,reason:c,statusCode:i,to:u,from:o.from?dn(o.from,"receipt.from"):null,blockNumber:Dl(o.blockNumber),transactionIndex:Dl(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Gl(e={}){let t=e.chainIds||Object.values(Mo).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Ul(r)&&!Hl[r]&&!jl(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Ir(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ba,Hl,S_,ge=be(()=>{L();ql();Ba=new b_(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Hl={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"};S_=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{readFileSync as N_}from"node:fs";import{homedir as P_}from"node:os";import{join as Ua}from"node:path";function C_(){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=P_();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Ua(t,".config","oracle")).trim();return[e,Ua(n,"exec.env")].filter(Boolean)}return[e,Ua(t,".config","oracle","exec.env"),Ua(t,".config","mad-desk","exec.env")].filter(Boolean)}function uh(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of C_())try{let i=N_(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(a&&(r=a[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 dh=be(()=>{});var ph=be(()=>{});import{createHash as O_,createHmac as fh,timingSafeEqual as R_}from"node:crypto";function Da(e){return Array.isArray(e)?`[${e.map(Da).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Da(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function hh(e,{required:t=!1}={}){try{return uh(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Yl(e){let{signature:t,...n}=e;return n}function gh(e,{secret:t}={}){let n=hh(t);return n?{...e,signature:fh("sha256",n).update(Da(Yl(e))).digest("hex")}:e}function $_(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 O_("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ye(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=hh(o);if(i){let m=fh("sha256",i).update(Da(Yl(e))).digest("hex");if(!L_(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let a=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(a)||a<0||a>qa||!Number.isInteger(s)||s<0||s>qa||a>s)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-a),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=M_(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 gh({...Yl(e),calldataHash:$_(r)},{secret:o})}function L_(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:R_(n,r)}function Kl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function B_(e){let t=e==null?qa: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,qa)}function We({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Kl(e,0),a=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,s=Math.min(60,Math.abs(Kl(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Kl(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=B_(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Xl({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:a=!1,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l=mh,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=We({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:a,requestedCapBps:s});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)||mh)),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 w=Number((d-g)*10000n/(d===0n?1n:d));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return gh({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 M_(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 a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+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 ie(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Xl({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var qa,mh,qe=be(()=>{dh();ph();qa=100,mh=2e4});function GT({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"?WT:VT}async function le(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=GT(t);return k(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function m0(e={}){let t=await le({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function Qt(e={}){return le({type:"allMids"},e)}async function Pr(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return le({type:"l2Book",coin:String(e)},t)}async function oi(e={}){return le({type:"outcomeMeta"},e)}async function os(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return le({type:"spotClearinghouseState",user:e},t)}async function f0(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return le({type:"userFills",user:e},t)}async function is(e={}){return le({type:"meta"},e)}async function dt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),le(t,e)}async function Cr({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 le(i,o)}async function as({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return le({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function h0(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return le({type:"openOrders",user:e},t)}async function g0(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return le({type:"frontendOpenOrders",user:e},t)}async function Or(e,t={}){if(!e)throw new Error("hlUserState requires user");return le({type:"clearinghouseState",user:e},t)}async function ss(e={}){return le({type:"spotMeta"},e)}var VT,WT,et=be(()=>{L();VT="https://api.hyperliquid.xyz/info",WT="https://api.hyperliquid-testnet.xyz/info"});async function E0(e={}){let t=Date.now();if(li.dexs&&t-li.at<6e4&&!e.fetchImpl)return li.dexs;let n=await le({type:"perpDexs"},e);return li={at:t,dexs:Array.isArray(n)?n:[]},li.dexs}async function A0(e="",t={}){let n=e||"",r=Date.now(),o=v0.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await le({type:"metaAndAssetCtxs",dex:e},t):await dt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return v0.set(n,c),c}function yn(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=I0+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function gn(e,t){let n=$u(e),r=$u(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=I0+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 $u(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 Lu(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:yn(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:gn(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:rN(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=gn(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 m=(await E0(t)).findIndex(b=>b&&b.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await A0(l,t),g=f.findIndex(b=>b.name===n||b.name===`${l}:${d}`||b.name.endsWith(`:${d}`));if(g<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=f[g];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let x=nN+m*1e4+g,y=h[g]||{};return{kind:"hip3",coin:w.name||n,assetId:x,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:y.markPx??null}}let{universe:r,ctxs:o}=await A0("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await E0(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 Lu({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let s=r[a];if(s.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[a]||{};return{kind:"main",coin:s.name,assetId:a,szDecimals:s.szDecimals??0,maxLeverage:s.maxLeverage??null,dex:"",markPx:c.markPx??null}}function rN(e,t){let n=$u(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var I0,nN,li,v0,ms=be(()=>{et();I0=1e8,nN=1e5,li={at:0,dexs:null},v0=new Map});function _e(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 pt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function or(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=_e(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 Bu(e,t="amount"){let n=or(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Ce(e,t,n="amount"){let r=_e(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,[a="0",s=""]=i.split(".");if(s.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((a||"0")+s.padEnd(t,"0"));return o?-c:c}var Rr=be(()=>{});function cN(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 _0(e,t){let n=_e(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 qt(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=>qt(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)}:${qt(e[r],t)}`).join(",")}}`}function lN(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)||qt(n,"declared order type")!==qt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(qt(n,"declared order type")!==qt({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||qt(n,"declared order type")!==qt({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 uN(e,t,n){let r=_0(e.s,"signed size"),o=_0(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Ce(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Ce(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function dN(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=bn(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(pt(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=or(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Ce(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function T0(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(_e(e.s,"hl: signed size")!==_e(t.size,"hl: size"))throw new Error("hl: signed size must match");if(_e(e.p,"hl: signed price")!==_e(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(qt(e.t,"signed order type")!==qt(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 N0(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(_e(e.s,"hl: bracket protection size")!==_e(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(_e(e.p,"hl: bracket protection price")!==_e(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(_e(i.triggerPx,"hl: triggerPx")!==_e(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function pN(e){let t=String(e||"").replace(/\/$/,"");if(!oN.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Mu(e){return yn(e)!=null}function mN(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Mu(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 fN(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(a=>{if(typeof a=="string"){let[s,c]=String(a).split(":");return s===e&&Number(c)===t}return String(a?.coin)===e&&Number(a?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Mu(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 P0(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=bn(n.kind,"kind",48),o=aN[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=pN(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 a=Number(n.nonce);if(!Number.isSafeInteger(a)||a<=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!==sN[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(iN.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=bn(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=yn(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(mN(c,t),fN(c,l,t),r==="hip4-order"&&!Mu(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");lN(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");T0(u[0],n,l);let f=1;d!=null&&N0(u[f++],n,l,d,"tp"),p!=null&&N0(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");T0(u[0],n,l)}uN(u[0],n,t),dN(n,t),s=_e(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=bn(n.usd,"margin usd",64),d=Ce(u,6,"hl: margin usd");if(or(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=Ce(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=cN(f,6)}}if(r==="builder-fee-approval"){let c=bn(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(bn(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=bn(n.maxFeeRate,"maxFeeRate",32);if(bn(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=Ce(u.slice(0,-1),12,"hl: builder fee percent"),p=Ce(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==a)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(s??n.action.wei??0),notional:String(s??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??s??0),coin:n.coin||null,submitTo:i})}var oN,iN,aN,sN,bn,C0=be(()=>{Rr();ms();oN=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),iN=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),aN=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"}),sN=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"}),bn=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function gN(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 fs(e,t={},n={}){let r=String(e?.kind||""),o=hN[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()),a=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),s=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:gN(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+a,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:s,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return P0(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 hN,Fu=be(()=>{C0();hN=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"})});import{Contract as yN,JsonRpcProvider as bN}from"ethers";function EN(e){return vN.test(String(e||""))}async function hs(e,{contract:t=wN,rpc:n=SN,chainId:r=xN,balanceOf:o}={}){if(!EN(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new bN(n,r,{staticNetwork:!0}),a=new yN(t,kN,i);return BigInt(await a.balanceOf(e))}var wN,xN,SN,kN,vN,Uu=be(()=>{wN="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",xN=999,SN="https://rpc.hyperliquid.xyz/evm",kN=["function balanceOf(address owner) view returns (uint256)"],vN=/^0x[a-fA-F0-9]{40}$/});import{existsSync as AN,readFileSync as IN,lstatSync as _N}from"node:fs";import{homedir as O0}from"node:os";import{join as qu}from"node:path";function PN(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(R0,t)?R0[t]:NN}function LN(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[$0])return String(e[$0]);let t=e.ORACLE_CONFIG_DIR||qu(O0(),".config","oracle");return qu(t,"fee-recipient")}return qu(O0(),".config","oracle","fee-recipient")}function Du(e=process.env){try{let t=LN(e);if(!AN(t)||_N(t).isSymbolicLink())return"";let n=IN(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function BN(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),TN)}function MN({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[ON]||"").trim(),o=String(e[RN]||$N).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=PN(t),a=BN(e[CN],{fallback:r?i:0}),s=Math.min(a,i);if(!s)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=Du(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:s,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function gs({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=MN({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let a=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(a))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await hs(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function L0(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 B0(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function M0(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var TN,NN,R0,CN,ON,RN,$0,$N,ui=be(()=>{Uu();TN=100,NN=5,R0=Object.freeze({swap:5,bridge:5,perps:0,nft:0});CN="ORACLE_INTEGRATOR_FEE_BPS",ON="ORACLE_INTEGRATOR_FEE_RECIPIENT",RN="ORACLE_INTEGRATOR_ID",$0="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",$N="oracle"});var Ju={};Ca(Ju,{HL_BUILDER_ADDRESS_ENV:()=>ys,HL_BUILDER_DEFAULT_FEE_BPS:()=>FN,HL_BUILDER_FEE_ENV:()=>ju,HL_BUILDER_FEE_TIERS:()=>di,HL_BUILDER_MAX_FEE_BPS:()=>Hu,HL_PERP_MAX_SIG_FIGS:()=>F0,HL_PERP_PRICE_DECIMALS:()=>U0,HL_SIGNATURE_CHAIN_ID:()=>Vu,MARGIN_MODE:()=>pi,ORDER_TYPES:()=>Ke,TIF:()=>mi,formatPerpPrice:()=>Zt,formatPerpSize:()=>j0,hlBuilderFeeBpsForKind:()=>H0,hlPerpAssetInfo:()=>wn,hlPrepareBracketOrder:()=>Qu,hlPrepareBuilderApproval:()=>Ku,hlPrepareCancelOrder:()=>fi,hlPreparePerpOrder:()=>Br,hlPrepareUpdateIsolatedMargin:()=>Xu,hlPrepareUpdateLeverage:()=>Yu,resolveBuilderFee:()=>Wu});function q0(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 UN(e,t){let n=q0(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function qN(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 D0(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 H0(e="perp"){if(e==="perp"||e==="main")return di.perp;if(e==="spot")return di.spot;if(e==="hip3")return di.hip3;if(e==="outcome"||e==="hip4")return di.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function Wu({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[ys]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${ys} must be an EVM address`);let o=Du(e);if(!o||o!==r)return null;let i=e?.[ju],a=H0(n),s=i==null?a:Number(i);if(!Number.isFinite(s)||s<=0||Math.abs(s*10-Math.round(s*10))>1e-9)throw new Error(`hl-perps: ${ju} must be a positive number in 0.1 bps increments`);if(s>Hu)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${Hu} bps cap`);if(s>a)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${a} bps product tier for ${n}`);let c=Math.round(s*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:s,percent:`${l}%`}}}async function DN(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 le({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 HN(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||hs;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Gu(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,a=""]=r.replace(/^-/,"").split(".");if(a.length<=t){let f=a.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let s=a.slice(0,t),c=Number(a[t]),l=BigInt(i+s),u=a.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 jN(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))),a=Math.max(0,t-1-i);return Gu(r,a,n)}function Zt(e,t,n={}){let r=U0-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Gu(jN(e,F0,n),r,n)}function j0(e,t){let n=Gu(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 zN(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,a=r.decimals+o.decimals,s=i.toString().padStart(a+1,"0");if(a===0)return s;let c=s.slice(0,-a),l=s.slice(-a).replace(/0+$/,"");return l?`${c}.${l}`:c}async function wn(e={},t={}){let n=await Lu(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,outcome:n.outcome??null,side:n.side??null}}function zu(e,{tif:t=mi.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Ke.LIMIT:return{limit:{tif:t}};case Ke.MARKET:return{limit:{tif:mi.IOC}};case Ke.STOP_MARKET:case Ke.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:Zt(n,o),tpsl:e===Ke.STOP_MARKET?"sl":"tp"}};case Ke.STOP_LIMIT:case Ke.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:Zt(n,o),tpsl:e===Ke.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function $r(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Vu,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 Lr(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=fs(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,O(r,{provider:e.provider||"hl-perps",kind:e.kind})}function Ku(e={},t={}){let n=Wu({env:t.env});if(!n)throw new Error(`hl-perps: ${ys} 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:Vu,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Lr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...$r(o,r,t)},e,t)}async function Br(e={},t={}){let n=await wn(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??Ke.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=D0(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=j0(e.size??e.sz,n.szDecimals),s;if(r===Ke.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let _=await Qt(t);x=Number(_?.[n.coin]??_?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))throw new Error("hl-perps: no mark price available for a market order");let y=Number(e.maxSlippageBps??50);if(!Number.isInteger(y)||y<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(y>100)throw new Error(`hl-perps: maxSlippageBps ${y} exceeds the hard 100 bps cap`);let b=o?x*(1+y/1e4):x*(1-y/1e4);s=Zt(b,n.szDecimals,{roundDown:o});let S=Math.abs(Number(s)/x-1)*1e4;if(S>y+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${S.toFixed(2)} bps from mark, above the ${y} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=Zt(e.price??e.limitPx,n.szDecimals)}let c=zu(r,{tif:e.tif??(r===Ke.MARKET?mi.IOC:mi.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:s,s:a,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=Wu({env:t.env,kind:n.kind}),p=await HN(d,e,t),m=p.exempt?null:d,f=await DN(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=zN(a,s);return Lr({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,side:o?"buy":"sell",orderType:r,price:s,size:a,reduceOnly:i,notionalUsd:w,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...$r(u,g,t)},e,t)}async function fi(e={},t={}){let n=await wn(qN(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=q0(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Lr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...$r(i,Number(e.nonce??Date.now()),t)},e,t)}async function Yu(e={},t={}){let n=await wn(e,t),r=UN(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||pi.CROSS).toLowerCase();if(o!==pi.CROSS&&o!==pi.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===pi.CROSS,leverage:r};return Lr({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,...$r(i,Number(e.nonce??Date.now()),t)},e,t)}async function Xu(e={},t={}){let n=await wn(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=Ce(o,6,"hl-perps: usd"),a=D0(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Lr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...$r(s,Number(e.nonce??Date.now()),t)},e,t)}async function Qu(e={},t={}){let n=await Br(e,t),r=await wn(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:Zt(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:zu(Ke.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:Zt(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:zu(Ke.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let a={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return Lr({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:Zt(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:Zt(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...$r(a,Number(e.nonce??Date.now()),t)},e,t)}var F0,U0,Vu,FN,Hu,ys,ju,di,Ke,mi,pi,bs=be(()=>{et();ms();Rr();X();Fu();Uu();ui();F0=5,U0=6,Vu="0x66eee",FN=2,Hu=10,ys="ORACLE_HL_BUILDER_ADDRESS",ju="ORACLE_HL_BUILDER_FEE_BPS",di=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Ke=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),mi=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),pi=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function wd(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:kn}var kn,Os=be(()=>{kn="0x000000000000000000000000000000000000dEaD"});var Ms={};Ca(Ms,{ACROSS_API:()=>Sy,HOP_API:()=>ky,RELAY_API:()=>vy,acrossHealth:()=>vd,acrossSuggestedFees:()=>Ls,hopHealth:()=>Ed,hopQuote:()=>Bs,relayHealth:()=>Ad,relayPrepare:()=>Id,relayQuote:()=>Si});async function vd(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ls({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 Ls(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:a}=e;if(!n||o==null||i==null||!a)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let s=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(a)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Sy).replace(/\/$/,"");return k(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ed(e={}){try{let t=await Bs({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 Bs(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let a=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a});if(!s.executable)throw new Error(`hop: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(s.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||ky).replace(/\/$/,""),u=await k(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?ie(u,{chainId:Number(e.originChainId||e.chainId||aC[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a}):{...u,autoSlippagePolicy:s}}async function Ad(e={}){try{let t=await Si({user:kn,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 Si(e={},t={}){let{user:n=kn,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:a="0x0000000000000000000000000000000000000000",amount:s,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!s)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=We({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||vy).replace(/\/$/,""),d=await k(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:a,amount:String(s),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:ie(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Id(e={},t={}){let n=await Si(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(s=>(s.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:s.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(s=>String(s.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let a=o.map(s=>({chainId:r,from:s.from||e.user,to:s.to,data:s.data,value:s.value??"0x0",...s.gasLimit!=null||s.gas!=null?{gasLimit:s.gasLimit??s.gas}:{},slippageGuard:ye(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return O({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}var Sy,ky,vy,aC,Fs=be(()=>{L();qe();Os();X();Sy="https://across.to/api",ky="https://api.hop.exchange/v1",vy="https://api.relay.link",aC={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});import{existsSync as rx,readFileSync as WR}from"node:fs";import{dirname as nx,join as cp}from"node:path";import{fileURLToPath as GR}from"node:url";function KR(e){let t=nx(GR(e));for(let n=0;n<8;n+=1){let r=cp(t,"package.json");if(rx(r))try{let i=JSON.parse(WR(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=nx(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function so(e,t){let n=KR(t),r=cp(n,e);return rx(r)?r:cp(n,"dist","assets",e)}var oc=be(()=>{});import{isAddress as YR}from"ethers";function QR(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:ox,tag:`v${ox}`}),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 ic(e){let t=ur[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Fi(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Ui(e,t){let n=String(e||"");if(!YR(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function ix(e,t){let n=ic(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,a,s]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");Fi(i,"safe-erc20: supply"),Ui(a,"safe-erc20: initialHolder"),Ui(s,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,a,s,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(Fi(i,"safe-erc721-drop: cap"),Ui(a,"safe-erc721-drop: treasury"),Fi(s,"safe-erc721-drop: mintPrice"),Fi(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Ui(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Ui(r,"safe-vesting: beneficiary");for(let[a,s]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(a);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${s} must be uint64`)}Fi(i,"safe-vesting: durationSeconds")}return n}function ax(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var ox,XR,ur,ac=be(()=>{ox="5.0.2",XR={"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"]}};ur=Object.freeze(Object.fromEntries(Object.entries(XR).map(([e,t])=>[e,QR(e,t)])))});import{spawnSync as lp}from"node:child_process";import{existsSync as dr,readFileSync as sc,readdirSync as sx,statSync as cx}from"node:fs";import{join as jt}from"node:path";import{createHash as JR}from"node:crypto";function lc(){return dr(qi)?sx(qi).filter(e=>ur[e]&&cx(jt(qi,e)).isDirectory()).map(e=>{let t=jt(qi,e),n=jt(t,"SECURITY.md");return{id:e,path:t,metadata:ic(e),securityNotice:dr(n)?sc(n,"utf8").slice(0,500):null,disclaimer:cc}}):[]}function lx(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",jt(e,".foundry/bin/forge")];for(let n of t)if(lp(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function ZR(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:lp("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function co(e,t,n){let r=lp(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 e$(e){let t=JR("sha256");function n(r){let o=cx(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of sx(r).sort())n(jt(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(sc(r)))}return n(e),t.digest("hex")}function Di(e,t={}){let n=ic(e),r=t.allowSkipStatic!==!1,o=jt(qi,e);if(!dr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=lx();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!dr(jt(o,"lib","forge-std"))){let m=co(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
3
- ${m.stderr}`)}if(!dr(jt(o,"lib","openzeppelin-contracts"))){let m=co(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
4
- ${m.stderr}`)}let a=jt(o,"lib","openzeppelin-contracts","package.json"),s=dr(a)?JSON.parse(sc(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=co(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
5
- ${c.stderr}`.slice(0,2e3));let l=co(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
1
+ var G1=Object.defineProperty;var be=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Oa=(e,t)=>{for(var n in t)G1(e,n,{get:t[n],enumerable:!0})};import{createHash as K1,createHmac as Y1,timingSafeEqual as X1}from"node:crypto";function Zf(e){let t=e==null||e===""?Yn:Number(e);return!Number.isFinite(t)||t<0?Yn:Math.min(t,Ra)}function Il(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Il).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Il(e[n])}`).join(",")}}`}function Jf(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Tl(e=process.env){return Jf(process.env)||Jf(e)}function Q1(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function Je(e){let t=Q1(e);return K1("sha256").update(Il(t)).digest("hex")}function Pl(e,t=Tl()){return t?Y1("sha256",t).update(String(e)).digest("hex"):""}function J1(e,t){try{let n=Buffer.from(String(e),"hex"),r=Buffer.from(String(t),"hex");return n.length===0||n.length!==r.length?!1:X1(n,r)}catch{return!1}}function O(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 a=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(a&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let s={...e,provider:e.provider||t,kind:e.kind||n,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:a?e.oraclePrepared:!0};if(!s.provider)throw new Error("stampPrepared: provider required");if(!s.kind)throw new Error("stampPrepared: kind required");let c=Number(o),l=i==null?c+Yn:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>Ra)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:_l},m=Je(p),f=Tl(r),h=f?Pl(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}function $a(e,{maxAgeMs:t=Yn,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)!==_l)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=Je(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let s=Number(e.preparedAt),c=Number(e.expiresAt),l=Zf(t),u=n-s,d=c-s;if(!Number.isFinite(u)||!Number.isFinite(c)||!Number.isFinite(d)||u<0||d<=0||d>Ra||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}function Z1(e,t={}){$a(e,t);let n=t.label||"operator",r=Tl(t.env||process.env);if(!r)throw new Error(`${n}: trusted prepare stamp requires ORACLE_STAMP_HMAC_SECRET`);let o=Je(e),i=String(e.prepareMac||""),a=Pl(o,r);if(!i||!J1(i,a))throw new Error(`${n}: prepareMac mismatch \u2014 stamp not from trusted preparer`);return!0}var _l,Yn,Ra,X=be(()=>{_l=2,Yn=300*1e3,Ra=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import Xn from"node:net";import e_ from"node:dns";function La(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),a=n(o);if(!i||!a)return null;let s=t.includes("::"),c=8-i.length-a.length;if(!s&&c!==0||s&&c<1)return null;let l=[...i,...Array(Math.max(0,c)).fill(0),...a];return l.length!==8?null:Uint8Array.from(l.flatMap(u=>[u>>8,u&255]))}function Nl(e,t,n){let r=Math.floor(n/8),o=n%8;for(let a=0;a<r;a+=1)if(e[a]!==t[a])return!1;if(!o)return!0;let i=255<<8-o;return(e[r]&i)===(t[r]&i)}function Cl(e){if(Xn.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(Xn.isIPv6(e)){let t=La(e);if(!t)return!1;let n=La("::ffff:0:0");return Nl(t,n,96)?Cl([...t.slice(12)].join(".")):Nl(t,La("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Nl(t,La(o),i)):!1}return!1}function n_(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(t_.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=Xn.isIP(n);return r!==0&&!Cl(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Ol(e,{lookupFn:t=e_.promises.lookup}={}){let n=n_(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:Xn.isIPv6(n.host)?6:4}]};let r;try{r=await t(n.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${n.host} did not resolve`}}return!Array.isArray(r)||r.length===0||r.some(o=>!Cl(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Rl({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let n,r;try{let d=await t();n=d.Agent,r=d.fetch}catch(d){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${d?.message||d}`);return null}if(typeof n!="function"||typeof r!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=d=>String(d).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,a=d=>(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(Xn.isIPv6(p.address)?6:4)})),s=(d,p,m)=>{i.set(o(d),a(typeof p=="string"?[{address:p,family:m}]:p))},c=d=>{let p=o(d);if(Xn.isIP(p))return[{address:p,family:Xn.isIPv6(p)?6:4}];let m=i.get(p);if(!m||!m.length)throw new Error(`refused: unpinned host ${d} during pinned fetch`);return m},l=new n({connect:{lookup(d,p,m){let f;try{f=c(d)}catch(h){return m(h)}return p?.all?m(null,f):m(null,f[0].address,f[0].family)}}}),u=r_((d,p={})=>r(d,{...p,dispatcher:l}),s);return{dispatcher:l,fetch:u,pin:s,resolve:c,async close(){try{await l.destroy()}catch{}}}}function r_(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[$l]=Object.freeze({pin:t}),e}function Ll(e){return typeof e=="function"&&typeof e[$l]?.pin=="function"}function eh(e,t,n){if(!Ll(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[$l].pin(t,n)}var t_,$l,th=be(()=>{t_=new Set(["localhost","metadata.google.internal","metadata.goog"]);$l=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as o_}from"node:crypto";function l_(e){let t=String(e||"").toLowerCase();return sh.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function u_(e){let t={};for(let[n,r]of Object.entries(e||{}))l_(n)||(t[n]=r);return t}function d_(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 p_(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function m_(e,t,n,r={}){let o={};for(let[u,d]of Object.entries(n||{}))o[u.toLowerCase()]=d;let i=Object.keys(o).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...sh,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
2
+ `),c=o_("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function f_(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,rh):Math.min(250*2**e,rh)+Math.floor(Math.random()*100)}function Bo(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ml(e,t,n){return Bo(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Mo(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function g_(e){return e?e.byteLength??e.length??0:0}async function ih(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&&(Mo(e),!r))throw Ml(n,`content-length ${i}`,t);let a=e.body?.getReader?.();if(!a){let d=await e.text(),p=Buffer.byteLength(d,"utf8");if(p>t){if(!r)throw Ml(n,`body ${p} bytes`,t);return Buffer.from(d,"utf8").subarray(0,t).toString("utf8")}return d}let s=[],c=0,l=!1;try{for(;;){let{value:d,done:p}=await a.read();if(p)break;if(d&&(s.push(Buffer.from(d)),c+=g_(d),c>t)){l=!0;break}}}finally{if(l)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(l&&(typeof o=="function"&&o(),!r))throw Ml(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function ah(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function y_(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs:i,lookupFn:a,realFetch:s,untrustedUrl:c=!1,maxResponseBytes:l=null,importUndici:u,validateResponse:d}){let p=new AbortController,m=setTimeout(()=>p.abort(),i),f=null,h=t,g=a?{lookupFn:a}:{};if(c&&!s&&!Ll(h))throw Bo(`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=async(x,{status:y=null}={})=>{let b=await Ol(x,g);if(!b.ok)throw Bo(y==null?`HTTP refused ${x}: ${b.error}`:`HTTP redirect to ${x} ${b.error}`,y==null?{}:{status:y});let S=new URL(x).hostname;if(s){if(f&&(await f.close(),f=null),!f)try{f=await Rl({requireUndici:!0,...u?{importUndici:u}:{}})}catch(I){throw Bo(y==null?`HTTP refused ${x}: ${I?.message||I}`:`HTTP redirect to ${x} refused: ${I?.message||I}`,y==null?{}:{status:y})}f.pin(S,b.addresses),h=f.fetch}else eh(h,S,b.addresses);return b};try{let x=String(e),y={...r||{}};c&&await w(x);for(let b=0;b<=oh;b+=1){let S=await h(x,{method:n,headers:y,body:o,signal:p.signal,redirect:"manual"});if(s_.has(S.status)){if(n!=="GET"&&n!=="HEAD"){let P=await ih(S,l??c_,{url:x,truncate:!0}),B=new Error(`HTTP ${S.status} ${n} ${x} redirected non-idempotent request`);throw B.status=S.status,B.body=ah(P)??P.slice(0,300),B}if(b===oh)throw Mo(S),new Error(`HTTP redirect loop for ${e}`);let E=S.headers?.get?.("location"),A;try{A=d_(E,x)}catch(P){throw Mo(S),P}let v=!p_(A,x);if(Mo(S),v&&(y=u_(y)),c)await w(A,{status:S.status});else if(v){let P=await Ol(A,g);if(!P.ok){let B=new Error(`HTTP redirect from ${x} ${P.error}`);throw B.status=S.status,B.retryable=!1,B}s&&P.addresses?.length&&(f||(f=await Rl(u?{importUndici:u}:{})),f&&(f.pin(new URL(A).hostname,P.addresses),h=f.fetch))}x=A;continue}if(typeof d=="function")try{await d(S,{url:x})}catch(E){throw Mo(S),Bo(E?.message||String(E))}let I=await ih(S,l,{url:x,onOversize:()=>p.abort()}),T=ah(I);if(!S.ok){let E=new Error(`HTTP ${S.status} ${n} ${x}`);throw E.status=S.status,E.retryAfter=S.headers?.get?.("retry-after")??null,E.body=T??I.slice(0,300),E}return T??I}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(m),f&&await f.close()}}async function k(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},a=t.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let s=Number.isInteger(t.retries)?Math.max(t.retries,0):a_,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=Number(t.maxResponseBytes),f=Number.isFinite(m)&&m>0?Math.floor(m):null,h=async()=>{let b;for(let S=0;S<=s;S++)try{return await y_(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:f,importUndici:d,validateResponse:p})}catch(I){b=I;let T=I?.status,E=I?.name==="AbortError",A=new Set([408,425,429]),v=I?.retryable===!1?!1:T!=null?A.has(T)||i_.has(T)&&nh.has(o):!E&&nh.has(o);if(S===s||!v)throw I;await h_(f_(S,I?.retryAfter))}throw b};if(!(t.dedupe!==!1&&o==="GET"&&a==null))return h();let w=m_(o,e,i,{untrustedUrl:u,maxResponseBytes:f}),x=Bl.get(w);if(x)return x;let y=h().finally(()=>Bl.delete(w));return Bl.set(w,y),y}async function Ie(e){let t=Date.now();try{let n=await e();return{ok:!0,ms:Date.now()-t,data:n}}catch(n){return{ok:!1,ms:Date.now()-t,error:String(n.message||n),status:n.status??null}}}async function Ve(e,t,n){let r=Array.from(e),o=Math.max(1,Math.min(Number(t)||1,r.length||1)),i=new Array(r.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;a<r.length;){let s=a++;i[s]=await n(r[s],s)}})),i}var i_,nh,a_,rh,sh,s_,oh,c_,Bl,h_,L=be(()=>{th();i_=new Set([408,425,429,500,502,503,504]),nh=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),a_=2,rh=4e3,sh=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],s_=new Set([301,302,303,307,308]),oh=3,c_=64*1024;Bl=new Map;h_=e=>new Promise(t=>setTimeout(t,e))});function Ba(e){return Fl.get(Number(e))||null}function b_({key:e,chainId:t,name:n,rpcEnv:r=[]}){if(!e)throw new Error("registerChain requires a key");if(!Number.isInteger(Number(t)))throw new Error("registerChain requires a numeric chainId");let o={chainId:Number(t),name:n||e,rpcEnv:r,evm:!0};return Fo[e]=o,Fl.set(o.chainId,o),o}function Ul(e,t=process.env){let n=Ba(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function ql(e){return Fl.has(Number(e))}var Fo,Fl,Dl=be(()=>{Fo={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}},Fl=new Map(Object.values(Fo).map(e=>[e.chainId,e]))});var Fa={};Oa(Fa,{PUBLIC_RPC_FALLBACKS:()=>jl,erc20Allowance:()=>Gl,erc20BalanceOf:()=>qo,resolveRpcUrl:()=>zl,rpcBlockNumber:()=>Uo,rpcCall:()=>q,rpcChainId:()=>Vl,rpcGasPrice:()=>Wl,rpcGetBalance:()=>Qn,rpcHealth:()=>_r,rpcHealthAll:()=>Kl,transactionReceipt:()=>Do});import{Interface as w_,getAddress as x_}from"ethers";function pn(e,t){try{return x_(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function S_(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 Hl(e){return e==null?null:Number.parseInt(String(e),16)}function zl(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Ul(e,n);return r||jl[Number(e)]||null}function v_(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!k_.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function q(e,t,n=[],r={}){let o=String(t||"");v_(o);let i=zl(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await k(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function _r(e,t={}){let n=await q(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await q(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Ba(e)?.name||null}}async function Uo(e,t={}){let n=await q(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function Vl(e,t={}){let n=await q(e,"eth_chainId",[],t);return parseInt(n,16)}async function Wl(e,t={}){let n=await q(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function Qn(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await q(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function Gl(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=pn(e.token||e.tokenAddress,"token"),o=pn(e.owner,"owner"),i=pn(e.spender,"spender"),a=Ma.encodeFunctionData("allowance",[o,i]),s=await q(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ma.decodeFunctionResult("allowance",s),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 qo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=pn(e.token||e.tokenAddress,"token"),o=pn(e.account||e.owner||e.address,"account"),i=Ma.encodeFunctionData("balanceOf",[o]),a=await q(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ma.decodeFunctionResult("balanceOf",a),c=BigInt(s[0]);return{chainId:n,token:r,account:o,balance:c.toString(),balanceHex:`0x${c.toString(16)}`,blockTag:e.blockTag||"latest"}}async function Do(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=S_(e.txHash||e.hash||e.transactionHash),o=await q(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=Hl(o.status),a=i===1,s=i===1?"success":i===0?"reverted":"unknown",c=a?null:s==="reverted"?"transaction reverted":"unknown receipt status",l=e.expectedTo?pn(e.expectedTo,"expectedTo"):null,u=o.to?pn(o.to,"receipt.to"):null;return l&&u!==l&&(a=!1,c=`to mismatch: expected ${l}, got ${u||"null"}`),{ok:a,chainId:n,txHash:r,status:s,reason:c,statusCode:i,to:u,from:o.from?pn(o.from,"receipt.from"):null,blockNumber:Hl(o.blockNumber),transactionIndex:Hl(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function Kl(e={}){let t=e.chainIds||Object.values(Fo).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!ql(r)&&!jl[r]&&!zl(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await _r(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ma,jl,k_,ge=be(()=>{L();Dl();Ma=new w_(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);jl={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"};k_=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{readFileSync as N_}from"node:fs";import{homedir as C_}from"node:os";import{join as qa}from"node:path";function O_(){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=C_();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||qa(t,".config","oracle")).trim();return[e,qa(n,"exec.env")].filter(Boolean)}return[e,qa(t,".config","oracle","exec.env"),qa(t,".config","mad-desk","exec.env")].filter(Boolean)}function uh(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of O_())try{let i=N_(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${n}=(.*)$`,"m"));if(a&&(r=a[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 dh=be(()=>{});var ph=be(()=>{});import{createHash as R_,createHmac as fh,timingSafeEqual as $_}from"node:crypto";function Ha(e){return Array.isArray(e)?`[${e.map(Ha).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ha(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function hh(e,{required:t=!1}={}){try{return uh(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function Xl(e){let{signature:t,...n}=e;return n}function gh(e,{secret:t}={}){let n=hh(t);return n?{...e,signature:fh("sha256",n).update(Ha(Xl(e))).digest("hex")}:e}function L_(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 R_("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function ye(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=hh(o);if(i){let m=fh("sha256",i).update(Ha(Xl(e))).digest("hex");if(!B_(e.signature,m))throw new Error("auto-slippage guard signature mismatch \u2014 refusing to bind a guard this Oracle did not issue")}let a=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(a)||a<0||a>Da||!Number.isInteger(s)||s<0||s>Da||a>s)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-a),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=F_(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 gh({...Xl(e),calldataHash:L_(r)},{secret:o})}function B_(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:$_(n,r)}function Yl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function M_(e){let t=e==null?Da: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,Da)}function We({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=Yl(e,0),a=i>0?i>=25e4?5:i>=1e5?10:i>=5e4?20:i>=1e4?40:70:r?30:10,s=Math.min(60,Math.abs(Yl(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,Yl(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=M_(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Ql({chainId:e,venue:t,quoteAmountOut:n,liquidityUsd:r,priceChange5m:o=0,quoteAgeMs:i=0,crossChain:a=!1,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l=mh,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=We({liquidityUsd:r,priceChange5m:o,quoteAgeMs:i,crossChain:a,requestedCapBps:s});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)||mh)),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 w=Number((d-g)*10000n/(d===0n?1n:d));if(w>p.capBps)throw new Error(`auto-slippage: realised floor implies ${w} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return gh({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 F_(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 a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+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 ie(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Ql({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Da,mh,qe=be(()=>{dh();ph();Da=100,mh=2e4});function KT({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"?GT:WT}async function le(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=KT(t);return k(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function m0(e={}){let t=await le({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function Jt(e={}){return le({type:"allMids"},e)}async function Cr(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return le({type:"l2Book",coin:String(e)},t)}async function ii(e={}){return le({type:"outcomeMeta"},e)}async function is(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return le({type:"spotClearinghouseState",user:e},t)}async function f0(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return le({type:"userFills",user:e},t)}async function as(e={}){return le({type:"meta"},e)}async function dt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),le(t,e)}async function Or({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 le(i,o)}async function ss({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return le({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function h0(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return le({type:"openOrders",user:e},t)}async function g0(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return le({type:"frontendOpenOrders",user:e},t)}async function Rr(e,t={}){if(!e)throw new Error("hlUserState requires user");return le({type:"clearinghouseState",user:e},t)}async function cs(e={}){return le({type:"spotMeta"},e)}var WT,GT,et=be(()=>{L();WT="https://api.hyperliquid.xyz/info",GT="https://api.hyperliquid-testnet.xyz/info"});async function E0(e={}){let t=Date.now();if(ui.dexs&&t-ui.at<6e4&&!e.fetchImpl)return ui.dexs;let n=await le({type:"perpDexs"},e);return ui={at:t,dexs:Array.isArray(n)?n:[]},ui.dexs}async function A0(e="",t={}){let n=e||"",r=Date.now(),o=v0.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await le({type:"metaAndAssetCtxs",dex:e},t):await dt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return v0.set(n,c),c}function bn(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=I0+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function yn(e,t){let n=Lu(e),r=Lu(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=I0+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 Lu(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 Bu(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:bn(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:yn(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:oP(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=yn(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 m=(await E0(t)).findIndex(b=>b&&b.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await A0(l,t),g=f.findIndex(b=>b.name===n||b.name===`${l}:${d}`||b.name.endsWith(`:${d}`));if(g<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=f[g];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let x=rP+m*1e4+g,y=h[g]||{};return{kind:"hip3",coin:w.name||n,assetId:x,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:y.markPx??null}}let{universe:r,ctxs:o}=await A0("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await E0(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 Bu({coin:p},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let s=r[a];if(s.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let c=o[a]||{};return{kind:"main",coin:s.name,assetId:a,szDecimals:s.szDecimals??0,maxLeverage:s.maxLeverage??null,dex:"",markPx:c.markPx??null}}function oP(e,t){let n=Lu(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var I0,rP,ui,v0,fs=be(()=>{et();I0=1e8,rP=1e5,ui={at:0,dexs:null},v0=new Map});function Te(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 pt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function ir(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=Te(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 mt(e,t="amount"){let n=ir(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function _e(e,t,n="amount"){let r=Te(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,[a="0",s=""]=i.split(".");if(s.length>t)throw new Error(`${n} has more than ${t} decimal places, which would lose precision`);let c=BigInt((a||"0")+s.padEnd(t,"0"));return o?-c:c}var $r=be(()=>{});function lP(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 _0(e,t){let n=Te(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 Dt(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=>Dt(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)}:${Dt(e[r],t)}`).join(",")}}`}function uP(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)||Dt(n,"declared order type")!==Dt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(Dt(n,"declared order type")!==Dt({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||Dt(n,"declared order type")!==Dt({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 dP(e,t,n){let r=_0(e.s,"signed size"),o=_0(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=_e(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=_e(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function pP(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=wn(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(pt(e.builder||"","hl: builder").toLowerCase()!==r)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(s=>String(s).toLowerCase()):[]).includes(r))throw new Error("hl: order builder not allowed");let i=ir(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=_e(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function T0(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(Te(e.s,"hl: signed size")!==Te(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Te(e.p,"hl: signed price")!==Te(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(Dt(e.t,"signed order type")!==Dt(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 P0(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(Te(e.s,"hl: bracket protection size")!==Te(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Te(e.p,"hl: bracket protection price")!==Te(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(Te(i.triggerPx,"hl: triggerPx")!==Te(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function mP(e){let t=String(e||"").replace(/\/$/,"");if(!iP.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Mu(e){return bn(e)!=null}function fP(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Mu(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 hP(e,t,n){let r=Array.isArray(n.hlMarkets)?n.hlMarkets:[];if(r.length){if(!r.some(a=>{if(typeof a=="string"){let[s,c]=String(a).split(":");return s===e&&Number(c)===t}return String(a?.coin)===e&&Number(a?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Mu(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 N0(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=wn(n.kind,"kind",48),o=sP[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=mP(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 a=Number(n.nonce);if(!Number.isSafeInteger(a)||a<=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!==cP[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(aP.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=wn(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=bn(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(fP(c,t),hP(c,l,t),r==="hip4-order"&&!Mu(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");uP(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");T0(u[0],n,l);let f=1;d!=null&&P0(u[f++],n,l,d,"tp"),p!=null&&P0(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");T0(u[0],n,l)}dP(u[0],n,t),pP(n,t),s=Te(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=wn(n.usd,"margin usd",64),d=_e(u,6,"hl: margin usd");if(ir(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=_e(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=lP(f,6)}}if(r==="builder-fee-approval"){let c=wn(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(wn(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=wn(n.maxFeeRate,"maxFeeRate",32);if(wn(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=_e(u.slice(0,-1),12,"hl: builder fee percent"),p=_e(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(p<0n||d*100n>p)throw new Error("hl: builder fee exceeds cap");if(Number(n.action.nonce)!==a)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(s??n.action.wei??0),notional:String(s??0),fee:"0",kind:r,actionType:n.action.type,amount:String(n.action.wei??s??0),coin:n.coin||null,submitTo:i})}var iP,aP,sP,cP,wn,C0=be(()=>{$r();fs();iP=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),aP=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),sP=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"}),cP=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"}),wn=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function yP(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 hs(e,t={},n={}){let r=String(e?.kind||""),o=gP[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()),a=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),s=String(e.submitTo||"").replace(/\/$/,""),c={version:1,surface:"hl",action:o,owner:yP(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${r}:${e.nonce}`),expiresAtMs:i+a,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:s,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return N0(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 gP,Fu=be(()=>{C0();gP=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"})});import{Contract as bP,JsonRpcProvider as wP}from"ethers";function AP(e){return EP.test(String(e||""))}async function gs(e,{contract:t=xP,rpc:n=kP,chainId:r=SP,balanceOf:o}={}){if(!AP(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new wP(n,r,{staticNetwork:!0}),a=new bP(t,vP,i);return BigInt(await a.balanceOf(e))}var xP,SP,kP,vP,EP,Uu=be(()=>{xP="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",SP=999,kP="https://rpc.hyperliquid.xyz/evm",vP=["function balanceOf(address owner) view returns (uint256)"],EP=/^0x[a-fA-F0-9]{40}$/});import{existsSync as IP,readFileSync as _P,lstatSync as TP}from"node:fs";import{homedir as O0}from"node:os";import{join as qu}from"node:path";function CP(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(R0,t)?R0[t]:NP}function BP(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[$0])return String(e[$0]);let t=e.ORACLE_CONFIG_DIR||qu(O0(),".config","oracle");return qu(t,"fee-recipient")}return qu(O0(),".config","oracle","fee-recipient")}function Du(e=process.env){try{let t=BP(e);if(!IP(t)||TP(t).isSymbolicLink())return"";let n=_P(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function MP(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),PP)}function FP({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[RP]||"").trim(),o=String(e[$P]||LP).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=CP(t),a=MP(e[OP],{fallback:r?i:0}),s=Math.min(a,i);if(!s)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=Du(e);return!c||c!==r.toLowerCase()?{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"recipient-not-pinned"}:{bps:s,recipient:r,integrator:o,action:t,applies:!0,reason:"configured"}}async function ys({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=FP({env:t,action:n,admin:o});if(o===!0)return{...i,holderVerificationStatus:"admin-oracle"};let a=String(e||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(a))return{...i,holderVerificationStatus:"wallet-required"};try{return BigInt(await gs(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function L0(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 B0(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function M0(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var PP,NP,R0,OP,RP,$P,$0,LP,di=be(()=>{Uu();PP=100,NP=5,R0=Object.freeze({swap:5,bridge:5,perps:0,nft:0});OP="ORACLE_INTEGRATOR_FEE_BPS",RP="ORACLE_INTEGRATOR_FEE_RECIPIENT",$P="ORACLE_INTEGRATOR_ID",$0="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",LP="oracle"});var Ju={};Oa(Ju,{HL_BUILDER_ADDRESS_ENV:()=>bs,HL_BUILDER_DEFAULT_FEE_BPS:()=>UP,HL_BUILDER_FEE_ENV:()=>ju,HL_BUILDER_FEE_TIERS:()=>pi,HL_BUILDER_MAX_FEE_BPS:()=>Hu,HL_PERP_MAX_SIG_FIGS:()=>F0,HL_PERP_PRICE_DECIMALS:()=>U0,HL_SIGNATURE_CHAIN_ID:()=>Vu,MARGIN_MODE:()=>mi,ORDER_TYPES:()=>Ke,TIF:()=>fi,formatPerpPrice:()=>en,formatPerpSize:()=>j0,hlBuilderFeeBpsForKind:()=>H0,hlPerpAssetInfo:()=>xn,hlPrepareBracketOrder:()=>Qu,hlPrepareBuilderApproval:()=>Ku,hlPrepareCancelOrder:()=>hi,hlPreparePerpOrder:()=>Mr,hlPrepareUpdateIsolatedMargin:()=>Xu,hlPrepareUpdateLeverage:()=>Yu,resolveBuilderFee:()=>Wu});function q0(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 qP(e,t){let n=q0(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function DP(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 D0(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 H0(e="perp"){if(e==="perp"||e==="main")return pi.perp;if(e==="spot")return pi.spot;if(e==="hip3")return pi.hip3;if(e==="outcome"||e==="hip4")return pi.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function Wu({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[bs]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${bs} must be an EVM address`);let o=Du(e);if(!o||o!==r)return null;let i=e?.[ju],a=H0(n),s=i==null?a:Number(i);if(!Number.isFinite(s)||s<=0||Math.abs(s*10-Math.round(s*10))>1e-9)throw new Error(`hl-perps: ${ju} must be a positive number in 0.1 bps increments`);if(s>Hu)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${Hu} bps cap`);if(s>a)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${a} bps product tier for ${n}`);let c=Math.round(s*10),l=(c/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:r,f:c},disclosure:{address:r,bps:s,percent:`${l}%`}}}async function HP(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 le({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 jP(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||gs;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Gu(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,a=""]=r.replace(/^-/,"").split(".");if(a.length<=t){let f=a.replace(/0+$/,"");return(o?"-":"")+(f?`${i}.${f}`:i)}let s=a.slice(0,t),c=Number(a[t]),l=BigInt(i+s),u=a.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 zP(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))),a=Math.max(0,t-1-i);return Gu(r,a,n)}function en(e,t,n={}){let r=U0-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Gu(zP(e,F0,n),r,n)}function j0(e,t){let n=Gu(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 VP(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,a=r.decimals+o.decimals,s=i.toString().padStart(a+1,"0");if(a===0)return s;let c=s.slice(0,-a),l=s.slice(-a).replace(/0+$/,"");return l?`${c}.${l}`:c}async function xn(e={},t={}){let n=await Bu(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,outcome:n.outcome??null,side:n.side??null}}function zu(e,{tif:t=fi.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case Ke.LIMIT:return{limit:{tif:t}};case Ke.MARKET:return{limit:{tif:fi.IOC}};case Ke.STOP_MARKET:case Ke.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:en(n,o),tpsl:e===Ke.STOP_MARKET?"sl":"tp"}};case Ke.STOP_LIMIT:case Ke.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:en(n,o),tpsl:e===Ke.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Lr(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Vu,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 Br(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=hs(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,O(r,{provider:e.provider||"hl-perps",kind:e.kind})}function Ku(e={},t={}){let n=Wu({env:t.env});if(!n)throw new Error(`hl-perps: ${bs} 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:Vu,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Br({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Lr(o,r,t)},e,t)}async function Mr(e={},t={}){let n=await xn(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??Ke.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=D0(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=j0(e.size??e.sz,n.szDecimals),s;if(r===Ke.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let I=await Jt(t);x=Number(I?.[n.coin]??I?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))throw new Error("hl-perps: no mark price available for a market order");let y=Number(e.maxSlippageBps??50);if(!Number.isInteger(y)||y<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(y>100)throw new Error(`hl-perps: maxSlippageBps ${y} exceeds the hard 100 bps cap`);let b=o?x*(1+y/1e4):x*(1-y/1e4);s=en(b,n.szDecimals,{roundDown:o});let S=Math.abs(Number(s)/x-1)*1e4;if(S>y+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${S.toFixed(2)} bps from mark, above the ${y} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=en(e.price??e.limitPx,n.szDecimals)}let c=zu(r,{tif:e.tif??(r===Ke.MARKET?fi.IOC:fi.GTC),triggerPx:e.triggerPx,szDecimals:n.szDecimals}),l={a:n.assetId,b:o,p:s,s:a,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=Wu({env:t.env,kind:n.kind}),p=await jP(d,e,t),m=p.exempt?null:d,f=await HP(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=VP(a,s);return Br({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,side:o?"buy":"sell",orderType:r,price:s,size:a,reduceOnly:i,notionalUsd:w,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...Lr(u,g,t)},e,t)}async function hi(e={},t={}){let n=await xn(DP(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=q0(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Br({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Lr(i,Number(e.nonce??Date.now()),t)},e,t)}async function Yu(e={},t={}){let n=await xn(e,t),r=qP(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||mi.CROSS).toLowerCase();if(o!==mi.CROSS&&o!==mi.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===mi.CROSS,leverage:r};return Br({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,...Lr(i,Number(e.nonce??Date.now()),t)},e,t)}async function Xu(e={},t={}){let n=await xn(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=_e(o,6,"hl-perps: usd"),a=D0(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Br({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Lr(s,Number(e.nonce??Date.now()),t)},e,t)}async function Qu(e={},t={}){let n=await Mr(e,t),r=await xn(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:en(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:zu(Ke.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:en(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:zu(Ke.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:r.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let a={type:"order",orders:i,grouping:"normalTpsl",...n.action.builder?{builder:n.action.builder}:{}};return Br({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:en(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:en(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Lr(a,Number(e.nonce??Date.now()),t)},e,t)}var F0,U0,Vu,UP,Hu,bs,ju,pi,Ke,fi,mi,ws=be(()=>{et();fs();$r();X();Fu();Uu();di();F0=5,U0=6,Vu="0x66eee",UP=2,Hu=10,bs="ORACLE_HL_BUILDER_ADDRESS",ju="ORACLE_HL_BUILDER_FEE_BPS",pi=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Ke=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),fi=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),mi=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function wd(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:vn}var vn,Rs=be(()=>{vn="0x000000000000000000000000000000000000dEaD"});var Fs={};Oa(Fs,{ACROSS_API:()=>Sy,HOP_API:()=>ky,RELAY_API:()=>vy,acrossHealth:()=>vd,acrossSuggestedFees:()=>Bs,hopHealth:()=>Ed,hopQuote:()=>Ms,relayHealth:()=>Ad,relayPrepare:()=>Id,relayQuote:()=>ki});async function vd(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Bs({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 Bs(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount:a}=e;if(!n||o==null||i==null||!a)throw new Error("acrossSuggestedFees requires token, originChainId, destinationChainId, amount");let s=new URLSearchParams({token:n,destinationToken:r,originChainId:String(o),destinationChainId:String(i),amount:String(a)}),c=(t.baseUrl||process.env.ACROSS_API_URL||Sy).replace(/\/$/,"");return k(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ed(e={}){try{let t=await Ms({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 Ms(e={},t={}){let{amount:n,token:r="ETH",fromChain:o="ethereum",toChain:i="arbitrum"}=e;if(!n)throw new Error("hopQuote requires amount");let a=e.slippage==null?void 0:Math.round(Number(e.slippage)*100),s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a});if(!s.executable)throw new Error(`hop: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({amount:String(n),token:r,fromChain:o,toChain:i,slippage:String(s.selectedBps/100)}),l=(t.baseUrl||process.env.HOP_API_URL||ky).replace(/\/$/,""),u=await k(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?ie(u,{chainId:Number(e.originChainId||e.chainId||sC[o]||0),venue:u?.tx?.to||"hop",amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:o!==i,requestedCapBps:e.maxSlippageBps??e.slippageBps??a}):{...u,autoSlippagePolicy:s}}async function Ad(e={}){try{let t=await ki({user:vn,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 ki(e={},t={}){let{user:n=vn,originChainId:r,destinationChainId:o,originCurrency:i="0x0000000000000000000000000000000000000000",destinationCurrency:a="0x0000000000000000000000000000000000000000",amount:s,tradeType:c="EXACT_INPUT"}=e;if(r==null||o==null||!s)throw new Error("relayQuote requires originChainId, destinationChainId, amount");let l=We({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||vy).replace(/\/$/,""),d=await k(`${u}/quote`,{method:"POST",body:{user:n,originChainId:Number(r),destinationChainId:Number(o),originCurrency:i,destinationCurrency:a,amount:String(s),tradeType:c,slippageTolerance:String(l.selectedBps)},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),p=d?.details?.currencyOut?.amount;return!p||!/^\d+$/.test(String(p))?{...d,autoSlippagePolicy:l}:ie(d,{chainId:Number(r),venue:d?.steps?.[0]?.items?.[0]?.data?.to||"relay",amountOut:p,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,crossChain:Number(r)!==Number(o),requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Id(e={},t={}){let n=await ki(e,t),r=Number(e.originChainId),o=(n.steps||[]).flatMap(s=>(s.items||[]).filter(c=>c?.data?.to&&c?.data?.data).map(c=>({stepId:s.id,...c.data})));if(!o.length)throw new Error("relay: quote returned no executable transaction items");let i=String(n?.autoSlippage?.venue||"").toLowerCase();if(o.some(s=>String(s.to).toLowerCase()!==i))throw new Error("relay: route includes a separate approval/transaction that is not yet safely bound");let a=o.map(s=>({chainId:r,from:s.from||e.user,to:s.to,data:s.data,value:s.value??"0x0",...s.gasLimit!=null||s.gas!=null?{gasLimit:s.gasLimit??s.gas}:{},slippageGuard:ye(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return O({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}var Sy,ky,vy,sC,Us=be(()=>{L();qe();Rs();X();Sy="https://across.to/api",ky="https://api.hop.exchange/v1",vy="https://api.relay.link",sC={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});import{existsSync as ox,readFileSync as GR}from"node:fs";import{dirname as rx,join as cp}from"node:path";import{fileURLToPath as KR}from"node:url";function YR(e){let t=rx(KR(e));for(let n=0;n<8;n+=1){let r=cp(t,"package.json");if(ox(r))try{let i=JSON.parse(GR(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=rx(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function co(e,t){let n=YR(t),r=cp(n,e);return ox(r)?r:cp(n,"dist","assets",e)}var ic=be(()=>{});import{isAddress as XR}from"ethers";function JR(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:ix,tag:`v${ix}`}),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 ac(e){let t=dr[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Ui(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function qi(e,t){let n=String(e||"");if(!XR(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function ax(e,t){let n=ac(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,a,s]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc20: name/symbol required");Ui(i,"safe-erc20: supply"),qi(a,"safe-erc20: initialHolder"),qi(s,"safe-erc20: initialOwner")}else if(e==="safe-erc721-drop"){let[r,o,i,a,s,c,l]=t;if(!String(r||"").trim()||!String(o||"").trim())throw new Error("safe-erc721-drop: name/symbol required");if(Ui(i,"safe-erc721-drop: cap"),qi(a,"safe-erc721-drop: treasury"),Ui(s,"safe-erc721-drop: mintPrice"),Ui(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");qi(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;qi(r,"safe-vesting: beneficiary");for(let[a,s]of[[o,"startTimestamp"],[i,"durationSeconds"]])try{let c=BigInt(a);if(c<0n||c>18446744073709551615n)throw new Error}catch{throw new Error(`safe-vesting: ${s} must be uint64`)}Ui(i,"safe-vesting: durationSeconds")}return n}function sx(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var ix,QR,dr,sc=be(()=>{ix="5.0.2",QR={"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"]}};dr=Object.freeze(Object.fromEntries(Object.entries(QR).map(([e,t])=>[e,JR(e,t)])))});import{spawnSync as lp}from"node:child_process";import{existsSync as pr,readFileSync as cc,readdirSync as cx,statSync as lx}from"node:fs";import{join as zt}from"node:path";import{createHash as ZR}from"node:crypto";function uc(){return pr(Di)?cx(Di).filter(e=>dr[e]&&lx(zt(Di,e)).isDirectory()).map(e=>{let t=zt(Di,e),n=zt(t,"SECURITY.md");return{id:e,path:t,metadata:ac(e),securityNotice:pr(n)?cc(n,"utf8").slice(0,500):null,disclaimer:lc}}):[]}function ux(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",zt(e,".foundry/bin/forge")];for(let n of t)if(lp(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function e$(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:lp("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function lo(e,t,n){let r=lp(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 t$(e){let t=ZR("sha256");function n(r){let o=lx(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of cx(r).sort())n(zt(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(cc(r)))}return n(e),t.digest("hex")}function Hi(e,t={}){let n=ac(e),r=t.allowSkipStatic!==!1,o=zt(Di,e);if(!pr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=ux();if(!i)throw new Error("protocol-templates: forge not found. Install Foundry (https://getfoundry.sh) then: cd protocols/templates/"+e+" && forge install && forge test");if(!pr(zt(o,"lib","forge-std"))){let m=lo(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
3
+ ${m.stderr}`)}if(!pr(zt(o,"lib","openzeppelin-contracts"))){let m=lo(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
4
+ ${m.stderr}`)}let a=zt(o,"lib","openzeppelin-contracts","package.json"),s=pr(a)?JSON.parse(cc(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=lo(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
5
+ ${c.stderr}`.slice(0,2e3));let l=lo(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
6
6
  ${l.stdout}
7
- ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=ZR();if(d){let m=co(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
7
+ ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=e$();if(d){let m=lo(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
8
8
  ${m.stdout}
9
- ${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=e$(o);return{ok:!0,templateId:e,metadata:n,path:o,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:u,sourceHash:p,disclaimer:cc,firmAudit:!1}}function ux(e,t={}){let n=Di(e,t),r=lx(),o=n.path,i=co(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
10
- ${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=jt(o,"out",`${a}.sol`,`${a}.json`);if(!dr(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(sc(s,"utf8"));return{gate:n,metadata:n.metadata,contractName:a,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:s}}var qi,cc,uc=be(()=>{oc();ac();qi=so("protocols/templates",import.meta.url),cc="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{createHash as up}from"node:crypto";import{secp256k1 as Hi}from"@noble/curves/secp256k1.js";import{bech32m as mx}from"@scure/base";function gt(e,t){throw new Error(`${e}: ${t}`)}function bx(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||gt("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function dp(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{gt(t,`must be an integer from ${n} to ${r}`)}}function i$(e){let t=String(e||"");if(!t||[...t].some(o=>!fx.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(fx.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 hx(e,t){let n=String(e||"").trim(),r=i$(n);return(!r||r.length!==32)&&gt(t,"must be a 32-byte base58 Solana public key"),n}function gx(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||gt(t,"must be a compressed secp256k1 public key");try{Hi.Point.fromHex(n)}catch{gt(t,"must encode a valid secp256k1 curve point")}return n}function a$(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}gt("bitcoin-tapscript-vault","script too large")}function mp(e,t){let n=up("sha256").update(e).digest();return up("sha256").update(n).update(n).update(t).digest()}function yx(e){return mp("TapLeaf",Buffer.concat([Buffer.from([192]),a$(e.length),e]))}function s$(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return mp("TapBranch",Buffer.concat([n,r]))}function dc(e){return Hi.Point.fromHex(e).x.toString(16).padStart(64,"0")}function wx(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function c$(e,t){let n=[];return e.forEach((r,o)=>n.push(wx(dc(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function l$(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 u$(e,t){return Buffer.concat([l$(t),Buffer.from([178,117]),wx(dc(e)),Buffer.from([172])])}function d$(e,t,n){let r=Hi.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${mp("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Hi.Point.Fn.ORDER,s=o.add(Hi.Point.BASE.multiply(a)),c=Buffer.from(s.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:mx.encode(l,[1,...mx.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function Tt(e,t){return Object.freeze({path:e,content:t.endsWith(`
9
+ ${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=t$(o);return{ok:!0,templateId:e,metadata:n,path:o,forgeTests:{ok:!0,tool:"forge",summary:"forge test passed"},forgeBuild:{ok:!0,tool:"forge",summary:"forge build passed"},staticAnalysis:u,sourceHash:p,disclaimer:lc,firmAudit:!1}}function dx(e,t={}){let n=Hi(e,t),r=ux(),o=n.path,i=lo(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
10
+ ${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=zt(o,"out",`${a}.sol`,`${a}.json`);if(!pr(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(cc(s,"utf8"));return{gate:n,metadata:n.metadata,contractName:a,abi:c.abi,bytecode:c.bytecode?.object||c.bytecode,deployedBytecode:c.deployedBytecode?.object||c.deployedBytecode,artifactPath:s}}var Di,lc,dc=be(()=>{ic();sc();Di=co("protocols/templates",import.meta.url),lc="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{createHash as up}from"node:crypto";import{secp256k1 as ji}from"@noble/curves/secp256k1.js";import{bech32m as fx}from"@scure/base";function yt(e,t){throw new Error(`${e}: ${t}`)}function wx(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||yt("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function dp(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{yt(t,`must be an integer from ${n} to ${r}`)}}function a$(e){let t=String(e||"");if(!t||[...t].some(o=>!hx.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(hx.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 gx(e,t){let n=String(e||"").trim(),r=a$(n);return(!r||r.length!==32)&&yt(t,"must be a 32-byte base58 Solana public key"),n}function yx(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||yt(t,"must be a compressed secp256k1 public key");try{ji.Point.fromHex(n)}catch{yt(t,"must encode a valid secp256k1 curve point")}return n}function s$(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}yt("bitcoin-tapscript-vault","script too large")}function mp(e,t){let n=up("sha256").update(e).digest();return up("sha256").update(n).update(n).update(t).digest()}function bx(e){return mp("TapLeaf",Buffer.concat([Buffer.from([192]),s$(e.length),e]))}function c$(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return mp("TapBranch",Buffer.concat([n,r]))}function pc(e){return ji.Point.fromHex(e).x.toString(16).padStart(64,"0")}function xx(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function l$(e,t){let n=[];return e.forEach((r,o)=>n.push(xx(pc(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function u$(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 d$(e,t){return Buffer.concat([u$(t),Buffer.from([178,117]),xx(pc(e)),Buffer.from([172])])}function p$(e,t,n){let r=ji.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${mp("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%ji.Point.Fn.ORDER,s=o.add(ji.Point.BASE.multiply(a)),c=Buffer.from(s.x.toString(16).padStart(64,"0"),"hex"),l=n==="mainnet"?"bc":n==="regtest"?"bcrt":"tb";return{address:fx.encode(l,[1,...fx.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function Pt(e,t){return Object.freeze({path:e,content:t.endsWith(`
11
11
  `)?t:`${t}
12
- `})}function p$(e){let t=up("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 m$(e){let t=bx(e.projectName),n=hx(e.authority,"solana-safe-vault authority"),r=dp(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||gt("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=hx(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&gt("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
12
+ `})}function m$(e){let t=up("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 f$(e){let t=wx(e.projectName),n=gx(e.authority,"solana-safe-vault authority"),r=dp(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||yt("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=gx(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&yt("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
13
13
  use anchor_lang::system_program::{transfer, Transfer};
14
14
 
15
15
  declare_id!("${i}");
@@ -97,16 +97,16 @@ pub enum VaultError {
97
97
  #[msg("Vault has insufficient funds")] InsufficientFunds,
98
98
  #[msg("Arithmetic overflow")] ArithmeticOverflow,
99
99
  }
100
- `,s=[Tt("Anchor.toml",`[provider]
100
+ `,s=[Pt("Anchor.toml",`[provider]
101
101
  cluster = "${o}"
102
102
  wallet = "~/.config/solana/id.json"
103
103
 
104
104
  [programs.${o}]
105
105
  ${t} = "${i}"
106
- `),Tt("Cargo.toml",`[workspace]
106
+ `),Pt("Cargo.toml",`[workspace]
107
107
  members = ["programs/${t}"]
108
108
  resolver = "2"
109
- `),Tt(`programs/${t}/Cargo.toml`,`[package]
109
+ `),Pt(`programs/${t}/Cargo.toml`,`[package]
110
110
  name = "${t}"
111
111
  version = "0.1.0"
112
112
  edition = "2021"
@@ -122,28 +122,28 @@ default = []
122
122
 
123
123
  [dependencies]
124
124
  anchor-lang = "0.31.1"
125
- `),Tt(`programs/${t}/src/lib.rs`,a),Tt(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
125
+ `),Pt(`programs/${t}/src/lib.rs`,a),Pt(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
126
126
  // 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
127
127
  // 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
128
- `),Tt("SECURITY.md",`# Security model
128
+ `),Pt("SECURITY.md",`# Security model
129
129
 
130
130
  - Initial and permanent withdrawal authority: \`${n}\`
131
131
  - Unlock delay: ${r} slots after the most recent deposit
132
132
  - No upgrade authority is created by this source; deployment authority handling is external
133
133
  - Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
134
- `)];return{family:"solana",network:o,projectName:t,protocolModel:pc["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:s,gate:{sourceChecks:{ok:a.includes("address = vault.authority")&&a.includes("checked_add")&&a.includes('seeds = [b"vault"')&&!a.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:pp},deploymentPrepared:!1}}function f$(e){let t=bx(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||gt("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>gx(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&gt("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(dp(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=gx(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&gt("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=dp(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(dc).join(",")})`,c=`and_v(v:older(${a}),pk(${dc(i)}))`,l=`taproot_tree(${s},${c})`,u=c$(r,o),d=u$(i,Number(a)),p=s$(yx(u),yx(d)),m=d$(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[Tt("policy/miniscript.txt",l),Tt("policy/descriptor.txt",f),Tt("policy/manifest.json",JSON.stringify(h,null,2)),Tt("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(a)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(a),expected:"spendable"}},null,2)),Tt("SECURITY.md",`# Security model
134
+ `)];return{family:"solana",network:o,projectName:t,protocolModel:mc["solana-safe-vault"].protocolModel,authorityReport:{initialAuthority:n,mutable:!1,unlockDelaySlots:r.toString()},programIdentity:{publicKey:i,callerSupplied:!0,secretKeyAccepted:!1},files:s,gate:{sourceChecks:{ok:a.includes("address = vault.authority")&&a.includes("checked_add")&&a.includes('seeds = [b"vault"')&&!a.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:pp},deploymentPrepared:!1}}function h$(e){let t=wx(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||yt("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>yx(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&yt("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(dp(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=yx(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&yt("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=dp(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(pc).join(",")})`,c=`and_v(v:older(${a}),pk(${pc(i)}))`,l=`taproot_tree(${s},${c})`,u=l$(r,o),d=d$(i,Number(a)),p=c$(bx(u),bx(d)),m=p$(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[Pt("policy/miniscript.txt",l),Pt("policy/descriptor.txt",f),Pt("policy/manifest.json",JSON.stringify(h,null,2)),Pt("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(a)-1),expected:"rejected"},matureRecovery:{recoverySignature:!0,csvBlocks:Number(a),expected:"spendable"}},null,2)),Pt("SECURITY.md",`# Security model
135
135
 
136
136
  - Cooperative path: ${o}-of-${r.length}
137
137
  - Recovery path: ${i} after ${a} blocks (BIP68 relative locktime)
138
138
  - This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
139
139
  - Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
140
- `)];return{family:"bitcoin",network:n,projectName:t,protocolModel:pc["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:a.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:a.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&a>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:pp},psbtPrepared:!1,fundingPrepared:!1}}function ji(){return Object.values(pc).map(e=>({...e,disclaimer:pp}))}async function zi(e={}){let t=String(e.templateId||"").trim(),n=pc[t];n||gt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?m$(e):f$(e),o=p$(r.files);return O({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 pp,fx,pc,fp=be(()=>{X();pp="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",fx="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",pc=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})})});var EA={};Ca(EA,{CONTRACTS_EVAL_HERE:()=>GU,runContractsEval:()=>WU});import Vc from"node:fs";import Mn from"node:path";import{spawnSync as RU}from"node:child_process";import{fileURLToPath as $U}from"node:url";function HU(){let e=process.env.HOME||"";for(let t of["forge",Mn.join(e,".foundry/bin/forge")])if(RU(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function vA(e,t=[]){if(!Vc.existsSync(e))return t;for(let n of Vc.readdirSync(e)){let r=Mn.join(e,n);if(Vc.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;vA(r,t)}else n.endsWith(".sol")&&!r.includes(`${Mn.sep}lib${Mn.sep}`)&&t.push(r)}return t}function jU(){let e=[];for(let t of Object.keys(ur)){let n=Mn.join(LU,t),r=vA(Mn.join(n,"src")),o=[];for(let i of r){let a=Vc.readFileSync(i,"utf8");for(let s of BU)s.test(a)&&o.push(`${Mn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function zU(){return HU()?Object.keys(ur).map(e=>{try{let t=Di(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(ur).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function VU(){let e=[],t=ji();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 zi({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:MU,programId:FU,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 zi({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[UU,qU],recoveryPubkey:DU,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 WU(){let e=jU(),t=zU(),n=await VU(),r=[...e,...t,...n],o=r.filter(a=>a.ok!==!0&&a.skipped!==!0).length,i=r.filter(a=>a.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 LU,BU,MU,FU,UU,qU,DU,GU,AA=be(()=>{ac();uc();fp();oc();LU=so("protocols/templates",import.meta.url),BU=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],MU="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",FU="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",UU="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",qU="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",DU="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";GU=Mn.dirname($U(import.meta.url))});X();ge();import{Interface as bh,getAddress as jo,isAddress as F_}from"ethers";L();var v_="https://api.dexscreener.com",E_=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),kt=e=>String(e??"").toLowerCase(),A_=e=>Array.isArray(e)?e:e==null?[]:[e];function I_(e,t,n){let r=kt(t),o=kt(n),i=kt(e?.baseToken?.address),a=kt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function __(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Fa(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||v_).replace(/\/$/,"")}async function ch(e={}){let n=(await k(`${Fa(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Qn(e,t={}){if(!e)throw new Error("tokenAddress required");return k(`${Fa(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Do(e,t={}){if(!e)throw new Error("query required");return k(`${Fa(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lh(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return k(`${Fa(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function Ho({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=kt(E_[Number(e)]||e),a=new Set(A_(r).filter(Boolean).map(kt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>Qn(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=`${kt(m?.chainId)}:${kt(m?.dexId)}:${kt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>kt(p?.chainId)===i).filter(p=>I_(p,t,n)).filter(p=>!a.size||a.has(kt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:__(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)[0]??null}qe();X();var De={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"}},U_=[100,500,3e3,1e4],Ha=new bh(["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)"]),yh=new bh(["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)"]),wh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",xh="0x0000000000000000000000000000000000000000",Ql=[100,500,2500,1e4],q_={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ql}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ql}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ql}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function Zl(e,t){let n=Number(e),r=De[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(De).join(", ")})`);let o=q_[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 a=o,s=a[i];if(!s){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(a)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:s.quoter,router:s.router,feeTiers:s.feeTiers||null}}function Jl(e,t){let n=De[Number(t)];if(!e||e===wh||e===xh||/^eth$/i.test(String(e)))return jo(n.weth);let r=String(e);if(/^weth$/i.test(r))return jo(n.weth);if(/^usdc$/i.test(r))return jo(n.usdc);if(!F_(r))throw new Error(`invalid token address: ${e}`);return jo(r)}function D_(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 H_(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 pn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=Zl(e.chainId??8453,e.venue),a=Jl(e.tokenIn||"WETH",n),s=Jl(e.tokenOut||De[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:U_,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let g=Ha.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let w=await q(n,"eth_call",[{to:r,data:g},"latest"],t);if(!w||w==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let x=Ha.decodeFunctionResult("quoteExactInputSingle",w),y={fee:h,ok:!0,amountOut:x[0].toString(),sqrtPriceX96After:x[1].toString(),initializedTicksCrossed:Number(x[2]),gasEstimate:x[3].toString()};d.push(y),(!p||BigInt(y.amountOut)>BigInt(p.amountOut))&&(p=y)}catch(w){d.push({fee:h,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await Ho({chainId:n,tokenA:a,tokenB:s,dexIds:D_(e.venue)},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return ie({venue:"uniswap-v3",chainId:n,chain:De[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sh(e={},t={}){let{chainId:n,quoter:r,router:o}=Zl(e.chainId??8453),i=(e.tokens||[]).map(p=>Jl(p,n)),a=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required");let c=H_(i,a),l=Ha.encodeFunctionData("quoteExactInput",[c,s]),u=await q(n,"eth_call",[{to:r,data:l},"latest"],t),d=Ha.decodeFunctionResult("quoteExactInput",u);return ie({venue:"uniswap-v3",chainId:n,chain:De[n].name,quoter:r,tokens:i,fees:a,path:c,amountIn:s.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 eu(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await pn({chainId:n,tokenIn:De[n].weth,tokenOut:De[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function kh(e={},t={}){let n=Number(e.chainId??8453),r=Zl(n,e.venue),o=jo(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===wh||i===xh||/^eth$/i.test(i),s=await pn(e,t),c=yh.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,fee:s.fee,recipient:o,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.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=yh.encodeFunctionData("multicall",[d,[c]]);return O({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:a?s.amountIn:"0",slippageGuard:ye(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function vh(e={}){let t=Number(e.chainId??8453);try{let n=await eu({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 Eh(){return Object.entries(De).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}ge();import{AbiCoder as z_,Interface as Ah,getAddress as Ut,isAddress as Va,keccak256 as V_}from"ethers";qe();X();var W_=z_.defaultAbiCoder(),Jn="0x0000000000000000000000000000000000000000",ct={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"}},Ih=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],ja=new Ah(["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)"]),z3=new Ah(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var G_="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function tu(e){let t=Number(e),n=ct[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ct).join(", ")})`);return{chainId:t,...n}}function za(e,t){let n=ct[Number(t)];if(!e||e===G_||e===Jn||/^eth$/i.test(String(e)))return Ut(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ut(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return Ut(n.usdc);if(!Va(r))throw new Error(`invalid token address: ${e}`);return Ut(r)}function _h({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Jn}){let i=Ut(e),a=Ut(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=o&&Va(o)?Ut(o):Jn;return V_(W_.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Th({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Jn}){let i=Ut(e),a=Ut(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&Va(o)?Ut(o):Jn},zeroForOne:l}}var Nh=["uniswap-v4","uniswapv4"];async function _r(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=tu(e.chainId??8453),a=za(e.tokenIn||"WETH",n),s=za(e.tokenOut||ct[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.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Ih],u=e.hooks||Jn,d=[],p=null;for(let h of l){let{poolKey:g,zeroForOne:w}=Th({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),x=ja.encodeFunctionData("quoteExactInputSingle",[{poolKey:g,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let y=await(t.rpcCall||q)(n,"eth_call",[{to:r,data:x},"latest"],t);if(!y||y==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let b=ja.decodeFunctionResult("quoteExactInputSingle",y),S={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:b[0].toString(),gasEstimate:b[1].toString(),poolKey:g,zeroForOne:w,poolId:_h({...g})};d.push(S),(!p||BigInt(S.amountOut)>BigInt(p.amountOut))&&(p=S)}catch(y){d.push({...h,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await Ho({chainId:n,tokenA:a,tokenB:s,dexIds:Nh},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return ie({venue:"uniswap-v4",chainId:n,chain:ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Va(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ph(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=tu(e.chainId??8453),a=za(e.tokenIn||"WETH",n),s=za(e.tokenOut||ct[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}]:[...Ih],u=e.hooks||Jn,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=Th({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),w=ja.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||q)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let y=ja.decodeFunctionResult("quoteExactOutputSingle",x),b={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:y[0].toString(),gasEstimate:y[1].toString(),poolKey:h,zeroForOne:g,poolId:_h({...h})};d.push(b),(!p||BigInt(b.amountIn)<BigInt(p.amountIn))&&(p=b)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await Ho({chainId:n,tokenA:a,tokenB:s,dexIds:Nh},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Ch(){return Object.entries(ct).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 Oh(e={}){let t=tu(e.chainId??8453),n=await q(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}}L();import{readFileSync as J_,existsSync as Z_}from"node:fs";import{getAddress as eT,Interface as Ya,TypedDataEncoder as ou,parseUnits as tT}from"ethers";var Rh="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function vt({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:$h(t)};let s;try{s=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(s.protocol!=="http:"&&s.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=s.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([$h(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return s.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:c}}if(String(process.env[Rh]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Rh}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function $h(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function lt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}X();var Y_=/^(0|[1-9][0-9]*)$/,Wa=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Zn(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(!Y_.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 X_(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function Q_(e={}){return e.maxFeePerGas!=null?Zn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Zn(e.gasPrice,"gasPrice"):null}function Ga(e={}){try{let t=X_(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Zn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=Zn(n.gasLimit??n.gas,"gasLimit"),s=Q_(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=Zn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Zn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Zn(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=a*s;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&s>c?{ok:!1,status:"BLOCK",reason:`unit fee ${s} exceeds cap ${c}`,chainId:t,unitFeeWei:s.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:s.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 nu(e={}){let t=Ga(e);if(!t.ok)throw new Wa(t);return t}var nT="https://api.opensea.io/api/v2",rT="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)",oT=new Ya([`function ${rT}`]),Ka=new Ya(["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"]),iT=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"]),aT=new Set(iT),qh=new Set(["solana","flow"]),zo="0x0000000000000000000000000000000000000000";function sT(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!Z_(e))return"";try{for(let t of J_(e,"utf8").split(`
141
- `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Xt(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||sT()}function Dh(e={}){return vt({provider:"opensea",defaultUrl:nT,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function er(e={}){return Dh(e).baseUrl}function tr(e={}){return lt({accept:"application/json"},{"x-api-key":Xt(e)},Dh(e).trusted)}function Hh(e){let t=String(e||"ethereum").trim().toLowerCase();if(!aT.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function W(e,t="address"){try{return eT(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function jh(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!qh.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return W(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 cT(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 lT(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 Lh(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 uT(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,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 zh(e={}){if(!Xt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Wo("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 Wo(e,t={}){if(!e)throw new Error("collection slug required");if(!Xt(t))throw new Error("OPENSEA_API_KEY required");return k(`${er(t)}/collections/${encodeURIComponent(e)}`,{headers:tr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Vh(e,t={}){let n=await Wo(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function Go(e={},t={}){if(!Xt(t))throw new Error("OPENSEA_API_KEY required");let n=Hh(e.chain),r=jh(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),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${er(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await k(l.toString(),{headers:tr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(uT(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Xa(e={},t={}){if(!Xt(t))throw new Error("OPENSEA_API_KEY required");let n=jh(e.address||e.owner),r=await k(`${er(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:tr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var Ko=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});function Yo(e){let t=String(e||"").trim().toLowerCase(),n=Ko[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ge(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 dT(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 Vo(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function Wh(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 Gh(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 pT(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function mT(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=W(e?.token,t);if(n===0&&r!==zo)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===zo)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function fT(e,t){let n=Ge(e?.startAmount,`${t} startAmount`),r=Ge(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 ru(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(pT);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 a of r){let s=mT(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=fT(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var hT=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"}]});function Ze(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Bh(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 Kh(e,t){return{itemType:Number(Ze(e?.itemType,`${t} itemType`)),token:W(e?.token,`${t} token`),identifierOrCriteria:Ze(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Ze(e?.startAmount,`${t} startAmount`),endAmount:Ze(e?.endAmount,`${t} endAmount`)}}function gT(e,t){return{...Kh(e,t),recipient:W(e?.recipient,`${t} recipient`)}}function yT(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:W(e.offerer,`${t} offerer`),zone:W(e.zone,`${t} zone`),offer:n.map((o,i)=>Kh(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>gT(o,`${t} consideration[${i}]`)),orderType:Number(Ze(e.orderType,`${t} orderType`)),startTime:Ze(e.startTime,`${t} startTime`),endTime:Ze(e.endTime,`${t} endTime`),zoneHash:Bh(e.zoneHash,`${t} zoneHash`),salt:Ze(e.salt,`${t} salt`),conduitKey:Bh(e.conduitKey,`${t} conduitKey`),counter:Ze(e.counter,`${t} counter`)}}function Yh(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=yT(t,n);if(ou.hashStruct("OrderComponents",hT,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Xh(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=W(e?.token,`${t} contract`),o=Vo(e?.identifierOrCriteria),i=Ge(e?.startAmount,`${t} startAmount`,{positive:!0}),a=Ge(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)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 bT(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 Xh(r[0],`${t} offer NFT`)}function wT(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=Xh(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 xT(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&W(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 ST(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 Qh(e,t,n,r){let o=Ze(t?.startTime,`${r} startTime`),i=Ze(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=Gh(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&ST(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function kT(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(Ko[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,a=bT(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;xT(e.asset,s,c,"listing");let l=Ge(e.price?.current?.value,"listing price",{positive:!0}),u=Yh(e,i,"listing"),d=ru(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:W(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:Qh(e,i,n,"listing"),counter:Ze(i?.counter,"listing counter")}}async function Qa(e={},t={}){if(!Xt(t))throw new Error("OPENSEA_API_KEY required");let n=Yo(e.chain);n.contract=e.contract?W(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(`${er(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await k(i.toString(),{headers:tr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.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:s.map(l=>kT(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Ja(e={},t={}){let n=Vo(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 a=1;a<=r;a+=1){let s=await Qa({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function vT(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||{},s=wT(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ge(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=ru(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=ru(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:Yh(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:W(e.protocol_address,"offer protocol address"),contract:s,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:Qh(e,i,r,"offer"),counter:Ze(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Za(e={},t={}){if(!Xt(t))throw new Error("OPENSEA_API_KEY required");let n=Yo(e.chain);n.contract=e.contract?W(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Vo(e.tokenId),i=await k(`${er(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:tr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return vT(a,n,o,s)}function ET(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 Jh(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"&&Jh(n))}function Zh(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function e0(e){return!e||typeof e!="object"?!1:Zh(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&e0(t))}function t0(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"&&t0(o,t,n);return t}function Mh(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function n0(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Zh(e))throw new Error("opensea: signed transaction material refused");if((e.from?W(Mh(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=W(Mh(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=oT.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").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=dT(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function es(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 iu(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=es(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(ge(),Ma)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(ge(),Ma)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function AT(e,t){if(Jh(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(e0(e))throw new Error("opensea: signed transaction material refused");let n=t0(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=>n0(r,t))}function IT(e,t,n={}){return O({...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 au(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function su(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function _T(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=W(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Xo(e={},t={}){if(!Xt(t))throw new Error("OPENSEA_API_KEY required");ET(e);let{chain:n,chainId:r}=Yo(e.chain),o=W(e.buyer||e.minter||e.address,"buyer"),i=W(e.contract,"NFT contract"),a=Wh(e.quantity),s=Ge(e.priceWei,"priceWei"),c=Ge(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Gh(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 Wo(d,t),m=_T(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await k(`${er(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:tr(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(g)?g:g?[g]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map($=>W($,"SeaDrop mint target"))),y=AT(h,{buyer:o,chainId:r,targets:x});if(y.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,S,_=null,T;try{b=Ka.decodeFunctionData("mintPublic",y[0].data),S="public",T=Ka.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Ka.decodeFunctionData("mintAllowList",y[0].data),S="allowlist";let $=b[4],H=[...b[5]].map(String);if(H.length<1||H.length>64||H.some(pe=>!/^0x[0-9a-fA-F]{64}$/.test(pe)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let U=BigInt($.startTime),J=BigInt($.endTime),ke=BigInt(Math.floor(l/1e3));if(U>ke||J<=ke)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");T=Ka.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],$,H]),_={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:U.toString(),endTime:J.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:H}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=W(b[0],"mint NFT contract"),A=W(b[1],"mint fee recipient"),v=W(b[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(v!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(T.toLowerCase()!==y[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let N=y.reduce(($,H)=>$+H.valueWei,0n);if(N!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(N>c)throw new Error("opensea: mint total exceeds total cap");let B=await iu(y,r,{...t,provider:e.provider||t.provider});if(B.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let te=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},Z=nu({chainId:r,tx:y[0],policy:te});return IT({action:"mint",mintType:S,..._?{stage:_}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:N.toString(),maxTotalWei:c.toString(),mintTarget:y[0].to,feeRecipient:A,expiry:u,transactions:y.map(es),gasWar:Z,...B},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Kn,Date.parse(u),_?Number(BigInt(_.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function TT(e={}){let t=Hh(e.chain);if(qh.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Lh(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Lh(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:W(e.contract,"NFT contract"),token_id:o,quantity:lT(e.quantity??1,"quantity"),price:{amount:cT(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:W(e.price?.currency??e.currency??zo,"price currency")},start_time:n.text,end_time:r.text}}var Tr={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"}]},Fh=new Ya(["function setApprovalForAll(address operator,bool approved)"]),NT=new Ya(["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 Uh(e,t){return e?.[t]||(e?.action===t?e:null)}function PT(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(y=>Uh(y,"createListingsAction")).find(Boolean)||o.find(y=>/createListings/i.test(String(y?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=W(c.verifyingContract,"listing protocol"),u=s.message;if(W(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(W(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 y of u.consideration){if(Number(y.itemType)!==0||W(y.token,"listing payment token")!==zo)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(y.startAmount),S=BigInt(y.endAmount);if(b<=0n||b!==S)throw new Error("opensea: listing consideration must be fixed and positive");W(y.recipient,"listing consideration recipient"),p+=b}let m=tT(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=ou.hashStruct("OrderComponents",Tr,u),w=o.map(y=>Uh(y,"itemApprovalAction")).find(Boolean)||o.find(y=>/setApprovalForAll/i.test(String(y?.action||""))),x=null;if(w){let y=w.transaction||w.itemApprovalAction?.transaction,b=n0(y,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=Fh.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let _=W(S[0],"listing approval operator");if(S[1]!==!0||b.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Fh.encodeFunctionData("setApprovalForAll",[_,!0]).toLowerCase()!==b.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...b,operator:_}}return{protocolAddress:l,typedData:{domain:c,types:Tr,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Qo(e={},t={}){if(!Xt(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=W(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(TT);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=W(e.taker,"taker"));let c=await k(`${er(t)}/listings/actions`,{method:"POST",headers:tr(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Yo(o[0].chain),u=PT(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await iu(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return O({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(es),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"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 cu(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Yo(e.chain),o=W(e.seller||e.address||e.owner,"seller"),i=W(e.protocolAddress,"reviewed Seaport protocol address"),a=W(e.contract,"NFT contract"),s=Vo(e.tokenId),c=Wh(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,A]of Object.entries(Tr)){let v=l.types?.[E];if(!Array.isArray(v)||v.length!==A.length||v.some((N,B)=>N?.name!==A[B].name||N?.type!==A[B].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Tr).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=W(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(W(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(W(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Vo(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=Ge(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ge(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||W(E.token,"cancellation payment token")!==zo)throw new Error("opensea: cancellation requires native fixed-price consideration");let A=Ge(E.startAmount,"cancellation consideration startAmount",{positive:!0}),v=Ge(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(A!==v)throw new Error("opensea: cancellation consideration must be fixed and positive");W(E.recipient,"cancellation consideration recipient")}let w=Ge(m.startTime,"cancellation startTime");if(Ge(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let y=ou.hashStruct("OrderComponents",Tr,m),b=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(b)||b!==y.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let S=NT.encodeFunctionData("cancel",[[m]]),_=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],T=await iu(_,r,{...t,provider:e.provider||t.provider});if(T.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return O({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:y,typedData:{domain:d,types:Tr,primaryType:"OrderComponents",message:m},transactions:_.map(es),...T,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}ge();var Nr=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),K=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),OT=/^0x[0-9a-fA-F]{40}$/;function r0(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 a=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${a} must be an object`);continue}OT.test(i.address||"")||t.push(`${a}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${a}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${a}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${a}.verified.method is required`),i.verified.source||t.push(`${a}.verified.source is required`),i.verified.date||n.push(`${a}.verified.date missing -- add one so staleness is visible`)):t.push(`${a} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))Nr.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 o0(e){let{ok:t,errors:n,warnings:r}=r0(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
140
+ `)];return{family:"bitcoin",network:n,projectName:t,protocolModel:mc["bitcoin-tapscript-vault"].protocolModel,policy:{descriptorType:"tr",miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey,threshold:o,signerCount:r.length,recoveryDelayBlocks:a.toString()},authorityReport:{cooperativeSigners:r,threshold:o,recoveryPubkey:i,recoveryDelayBlocks:a.toString()},files:g,gate:{sourceChecks:{ok:o<=r.length&&a>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:pp},psbtPrepared:!1,fundingPrepared:!1}}function zi(){return Object.values(mc).map(e=>({...e,disclaimer:pp}))}async function Vi(e={}){let t=String(e.templateId||"").trim(),n=mc[t];n||yt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?f$(e):h$(e),o=m$(r.files);return O({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 pp,hx,mc,fp=be(()=>{X();pp="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",hx="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",mc=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})})});var AA={};Oa(AA,{CONTRACTS_EVAL_HERE:()=>KU,runContractsEval:()=>GU});import Wc from"node:fs";import Fn from"node:path";import{spawnSync as $U}from"node:child_process";import{fileURLToPath as LU}from"node:url";function jU(){let e=process.env.HOME||"";for(let t of["forge",Fn.join(e,".foundry/bin/forge")])if($U(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function EA(e,t=[]){if(!Wc.existsSync(e))return t;for(let n of Wc.readdirSync(e)){let r=Fn.join(e,n);if(Wc.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;EA(r,t)}else n.endsWith(".sol")&&!r.includes(`${Fn.sep}lib${Fn.sep}`)&&t.push(r)}return t}function zU(){let e=[];for(let t of Object.keys(dr)){let n=Fn.join(BU,t),r=EA(Fn.join(n,"src")),o=[];for(let i of r){let a=Wc.readFileSync(i,"utf8");for(let s of MU)s.test(a)&&o.push(`${Fn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function VU(){return jU()?Object.keys(dr).map(e=>{try{let t=Hi(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(dr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function WU(){let e=[],t=zi();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 Vi({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:FU,programId:UU,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 Vi({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[qU,DU],recoveryPubkey:HU,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 GU(){let e=zU(),t=VU(),n=await WU(),r=[...e,...t,...n],o=r.filter(a=>a.ok!==!0&&a.skipped!==!0).length,i=r.filter(a=>a.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 BU,MU,FU,UU,qU,DU,HU,KU,IA=be(()=>{sc();dc();fp();ic();BU=co("protocols/templates",import.meta.url),MU=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],FU="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",UU="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",qU="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",DU="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",HU="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";KU=Fn.dirname(LU(import.meta.url))});X();ge();import{Interface as bh,getAddress as zo,isAddress as U_}from"ethers";L();var E_="https://api.dexscreener.com",A_=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),vt=e=>String(e??"").toLowerCase(),I_=e=>Array.isArray(e)?e:e==null?[]:[e];function __(e,t,n){let r=vt(t),o=vt(n),i=vt(e?.baseToken?.address),a=vt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function T_(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ua(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||E_).replace(/\/$/,"")}async function ch(e={}){let n=(await k(`${Ua(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={}){if(!e)throw new Error("tokenAddress required");return k(`${Ua(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ho(e,t={}){if(!e)throw new Error("query required");return k(`${Ua(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lh(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return k(`${Ua(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function jo({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=vt(A_[Number(e)]||e),a=new Set(I_(r).filter(Boolean).map(vt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.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=`${vt(m?.chainId)}:${vt(m?.dexId)}:${vt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>vt(p?.chainId)===i).filter(p=>__(p,t,n)).filter(p=>!a.size||a.has(vt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:T_(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)[0]??null}qe();X();var De={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"}},q_=[100,500,3e3,1e4],ja=new bh(["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)"]),yh=new bh(["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)"]),wh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",xh="0x0000000000000000000000000000000000000000",Jl=[100,500,2500,1e4],D_={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Jl}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Jl}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Jl}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function eu(e,t){let n=Number(e),r=De[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(De).join(", ")})`);let o=D_[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 a=o,s=a[i];if(!s){let c=[...r.quoter&&r.router?[r.name]:[],...Object.keys(a)].join(", ");throw new Error(`uniswap-v3: unknown venue "${t}" on chain ${n} (known: ${c})`)}return{chainId:n,venue:i,...r,quoter:s.quoter,router:s.router,feeTiers:s.feeTiers||null}}function Zl(e,t){let n=De[Number(t)];if(!e||e===wh||e===xh||/^eth$/i.test(String(e)))return zo(n.weth);let r=String(e);if(/^weth$/i.test(r))return zo(n.weth);if(/^usdc$/i.test(r))return zo(n.usdc);if(!U_(r))throw new Error(`invalid token address: ${e}`);return zo(r)}function H_(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 j_(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 mn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=eu(e.chainId??8453,e.venue),a=Zl(e.tokenIn||"WETH",n),s=Zl(e.tokenOut||De[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:q_,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let h of u){let g=ja.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:h,sqrtPriceLimitX96:0n}]);try{let w=await q(n,"eth_call",[{to:r,data:g},"latest"],t);if(!w||w==="0x"){d.push({fee:h,ok:!1,error:"empty result"});continue}let x=ja.decodeFunctionResult("quoteExactInputSingle",w),y={fee:h,ok:!0,amountOut:x[0].toString(),sqrtPriceX96After:x[1].toString(),initializedTicksCrossed:Number(x[2]),gasEstimate:x[3].toString()};d.push(y),(!p||BigInt(y.amountOut)>BigInt(p.amountOut))&&(p=y)}catch(w){d.push({fee:h,ok:!1,error:String(w.message||w).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await jo({chainId:n,tokenA:a,tokenB:s,dexIds:H_(e.venue)},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return ie({venue:"uniswap-v3",chainId:n,chain:De[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sh(e={},t={}){let{chainId:n,quoter:r,router:o}=eu(e.chainId??8453),i=(e.tokens||[]).map(p=>Zl(p,n)),a=(e.fees||[]).map(Number);if(i.length<2)throw new Error("tokens[] need at least 2 addresses");let s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required");let c=j_(i,a),l=ja.encodeFunctionData("quoteExactInput",[c,s]),u=await q(n,"eth_call",[{to:r,data:l},"latest"],t),d=ja.decodeFunctionResult("quoteExactInput",u);return ie({venue:"uniswap-v3",chainId:n,chain:De[n].name,quoter:r,tokens:i,fees:a,path:c,amountIn:s.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 tu(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await mn({chainId:n,tokenIn:De[n].weth,tokenOut:De[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function kh(e={},t={}){let n=Number(e.chainId??8453),r=eu(n,e.venue),o=zo(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===wh||i===xh||/^eth$/i.test(i),s=await mn(e,t),c=yh.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,fee:s.fee,recipient:o,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.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=yh.encodeFunctionData("multicall",[d,[c]]);return O({provider:"uniswap-v3",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:d,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:p,value:a?s.amountIn:"0",slippageGuard:ye(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function vh(e={}){let t=Number(e.chainId??8453);try{let n=await tu({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 Eh(){return Object.entries(De).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}ge();import{AbiCoder as V_,Interface as Ah,getAddress as qt,isAddress as Wa,keccak256 as W_}from"ethers";qe();X();var G_=V_.defaultAbiCoder(),Zn="0x0000000000000000000000000000000000000000",ct={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"}},Ih=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],za=new Ah(["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)"]),V3=new Ah(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]);var K_="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function nu(e){let t=Number(e),n=ct[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ct).join(", ")})`);return{chainId:t,...n}}function Va(e,t){let n=ct[Number(t)];if(!e||e===K_||e===Zn||/^eth$/i.test(String(e)))return qt(n.weth);let r=String(e);if(/^weth$/i.test(r))return qt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return qt(n.usdc);if(!Wa(r))throw new Error(`invalid token address: ${e}`);return qt(r)}function _h({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Zn}){let i=qt(e),a=qt(t);if(i.toLowerCase()===a.toLowerCase())throw new Error("poolKey currencies must differ");let[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=o&&Wa(o)?qt(o):Zn;return W_(G_.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Th({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Zn}){let i=qt(e),a=qt(t),[s,c]=i.toLowerCase()<a.toLowerCase()?[i,a]:[a,i],l=i.toLowerCase()===s.toLowerCase();return{poolKey:{currency0:s,currency1:c,fee:Number(n),tickSpacing:Number(r),hooks:o&&Wa(o)?qt(o):Zn},zeroForOne:l}}var Ph=["uniswap-v4","uniswapv4"];async function Tr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=nu(e.chainId??8453),a=Va(e.tokenIn||"WETH",n),s=Va(e.tokenOut||ct[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.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Ih],u=e.hooks||Zn,d=[],p=null;for(let h of l){let{poolKey:g,zeroForOne:w}=Th({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),x=za.encodeFunctionData("quoteExactInputSingle",[{poolKey:g,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let y=await(t.rpcCall||q)(n,"eth_call",[{to:r,data:x},"latest"],t);if(!y||y==="0x"){d.push({...h,ok:!1,error:"empty result"});continue}let b=za.decodeFunctionResult("quoteExactInputSingle",y),S={fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountOut:b[0].toString(),gasEstimate:b[1].toString(),poolKey:g,zeroForOne:w,poolId:_h({...g})};d.push(S),(!p||BigInt(S.amountOut)>BigInt(p.amountOut))&&(p=S)}catch(y){d.push({...h,ok:!1,error:String(y.message||y).slice(0,160)})}}if(!p){let h=d.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${h}`)}let m=e.liquidityUsd==null?await jo({chainId:n,tokenA:a,tokenB:s,dexIds:Ph},t).catch(()=>null):null,f=e.liquidityUsd??m?.liquidityUsd??null;return ie({venue:"uniswap-v4",chainId:n,chain:ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:f,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Wa(e.recipient)&&e.slippageBps!=null},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:f,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Nh(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=nu(e.chainId??8453),a=Va(e.tokenIn||"WETH",n),s=Va(e.tokenOut||ct[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}]:[...Ih],u=e.hooks||Zn,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=Th({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),w=za.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||q)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let y=za.decodeFunctionResult("quoteExactOutputSingle",x),b={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:y[0].toString(),gasEstimate:y[1].toString(),poolKey:h,zeroForOne:g,poolId:_h({...h})};d.push(b),(!p||BigInt(b.amountIn)<BigInt(p.amountIn))&&(p=b)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await jo({chainId:n,tokenA:a,tokenB:s,dexIds:Ph},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ct[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Ch(){return Object.entries(ct).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 Oh(e={}){let t=nu(e.chainId??8453),n=await q(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}}L();import{readFileSync as Z_,existsSync as eT}from"node:fs";import{getAddress as tT,Interface as Xa,TypedDataEncoder as iu,parseUnits as nT}from"ethers";var Rh="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Et({provider:e,defaultUrl:t,hosts:n=[],url:r,strict:o=!1}){let a=(String(r??"").trim()||String(t)).replace(/\/$/,"");if(a===String(t).replace(/\/$/,""))return{baseUrl:a,trusted:!0,host:$h(t)};let s;try{s=new URL(a)}catch{throw new Error(`${e}: baseUrl must be an absolute http(s) URL`)}if(s.protocol!=="http:"&&s.protocol!=="https:")throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);let c=s.host;if(!c)throw new Error(`${e}: baseUrl must be an absolute http(s) URL`);if(new Set([$h(t),...n]).has(c)){let u=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(c);return s.protocol==="http:"&&!u?{baseUrl:a,trusted:!1,host:c,reason:"plaintext http downgrade"}:{baseUrl:a,trusted:!0,host:c}}if(String(process.env[Rh]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Rh}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function $h(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function lt(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}X();var X_=/^(0|[1-9][0-9]*)$/,Ga=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function er(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(!X_.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 Q_(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function J_(e={}){return e.maxFeePerGas!=null?er(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?er(e.gasPrice,"gasPrice"):null}function Ka(e={}){try{let t=Q_(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=er(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=er(n.gasLimit??n.gas,"gasLimit"),s=J_(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=er(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=er(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:er(n.maxPriorityFeePerGas,"maxPriorityFeePerGas"),d=a*s;return d>i?{ok:!1,status:"BLOCK",reason:`total gas ${d} exceeds cap ${i}`,chainId:t,totalGasWei:d.toString(),maxTotalGasWei:i.toString()}:c!=null&&s>c?{ok:!1,status:"BLOCK",reason:`unit fee ${s} exceeds cap ${c}`,chainId:t,unitFeeWei:s.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:s.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 ru(e={}){let t=Ka(e);if(!t.ok)throw new Ga(t);return t}var rT="https://api.opensea.io/api/v2",oT="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)",iT=new Xa([`function ${oT}`]),Ya=new Xa(["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"]),aT=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"]),sT=new Set(aT),qh=new Set(["solana","flow"]),Vo="0x0000000000000000000000000000000000000000";function cT(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!eT(e))return"";try{for(let t of Z_(e,"utf8").split(`
141
+ `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Qt(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||cT()}function Dh(e={}){return Et({provider:"opensea",defaultUrl:rT,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function tr(e={}){return Dh(e).baseUrl}function nr(e={}){return lt({accept:"application/json"},{"x-api-key":Qt(e)},Dh(e).trusted)}function Hh(e){let t=String(e||"ethereum").trim().toLowerCase();if(!sT.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function W(e,t="address"){try{return tT(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function jh(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!qh.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return W(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 lT(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 uT(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 Lh(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 dT(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,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 zh(e={}){if(!Qt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await Go("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 Go(e,t={}){if(!e)throw new Error("collection slug required");if(!Qt(t))throw new Error("OPENSEA_API_KEY required");return k(`${tr(t)}/collections/${encodeURIComponent(e)}`,{headers:nr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Vh(e,t={}){let n=await Go(e,t),r=n.stats||n.total||{},o=n.floor_price??n.floorPrice??r.floor_price??r.floorPrice??null;return{slug:n.collection||e,name:n.name||null,floor:o,totalSupply:n.total_supply??r.total_supply??null,numOwners:n.num_owners??r.num_owners??null,raw:{contracts:n.contracts,fees:n.fees,category:n.category}}}async function Ko(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=Hh(e.chain),r=jh(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),a=[],s=e.next?String(e.next):null,c=0;do{let l=new URL(`${tr(t)}/chain/${encodeURIComponent(n)}/account/${encodeURIComponent(r)}/nfts`);l.searchParams.set("limit",String(o)),e.collection&&l.searchParams.set("collection",String(e.collection)),s&&l.searchParams.set("next",s);let u=await k(l.toString(),{headers:nr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(dT(d,n,r));s=u?.next?String(u.next):null,c+=1}while(s&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:n,owner:r,count:a.length,pages:c,complete:!s,next:s,nfts:a,exec:!1,readOnly:!0}}async function Qa(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=jh(e.address||e.owner),r=await k(`${tr(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:nr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:n,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:r?.realized_pnl_usd??null,unrealizedPnlUsd:r?.unrealized_pnl_usd??null,totalPnlUsd:r?.total_pnl_usd??null,netInvestedUsd:r?.net_invested_usd??null,currentValueUsd:r?.current_value_usd??null,returnPercentage:r?.return_percentage??null,itemLevelPnlAvailable:!1,raw:r,exec:!1,readOnly:!0}}var Yo=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});function Xo(e){let t=String(e||"").trim().toLowerCase(),n=Yo[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function Ge(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 pT(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 Wo(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function Wh(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 Gh(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 mT(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function fT(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=W(e?.token,t);if(n===0&&r!==Vo)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Vo)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function hT(e,t){let n=Ge(e?.startAmount,`${t} startAmount`),r=Ge(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 ou(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(mT);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 a of r){let s=fT(a,`${t} payment token`);if(o==null)o=s;else if(s!==o)throw new Error(`opensea: ${t} mixes more than one payment token`);i+=hT(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var gT=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"}]});function Ze(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Bh(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 Kh(e,t){return{itemType:Number(Ze(e?.itemType,`${t} itemType`)),token:W(e?.token,`${t} token`),identifierOrCriteria:Ze(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Ze(e?.startAmount,`${t} startAmount`),endAmount:Ze(e?.endAmount,`${t} endAmount`)}}function yT(e,t){return{...Kh(e,t),recipient:W(e?.recipient,`${t} recipient`)}}function bT(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:W(e.offerer,`${t} offerer`),zone:W(e.zone,`${t} zone`),offer:n.map((o,i)=>Kh(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>yT(o,`${t} consideration[${i}]`)),orderType:Number(Ze(e.orderType,`${t} orderType`)),startTime:Ze(e.startTime,`${t} startTime`),endTime:Ze(e.endTime,`${t} endTime`),zoneHash:Bh(e.zoneHash,`${t} zoneHash`),salt:Ze(e.salt,`${t} salt`),conduitKey:Bh(e.conduitKey,`${t} conduitKey`),counter:Ze(e.counter,`${t} counter`)}}function Yh(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=bT(t,n);if(iu.hashStruct("OrderComponents",gT,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Xh(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=W(e?.token,`${t} contract`),o=Wo(e?.identifierOrCriteria),i=Ge(e?.startAmount,`${t} startAmount`,{positive:!0}),a=Ge(e?.endAmount??e?.startAmount,`${t} endAmount`,{positive:!0});if(i!==a)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 wT(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 Xh(r[0],`${t} offer NFT`)}function xT(e,t,n){let r=Array.isArray(e?.consideration)?e.consideration:[];if(r.some(a=>[4,5].includes(Number(a?.itemType))))throw new Error(`opensea: ${n} uses a criteria consideration item, not a fixed token`);let o=r.filter(a=>[2,3].includes(Number(a?.itemType)));if(o.length!==1)throw new Error(`opensea: ${n} must require exactly one fixed ERC-721 or ERC-1155 consideration item`);let i=Xh(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 ST(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&W(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 kT(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 Qh(e,t,n,r){let o=Ze(t?.startTime,`${r} startTime`),i=Ze(t?.endTime,`${r} endTime`),a=BigInt(Math.floor(n/1e3));if(BigInt(o)>a)throw new Error(`opensea: ${r} canonical startTime is in the future`);if(BigInt(i)<=a)throw new Error(`opensea: ${r} canonical endTime is expired or stale`);let s=Gh(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&kT(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function vT(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(Yo[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,a=wT(i,"listing"),s=a.contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned a listing for the wrong contract");let c=a.tokenId;ST(e.asset,s,c,"listing");let l=Ge(e.price?.current?.value,"listing price",{positive:!0}),u=Yh(e,i,"listing"),d=ou(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:W(e.protocol_address,"listing protocol address"),contract:s,tokenId:c,quantity:a.quantity,priceWei:l.toString(),paymentToken:d.paymentToken,currency:String(e.price?.current?.currency||"").trim()||null,decimals:Number(e.price?.current?.decimals??18),expiry:Qh(e,i,n,"listing"),counter:Ze(i?.counter,"listing counter")}}async function Ja(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=Xo(e.chain);n.contract=e.contract?W(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(`${tr(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await k(i.toString(),{headers:nr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),s=Array.isArray(a?.listings)?a.listings:[];if(!s.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:s.map(l=>vT(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Za(e={},t={}){let n=Wo(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 a=1;a<=r;a+=1){let s=await Ja({...e,tokenId:void 0,limit:50,next:o},t),c=s.listings.find(l=>l.tokenId===n);if(c)return{provider:"opensea-nft",source:"opensea-best-exact-listing",...c,pagesScanned:a,exact:!0,exec:!1,readOnly:!0};if(!s.next||i.has(s.next))break;i.add(s.next),o=s.next}throw new Error("opensea: no active exact NFT listing returned within page bound")}function ET(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||{},s=xT(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=Ge(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=ou(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=ou(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:Yh(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:W(e.protocol_address,"offer protocol address"),contract:s,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:Qh(e,i,r,"offer"),counter:Ze(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function es(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");let n=Xo(e.chain);n.contract=e.contract?W(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Wo(e.tokenId),i=await k(`${tr(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:nr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.offer||(Array.isArray(i?.offers)?i.offers[0]:i);if(!a)throw new Error("opensea: no active exact NFT offer returned");let s=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now();return ET(a,n,o,s)}function AT(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 Jh(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"&&Jh(n))}function Zh(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function e0(e){return!e||typeof e!="object"?!1:Zh(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&e0(t))}function t0(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"&&t0(o,t,n);return t}function Mh(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function n0(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Zh(e))throw new Error("opensea: signed transaction material refused");if((e.from?W(Mh(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=W(Mh(e.to??e.target),"transaction target");if(!r.has(i))throw new Error("opensea: OpenSea returned a transaction for the wrong target");let a=e.data??e.calldata,s=e.input_data&&typeof e.input_data=="object"?e.input_data:e.input&&typeof e.input=="object"?e.input:null;if(a==null&&s){if(!String(e.function||"").replace(/^function\s+/,"").startsWith("fulfillAdvancedOrder("))throw new Error("opensea: only exact Seaport fulfillAdvancedOrder preparation is accepted");a=iT.encodeFunctionData("fulfillAdvancedOrder",[s.advancedOrder,s.criteriaResolvers,s.fulfillerConduitKey,s.recipient])}let c=String(a??"").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=pT(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function ts(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 au(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=ts(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(ge(),Fa)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(ge(),Fa)),l={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},u=BigInt(await c(t,"eth_gasPrice",[],l));try{s=BigInt(await c(t,"eth_maxPriorityFeePerGas",[],l))}catch{s=0n}let d=await c(t,"eth_getBlockByNumber",["pending",!1],l),m=(d?.baseFeePerGas==null?0n:BigInt(d.baseFeePerGas))*2n+s;a=u>m?u:m}return a!=null&&s!=null&&e.forEach((c,l)=>{let d=(BigInt(i[l])*120n+99n)/100n;c.gasLimit=d.toString(),c.maxPriorityFeePerGas=s.toString(),c.maxFeePerGas=a.toString(),c.worstCaseFeeWei=(d*a).toString()}),{simulated:!0,gasEstimates:i}}function IT(e,t){if(Jh(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(e0(e))throw new Error("opensea: signed transaction material refused");let n=t0(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=>n0(r,t))}function _T(e,t,n={}){return O({...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 su(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function cu(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function TT(e,t,n){let o=(Array.isArray(e?.contracts)?e.contracts:[]).find(a=>String(a?.chain||t).toLowerCase()===t&&a?.address);if(!o)throw new Error("opensea: collection response contains no contract for requested chain");let i=W(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Qo(e={},t={}){if(!Qt(t))throw new Error("OPENSEA_API_KEY required");AT(e);let{chain:n,chainId:r}=Xo(e.chain),o=W(e.buyer||e.minter||e.address,"buyer"),i=W(e.contract,"NFT contract"),a=Wh(e.quantity),s=Ge(e.priceWei,"priceWei"),c=Ge(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Gh(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 Go(d,t),m=TT(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await k(`${tr(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:nr(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),g=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(g)?g:g?[g]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map($=>W($,"SeaDrop mint target"))),y=IT(h,{buyer:o,chainId:r,targets:x});if(y.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,S,I=null,T;try{b=Ya.decodeFunctionData("mintPublic",y[0].data),S="public",T=Ya.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Ya.decodeFunctionData("mintAllowList",y[0].data),S="allowlist";let $=b[4],H=[...b[5]].map(String);if(H.length<1||H.length>64||H.some(pe=>!/^0x[0-9a-fA-F]{64}$/.test(pe)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let U=BigInt($.startTime),J=BigInt($.endTime),ke=BigInt(Math.floor(l/1e3));if(U>ke||J<=ke)throw new Error("opensea: allowlist mint stage is not open");if(BigInt($.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt($.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");T=Ya.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],$,H]),I={mintPrice:BigInt($.mintPrice).toString(),maxTotalMintableByWallet:BigInt($.maxTotalMintableByWallet).toString(),startTime:U.toString(),endTime:J.toString(),dropStageIndex:BigInt($.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt($.maxTokenSupplyForStage).toString(),feeBps:Number($.feeBps),restrictFeeRecipients:!!$.restrictFeeRecipients,proof:H}}catch($){throw/opensea:/.test(String($?.message||""))?$:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=W(b[0],"mint NFT contract"),A=W(b[1],"mint fee recipient"),v=W(b[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(v!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(T.toLowerCase()!==y[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let P=y.reduce(($,H)=>$+H.valueWei,0n);if(P!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(P>c)throw new Error("opensea: mint total exceeds total cap");let B=await au(y,r,{...t,provider:e.provider||t.provider});if(B.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let te=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},Z=ru({chainId:r,tx:y[0],policy:te});return _T({action:"mint",mintType:S,...I?{stage:I}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:P.toString(),maxTotalWei:c.toString(),mintTarget:y[0].to,feeRecipient:A,expiry:u,transactions:y.map(ts),gasWar:Z,...B},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Yn,Date.parse(u),I?Number(BigInt(I.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function PT(e={}){let t=Hh(e.chain);if(qh.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Lh(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Lh(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:W(e.contract,"NFT contract"),token_id:o,quantity:uT(e.quantity??1,"quantity"),price:{amount:lT(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:W(e.price?.currency??e.currency??Vo,"price currency")},start_time:n.text,end_time:r.text}}var Pr={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"}]},Fh=new Xa(["function setApprovalForAll(address operator,bool approved)"]),NT=new Xa(["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 Uh(e,t){return e?.[t]||(e?.action===t?e:null)}function CT(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(y=>Uh(y,"createListingsAction")).find(Boolean)||o.find(y=>/createListings/i.test(String(y?.action||""))),a=i?.signatureRequest?.message??i?.typedData,s;try{s=typeof a=="string"?JSON.parse(a):a}catch{throw new Error("opensea: invalid listing typed-data JSON")}if(!s||s.primaryType!=="OrderComponents"||!s.domain||!s.message)throw new Error("opensea: exact Seaport OrderComponents action required");let c=s.domain;if(c.name!=="Seaport"||c.version!=="1.6"||Number(c.chainId)!==r)throw new Error("opensea: listing domain mismatch");let l=W(c.verifyingContract,"listing protocol"),u=s.message;if(W(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(W(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 y of u.consideration){if(Number(y.itemType)!==0||W(y.token,"listing payment token")!==Vo)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(y.startAmount),S=BigInt(y.endAmount);if(b<=0n||b!==S)throw new Error("opensea: listing consideration must be fixed and positive");W(y.recipient,"listing consideration recipient"),p+=b}let m=nT(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=iu.hashStruct("OrderComponents",Pr,u),w=o.map(y=>Uh(y,"itemApprovalAction")).find(Boolean)||o.find(y=>/setApprovalForAll/i.test(String(y?.action||""))),x=null;if(w){let y=w.transaction||w.itemApprovalAction?.transaction,b=n0(y,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=Fh.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let I=W(S[0],"listing approval operator");if(S[1]!==!0||b.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(Fh.encodeFunctionData("setApprovalForAll",[I,!0]).toLowerCase()!==b.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...b,operator:I}}return{protocolAddress:l,typedData:{domain:c,types:Pr,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Jo(e={},t={}){if(!Qt(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=W(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(PT);if(new Set(o.map(m=>m.chain)).size!==1)throw new Error("opensea: all prepared listing items must be on one chain");let a=e.useCreatorFee!==!1,s={address:n,items:o,use_creator_fee:a};e.taker&&(s.taker=W(e.taker,"taker"));let c=await k(`${tr(t)}/listings/actions`,{method:"POST",headers:nr(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Xo(o[0].chain),u=CT(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await au(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return O({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(ts),useCreatorFee:a,taker:s.taker||null,feeDisclosure:a?"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 lu(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Xo(e.chain),o=W(e.seller||e.address||e.owner,"seller"),i=W(e.protocolAddress,"reviewed Seaport protocol address"),a=W(e.contract,"NFT contract"),s=Wo(e.tokenId),c=Wh(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,A]of Object.entries(Pr)){let v=l.types?.[E];if(!Array.isArray(v)||v.length!==A.length||v.some((P,B)=>P?.name!==A[B].name||P?.type!==A[B].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(Pr).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=W(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(W(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(W(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Wo(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=Ge(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=Ge(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||W(E.token,"cancellation payment token")!==Vo)throw new Error("opensea: cancellation requires native fixed-price consideration");let A=Ge(E.startAmount,"cancellation consideration startAmount",{positive:!0}),v=Ge(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(A!==v)throw new Error("opensea: cancellation consideration must be fixed and positive");W(E.recipient,"cancellation consideration recipient")}let w=Ge(m.startTime,"cancellation startTime");if(Ge(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let y=iu.hashStruct("OrderComponents",Pr,m),b=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(b)||b!==y.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let S=NT.encodeFunctionData("cancel",[[m]]),I=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],T=await au(I,r,{...t,provider:e.provider||t.provider});if(T.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return O({provider:"opensea-nft",marketplace:"opensea",kind:"nft-cancel",action:"cancel-listing",prepareReady:!0,chain:n,chainId:r,seller:o,contract:a,tokenId:s,quantity:c,protocolAddress:p,orderHash:y,typedData:{domain:d,types:Pr,primaryType:"OrderComponents",message:m},transactions:I.map(ts),...T,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}ge();var Nr=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),K=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),RT=/^0x[0-9a-fA-F]{40}$/;function r0(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 a=`venues[${o}]`;if(!i||typeof i!="object"){t.push(`${a} must be an object`);continue}RT.test(i.address||"")||t.push(`${a}.address is not a valid 20-byte address`),/^0x0{40}$/.test(i.address||"")&&t.push(`${a}.address is the zero address -- placeholder left in place?`),i.kind||t.push(`${a}.kind is required (router|quoter|factory|...)`),i.verified?(i.verified.method||t.push(`${a}.verified.method is required`),i.verified.source||t.push(`${a}.verified.source is required`),i.verified.date||n.push(`${a}.verified.date missing -- add one so staleness is visible`)):t.push(`${a} must record verification: { verified: { method, source, date } }. An unverified venue stays blocked.`)}let r=e.capabilities||{};for(let o of Object.keys(r))Nr.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 o0(e){let{ok:t,errors:n,warnings:r}=r0(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
142
142
  - ${n.join(`
143
- - `)}`);let o=e.capabilities||{},i=Nr.filter(s=>typeof o[s]=="function"),a={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(s=>({...s})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Nr.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Nr)i.includes(s)?a[s]=async(...c)=>o[s](...c,{scanner:a}):a[s]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${s}". 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(a)}var Jo=new Map;function ts(e){let t=o0(e);return Jo.set(t.chainId,t),t}function lu(e){return Jo.get(Number(e))||null}function uu(){return[...Jo.values()]}function RT(){let e={};for(let t of Jo.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:Jo.size,capabilities:[...Nr],chains:e}}ge();var pu={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ut=e=>BigInt(e).toString(16).padStart(64,"0"),Zo=e=>e.slice(2).toLowerCase().padStart(64,"0");function $T(e,t){return`0x${pu.getAmountsOut}`+ut(e)+ut(64)+ut(t.length)+t.map(Zo).join("")}function LT(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 du(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var mu=100;function BT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>mu)throw new Error(`slippageBps ${n} exceeds the ${mu} 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 i0(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await q(t,"eth_call",[{to:o,data:$T(i,a)},"latest"],s);return LT(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=du(c.scanner);if(!l)return{chainId:t,evidence:K.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=s||[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,a,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(a),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:K.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:K.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:a},s={}){let c=du(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:K.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:z.UNKNOWN,evidence:K.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],s);if(!u)return{chainId:t,token:o,verdict:z.FAIL,evidence:K.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:z.FAIL,evidence:K.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],s);if(!p)return{chainId:t,token:o,verdict:z.FAIL,evidence:K.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=z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.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:K.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:a,recipient:s,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=du(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(s||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:a,path:f},d);if(h.evidence!==K.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=BT(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(l)),x=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,y=x?`0x${pu.swapExactETHForTokens}`+ut(g)+ut(128)+Zo(s)+ut(w)+ut(f.length)+f.map(Zo).join(""):`0x${pu.swapExactTokensForTokens}`+ut(a)+ut(g)+ut(160)+Zo(s)+ut(w)+ut(f.length)+f.map(Zo).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:y,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:mu,deadline:w.toString()},requires:x?[]:[{step:"approve",token:f[0],spender:m,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."}}}}ge();var MT=[100,500,3e3,1e4],a0={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},nr=e=>BigInt(e).toString(16).padStart(64,"0"),ei=e=>e.slice(2).toLowerCase().padStart(64,"0"),s0=/^0x[0-9a-fA-F]{40}$/,hu=100;function FT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>hu)throw new Error(`slippageBps ${n} exceeds the ${hu} 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 fu(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function c0(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${a0.quoteExactInputSingle}`+ei(a)+ei(s)+nr(c)+nr(l)+nr(0),p=await q(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:a,tokenOut:s,amountIn:c},l){let u=[],d=null;for(let p of MT){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=fu(c.scanner,"quoter");if(!l)return{chainId:t,evidence:K.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,a])if(!s0.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:a,amountIn:s},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:a,amountIn:String(s),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:K.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:a,triedFeeTiers:d,evidence:K.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:a,base:s},c={}){let l=fu(c.scanner,"quoter"),u=s||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:K.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||!u)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:K.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:a},c);if(!d.best)return{chainId:t,token:i,verdict:z.FAIL,evidence:K.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:z.FAIL,evidence:K.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p.best.amountOut,f=Number(m*10000n/BigInt(a)),h=z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:g,amountIn:String(a),bought:d.best.amountOut.toString(),returned:m.toString(),retentionBps:f,buyFee:d.best.fee,sellFee:p.best.fee,evidence:K.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:a,amountIn:s,recipient:c,slippageBps:l=50,fee:u},d={}){let p=fu(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(!s0.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:a,amountIn:s},d);if(m.evidence!==K.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=FT(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(),w=`0x${a0.exactInputSingle}`+ei(i)+ei(a)+nr(f)+ei(c)+nr(s)+nr(h)+nr(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:g?String(s):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:hu,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,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 ns={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function l0(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function u0(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 UT(e){let{chainId:t}=e;async function n(r,o,i){return q(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Fo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:K.LIVE}},async nativeBalance(r,o={}){let i=await Xn(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:K.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await Uo({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:K.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:K.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,a,s,c]=await Promise.all([n(r,ns.decimals,o).catch(()=>null),n(r,ns.symbol,o).catch(()=>null),n(r,ns.name,o).catch(()=>null),n(r,ns.totalSupply,o).catch(()=>null)]),l=l0(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:u0(a?.result??a),name:u0(s?.result??s),totalSupply:(l0(c?.result??c)??null)?.toString()??null,evidence:u?K.LIVE:K.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:K.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await Qn(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?K.LIVE:K.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:a,chunkSize:s=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 d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),a&&(m.topics=a);let f=await q(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence:K.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:K.LIVE}},async scoreRisk(r,o={}){let i=[],a=z.PASS,s=u=>{let d={[z.PASS]:0,[z.CAUTION]:1,[z.UNKNOWN]:2,[z.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==K.LIVE?(i.push({check:"erc20-metadata",result:z.UNKNOWN,detail:c.warning}),s(z.UNKNOWN)):i.push({check:"erc20-metadata",result:z.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===K.UNAVAILABLE)i.push({check:"liquidity",result:z.UNKNOWN,detail:l.reason}),s(z.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:z.FAIL,detail:"no pool with liquidity found"}),s(z.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:z.CAUTION,detail:`top pool only $${d}`}),s(z.CAUTION)):i.push({check:"liquidity",result:z.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:z.CAUTION,detail:"pool under 24h old"}),s(z.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:z.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}),s(u.verdict)}else i.push({check:"sellability",result:z.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."}),s(z.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function gu(e){let n={...UT(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,c0({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,i0({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,a]of Object.entries(n))o[i]=a.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 mn=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",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",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",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",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",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",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",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",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}}]}]);function ti(){return mn.map(e=>ts(gu(e)))}function d0(e){return ts(gu(e))}var ni=new Map,qT=Object.keys(De).map(Number),DT=Object.keys(ct).map(Number),HT=mn.map(e=>e.chainId),jT=[...new Set(Object.values(Ko))],yu=new Set,p0=!1;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(p0&&yu.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return ni.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),ni.get(t)}function rs(e){return ni.get(e)||null}function ri({venue:e,op:t}={}){let n=[...ni.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function zT(){yu.clear();for(let e of ni.keys())yu.add(e);p0=!0}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:"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"],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:HT,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:mn.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 v1 quote + local-signer Solana swap handoff"});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"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});P({id:"uniswap-v3",venue:"dex",chainIds:qT,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:"uniswap-v4",venue:"dex",chainIds:DT,auth:"none",ops:["health","quote","chains"],execution:"read-only",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 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});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"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});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:jT,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:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity"],execution:"prepare",baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 agent identity registration and inspection using an exact configured registry; the connected wallet signs and pays network gas"});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","chains","quote","prepare"],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."});zT();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. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});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:"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:"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:"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)"});L();et();et();var YT=/^0x[0-9a-fA-F]{40}$/,ii="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function bu(e,t){let n=String(e||"").trim();if(!YT.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function y0(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function b0(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 XT(e){return[...e].sort((t,n)=>(y0(n.tvl)??-1)-(y0(t.tvl)??-1))}function wu(e){return e.hlInfo||le}function xu(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Su(e={},t={}){let n=await wu(t)({type:"vaultSummaries"},t),r=XT((Array.isArray(n)?n:[]).map(b0));return xu({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function cs(e={},t={}){let r={type:"vaultDetails",vaultAddress:bu(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=bu(e.user,"user"));let o=await wu(t)(r,t);return xu({provider:"hl-vaults",vault:b0(o||{}),raw:o})}async function ku(e={},t={}){let n=bu(e.user||e.address,"user"),r=await wu(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 xu({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function vu(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return cs({...e,vaultAddress:ii},t);if(n==="summaries")return Su(e,t);if(n==="details")return cs(e,t);if(n==="mine")return ku(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function w0(e={}){try{let t=await vu({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ii&&!!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}}}ge();import{AbiCoder as JT}from"ethers";var Eu=999;var Pe=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Au=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),ZT=JT.defaultAbiCoder();function ai(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 si(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 rr(e,t){return e.length?ZT.encode(e,t):"0x"}function Jt(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 eN(e,t=0){let n=Jt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function fn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Eu});let r=await q(Eu,"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 hn(e){return{provider:"hl-precompiles",chainId:Eu,...Au,...e}}async function ls(e={}){let t=await fn(Pe.l1BlockNumber,"0x",e);return hn({op:"l1BlockNumber",precompile:Pe.l1BlockNumber,l1BlockNumber:Jt(t).toString(),raw:t})}async function Iu(e={},t={}){let n=si(e.index??e.assetId??0,"index",32),r=await fn(Pe.markPx,rr(["uint32"],[n]),t);return hn({op:"markPx",precompile:Pe.markPx,index:n,markPx:Jt(r).toString(),raw:r})}async function _u(e={},t={}){let n=si(e.index??e.assetId??0,"index",32),r=await fn(Pe.oraclePx,rr(["uint32"],[n]),t);return hn({op:"oraclePx",precompile:Pe.oraclePx,index:n,oraclePx:Jt(r).toString(),raw:r})}async function Tu(e={},t={}){let n=si(e.index??e.assetId??0,"index",32),r=await fn(Pe.spotPx,rr(["uint32"],[n]),t);return hn({op:"spotPx",precompile:Pe.spotPx,index:n,spotPx:Jt(r).toString(),raw:r})}async function Nu(e={},t={}){let n=ai(e.user,"user"),r=si(e.perp??e.assetId??0,"perp",16),o=await fn(Pe.position,rr(["address","uint16"],[n,r]),t);return hn({op:"position",precompile:Pe.position,user:n,perp:r,szi:eN(o,0),raw:o})}async function Pu(e={},t={}){let n=ai(e.user,"user"),r=si(e.token??0,"token",64),o=await fn(Pe.spotBalance,rr(["address","uint64"],[n,r]),t);return hn({op:"spotBalance",precompile:Pe.spotBalance,user:n,token:r,total:Jt(o,0).toString(),hold:Jt(o,1).toString(),raw:o})}async function Cu(e={},t={}){let n=ai(e.user,"user"),r=ai(e.vaultAddress??e.vault??ii,"vault"),o=await fn(Pe.vaultEquity,rr(["address","address"],[n,r]),t);return hn({op:"vaultEquity",precompile:Pe.vaultEquity,user:n,vaultAddress:r,hlp:r===ii,equity:Jt(o,0).toString(),raw:o})}async function Ou(e={},t={}){let n=ai(e.user,"user"),r=await fn(Pe.withdrawable,rr(["address"],[n]),t);return hn({op:"withdrawable",precompile:Pe.withdrawable,user:n,withdrawable:Jt(r).toString(),raw:r})}async function x0(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return ls(t);if(n==="markPx")return Iu(e,t);if(n==="oraclePx")return _u(e,t);if(n==="spotPx")return Tu(e,t);if(n==="position")return Nu(e,t);if(n==="spotBalance")return Pu(e,t);if(n==="vaultEquity"||n==="hlp")return Cu(e,t);if(n==="withdrawable")return Ou(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function S0(e={}){try{let t=await ls(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Au,l1BlockNumber:t.l1BlockNumber,precompiles:Pe}}catch(t){return{ok:!1,provider:"hl-precompiles",...Au,error:String(t?.message||t).slice(0,160)}}}et();X();function k0(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ds(e={},t,n){let r=String(t||""),o=k0(e);if(o){let a=ci(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=ci(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function ps(e={},t=[],n){let r=k0(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(ci(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&ci(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(ci(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Ru=Number.MAX_SAFE_INTEGER,us=String(Ru);function ci(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Ru?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>us.length||t.length===us.length&&t>us||t===us&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Ru?r:null}function z0(){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 en(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function V0(e){let t=en(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function VN(e,t,n=4){let r=en(e),o=en(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 a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function W0(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]||{},a=n[o]||{},s=String(i.name||"").trim(),c=en(a.funding),l=en(a.markPx??a.oraclePx),u=en(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:en(a.oraclePx),openInterest:u,fundingAprPct:V0(c)})}return r}function G0(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=en(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=V0(n),o=n>0,i={coin:e.coin,notionalUsd:en(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?VN(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 Zu(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await dt(t),i=W0(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.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 ed(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 dt(t),i=W0(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return G0(i,r)}async function td(e={},t={}){Y0(e,t,"hl-delta-neutral");let n=X0(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await ed(e,t);if(r.verdict==="skip")return O({...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=ds(e,r.coin,"hl-delta-neutral");if(!K0.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(()=>(bs(),Ju)),a=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(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return O({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var K0=/^0x[0-9a-fA-F]{40}$/;function Y0(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 WN(e,t,n){Y0(e,t,n)}function GN(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=X0(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"&&ps(e,n,"hl-delta-neutral"),t==="live"&&!K0.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 X0(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 Q0(e={},t={}){WN(e,t,"hl-delta-neutral");let n=GN(e),r=await Zu({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=G0(s,a);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 td({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,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(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();X();Rr();var YN=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),hi=14,J0=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Mr(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function nd(e){let t=String(e||"").replace(/\/$/,"");if(!YN.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Z0(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=J0(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=nd(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(or(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(or(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Mr(n.orderType,0,"orderType"),Mr(n.timeInForce,1,"timeInForce"),Mr(n.reduceOnly,0,"reduceOnly"),Mr(n.triggerPrice,0,"triggerPrice"),Mr(n.orderExpiry,-1,"orderExpiry");let c=J0(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=Bu(n.baseAmount,"lighter: baseAmount"),d=Bu(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,w=u*d,x=Ce(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(w!==x)throw new Error("lighter: notionalUsd must match size and price");let y=Ce(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>y)throw new Error("lighter: notional exceeds cap");let b=_e(n.notionalUsd,"lighter: notionalUsd");return Mr(n.txType,hi,"txType"),Object.freeze({unit:"usd",value:String(b),notional:String(b),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(b)})}function XN(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 eg(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=nd(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:XN(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??hi,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return Z0(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var ng="https://mainnet.zklighter.elliot.ai",rg="https://testnet.zklighter.elliot.ai";function QN(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?rg:ng}function og(){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 xn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function JN(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 ig(e){let t=xn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function ZN(e,t,n=4){let r=xn(e),o=xn(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 a=10**i;return Math.floor(r/o*a+1e-12)}function tg(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function ag(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 a of r){let s=tg(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=tg(a.market_id);if(s==null)continue;let c=o.get(s),l=xn(c?.mark_price??c?.index_price),u=xn(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:xn(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:ig(u)})}return i}function sg(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=xn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=ig(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:xn(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?ZN(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 cg(e={}){let t=QN(e),n=e.fetchImpl,r=await k(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await k(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function rd(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await cg(t),i=ag(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function od(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 cg(t),a=ag(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return sg(a,r)}async function id(e={},t={}){ug(e,t,"lighter");let n=dg(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 od(e,t);if(o.verdict==="skip")return O({...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=ds(e,o.coin,"lighter");if(!lg.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 s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=JN(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:hi,submitTo:`${s?rg:ng}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=eg(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return O({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var lg=/^0x[0-9a-fA-F]{40}$/;function ug(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 eP(e,t,n){ug(e,t,n)}function tP(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=dg(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"&&ps(e,n,"lighter"),t==="live"&&!lg.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function dg(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 pg(e={},t={}){eP(e,t,"lighter");let n=tP(e),r=await rd({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=sg(s,a);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 id({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,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(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var rP="https://clob.polymarket.com",oP="https://gamma-api.polymarket.com";function gi(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||rP).replace(/\/$/,"")}function mg(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||oP).replace(/\/$/,"")}async function ad(e={}){return k(`${gi(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function fg(e={}){let t=await ad(e);return{ok:t!=null&&t!=="",time:t}}async function hg({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,a])=>[i,String(a)]))});return k(`${mg(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function gg(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${gi(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yg(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${gi(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function bg(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${gi(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function wg(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 k(`${gi(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function xg({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,a])=>[i,String(a)]))});return k(`${mg(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}ge();L();import{createHash as Sg}from"node:crypto";var Fr="mainnet-beta",aP="https://api.mainnet-beta.solana.com",sd="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function sP(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||aP).trim()}function me(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 cP(e,t){return t?[...e,{commitment:t}]:e}async function yi(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=await k(sP(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function cd(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await yi("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Fr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function kg(e={}){try{let[t,n]=await Promise.all([yi("getHealth",[],e),cd({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Fr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Fr,error:String(t?.message||t),exec:!1}}}async function ws(e={},t={}){let n=me(e.address||e.owner,"address"),r=await yi("getBalance",cP([n],e.commitment),t);return{provider:"solana-rpc",cluster:Fr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function lP(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 bi(e={},t={}){let n=me(e.owner||e.address,"owner"),r=e.mint?{mint:me(e.mint,"mint")}:{programId:me(e.programId||sd,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await yi("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(lP):[];return{provider:"solana-rpc",cluster:Fr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function uP(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 dP(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 a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function pP(e){let t=Buffer.from(e,"base64");try{let n=dP(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Sg("sha256").update(t.subarray(r)).digest("hex")}catch{return Sg("sha256").update(t).digest("hex")}}async function vg(e={},t={}){let n=uP(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await yi("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Fr,ok:i.err==null,transactionHash:pP(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var fP="mainnet",hP="https://mempool.space/api",gP="https://mempool.space/testnet/api";function Dt(e={}){return String(e.network||process.env.BTC_NETWORK||fP).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ud(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Dt(e)==="testnet"?gP:hP}function ld(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 Et(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 yP(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 dd(e,t={}){let n=`${ud(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 xs(e,t={}){let n=await dd(e,t);try{return JSON.parse(n)}catch{return n}}async function Eg(e={}){try{let t=await dd("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Dt(e),baseUrl:ld(ud(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Dt(e),baseUrl:ld(ud(e)),error:ld(t?.message||t),exec:!1}}}async function Ag(e={}){let t=await dd("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Dt(e),tipHeight:Number(t)}}async function Ig(e={}){try{let t=await xs("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Dt(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:Dt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ss(e={},t={}){let n=Et(e.address||e.addr,"address"),r=await xs(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:Dt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function _g(e={},t={}){let n=Et(e.address||e.addr,"address"),r=await xs(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:Dt(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Tg(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 xs(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:Dt(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 Ng(e={},t={}){let n=yP(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Dt(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 pd="https://ordinals.com";function ks(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var wP=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Pg(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=ks(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=wP.includes(o)&&(i==="https:"||a)}}catch{n=!1}return lt({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Ur(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Pg(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 Cg(e={}){let t=ks(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 a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Pg(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.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 vs(e={},t={}){let n=Et(e.address||e.addr,"address"),r=ks(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 a of o)try{let s=await Ur(a,t),c=xP(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function xP(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 qr(e={},t={}){let n=Et(e.address||e.addr,"address"),r=ks(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}`],a=null;for(let s of i)try{let c=await Ur(s,t),l=SP(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function Og(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||pd,o=await Ur(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Rg(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||pd,o=Number(e.page||0),i=await Ur(`${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 $g(e={},t={}){let n=t.ordinalsBase||pd,r=e.height??await Ur(`${n}/r/blockheight`,t),o=await Ur(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function SP(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}))}X();var vP=["unsigned","notsigned","tosign","signable"],EP=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),AP=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function md(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function IP(e){return vP.some(t=>e.startsWith(t))||EP.has(e)}function _P(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=md(t);return IP(n)?!1:AP.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function TP(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 fd(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=>fd(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(_P(c)){o.push(c);continue}o.push(...fd(l,t+1,n,r))}let a=Object.keys(e).map(md).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(md(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),TP(e)&&o.push("v/r/s"),o}function tn(e,t){let n=fd(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 NP="https://api.satflow.com/v1";function Lg(e={}){return vt({provider:"satflow",defaultUrl:NP,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Es(e={}){return Lg(e).baseUrl}function gd(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function PP(e={}){return lt({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":gd(e)},Lg(e).trusted)}async function Sn(e,{method:t="GET",body:n,opts:r={}}={}){if(!gd(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Es(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:PP(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function Bg(e={}){if(!!!gd(e))return{ok:!1,provider:"satflow",baseUrl:Es(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 Sn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Es(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:Es(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Mg(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 Sn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Fg(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 Sn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Ug(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 Sn(`/item?${r}`,{opts:t})}}async function As(e={},t={}){let n=Et(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 Sn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function qg(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 Sn(`/orders/floor?${r}`,{opts:t})}}var CP=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Dg(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))CP.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var OP=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"]),RP=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function hd(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 $P(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=Et(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=Et(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))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:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function Hg(e={},t={}){let n=Dg(e,OP);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=hd(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Sn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=hd(a)??hd(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);tn("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=$P(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return O({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,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 Is(e={},t={}){let n=Dg(e,RP);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 Sn("/intent/sell",{method:"POST",body:n,opts:t});return tn("satflow",r),O({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."})}L();X();var Ts="https://lite-api.jup.ag/swap/v1",bd="So11111111111111111111111111111111111111112",Vg="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",BP=100,jg=2e4;function Wg(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Ts).replace(/\/$/,"")}function wi(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 Gg(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>BP)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function _s(e,t){return e==null?t:!!e}function MP(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 FP(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 Kg(e){let t=Buffer.from(e,"base64"),n=FP(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 yd(e={},{quotedAtMs:t=Date.now(),ttlMs:n=jg}={}){let r=me(e.inputMint,"inputMint"),o=me(e.outputMint,"outputMint"),i=wi(e.inAmount,"inAmount"),a=wi(e.outAmount,"outAmount"),s=wi(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Gg(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==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:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||jg,1e3),3e4)}}function UP({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==bd)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=Kg(n),a=wi(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:a}}}var qP=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),DP="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function zg(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=DP.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 Yg(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(`${Ts}/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(),a=Object.entries(i),s=a.filter(([p])=>zg(p)),c=[],l=a.filter(([p])=>!zg(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Ts}/program-id-to-label`,verified:s.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.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<s.length;p+=90){let m=s.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[w,x]=m[g];h&&h.executable===!0&&qP.has(h.owner)?c.push({programId:w,label:x,owner:h.owner}):l.push({programId:w,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.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:`${Ts}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.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 Xg(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Ns({inputMint:bd,outputMint:Vg,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 Ns(e={},t={}){let n=me(e.inputMint||e.fromMint||bd,"inputMint"),r=me(e.outputMint||e.toMint||Vg,"outputMint"),o=wi(e.amount||e.inAmount,"amount"),i=Gg(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Wg(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await k(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=yd({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function HP(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Qg(e={},t={}){let n=me(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:yd(e.quoteResponse,t)}:await Ns(e,t),o=r.quote,i=r.solanaGuard||yd(o,t);if(_s(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await k(`${Wg(t)}/swap`,{method:"POST",body:HP({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:_s(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:_s(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:_s(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=MP(a?.swapTransaction);Kg(s),tn("jupiter",a);let c=a?.quoteResponse??a?.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=UP({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return O({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:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}L();var zP="https://coins.llama.fi",VP="https://api.llama.fi",WP="https://yields.llama.fi",GP="https://stablecoins.llama.fi";function KP(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||zP).replace(/\/$/,"")}function Jg(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||VP).replace(/\/$/,"")}async function At(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return k(`${KP(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Zg(e={}){let n=(await At(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Ps(e={}){return k(`${Jg(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function ey(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||WP).replace(/\/$/,""),r=await k(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(a=>String(a.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(a=>String(a.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(a=>!!a.stablecoin==!!e.stablecoin)),o.sort((a,s)=>Number(s.tvlUsd||0)-Number(a.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 Cs(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||GP).replace(/\/$/,""),r=e.includePrices!==!1;return k(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function ty(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 k(`${Jg(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function ny(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await At(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();qe();Os();X();ui();var XP="https://li.quest/v1";function Sd(e={}){return(e.baseUrl||process.env.LIFI_API_URL||XP).replace(/\/$/,"")}var xd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",QP="0x0000000000000000000000000000000000000000";function JP(e){let t=String(e||xd).toLowerCase();return t===xd.toLowerCase()||t===QP}function ry(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 oy(e={}){let t=await k(`${Sd(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 vn(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=xd,toToken:i,fromAmount:a,fromAddress:s=kn}=e;if(n==null||!i||!a)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(a),fromAddress:s}),l=We({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 gs({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(B0(u)))c.set(g,w);let d=await k(`${Sd(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=ie(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 iy(e={},t={}){let n=await vn(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!JP(e.fromToken)){let a=n?.estimate?.approvalAddress||n?.approvalAddress;if(!a)throw new Error("lifi: ERC20 route missing approvalAddress");let s=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:ry(s,"approval token"),spender:ry(a,"approval spender"),amount:String(e.fromAmount)}}return O({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:ye(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function ay(e={}){return k(`${Sd(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}ge();qe();X();import{Interface as ly,getAddress as xi,isAddress as eC}from"ethers";var En={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},tC=[1,50,100,200,2e3],sy=new ly(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),nC=new ly(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),uy="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dy="0x0000000000000000000000000000000000000000";function py(e){let t=Number(e),n=En[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(En).join(", ")})`);return{chainId:t,...n}}function cy(e,t){let n=En[Number(t)];if(!e||e===uy||e===dy||/^eth$/i.test(String(e)))return xi(n.weth);let r=String(e);if(/^weth$/i.test(r))return xi(n.weth);if(/^usdc$/i.test(r))return xi(n.usdc);if(!eC(r))throw new Error(`invalid token address: ${e}`);return xi(r)}async function Rs(e={},t={}){let{chainId:n,quoter:r,router:o}=py(e.chainId??8453),i=cy(e.tokenIn||"WETH",n),a=cy(e.tokenOut||En[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...tC],l=[],u=null;for(let d of c){let p=sy.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await q(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=sy.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return ie({venue:"aerodrome",chainId:n,chain:En[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function my(e={},t={}){let n=Number(e.chainId??8453),r=py(n),o=xi(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===uy||i===dy||/^eth$/i.test(i),s=await Rs(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=nC.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return O({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:ye(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function fy(e={}){let t=Number(e.chainId??8453);try{let n=await Rs({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:En[t]?.router,quoter:En[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function hy(){return Object.entries(En).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();qe();X();var oC="https://api.0x.org";function gy(e={}){return vt({provider:"zerox",defaultUrl:oC,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function yy(e={}){return gy(e).baseUrl}function $s(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function by(e={}){return lt({"0x-version":"v2",accept:"application/json"},{"0x-api-key":$s(e)},gy(e).trusted)}async function wy(e={}){if(!$s(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await kd({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 kd(e={},t={}){if(!$s(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let s=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return a&&s.set("taker",a),k(`${yy(t)}/swap/allowance-holder/price?${s}`,{headers:by(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ir(e={},t={}){if(!$s(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`0x: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(s.selectedBps)});a&&c.set("taker",a);let l=await k(`${yy(t)}/swap/allowance-holder/quote?${c}`,{headers:by(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?ie(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:s}}async function xy(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await ir(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 O({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:ye(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}Fs();L();qe();import{TypedDataEncoder as pC,getAddress as ki,isAddress as mC}from"ethers";var j8=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"}),sC=new Set(["evm:execute","btc:execute","solana:execute","nft:buy","nft:mint","cow:submit"]),cC=new Set(["evm:prepare"]),lC="this capability plane prepares only; sign with the user wallet or oracle signer";function Dr(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Ey(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}function Ay(e,{env:t=process.env,userInitiated:n=!1,autonomous:r=!1}={}){return sC.has(e)?{capability:e,armed:!1,allowed:!1,reason:lC}:cC.has(e)?String(t.ORACLE_EVM_ADDRESS??"").trim()?!n&&!r?{capability:e,armed:!1,allowed:!1,reason:"preparation requires an explicit request or enabled unattended preparation"}:r&&!Dr(t)?{capability:e,armed:!1,allowed:!1,reason:"unattended preparation is off"}:{capability:e,armed:!1,allowed:!0,reason:null}:{capability:e,armed:!1,allowed:!1,reason:"a public address is required to prepare this action"}:{capability:e,armed:!1,allowed:!1,reason:`unknown capability: ${e}`}}function uC(e,t={}){let n=Ay(e,t);if(!n.allowed){let r=new Error(`oracle: ${e} not permitted: ${n.reason}`);throw r.status=n,r}return n}function dC(e=process.env){return{model:"read/prepare plane; sign and broadcast through wallet or oracle signer",armed:[],autonomousTrading:"off",autonomousPreparation:Dr(e)?"ENABLED":"off",note:"Oracle prepares actions. The user wallet or oracle signer signs and submits after confirmation."}}Os();X();var _y={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"},fC=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),hC=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Td={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Ty={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Iy=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"}]}),J8=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function Nd(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=_y[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Us(e,t){let n=String(e||"").trim();if(!mC(n))throw new Error(`cowswap: ${t} must be an address`);return ki(n).toLowerCase()}function _d(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 gC(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 yC(e){let t=fC[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:ki(t)}}function bC(e={},t,n){let r=Us(e.sellToken,"sellToken"),o=Us(e.buyToken,"buyToken"),i=Us(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=gC(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:_d(e.sellAmount,"sellAmount"),buyAmount:_d(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:_d(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Ny(e={}){try{let t=await An({chainId:1,sellToken:Td[1],buyToken:Ty[1],sellAmountBeforeFee:"1000000000000000",from:kn},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 An(e={},t={}){let n=Number(e.chainId??1),r=wd(e.from||e.owner),o=e.sellToken||Td[n],i=e.buyToken||Ty[n],a=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||a==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Td[n],!o))throw new Error("no WETH mapping for chain");let s={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:a,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await k(`${Nd(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?ie(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Py(e={},t={}){let n=Number(e.chainId??1),r=Us(wd(e.from||e.owner||e.signer),"owner"),o=await An({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=bC(o?.quote||o,n,r),a=yC(n),s={domain:a,types:Iy,primaryType:"Order",message:i},c=pC.hash(a,Iy,i),l=hC[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return O({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:ki(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:s,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:a.verifyingContract.toLowerCase(),vaultRelayer:ki(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:ki(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Cy(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return k(`${Nd(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Oy(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return k(`${Nd(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Ry(){return Object.keys(_y).map(Number)}L();qe();X();var xC="https://api.1inch.dev/swap/v6.0";function $y(e={}){return vt({provider:"oneinch",defaultUrl:xC,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Pd(e={}){return $y(e).baseUrl}function vi(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Cd(e={}){let t=vi(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},$y(e).trusted)}async function Ly(e={}){if(!vi(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Ei({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 Ei(e={},t={}){if(!vi(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 a=new URLSearchParams({src:r,dst:o,amount:String(i)}),s=await k(`${Pd(t)}/${n}/quote?${a}`,{headers:Cd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?ie(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function SC(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Od(e={},t={}){if(!vi(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return k(`${Pd(t)}/${n}/approve/spender`,{headers:Cd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function By(e={},t={}){if(!vi(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,a=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!a)throw new Error("oneinchPrepare requires src, dst, amount, from");let s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`1inch: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:a,slippage:String(s.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 k(`${Pd(t)}/${n}/swap?${c}`,{headers:Cd(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(a).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=ie(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!SC(r)){let f=l?.spender||l?.approvalAddress||(await Od({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 O({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||a,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:ye(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var vC=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Ai(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||vC,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,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,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function My(e={}){try{let t=await Ai({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 Fy(e={}){let t=await Ai({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Uy(e,t={}){if(!e)throw new Error("coin required");let n=await Ai({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var AC=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function qs(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 a=t.url||AC,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,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 w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function qy(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await qs([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 Dy(e,t={}){if(!e)throw new Error("assetId required");let n=await qs([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}L();import{getAddress as RC,Interface as jr,keccak256 as Ld}from"ethers";import{createHash as Bd,createHmac as $C,timingSafeEqual as nb}from"node:crypto";ge();import{Interface as zy,getAddress as Rd,isAddress as _C}from"ethers";var TC="0x0000000000000000000000000000000000000000",Vy=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),NC=new zy(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),PC=new zy(["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)"]);function CC(e){let t=Number(e??4663),n=Vy[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Hy(e,t){if(/^weth$/i.test(String(e||"")))return Rd(Vy[t].weth);if(!_C(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Rd(e)}function OC(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function jy(e,t,n,r,o,i){let a=r.encodeFunctionData(o,i),s=await e(t,"eth_call",[{to:n,data:a},"latest"]);if(!s||s==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,s)}async function Wy(e,t={},n={}){try{let r=CC(t.chainId),o=Hy(t.tokenIn,r.chainId),i=Hy(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=OC(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),s=Number(t.tickSpacing??2e3);if(!Number.isInteger(s)||s<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||q,l=await jy(c,r.chainId,r.factory,NC,"getPool",[o,i,s]),u=Rd(l[0]);if(u.toLowerCase()===TC)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:a,tickSpacing:s,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:a,tickSpacing:s,sqrtPriceLimitX96:0n},m=await jy(c,r.chainId,r.quoter,PC,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:s,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:a.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:a.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Gy(e={},t={}){return Wy("exact-input",e,t)}async function Ky(e={},t={}){return Wy("exact-output",e,t)}X();var j=4663,Ds="https://anvil.clutch.market",LC=`${Ds}/api/markets/snapshot?chainId=${j}`,BC=`${Ds}/api/rpc?chainId=${j}`,MC=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),tt="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Md="0x0000000000000000000000000000000000000000",ar=1e5,FC=256e3,Yy=256,UC=3e4,qC=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"}),mt=Object.freeze({chainId:j,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Be=new jr(["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"]),DC=new jr(["function allowance(address owner,address spender) view returns (uint256)"]),rb=new jr(["function decimals() view returns (uint8)"]),Xy=new jr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),ft=new jr(["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)"]),In=new jr(["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)"]);function D(e,t){try{return RC(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function rn(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 nt(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 ee(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(j,"eth_call",[{to:D(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function ob(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 Qy(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>Yy)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Yy}`);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)!==j)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${j}`);return{name:n.name||n.collectionName||null,chainId:j,collection:D(n.collection||n.collectionAddress,"Anvil collection"),market:D(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?D(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 HC(e,t,n=[],r={}){if(Number(e)!==j)throw new Error(`stonkbrokers: Anvil supports chain ${j} only`);if(!MC.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await k(BC,{method:"POST",headers:{origin:Ds,referer:`${Ds}/`,"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 It(e={}){return e.rpcCall||((t,n,r)=>HC(t,n,r,e))}async function zr(e={},t={}){if(e.snapshot){let s=Qy(e.snapshot),c={kind:"anvil-markets",chainId:j,total:s.length,contentHash:Bd("sha256").update(Hr(s)).digest("hex")},l=Fd(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.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 k(LC,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:FC,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=Qy(r),i={kind:"anvil-markets",chainId:j,total:o.length,contentHash:Bd("sha256").update(Hr(o)).digest("hex")},a=Fd(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:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function Hs(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 ib({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 zr({},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 a=qC[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=It(n),c=Hs(await s(j,"eth_blockNumber",[])),l=await s(j,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||Hs(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 s(j,"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=Ld(p).toLowerCase();if(m!==a)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:s,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+UC}}function ab(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:j,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 _i(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=rn(e.tokenId),i=await ib({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Be,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Be,"inventory",[BigInt(o)],s),ee(a,r,ft,"ownerOf",[BigInt(o)],s),ee(a,n,Be,"collection",[],s),ee(a,n,Be,"token",[],s),ee(a,n,Be,"robinhoodSwapFeeWei",[],s)]),f=D(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=D(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await ee(a,h,rb,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(m[0]).toString(),x=ab(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),y=!!c[4],b=!!l[0],S=D(u[0],"NFT owner")===n,_=y&&b&&S;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:j,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:w,fees:ob(c[2],c[3]),available:_,evidence:{quoteAvailable:y,inventory:b,ownerIsMarket:S,marketCollection:f,attestation:x},reason:_?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function js(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await ib({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Be,"quoteSellNFT",[],a),ee(i,n,Be,"collection",[],a),ee(i,n,Be,"token",[],a),ee(i,n,Be,"robinhoodSwapFeeWei",[],a)]),d=D(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=D(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await ee(i,p,rb,"decimals",[],a))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=ab(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:j,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:f,fees:ob(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function sb(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 nn(e,t){let n=nt(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function cb({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:j,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:nn(o,"gasLimit").toString(),maxFeePerGas:nn(i,"maxFeePerGasWei").toString(),nonce:Number(s),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return a!=null&&a!==""&&(c.maxPriorityFeePerGas=nn(a,"maxPriorityFeePerGasWei").toString()),c}function lb(e,t){return O({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 ub(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=D(e.market,"Anvil market"),o=D(e.collection,"NFT collection"),i=rn(e.tokenId),a=nn(e.maxTotalCostRaw,"maxTotalCostRaw"),s=nt(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 _i({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>a||BigInt(l.nativeSwapFeeWei)>s)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=nn(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=D(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,w={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await ee(It(t),f,DC,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let y={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},b=[cb({...y,to:r,data:Be.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],S={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},_={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:S,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:sb(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:S,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return lb(_,l)}async function db(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=It(t),r=D(e.seller,"seller"),o=D(e.market,"Anvil market"),i=D(e.collection,"NFT collection"),a=rn(e.tokenId),s=nn(e.minPayoutRaw,"minPayoutRaw"),c=nt(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 js({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ee(n,i,ft,"ownerOf",[BigInt(a)],p).then(v=>D(v[0],"NFT owner")),ee(n,i,ft,"getApproved",[BigInt(a)],p).then(v=>D(v[0],"NFT approval")),ee(n,i,ft,"isApprovedForAll",[r,o],p).then(v=>!!v[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)<s||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),w=nn(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),y=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),b=D(u.paymentToken,"Anvil payment token"),S=Number(u.paymentTokenDecimals),_={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},T=[cb({..._,to:o,data:Be.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},A={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:b,paymentTokenDecimals:S,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:w.toString()},tradeId:sb(e.tradeId),slippageBps:0,expiresAtMs:x+y,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:T}};return lb(A,u)}async function jC(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(S=>rn(S)),y={kind:"anvil-inventory",chainId:j,market:D(e.market,"Anvil market"),collection:D(e.collection,"NFT collection"),total:x.length,contentHash:Bd("sha256").update(Hr(x)).digest("hex")},b=Fd(e.inventoryCompletenessEvidence,y,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:b.valid,continuation:b.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:b.evidence,completenessError:b.error}}let n=It(t),r=D(e.market,"Anvil market"),o=Hs(await n(j,"eth_blockNumber",[])),i=await n(j,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||Hs(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Be,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>ar)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${ar}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>ar))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${ar}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:ar};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Be,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let x=f.toString();g.add(x),h.push(x),f=BigInt((await ee(n,r,Be,"getNextTokenId",[f],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function zC(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 VC(e,t,n){let r=It(n);try{let o=String((await ee(r,e,ft,"tokenURI",[BigInt(t)]))[0]),i=zC(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await k(a,{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 ee(r,e,ft,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function pb(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 WC(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),a=String(r?.op||"eq").trim().toLowerCase();if(a==="exists")return i!=null;if(i==null)return!1;let s=i.value;if(a==="eq")return String(s).toLowerCase()===String(r.value).toLowerCase();if(a==="in")return Array.isArray(r.values)&&r.values.some(u=>String(s).toLowerCase()===String(u).toLowerCase());let c=Number(s),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(a==="gte")return c>=l;if(a==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${a}`)})}async function zs(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await jC({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=It(t),p=(await Ve(i,s,async h=>{try{let g=await ee(u,r,ft,"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>=a),f=(await Ve(p,s,async h=>{try{let g=await _i({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:j,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 Ve(i,s,async u=>{try{let[d,p]=await Promise.all([VC(r,u,t),_i({market:n,collection:r,tokenId:u},t)]),m=pb(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?WC(d,f):e.includeAll===!0?!0:m!=null&&m>=a)?{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:j,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 mb(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Jy(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 fb(e={}){return{maxMarkets:Jy(e,"maxMarkets",ar),maxItemsPerMarket:Jy(e,"maxItemsPerMarket",ar)}}function hb(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Ii(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,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function gb(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(s=>s.complete===!0),a=t.filter(s=>s.complete!==!0).map(s=>({market:s.market,continuation:s.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?a.length?{markets:a}:null:{snapshotEvidenceRequired:!0,...a.length?{markets:a}:{}}:{marketOffset:n}}}async function yb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=fb(e),o=await zr(e,t),i=hb(o,e,n),a=t.scanCollection||zs,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ve(i,s,async l=>{let u=mb(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 a(d,t);return{...l,status:"ok",scan:p,...Ii(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Ii(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:j,marketCount:i.length,...gb(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 bb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=fb(e),o=await zr(e,t),i=o.snapshotCoverage?.complete===!0,a=hb(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Ud,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ve(a,l,async d=>{let p=mb(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Ii(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=Ii(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),...Ii(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:j,marketCount:a.length,...gb(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 Zy(e,t){return e>t?"ARB":"PASS"}async function GC(e={},t={}){let n=String(e.direction||""),r=nt(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=D(e.paymentToken,"Anvil payment token"),i={chainId:j,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:It(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Ky)({chainId:j,tokenIn:tt,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:tt,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||Ph)({...i,tokenIn:tt,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:tt,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 s=await(t.up33QuoteExactIn||Gy)({chainId:j,tokenIn:o,tokenOut:tt,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:tt,amountInRaw:r.toString(),amountOutWei:String(s.amountOut),source:`up33:${s.pool}`,venue:s.venue||"up33-v3",tickSpacing:s.tickSpacing,pool:s.pool,quoter:s.quoter,gasEstimate:s.gasEstimate};let c=await(t.uniV4QuoteExactIn||_r)({...i,tokenIn:o,tokenOut:tt,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:tt,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 eb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=D(e.quoteToken,"conversion quote token");if(n!==tt)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=nt(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=nt(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function KC(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 Hr(e){return Array.isArray(e)?`[${e.map(Hr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Hr(e[t])}`).join(",")}}`:JSON.stringify(e)}function wb(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:$C("sha256",n).update(Hr(r)).digest("hex")}}function YC(e,t){return wb(e,t)}function Fd(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=YC(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!nb(a,s))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 XC(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:KC(e,t)}function $d(e,t,n,r,o,i){let a=XC(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==j)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.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 s=String(a.mac||"").toLowerCase(),c=wb(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!nb(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(a.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(a.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(a.blockHash||"").toLowerCase()!==o.blockHash||String(a.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(a.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&D(a.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(a.quotedAtMs),p=Number(a.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=a.amountWei??a.amount??a.gasCostWei??a.gasPriceWei,f=nt(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=nn(a.gasLimit,`${r} evidence gasLimit`),g=nn(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let w=a.simulation;if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`${r} simulation evidence is required`);if(Number(w.chainId)!==j)throw new Error(`${r} simulation chainId mismatch`);if(String(w.route||"")!==t||String(w.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(w.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(w.blockHash||"").toLowerCase()!==o.blockHash||String(w.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(w.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(D(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let y=D(w.sender,`${r} simulation sender`),b=D(w.owner,`${r} simulation owner`);if(!o.owner||y!==o.owner||b!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(nt(w.valueWei,`${r} simulation valueWei`))!==String(nt(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(w.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&D(w.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(w.success!==!0||w.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(w.result??"")))throw new Error(`${r} simulation did not return a successful result`);let S=Number(w.quotedAtMs),_=Number(w.expiresAtMs);if(!Number.isFinite(S)||!Number.isFinite(_)||S>n||_<=n||_<=S)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...a,amountWei:f.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function tb(e){let t=D(e,"OpenSea payment token");if(t!==Md&&t!==tt)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Ud(e={},t={}){let n=await zs(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=D(e.owner,"execution owner")}catch{}let a=(w,x,y,b={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:y,owner:i,...b}),s=(w,x,y,b,S)=>$d(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(y,b,x,S),o),c=(w,x)=>{let y=null;try{y=D(w?.target,"conversion target")}catch{}let b=a(w?.calldataHash,w,"conversion",{target:y,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(b.calldataHash)||!/^0x[0-9a-f]{64}$/.test(b.blockHash)||!/^\d+$/.test(b.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let S=$d(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",b,o);if(S.amount!=null||w?.gasEstimate==null)return S;let _=$d(e.gasPriceEvidence,x,r,"gas price",{...b,leg:"conversion-gas-price"},o);if(_.amount==null)return{amount:null,evidence:null,error:_.error};let T=nt(w.gasEstimate,"conversion gasEstimate");return{amount:T*_.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:T.toString(),gasPriceEvidence:_.evidence},error:null}},l=(w,x,y,b,S)=>{try{let _=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(_))throw new Error("exact Seaport order hash is required");let T=D(x?.protocolAddress,"Seaport protocol address"),E=String(x?.executionCalldataHash||"").toLowerCase(),A=/^0x[0-9a-f]{64}$/.test(E)?E:null,v=b==="seaport-fulfillment"&&S===Md?String(x?.priceWei??""):"0",N={orderHash:_,protocolAddress:T,target:T,valueWei:v},B=s(w,b,A,y,N);if(B.amount==null)throw new Error(B.error);if(B.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let te=B.evidence?.approvalRequired;if(typeof te!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==te)throw new Error("Seaport approval requirement evidence mismatch");let Z=[B];if(te){let H=String(x?.approvalCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(H)?H:null,J=b==="seaport-offer-acceptance"?n.collection:S;Z.push(s(w,"seaport-approval",U,y,{...N,target:J,valueWei:"0"}))}if(S===Md){let H=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",U=String(x?.prerequisiteCalldataHash||"").toLowerCase(),J=/^0x[0-9a-f]{64}$/.test(U)?U:null,ke=H==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";Z.push(s(w,H,J,y,{...N,target:tt,valueWei:ke}))}let $=Z.find(H=>H.amount==null);if($)throw new Error($.error);return{amount:Z.reduce((H,U)=>H+U.amount,0n),evidence:Z.map(H=>H.evidence),error:null}}catch(_){return{amount:null,evidence:null,error:String(_.message||_)}}},u=nt(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Ja,p=t.openSeaBestOffer||Za,m=t.paymentTokenConversion||(w=>GC({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await js({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let y=w.quote,b=Ld(Be.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(y.totalCostRaw)])).toLowerCase(),S=s("anvil-to-opensea","anvil-call",b,y.evidence.attestation,{target:n.market,valueWei:y.nativeSwapFeeWei}),_=null,T=null;if(x)try{_=tb(x.paymentToken)}catch(U){T=String(U.message||U)}let E=T||!x?{amount:null,evidence:null,error:T||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,y.evidence.attestation,"seaport-offer-acceptance",_),A={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:y.paymentToken,amountUnits:y.amountUnits,anvilTotalCostRaw:y.totalCostRaw,anvilBaseCostRaw:y.baseCostRaw,anvilFeeRaw:y.fees.totalFeeRaw,paymentTokenDecimals:y.paymentTokenDecimals,nativeSwapFeeWei:y.nativeSwapFeeWei,openSeaGrossOfferWei:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.feeWei),openSeaPaymentToken:_,gasCostWei:S.amount==null?null:S.amount.toString(),gasEvidence:S.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!y.available)h.push({...A,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(T)h.push({...A,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${T}`});else if(S.amount==null)h.push({...A,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${S.error}`});else if(E.amount==null)h.push({...A,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({...A,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let U=eb(await m({chainId:j,direction:"acquire-exact-output",amountRaw:y.totalCostRaw,paymentToken:y.paymentToken,quoteToken:tt}),{direction:"acquire-exact-output",amountRaw:y.totalCostRaw}),J=c(U,"anvil-to-opensea");if(J.amount==null)h.push({...A,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${J.error}`});else{let ke=S.amount+E.amount+J.amount,pe=BigInt(x.sellerNetWei)-BigInt(U.amountInWei)-BigInt(y.nativeSwapFeeWei)-ke;h.push({...A,conversionGasCostWei:J.amount.toString(),conversionGasEvidence:J.evidence,totalExecutionGasWei:ke.toString(),anvilCostInWethWei:U.amountInWei,conversion:U,netWei:pe.toString(),decision:Zy(pe,u),reason:pe>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(U){h.push({...A,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}let v=null;try{v=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!v)continue;let N=Ld(Be.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),B=s("opensea-to-anvil","anvil-call",N,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),te=null,Z=null;try{te=tb(v.paymentToken)}catch(U){Z=String(U.message||U)}let $=Z?{amount:null,evidence:null,error:Z}:l("opensea-to-anvil",v,f.evidence.attestation,"seaport-fulfillment",te),H={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(v.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:te,gasCostWei:B.amount==null?null:B.amount.toString(),gasEvidence:B.evidence,marketplaceGasCostWei:$.amount==null?null:$.amount.toString(),marketplaceGasEvidence:$.evidence,conversionGasCostWei:null};if(Z){h.push({...H,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${Z}`});continue}if(B.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${B.error}`});continue}if($.amount==null){h.push({...H,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({...H,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let U=eb(await m({chainId:j,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:tt}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),J=c(U,"opensea-to-anvil");if(J.amount==null)h.push({...H,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${J.error}`});else{let ke=B.amount+$.amount+J.amount,pe=BigInt(U.amountOutWei)-BigInt(v.priceWei)-BigInt(f.nativeSwapFeeWei)-ke;h.push({...H,conversionGasCostWei:J.amount.toString(),conversionGasEvidence:J.evidence,totalExecutionGasWei:ke.toString(),anvilPayoutInWethWei:U.amountOutWei,conversion:U,netWei:pe.toString(),decision:Zy(pe,u),reason:pe>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(U){h.push({...H,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}}let g=n.complete===!0?h:h.map(w=>w.decision==="ARB"?{...w,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:w);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:j,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((w,x)=>{let y=BigInt(w.netWei??"-1"),b=BigInt(x.netWei??"-1");return b>y?1:b<y?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Vs(e={},t={}){let n=It(t),r=rn(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,mt.ammVault,Xy,"quoteSpecificBuy",[BigInt(r)]),ee(n,mt.ammVault,Xy,"inventory",[BigInt(r)]),ee(n,mt.nft,ft,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:D(a[0],"broker owner")===mt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:j,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function xb(e,t){try{return D((await ee(t,mt.nft,ft,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return D((await ee(t,mt.nft,ft,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Sb(e={},t={}){let n=It(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ve(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=rn(a.brokerTokenId,"brokerTokenId"),c=rn(a.nestedTokenId,"nestedTokenId"),l=D(a.tba,"TBA"),u=D(a.nestedCollection,"nested collection"),d=pb({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([xb(s,n),ee(n,u,ft,"ownerOf",[BigInt(c)]).then(g=>D(g[0],"nested owner")),Vs({brokerTokenId:s},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.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((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:j,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function kb(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=rn(e.brokerTokenId,"brokerTokenId"),o=nt(e.maxTokenCostWei,"maxTokenCostWei"),i=nt(e.maxEthFeeWei,"maxEthFeeWei"),a=await Vs({brokerTokenId:r},t);if(!a.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(a.tokenCostWei)>o||BigInt(a.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return O({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:j,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:mt.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Ti(e={},t={}){let n=It(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?mt.overtimeBooster:mt.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,In,"pendingEth"),ee(n,o,In,"minDropWei"),ee(n,o,In,"roundActive"),ee(n,o,In,"currentRound"),ee(n,o,In,"roundState").catch(()=>null),ee(n,o,In,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:j,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=>D(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function vb(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?mt.overtimeBooster:mt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?In.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):In.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return O({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:j,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:j,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Eb(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>rn(s,"brokerTokenId")):[],r=It(t),o=await Ve(n,8,async s=>{let[c,l]=await Promise.all([ee(r,mt.nft,ft,"ownerOf",[BigInt(s)]).then(u=>D(u[0],"broker owner")),xb(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Ti({which:"stock"},t),Ti({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:j,owner:e.owner?D(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Ab(e={},t={}){try{let n=await zr(e,t);return{ok:!0,chainId:j,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Ib(e={},t={}){try{let n=await Ti({which:"stock"},t);return{ok:!0,chainId:j,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180)}}}X();import{createHash as JC}from"node:crypto";var Ni="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",Pb=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"}]),on=Object.freeze(Object.fromEntries(Pb.map(e=>[e.name,e.selector]))),ZC=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),eO=new Set(["name","endpoint","version","skills","domains"]),tO=new Set(["agentId","agentRegistry"]),_b=new Set(["reputation","crypto-economic","tee-attestation"]),nO=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,rO=64*1024;function Wr(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 qd(e,t,n){for(let r of Object.keys(e)){if(nO.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 Vr(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 Tb(e,t,{service:n=!1}={}){let r=Vr(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 Ws(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 sr(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function Gs(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 Ks(e){let t=sr(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Ws(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Dd(){let e=[];try{let t=sr(process.env.ORACLE_ERC8004_CHAIN_ID);Ks(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 oO(e){return JSON.parse(JSON.stringify(e))}function Ci(e){let t=Wr(e,"registration file");if(qd(t,ZC,"registration"),t.type!==Ni)throw new Error("erc8004: registration-v1 type required");let n={type:Ni,name:Vr(t.name,"name",128),description:Vr(t.description,"description",4096),image:Tb(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((a,s)=>{let c=Wr(a,`services[${s}]`);qd(c,eO,`services[${s}]`);let l=Vr(c.name,`services[${s}].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:Tb(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=Vr(c.version,`services[${s}].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[${s}].${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((a,s)=>{let c=Wr(a,`registrations[${s}]`);qd(c,tO,`registrations[${s}]`);let l=Gs(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[${s}].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>_b.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!_b.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>rO)throw new Error("erc8004: registration metadata oversized");return oO(n)}function Cb(e){if(Wr(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ni)throw new Error("erc8004: registration-v1 type required");return Ci({type:Ni,...e})}function Ob(e){let t=Ci(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Pi(e){return BigInt(e).toString(16).padStart(64,"0")}function Rb(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Pi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function $b(e){return`${on.register}${Pi(32)}${Rb(e)}`}function Lb(e,t){return`${on.setAgentURI}${Pi(e)}${Pi(64)}${Rb(t)}`}function iO(e,t){return`${e}${Pi(t)}`}function Bb(e){return JC("sha256").update(e,"utf8").digest("hex")}function Hd(e,t){Wr(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 Mb(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=sr(e.chainId),c=Ws(e.owner,"owner"),l=Ks(s),u=Number(t?.nowMs??Date.now());return O({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:Bb(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:s,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function jd(e={},t={}){Hd(e,new Set(["chainId","owner","registration"]));let n=Ob(Cb(e.registration));return Mb(e,t,{kind:"erc8004-register",uri:n,selector:on.register,data:$b(n)})}function zd(e={},t={}){Hd(e,new Set(["chainId","owner","agentId","agentURI"]));let n=Gs(e.agentId),r=Fb(e.agentURI);return Mb(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:on.setAgentURI,data:Lb(n,r),id:n})}function Fb(e){let t=Vr(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 Ci(o),t}function aO(e,t={}){Ra(e,{nowMs:t.nowMs,providers:["erc8004-identity"],kinds:["erc8004-register","erc8004-set-agent-uri"],label:"erc8004"});let n=Ks(sr(e.chainId));if(e.registry!==n||e.transaction?.to!==n)throw new Error("erc8004: registry mismatch");let r=Ws(e.owner,"owner");if(e.taker!==r||e.transaction?.from!==r)throw new Error("erc8004: owner/taker mismatch");if(e.transaction?.value!=="0x0")throw new Error("erc8004: transaction value must be zero");if(e.custody!=="public-keyless"||e.signingReady||e.broadcastReady||e.executionReady)throw new Error("erc8004: public custody flags mismatch");let o=e.kind==="erc8004-register"?on.register:on.setAgentURI;if(e.selector!==o)throw new Error("erc8004: selector mismatch");if(e.agentURIHash!==Bb(e.agentURI))throw new Error("erc8004: agentURI hash mismatch");let i=e.kind==="erc8004-register"?$b(e.agentURI):Lb(Gs(e.agentId),e.agentURI);if(e.transaction?.data!==i)throw new Error("erc8004: calldata mismatch");if(sr(e.transaction?.chainId)!==sr(e.chainId))throw new Error("erc8004: transaction chain mismatch");let a=Object.keys(Wr(e.transaction,"transaction")).sort();if(JSON.stringify(a)!==JSON.stringify(["chainId","data","from","to","value"]))throw new Error("erc8004: transaction authority fields mismatch");return e}function Nb(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 Ws(`0x${e.slice(-40)}`,t)}function sO(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 Vd(e={},t={}){Hd(e,new Set(["chainId","agentId"]));let n=sr(e.chainId),r=Gs(e.agentId),o=Ks(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:iO(d,r)},"latest"]),[a,s,c]=await Promise.all([i(on.ownerOf),i(on.tokenURI),i(on.getAgentWallet)]),l=Fb(sO(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Ci(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Nb(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Nb(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}ge();var Ub=999;async function qb(e={}){let t={chainId:Ub,rpc:null,dex:null};try{t.rpc=await Ir(Ub,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Do("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 Db(e="HYPE",t={}){let r=(await Do(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 Hb(e,t={}){return Qn(e,t)}L();X();var uO="https://api-mainnet.magiceden.dev/v2",Oi=1e9;function jb(e={}){return vt({provider:"magiceden",defaultUrl:uO,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Kr(e={}){return jb(e).baseUrl}function cr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function Yr(e={}){let t=cr(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},jb(e).trusted)}function Wd(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 Gr(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 dO(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 pO(e){return Math.round(Gr(e,"priceSol")*Oi)}function mO(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 fO({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function hO(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=fO(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function zb(e={}){try{let t=await Gd({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!cr(e),readTier:"keyless",prepareTier:cr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!cr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Gd(e={},t={}){let n=Wd(e.symbol||e.collection),r=await k(`${Kr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:Yr(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/Oi:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Oi:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Oi:null,exec:!1,raw:r}}function Vb(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*Oi):null,tokenSize:e.tokenSize??1}}async function Wb(e={},t={}){let n=Wd(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(`${Kr(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 a=await k(i.toString(),{headers:Yr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Vb);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Gb(e={},t={}){let n=me(e.tokenMint||e.mint,"tokenMint"),r=await k(`${Kr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:Yr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Vb);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Kb(e={},t={}){if(!cr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=me(e.buyer||e.userPublicKey,"buyer"),r=me(e.seller,"seller"),o=me(e.tokenMint,"tokenMint"),i=me(e.tokenATA||e.tokenAddress,"tokenATA"),a=me(e.auctionHouse,"auctionHouse"),s=Gr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Gr(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Kr(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await k(l.toString(),{headers:Yr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});tn("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 O({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:s,maxPriceSol:c,lamports:pO(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ys(e={},t={}){if(!cr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=me(e.seller||e.userPublicKey,"seller"),r=me(e.tokenMint,"tokenMint"),o=me(e.tokenATA||e.tokenAddress,"tokenATA"),i=me(e.auctionHouse,"auctionHouse"),a=Gr(e.priceSol??e.price,"priceSol"),s=mO(e.expiry),c=hO(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Kr(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(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",me(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await k(l.toString(),{headers:Yr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});tn("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 O({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:a,expiry:s,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function Yb(e={},t={}){if(!cr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=me(e.buyer||e.userPublicKey,"buyer"),r=Wd(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=Gr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Gr(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Kr(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await k(a.toString(),{headers:Yr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=dO(s);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`);tn("magiceden",s);let u=s?.v0?.tx?.data??s?.tx?.data??null;if(!Array.isArray(u))throw s?.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 O({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:s})}X();Fu();L();et();var Xr=8,Kd=10n**BigInt(Xr),yO="0xa4b1",Xb=7,Yd=1,bO=2n**64n-1n;function wO(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 $i(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Jr(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 Ri(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>Xr)throw new Error(`hl-staking: ${t} has more than ${Xr} decimals`);let i=BigInt(r)*Kd+BigInt((o+"0".repeat(Xr)).slice(0,Xr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>bO)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Qr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function an(e){let t=BigInt(String(e||"0")),n=t/Kd,r=(t%Kd).toString().padStart(Xr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Qb(e={}){try{let t=await Xd(e);return{ok:t.count>0,provider:"hl-staking",chain:$i(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 Xd(e={}){let t=await le({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 Qd(e={},t={}){let n=Jr(e.user||e.address,"user"),r=await le({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 Jd(e={},t={}){let n=Jr(e.user||e.address,"user"),r=await le({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 Jb(e={},t={}){let n=Jr(e.user||e.address,"user"),r=await le({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Zb(e={},t={}){let n=Jr(e.user||e.address,"user"),r=await le({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Zd(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 Xs(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||yO)}function xO(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Xs(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function ep({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:a,caps:s,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:$i(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:wO(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:xO(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=fs(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,O(l,{provider:"hl-staking",kind:e})}function ew(e={},t={}){let n=Ri(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Ri(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${an(n)} HYPE exceeds maxHype cap ${an(r)} HYPE`);let o=Zd(e),i=$i(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Xs(t),wei:Qr(n),nonce:o};return ep({kind:"hype-stake-deposit",action:a,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:Qr(n),nonce:o},opts:t,args:e,caps:{amountHype:an(n),maxHype:r?an(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 tw(e={},t={}){let n=Ri(e.amountHype??e.amount,"amountHype"),r=Zd(e),o=$i(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Xs(t),wei:Qr(n),nonce:r};return ep({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:Qr(n),nonce:r},opts:t,args:e,caps:{amountHype:an(n)},notes:[`Starts the ${Xb} 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 nw(e={},t={}){let n=Jr(e.validator,"validator"),r=Ri(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 a=o?e.isUndelegate:i?e.undelegate:!1,s=e.maxHype==null?null:Ri(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${an(r)} HYPE exceeds maxHype cap ${an(s)} HYPE`);let c=Zd(e),l=$i(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Xs(t),validator:n,wei:Qr(r),isUndelegate:a,nonce:c};return ep({kind:a?"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:Qr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:an(r),maxHype:s?an(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Yd} 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 ${Yd} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function rw(e={},t={}){let n=Jr(e.user||e.address,"user"),r=await Qd({user:n},t),o=await Jd({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Xb,validatorLockupDays:Yd,exec:!1}}et();async function tp(e={}){let t=Date.now();try{let n=await Qt(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}}}var kO=24*365,vO=8;function Me(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function EO(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Qs(e={},t={}){let[n,r]=await Promise.all([dt(t),Qt(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],s=o.map((c,l)=>{let u=i[l]||{},d=Me(u.markPx),p=Me(u.prevDayPx),m=Me(u.openInterest),f=Me(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Me(u.oraclePx),midPx:Me(u.midPx)??Me(r?.[c.name]),prevDayPx:p,change24hPct:EO(d,p),dayNtlVolumeUsd:Me(u.dayNtlVlm),premium:Me(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(kO/vO)*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:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function ow(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Qs(e,t),a=(s,c=-1)=>r.filter(l=>l[s]!=null).sort((l,u)=>(l[s]-u[s])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:a("change24hPct"),losers:a("change24hPct",1),byVolume:a("dayNtlVolumeUsd"),byOpenInterest:a("openInterestUsd"),fundingHighest:a("fundingRateAprPct"),fundingLowest:a("fundingRateAprPct",1)}}async function iw(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(),a=i-o,[s,c,l]=await Promise.all([Qs({},t),Cr({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Pr(n,t).catch(()=>null)]),u=s.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:Me(h.o),high:Me(h.h),low:Me(h.l),close:Me(h.c),volume:Me(h.v)})),p=l?.levels??[],m=Me(p?.[0]?.[0]?.px),f=Me(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 aw(e={},t={}){let n=await ss(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}))}}import{mkdirSync as XO,readFileSync as QO,readdirSync as JO,renameSync as ZO,writeFileSync as eR}from"node:fs";import{homedir as tR}from"node:os";import{join as tc}from"node:path";var rt=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),IO=new Set(["watch","watch this","ping","ping me","alert","notify"]),_O=new Set(["watching","armed"]);function sw(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(IO.has(t))return rt.ALERT_ONLY;if(t==="arm")return rt.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function TO(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:sw(t)}}function NO(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(rt).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function PO(e){return e?.active===!0&&e?.actionMode===rt.ALERT_ONLY}function CO(e){return e?.active===!0&&e?.actionMode===rt.EXECUTE}function OO(e={}){if(e.actionMode!==void 0&&e.actionMode!==rt.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:_O.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:rt.ALERT_ONLY}}L();ge();X();import{Interface as np,getAddress as fw,isAddress as RO}from"ethers";var cw=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),lw=Object.freeze({42161:{name:"arbitrum",api:cw[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:cw[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),uw="0x0000000000000000000000000000000000000000",$O=`0x${"0".repeat(64)}`,dw=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),pw=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Js=new np(["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"]),hw=new np(["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)"]),LO=new np(["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)"]),BO=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function eo(e){let t=Number(e??42161),n=lw[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(lw).join(", ")})`);return{chainId:t,...n}}function Zs(e,t={}){let n=eo(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function ht(e,t){if(!RO(e))throw new Error(`${t} must be a valid EVM address`);return fw(e)}function re(e){return fw(e).toLowerCase()}function Zr(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 lr(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 MO(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 FO(e){let t=String(e||"marketIncrease").trim();if(!(t in dw))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:dw[t]}}function UO(e){let t=String(e||"noSwap").trim();if(!(t in pw))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:pw[t]}}function qO(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function DO(e,t){let n=re(t);return e.find(r=>re(r.marketToken||r.market||r.address)===n)||null}function HO(e,t){let n=re(t);return e.find(r=>re(r.tokenAddress||r.address)===n)||null}function jO({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Zr(e?.minPrice,"gmx minPrice"),i=Zr(e?.maxPrice,"gmx maxPrice"),a=BigInt(r),s=10000n;return n==="marketIncrease"?(t?i*(s+a)/s:o*(s-a)/s).toString():(t?o*(s-a)/s:i*(s+a)/s).toString()}function zO(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function VO(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Ht(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 WO(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:Ht(t,"account",a=>re(a)),market:Ht(t,"market",a=>re(a)),initialCollateralToken:Ht(t,"initialCollateralToken",a=>re(a)),key:Ht(o,"key",a=>String(a).toLowerCase()),reason:Ht(i,"reason",a=>String(a)),sizeDeltaUsd:Ht(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:Ht(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:Ht(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:Ht(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:Ht(r,"isLong",a=>!!a)}}function GO(e={},t){if(re(e.address)!==re(t.eventEmitter))return null;let n;try{n=LO.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=BO[r];if(!o)return null;let i=WO(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||VO(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?re(s):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 mw(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function KO(e=[],{chainId:t}={}){let n=eo(t);return(Array.isArray(e)?e:[]).map(r=>GO(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function gw(e={},t={}){return k(`${Zs(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rp(e={},t={}){return k(`${Zs(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yw(e={},t={}){return k(`${Zs(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function to(e={},t={}){return k(`${Zs(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function bw(e={}){let t=await to({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function ww(e={},t={}){let n=eo(e.chainId??42161),r=ht(e.account||e.owner||e.user,"gmx account"),o=lr(e.start??0,"gmx start"),i=lr(e.end??e.limit??20,"gmx end"),a=hw.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:re(n.reader),dataStore:re(n.dataStore),account:re(r),raw:c}}async function xw(e={},t={}){let n=eo(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=hw.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:re(n.reader),dataStore:re(n.dataStore),key:r,raw:a}}async function Sw(e={},t={}){let n=eo(e.chainId??42161),r=t.receipt||await qo({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=KO(r.logs||[],{chainId:n.chainId}),a=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,s=a?i.filter(u=>u.orderKey===a):i;if(s.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:a?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=s.reduce((u,d)=>mw(d.status)>=mw(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?re(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:re(n.eventEmitter),events:s,receipt:r}}async function kw(e={},t={}){let n=eo(e.chainId??42161),r=FO(e.orderType||e.type),o=UO(e.decreasePositionSwapType),i=ht(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=ht(e.receiver||i,"gmx receiver"),s=ht(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?ht(e.callbackContract,"gmx callbackContract"):uw,l=e.uiFeeReceiver?ht(e.uiFeeReceiver,"gmx uiFeeReceiver"):uw,u=ht(e.market||e.marketToken,"gmx market"),d=ht(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Zr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):lr(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Zr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Zr(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 w=MO(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[y,b]=await Promise.all([rp({chainId:n.chainId},t),to({chainId:n.chainId},t)]),S=DO(qO(y,"markets"),u);if(!S)throw new Error("gmx market not found in public registry");if(S.isListed===!1)throw new Error("gmx market is not listed");let _=ht(S.indexToken,"gmx market indexToken"),T=ht(S.longToken,"gmx market longToken"),E=ht(S.shortToken,"gmx market shortToken"),A=re(d);if(![re(T),re(E)].includes(A))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let v=zO(S,x);if(v>0n&&m>v)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let N=HO(b,_);if(!N)throw new Error("gmx index ticker not found");let B=e.acceptablePrice?Zr(e.acceptablePrice,"gmx acceptablePrice").toString():jO({ticker:N,isLong:x,typeKey:r.key,maxSlippageBps:w}),te=(e.swapPath||[]).map(he=>ht(he,"gmx swapPath market"));if(te.length>3)throw new Error("gmx swapPath too long for guarded slice");let Z=lr(e.triggerPrice??"0","gmx triggerPrice"),$=lr(e.callbackGasLimit??"0","gmx callbackGasLimit"),H=lr(e.minOutputAmount??"0","gmx minOutputAmount"),U=lr(e.validFromTime??"0","gmx validFromTime"),J=!!e.shouldUnwrapNativeToken,ke=e.autoCancel==null?!0:!!e.autoCancel,pe=String(e.referralCode||$O);if(!/^0x[0-9a-fA-F]{64}$/.test(pe))throw new Error("gmx referralCode must be bytes32 hex");let Yt=Array.isArray(e.dataList)?e.dataList:[];for(let he of Yt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(he)))throw new Error("gmx dataList entries must be bytes32 hex");let un={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:te},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:Z,acceptablePrice:BigInt(B),executionFee:f,callbackGasLimit:$,minOutputAmount:H,validFromTime:U},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:J,autoCancel:ke,referralCode:pe,dataList:Yt},R=[];r.key==="marketIncrease"&&p>0n&&R.push(Js.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(Js.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(Js.encodeFunctionData("createOrder",[un]));let F=Js.encodeFunctionData("multicall",[R]),Y={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:re(i),receiver:re(a),exchangeRouter:re(n.exchangeRouter),router:re(n.router),orderVault:re(n.orderVault),market:re(u),indexToken:re(_),initialCollateralToken:re(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:B,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return O({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:re(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:re(d),spender:re(n.router),amount:p.toString()}:null,gmxGuard:Y,transaction:{chainId:n.chainId,from:re(i),to:re(n.exchangeRouter),data:F,value:f.toString(),gmxGuard:Y}},{provider:"gmx",kind:"gmx-order"})}et();var _n="oracle.hl.entry-state.v1",nR=8,rR=24*365;function ue(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function no(e){return e==null||e===0?0:e>0?1:-1}function Li(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function oR(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||tc(tR(),".config","oracle")}function Aw(e={}){return tc(oR(e),"hl-entry-states")}function ec(e,t,n){return n==null&&e.push(t),n}function iR(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(a=>String(a?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function sn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function aR(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:ue(a.time),rate:ue(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return sn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)no(o[a].rate)!==no(o[a-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 sR(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return sn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=ue(a.peggedUSD??a.usd??i.circulatingPrevDay?.peggedUSD);s!=null&&(r+=s,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:sn("defillama.stablecoins","no peggedUSD")}function vw(e,t){let n=ue(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 cR(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return sn("gmx.tickers","no matching symbol");let c=vw(s.minPrice,n),l=vw(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return sn("gmx.tickers","unreadable price");let d=n!=null&&n>0?Li(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?sn("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(s.tokenSymbol||s.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function lR({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?sn("hl-info.fundingHistory","not fetched"):aR(r,{coin:e,asOfMs:n}),llamaStables:o==null?sn("defillama.stablecoins","not fetched"):sR(o,n),gmxTicker:i==null?sn("gmx.tickers","not fetched"):cR(i,{coin:e,hlMark:t,asOfMs:n})}}function Ew(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=ue(s?.px),l=ue(s?.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 a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function uR(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 a=ue(i.szi),s=ue(i.positionValue)!=null&&a?Math.abs(ue(i.positionValue)/a):null,c=ue(i.entryPx),l=ue(i.liquidationPx),u=a==null?null:a>0?"long":a<0?"short":null,d=null,p=s??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 a==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:a,entryPx:c,liquidationPx:l,leverage:ue(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function dR({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:_n,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=iR(n,e);if(!d)return{schema:_n,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=ec(u,"markPx",ue(m.markPx)),h=ec(u,"oraclePx",ue(m.oraclePx)),g=ue(m.midPx),w=ue(m.premium),x=ec(u,"fundingRate",ue(m.funding)),y=ec(u,"openInterestCoin",ue(m.openInterest)),b=ue(m.dayNtlVlm),S=Array.isArray(m.impactPxs)?m.impactPxs:[],_=ue(S[0]),T=ue(S[1]),E=x==null?null:x*(rR/nR)*100,A=y==null||f==null?null:y*f,v=i==null||i===0||y==null?null:(y-i)/i*100;v==null&&u.push("oiDeltaPct");let N=r?.levels,B=Array.isArray(N)?N[0]:[],te=Array.isArray(N)?N[1]:[],Z=ue(B?.[0]?.px),$=ue(te?.[0]?.px);Z==null&&u.push("book.bidPx"),$==null&&u.push("book.askPx");let H=Ew(te,Number(t)||0,"buy"),U=Ew(B,Number(t)||0,"sell");H.fillable||u.push("book.buyFillable"),U.fillable||u.push("book.sellFillable");let J=g??f,ke=H.avgFillPx==null||J==null?null:Li(H.avgFillPx,J),pe=U.avgFillPx==null||J==null?null:Li(J,U.avgFillPx),Yt=uR(o,e);for(let Y of Yt.unknown||[])u.push(Y);let un=ue(m.prevDayPx),R=f==null||un==null||un===0?null:(f-un)/un*100;R==null&&u.push("change24hPct");let F=lR({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return F.fundingPath.unknown&&u.push("overlays.fundingPath"),F.llamaStables.unknown&&u.push("overlays.llamaStables"),F.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:_n,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:Li(f,h),fundingRate:x,fundingAprPct:E,openInterestCoin:y,openInterestUsd:A,oiDeltaPct:v,dayNtlVolumeUsd:b,change24hPct:R,impactBidPx:_,impactAskPx:T,maxLeverage:p.maxLeverage??null,book:{bidPx:Z,askPx:$,spreadBps:Z==null||$==null?null:Li($,Z),notionalUsd:Number(t)||0,buy:H,sell:U,buySlipBps:ke,sellSlipBps:pe},position:Yt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Iw(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 a=n==="long"?e.book?.buy:e.book?.sell;if(!a)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!a.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${a.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 s=e.position?.liqDistancePct;e.position?.present?s==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:s<5?"counter":"aligned",note:`${s.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 pR(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 mR({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==_n||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=pR(n),a=Iw(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:_n,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:rt.ALERT_ONLY},c=Aw({...o,configDir:r||o.configDir});XO(c,{recursive:!0,mode:448});let l=tc(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return eR(u,`${JSON.stringify(s,null,2)}
144
- `,{mode:384}),ZO(u,l),s}function op(e={}){let t=Aw(e),n=[];try{n=JO(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(QO(tc(t,r),"utf8")))}function fR(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:rt.ALERT_ONLY};let r=e.see,o=t;no(r.fundingRate)!==no(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),no(r.premium)!==no(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,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="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:_n,id:e.id,coin:e.see.coin,side:e.side,actionMode:rt.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function _w(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await dt(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 Bi(e={},t={}){let n=e.coin,r=ue(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([dt(t),n?Pr(n,t).catch(()=>null):Promise.resolve(null),e.user?Or(e.user,t).catch(()=>null):Promise.resolve(null),n?as({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Cs({},t).catch(()=>null),to({chainId:42161},t).catch(()=>null)]);return dR({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:ue(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Tw(e={},t={}){let n=e.see&&e.see.schema===_n?e.see:await Bi(e,t);return{see:n,...Iw(n,e.side)}}async function Nw(e={},t={}){let n=e.see&&e.see.schema===_n?e.see:await Bi(e,t);return mR({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Pw(e={},t={}){let n=e.locked||op(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:rt.ALERT_ONLY};let r=await Bi({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return fR(n,r)}et();ms();bs();async function Cw(e={}){let t=await oi(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Ow(e={},t={}){let n=e.coin,r=e.outcome==null?null:gn(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=$w(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=ip(i)));let a=n==null?null:yn(n);if(n!=null&&!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??a?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await oi(t))?.outcomes||[]).find(f=>{try{return gn(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=ip(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(a&&a.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=gn(r,i).coin}if(a=yn(n),!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&a.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&a.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let s=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,s==null?delete c.side:c.side=s,Br(c,t)}async function Rw(e={},t={}){let n=e.coin,r=e.outcome==null?null:gn(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=$w(e.outcomeSide):(o=e.side,o!=null&&(o=ip(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=gn(r,o).coin}let i=yn(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 a={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete a.side,fi(a,t)}function $w(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function ip(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")}X();Rr();var zH="0x"+"00".repeat(32);function Lw(e,t){let n=BigInt(_e(e.makerAmount,"poly: makerAmount")),r=BigInt(_e(e.takerAmount,"poly: takerAmount"));if(n<=0n||r<=0n)throw new Error("poly: order amounts must be positive integer micro-units");return Number(t==="BUY"?n:r)/1e6}Rr();var yR=new Set(["https://clob.polymarket.com/order"]),Mi=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),KH=Object.freeze(Mi.map(e=>e[0])),bR=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),wR="0xe111180000d2663c0091e4f400237545b87b996b",xR="0xe2222d279d744050d28e00520010520000310f59",Bw=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function Mw(e){let t=String(e||"").replace(/\/$/,"");if(!yR.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Fw(e){let t=pt(e,"poly: exchange").toLowerCase();if(!bR.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Uw(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=Bw(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(pt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Mw(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(Fw(o.verifyingContract),Fw(n.exchange),pt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==pt(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?xR:wR;if(pt(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==Mi.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let g=0;g<Mi.length;g+=1)if(s[g]?.name!==Mi[g][0]||s[g]?.type!==Mi[g][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(pt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(pt(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=Bw(n.tokenId,"tokenId",80);if(pt(a.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(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=Lw(a,d),m=Ce(n.notionalUsdc,6,"poly: notionalUsdc"),f=Ce(p,6,"poly: computed notional");if(m!==f)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let h=t.maxNotionalUsd??t.maxNotionalUsdc;if(h!=null){let g=Ce(h,6,"poly: maxNotionalUsd");if(f>g)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:String(p),notional:String(p),fee:"0",kind:r,tokenId:l,side:d,submitTo:Mw(n.submitTo)})}function SR(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 qw(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)),a={version:1,surface:"poly",action:"order",owner:SR({...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,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 Uw(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as t9,randomInt as kR}from"node:crypto";import{keccak256 as r9,concat as o9,zeroPadValue as i9,getCreate2Address as a9,AbiCoder as s9}from"ethers";var Vw=137;var vR="0xE111180000d2663C0091e4f400237545B87B996B",ER="0xe2222d279d744050d28e00520010520000310F59",Dw="0x0000000000000000000000000000000000000000000000000000000000000000",ap=6;var AR={name:"Polymarket CTF Exchange",version:"2",chainId:Vw},IR={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"}]},Hw={"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}};function nc(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function rc(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function jw(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function _R(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function TR(e,t,n,r){let o=_R(Number(n),r.price);if(e==="BUY"){let c=rc(Number(t),r.size),l=c*o;return nc(l)>r.amount&&(l=jw(l,r.amount+4),nc(l)>r.amount&&(l=rc(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=rc(Number(t),r.size),s=a*o;return nc(s)>r.amount&&(s=jw(s,r.amount+4),nc(s)>r.amount&&(s=rc(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function zw(e){let t=Number(e).toFixed(ap),[n,r=""]=t.split(".");return(n+r.padEnd(ap,"0").slice(0,ap)).replace(/^0+/,"")||"0"}function NR(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:a,negRisk:s=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=Dw,builder:p=Dw}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!a)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=Hw[String(c)]||Hw["0.01"],{rawMakerAmt:g,rawTakerAmt:w}=TR(n,f,m,h),x=zw(g),y=zw(w),b=String(kR(1,2**31-1)),S=Date.now().toString(),_=n==="BUY"?0:1,T=s?ER:vR,E={salt:b,maker:i,signer:a,tokenId:String(t),makerAmount:x,takerAmount:y,side:_,signatureType:u,timestamp:S,metadata:d,builder:p};return{domain:{...AR,verifyingContract:T},types:IR,value:E,orderType:l,side:n,notionalUsdc:n==="BUY"?g:w,exchange:T,negRisk:s}}function Ww(){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 Gw(e={},t={}){let n=NR(e),r={provider:"poly-clob",kind:"poly-order",chainId:Vw,tokenId:String(e.tokenId),side:n.side,orderType:n.orderType,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=qw(r,e,t)}catch{r.oraclePrepared=!1}return O(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as t$,keccak256 as dx}from"ethers";import{createHash as CR}from"node:crypto";import{wordlists as OR}from"ethers";var Xw=1,RR=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),$R=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],LR=new Set([12,15,18,21,24]);function BR(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return LR.has(t.length)&&t.every(n=>OR.en.getWordIndex(n)>=0)}var MR=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,FR=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,UR=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function qR(e){let t=Qw(e);return UR.has(t)||FR.test(t)}var io=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Qw(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function DR(e){let t=Qw(e);return[...RR].some(n=>t.includes(n))}function HR(e,t,n){if(typeof t=="string"){if($R.some(r=>r.test(t))||BR(t))throw new io(n);if(MR.test(t)&&!qR(e))throw new io(n)}}function ao(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return HR(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)=>ao(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(DR(o))throw new io(i);e[o]!==void 0&&(r[o]=ao(e[o],i,o))}return r}function _t(e){return ao(e)}function sp(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(sp).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${sp(e[t])}`).join(",")}}`}function Jw(e){return sp(ao(e))}function Zw(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: object required");let{receiptId:t,summary:n,...r}=e;return CR("sha256").update(Jw(r)).digest("hex")}function oo(e,...t){for(let n of t)if(e[n]!==void 0)return e[n]}function ro(e,t,n){let r=oo(e,...t);if(r==null)throw new TypeError(`action receipt: ${n} required`);return r}function jR(e){let t=oo(e,"balances","balanceChanges"),n=oo(e,"beforeBalances","balancesBefore","before"),r=oo(e,"afterBalances","balancesAfter","after");return t!==void 0?{balances:t}:n===void 0&&r===void 0?{}:{balances:{...n===void 0?{}:{before:n},...r===void 0?{}:{after:r}}}}function ex(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: input object required");ao(e);let t=oo(e,"txHash","transactionHash"),n=oo(e,"phase","stage","resultType")??(t==null?"prepare":"execute");if(n!=="prepare"&&n!=="execute")throw new TypeError('action receipt: phase must be "prepare" or "execute"');let r={receiptVersion:Xw,phase:n,intent:ro(e,["intent"],"intent"),route:ro(e,["route"],"route"),decodedAction:ro(e,["decodedAction","action"],"decodedAction"),policyChecks:ro(e,["policyChecks","checks"],"policyChecks"),allowlistHits:ro(e,["allowlistHits","allowlistMatches"],"allowlistHits"),prepareHash:ro(e,["prepareHash"],"prepareHash"),...t==null?{}:{txHash:t},...jR(e)},o=ao(r);return Object.freeze({...o,receiptId:Zw(o)})}var zR=ex;function Kw(e,t=[]){if(typeof e=="string"||typeof e=="number")return String(e);for(let n of t)if(e?.[n]!=null)return String(e[n]);return"recorded"}function Yw(e){if(typeof e=="boolean")return e;if(e&&typeof e=="object"){if(typeof e.ok=="boolean")return e.ok;if(typeof e.allowed=="boolean")return e.allowed;if(typeof e.passed=="boolean")return e.passed}return null}function tx(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=Kw(e.decodedAction,["type","action","method","name"]),n=Kw(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>Yw(l)===!0).length,i=r.filter(l=>Yw(l)===!1).length,a=Array.isArray(e.allowlistHits)?e.allowlistHits.length:Object.keys(e.allowlistHits||{}).length,s=e.txHash==null?"no transaction hash":`tx ${e.txHash}`,c=e.balances==null?"balances not provided":"before/after balances recorded";return`${e.phase} ${t} via ${n}; policy ${o} passed, ${i} failed; ${a} allowlist hit${a===1?"":"s"}; ${s}; ${c}; receipt ${e.receiptId}`}var VR=tx;X();uc();ac();var n$=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function r$(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=_t(e);for(let o of Object.keys(n))if(!n$.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 px(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=ix(n,o),a=ux(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new t$(a.abi,s).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...r$(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return O({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:a.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:a.abi,sourceHash:a.gate.sourceHash,bytecodeHash:dx(s),authorityReport:ax(i),simulationReceipt:p,verificationManifest:{contractName:a.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:a.gate.sourceHash,creationBytecodeHash:dx(s),constructorData:`0x${u.slice(s.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${a.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:a.gate.forgeBuild,forgeTests:a.gate.forgeTests,staticAnalysis:{tool:a.gate.staticAnalysis.tool,ok:a.gate.staticAnalysis.ok,skipped:a.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:cc},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"})}uc();fp();bs();L();var h$="https://api.geckoterminal.com/api/v2",mc=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||h$).replace(/\/$/,""),lo=e=>encodeURIComponent(String(e));async function hp(e={},t={}){let n=Math.max(1,Number(e.page||1));return k(`${mc(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function xx(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return k(`${mc(t)}/networks/${lo(e.network)}/pools/${lo(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Sx(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return k(`${mc(t)}/networks/${lo(e.network)}/tokens/${lo(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function kx(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)),k(`${mc(t)}/networks/${lo(e.network)}/pools/${lo(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function vx(e={}){let t=await hp({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();ge();qe();X();import{Interface as _x,getAddress as Tx,isAddress as y$}from"ethers";var b$="https://api.curve.finance/v1",Nx=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||b$).replace(/\/$/,""),w$=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Px="0x0000000000000000000000000000000000000000",gp=new _x(["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)"]),Ex=new _x(["function coins(uint256) view returns (address)"]);function Cx(e){let t=w$[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Vi(e,t){if(!y$(e))throw new Error(`${t} must be a valid EVM address`);return Tx(e)}function x$(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 Ax(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 Ox(e,t,n){return[e,t,n,...Array(8).fill(Px)]}function Rx(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function $x(e){return[e,...Array(4).fill(Px)]}async function S$({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Ex.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Ex.decodeFunctionResult("coins",c);i.push(Tx(l[0]))}return i}function Ix(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 Lx(e={}){return k(`${Nx(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function yp(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 k(`${Nx(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Bx(e={}){let t=await yp({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function bp(e={},t={}){let n=Number(e.chainId??8453),r=Cx(n),o=Vi(e.pool,"curve pool"),i=Vi(e.tokenIn,"curve tokenIn"),a=Vi(e.tokenOut,"curve tokenOut"),s=x$(e.amountIn,"curve amountIn"),c=Ax(e.nCoins??2,"curve nCoins",2,8),l=Ax(e.poolType,"curve poolType",1,4),u=t.rpcCall||q,d=await S$({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Ix(d,i,"tokenIn"),m=Ix(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=Ox(i,o,a),h=Rx(p,m,l,c),g=$x(o),w=gp.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),y=gp.decodeFunctionResult("get_dy",x),b=BigInt(y[0]);if(b<=0n)throw new Error("curve quote returned zero output");return ie({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:b.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(S=>S.map(_=>_.toString())),pools:g},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Mx(e={},t={}){let n=Number(e.chainId??8453),r=Cx(n),o=Vi(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Vi(e.receiver||e.recipient||o,"curve receiver"),a=await bp({...e,sender:o},t),s=Ox(a.tokenIn,a.pool,a.tokenOut),c=Rx(a.i,a.j,a.poolType,a.nCoins),l=$x(a.pool),u=gp.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return O({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,autoSlippage:a.autoSlippage,requiresApproval:{token:a.tokenIn,spender:r,amount:a.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:ye(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}L();ge();X();import{Interface as v$,getAddress as E$,isAddress as A$,keccak256 as Fx,toUtf8Bytes as Ux}from"ethers";var I$="https://api.morpho.org/graphql",fc=new v$(["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)"]),_$=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||I$;async function xp(e,t,n={}){return k(_$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var T$="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 } } } }",N$="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Wi(e,t){let n=String(e||"").trim();if(!A$(n))throw new Error(`morpho: ${t} must be an address`);return E$(n).toLowerCase()}function P$(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 wp(e){return Array.isArray(e)?`[${e.map(wp).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wp(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Gi(e,t,n,r,o={}){let i=fc.encodeFunctionData(n,r),s=await(o.rpcCall||q)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return fc.decodeFunctionResult(n,s)}function C$(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function qx(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return xp(T$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Sp(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return xp(N$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Dx(e={}){return{ok:(await xp("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Hx(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=Wi(e.vault||e.vaultAddress,"vault"),i=Wi(e.owner||e.from||e.sender,"owner"),a=Wi(e.receiver||i,"receiver"),s=P$(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Sp({chainId:n,first:100},t),u=C$(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await Gi(n,o,"asset",[],t),m=Wi(p,"vault asset");if((u?.asset?.address?Wi(u.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[x]=await Gi(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[y]=await Gi(n,o,"previewDeposit",[s],t);if(BigInt(y.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:y.toString()},h=fc.encodeFunctionData("deposit",[s,a])}else{let[x]=await Gi(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[y]=await Gi(n,o,"previewWithdraw",[s],t);if(BigInt(y.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:y.toString()},h=fc.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...g,calldataHash:Fx(Ux(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=Fx(Ux(wp(w))),O({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:a,amount:s,vaultInfo:u,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();ge();qe();X();import{Interface as R$,getAddress as kp,isAddress as $$}from"ethers";var L$="https://api-v3.balancer.fi/",B$=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||L$;async function Vx(e,t,n={}){return k(B$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var M$="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",jx=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"}}),F$="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",U$="0x0000000000000000000000000000000000000000",vp=new R$(["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)"]);function Wx(e){let t=Number(e??8453),n=jx[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(jx).join(", ")})`);return{chainId:t,...n}}function Gx(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===U$||t===F$.toLowerCase()}function hc(e,t){if(!$$(e))throw new Error(`${t} must be a valid EVM address`);return kp(e)}function zx(e,t,n){let r=String(e||"");return Gx(r)||/^weth$/i.test(r)?kp(t.weth):/^usdc$/i.test(r)?kp(t.usdc):hc(r,n)}function q$(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 Kx(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 Yx(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 Vx(M$,{first:n,chains:r,where:{chainIn:r}},t)}async function Xx(e={}){return{ok:(await Vx("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Ep(e={},t={}){let n=Wx(e.chainId),r=hc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=zx(o,n,"balancer tokenIn"),a=zx(e.tokenOut||"USDC",n,"balancer tokenOut"),s=q$(e.amountIn,"balancer amountIn"),c=hc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=vp.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Kx(e.userData)]),d=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=vp.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return ie({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:a,amountIn:s.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 Qx(e={},t={}){let n=Wx(e.chainId),r=hc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Gx(o),a=await Ep({...e,sender:r},t),s=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+s),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=vp.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Kx(e.userData)]);return O({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:ye(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}L();qe();X();import{getAddress as H$}from"ethers";var j$="https://api-v2.pendle.finance/core",z$=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),V$="0x0000000000000000000000000000000000000000",W$="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Jx=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||j$).replace(/\/$/,"");function gc(e,t){try{return H$(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function uo(e,t){return gc(e,t).toLowerCase()}function G$(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===W$||t===V$}function Ap(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 K$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:gc(t.token,`pendle input ${n} token`),amount:Ap(t.amount,`pendle input ${n} amount`)}))}function Y$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>gc(t,`pendle output ${n} token`))}function X$(e){let t=z$[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function Q$(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 Ap(t,"pendle output amount")}function J$(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!G$(r.token)).map(r=>({token:uo(r.token,"pendle approval token"),spender:uo(t,"pendle approval spender"),amount:Ap(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Ip(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)),k(`${Jx(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Zx(e={}){let t=await Ip({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function _p(e={},t={}){let n=Number(e.chainId??42161),r=X$(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=gc(e.receiver||o,"pendle receiver"),a=K$(e.inputs),s=Y$(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=We({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:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await k(`${Jx(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(uo(p.to,"pendle tx target")!==uo(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&uo(p.from,"pendle tx sender")!==uo(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=Q$(u),f=ie(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return O({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:J$(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:ye(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function eS(e={},t={}){let n=await _p(e,t),{transaction:r,...o}=n;return o}L();qe();X();import{isAddress as e2}from"ethers";var t2="https://api.odos.xyz",Tp=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||t2).replace(/\/$/,"");async function Np(e={}){return k(`${Tp(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function n2(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(!e2(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function tS(e={},t={}){let n=n2(e),r=We({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 k(`${Tp(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),a=i?.outAmounts?.[0];if(!i?.pathId||!a)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:a}}async function nS(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await tS(e,t);return{...ie(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 rS(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await tS(e,t),i=await k(`${Tp(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}),a=i?.transaction;if(!a?.to||!a?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(a.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(a.from&&String(a.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 s=ie(r,{chainId:n,venue:a.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(s.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:a.to,amount:String(p.amount)}));return O({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,simulation:i.simulation,requiresApproval:d,autoSlippage:s.autoSlippage,transaction:{chainId:n,from:a.from||e.userAddr,to:a.to,data:a.data,value:a.value??"0x0",...a.gas!=null?{gasLimit:a.gas}:{},...a.nonce!=null?{nonce:a.nonce}:{},slippageGuard:ye(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function oS(e={}){let t=await Np(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var iS=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,o2=/[<>&`*_~[\]()|\\]/g,i2=/[\u0000-\u001F\u007F]/g;function Pp(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(iS,"").replace(i2,"").replace(o2,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Cp(e){if(e==null)return!1;let t=String(e);return iS.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var aS=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"});function yc(e,t={}){let n=Number(e),r=t.baseUrl||aS[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function sS(e){return!!aS[Number(e)]}async function Op(e={},t={}){return k(`${yc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function cS(e={},t={}){if(!e.address)throw new Error("address required");return k(`${yc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lS(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return k(`${yc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function uS(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${yc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await k(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function dS(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 a=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!a||typeof a!="string")continue;let s=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(s)||s==="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=Pp(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Pp(o.name,{max:80,fallback:""})||null;n.push({address:a.toLowerCase().startsWith("0x")?a:`0x${a}`,symbol:l,name:u,decimals:c,amountRaw:s,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:Cp(o.symbol)||Cp(o.name)||void 0})}return n}async function pS(e={}){let t=await Op({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as s2}from"ethers";L();ge();et();var c2="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",fS=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function Tn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function bc(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function mS(e){if(!e)return null;try{return s2(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function pr(e={},t=process.env){let n=e.addresses||{},r=mS(n.evm||e.evmAddress||bc(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||bc(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||bc(t,"ORACLE_BITCOIN_ADDRESS"),a=mS(n.hyperliquid||e.hyperliquidAddress||bc(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?me(o,"portfolio Solana address"):null,bitcoin:i?Et(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Ki(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,a=10n**BigInt(r),s=i/a,c=String(i%a).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${c?`.${c}`:""}`}function po(e){let t=Number(e);return Number.isFinite(t)?t:null}function wc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Nn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function hS(e,t){let n=fS[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 l2(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"}`,a=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};a.amountRaw+=o,a.accounts+=1,n.program&&a.programs.add(n.program),t.set(i,a)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Ki(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 Rp(e,t){return{family:e,status:"unsupported",reason:t}}function $p(e,t){if(!e||e.status!=="ok")return e;let n=hS(t,e.symbol),r=po(e.amount),o=r!=null&&n.priceUsd!=null?wc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function gS(e={}){let t=pr({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function xc(e={},t={}){let n=new Date().toISOString(),r=pr(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(mn.map(R=>[R.chainId,R])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(fS))],u=o?Ie(()=>At(l,Tn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ve(c,e.concurrency||5,async R=>{let F=s.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 Y={...Tn(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},he=await Ie(()=>Xn(R,r.evm,Y));if(!he.ok)return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"unavailable",latencyMs:he.ms,error:he.error};let Le=F.nativeCurrency?.decimals??18,Qe=F.nativeCurrency?.symbol||"NATIVE",V=he.data.balanceWei,ve={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&sS(R)){let Gn=await Ie(()=>uS({chainId:R,address:r.evm},{...Tn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Gn.ok?ve={status:"ok",assets:dS(Gn.data,{fungibleOnly:!0}).map(Ro=>{let $o=Ki(Ro.amountRaw,Ro.decimals);return{...Ro,amount:$o,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Gn.ms}:ve={status:"unavailable",assets:[],reason:Gn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Gn.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"ok",latencyMs:he.ms,native:{status:"ok",symbol:Qe,amountRaw:V,decimals:Le,amount:Ki(V,Le)},fungibleTokens:ve,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ve.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=Tn(t,"solana"),F=await Ie(()=>ws({address:r.solana},R)),Y=i||a?await Promise.all([Ie(()=>bi({owner:r.solana,programId:sd},R)).then(ve=>({...ve,program:"spl-token"})),Ie(()=>bi({owner:r.solana,programId:c2},R)).then(ve=>({...ve,program:"token-2022"}))]):[],he=l2(Y),Le=he.filter(ve=>ve.classification==="collectible-candidate"),Qe=he.filter(ve=>ve.classification!=="collectible-candidate"),V=Y.filter(ve=>!ve.ok).map(ve=>ve.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Y.some(ve=>ve.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:Ki(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?V.length===Y.length?"unavailable":V.length?"partial":"ok":"not-requested",assets:i?Qe:[],errors:V,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?V.length===Y.length?"unavailable":"partial":"not-requested",assets:a?Le:[],errors:V,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=Tn(t,"bitcoin"),F=Tn(t,"bitcoinMeta"),[Y,he,Le]=await Promise.all([Ie(()=>Ss({address:r.bitcoin},R)),i?Ie(()=>vs({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Ie(()=>qr({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),Qe=he.ok?he.data:null,V=Le.ok?Le.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:Y.ok||Qe?.ok||V?.ok?"ok":"unavailable",native:Y.ok?{status:"ok",symbol:"BTC",amountRaw:Y.data.balanceSats,decimals:8,amount:Ki(Y.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:Y.error},fungibleTokens:{status:i?Qe?.ok?"ok":"unavailable":"not-requested",assets:Qe?.balances||[],error:Qe?.ok?null:Qe?.error||he.error,verification:"indexer-reported"},collectibles:{status:a?V?.ok?"ok":"unavailable":"not-requested",assets:V?.inscriptions||[],error:V?.ok?null:V?.error||Le.error,unknownNotEmpty:!!V?.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=Tn(t,"hyperliquid"),[F,Y,he]=await Promise.all([Ie(()=>os(r.hyperliquid,R)),Ie(()=>Or(r.hyperliquid,R)),Ie(()=>Qt(R))]),Le=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(V=>Nn(V.total)||Nn(V.hold)).map(V=>({coin:V.coin||null,total:String(V.total??"0"),hold:String(V.hold??"0"),priceUsd:null,usdValue:null})),Qe=(Y.ok&&Array.isArray(Y.data?.assetPositions)?Y.data.assetPositions:[]).map(V=>V.position||V).filter(V=>Nn(V.szi)).map(V=>({coin:V.coin||null,size:String(V.szi??"0"),entryPrice:V.entryPx??null,positionValueUsd:V.positionValue??null,unrealizedPnlUsd:V.unrealizedPnl??null,liquidationPrice:V.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||Y.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Le,error:F.ok?null:F.error},perps:{status:Y.ok?"ok":"unavailable",accountValueUsd:Y.data?.marginSummary?.accountValue??null,withdrawableUsd:Y.data?.withdrawable??null,positions:Qe,error:Y.ok?null:Y.error},mids:he.ok?he.data:{},source:"hyperliquid-info"}})(),[h,g,w,x,y]=await Promise.all([d,p,m,f,u]),b=y.ok?y.data:null,S=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),_=[];for(let R of h){if(R.family!=="evm"||R.fungibleTokens?.status!=="ok")continue;let F=S[R.chainId];if(F)for(let Y of R.fungibleTokens.assets||[])Y.address&&_.push(`${F}:${String(Y.address).toLowerCase()}`)}let T=null;if(o&&_.length){let R=[...new Set(_)],F=await Ie(()=>At(R,Tn(t,"prices")));F.ok&&(T=F.data)}let E=h.map(R=>{let F=R.native?{...R,native:$p(R.native,b)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Y=S[F.chainId],he=F.fungibleTokens.assets.map(Le=>{let Qe=String(Le.symbol||"").toUpperCase(),V=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(Qe)&&(V=1),V==null&&Y&&Le.address&&T?.coins){let Qf=`${Y}:${String(Le.address).toLowerCase()}`,Ro=T.coins[Qf],$o=Number(Ro?.price);Number.isFinite($o)&&$o>0&&(V=$o)}let ve=po(Le.amount),Gn=ve!=null&&V!=null?wc(ve*V):null;return{...Le,priceUsd:V,usdValue:Gn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:he}}}return F});g.native&&(g.native=$p(g.native,b)),w.native&&(w.native=$p(w.native,b));let A=0,v=0,N=0;for(let R of[...E,g,w]){R.native?.status==="ok"&&Nn(R.native.amount)&&(R.native.usdValue!=null?(A+=R.native.usdValue,v+=1):N+=1);for(let F of R.fungibleTokens?.assets||[])!Nn(F.amount)&&!Nn(F.amountRaw)||(F.usdValue!=null?(A+=F.usdValue,v+=1):N+=1)}let B=hS(b,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),Y=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?B.priceUsd||po(x.mids?.HYPE):po(x.mids?.[R.coin]),he=po(R.total);R.priceUsd=Y,R.usdValue=he!=null&&Y!=null?wc(he*Y):null,Nn(R.total)&&(R.usdValue!=null?(A+=R.usdValue,v+=1):N+=1)}let te=po(x.perps?.accountValueUsd);te!=null&&te!==0&&(A+=te,v+=1);let Z=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>Nn(R.amount)).length,$=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;N+=Z+$;let H=[...E,g,w,x],U=R=>H.filter(F=>F.status===R).length,J=[],ke=E.filter(R=>R.fungibleTokens?.status==="unavailable"),pe=E.filter(R=>R.fungibleTokens?.status==="ok");ke.length&&!pe.length?J.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):ke.length&&J.push(`EVM token discovery partial: Blockscout covered ${pe.length} chain(s); ${ke.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&J.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&J.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),y.ok||J.push(`Price provider unavailable: ${y.error}`);let Yt=[Rp("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Rp("sui","Sui balance adapter is not installed"),Rp("aptos","Aptos balance adapter is not installed")],un=H.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:H.length,ok:U("ok"),unavailable:U("unavailable"),notConfigured:U("not-configured"),unsupported:U("unsupported")+Yt.length,evmChainsRequested:c.length,evmChainsOk:E.filter(R=>R.status==="ok").length},valuation:{knownUsd:wc(A),label:"known priced value, not a complete portfolio total",pricedItems:v,unpricedNonzeroItems:N,complete:N===0&&!un&&U("unavailable")===0&&U("not-configured")===0&&Yt.length===0,priceSource:o?"DefiLlama":null,priceStatus:y.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,g,w,x],unsupportedFamilies:Yt,warnings:J}}import{constants as kc}from"node:fs";import{chmod as $2,mkdir as L2,open as B2,readFile as M2}from"node:fs/promises";import{createHash as F2,randomUUID as U2}from"node:crypto";import q2 from"node:os";import fo from"node:path";L();L();var d2=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"]),p2=new Set(["image/jpeg","image/png","image/webp"]);function m2(e){let t=String(e||"").toLowerCase();return d2.some(n=>t===n||t.endsWith(`.${n}`))}function f2(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 yS(e){let t=f2(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!m2(n.hostname)?null:n}async function h2(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=yS(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 a=await Ie(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!a.ok)throw new Error(a.error);let s=a.data;if(s.status>=300&&s.status<400){let d=s.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=yS(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!s.ok)throw new Error(`image HTTP ${s.status}`);let c=String(s.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!p2.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.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 Lp(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function g2(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function bS(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 a=n.slice((o-1)*r,o*r),s=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let y of a){if(c>=l){s.push({item:y,image:null,error:"gallery page byte cap reached"});continue}try{let b=await h2(y.imageUrl||y.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=b.bytes,s.push({item:y,image:b,error:null})}catch(b){s.push({item:y,image:null,error:String(b?.message||b).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(a.length/u),h=u*d,g=m+f*p,w=s.map(({item:y,image:b,error:S},_)=>{let T=_%u,E=Math.floor(_/u),A=T*d,v=m+E*p,N=b?`<image x="${A+14}" y="${v+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${A+14}" y="${v+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${A+170}" y="${v+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,B=Lp(g2(y,_).slice(0,34)),te=Lp(y.chain||"unknown chain");return`${N}<text x="${A+16}" y="${v+350}" fill="#f3f5f7" font-size="17" font-weight="600">${B}</text><text x="${A+16}" y="${v+376}" fill="#8d98a8" font-size="13">${te}${S?" \xB7 placeholder":""}</text>`}).join(""),x=`<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 ${Lp(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(y=>y.image).length,placeholders:s.filter(y=>!y.image).map(y=>({assetKey:y.item.assetKey||null,name:y.item.name||null,sourceUrl:y.item.imageUrl||null,error:y.error})),rasterOnly:!0,externalScripts:!1}}var y2=[/\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],b2=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,w2=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function x2(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;b2.test(n)&&t.push("url-in-name");let i=y2.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),w2.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 a=e.estimatedValueUsd==null&&e.estimatedValueSats==null,s=!Array.isArray(e.traits)||e.traits.length===0;a&&s&&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 wS(e={}){let t=x2(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}X();var S2=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"}]),k2=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function mr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Yi(e,t){let n=await Ie(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function v2(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 E2(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 A2(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 kS(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function I2(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 _2(e,t){let n=kS(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,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-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function T2(e){let t=new Map;for(let n of e){let r=kS(n);t.has(r)||t.set(r,n)}return[...t.values()]}function N2(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.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 vS(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function mo(e={},t={}){let n=new Date().toISOString(),r=pr(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=S2.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=mr(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await Ve(l,4,async b=>({row:b,result:await Yi(`opensea-${b.chain}`,()=>Go({chain:b.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:b,result:S}of u)if(S.ok){let _=S.data.nfts.map(T=>({...T,family:b.family,chainId:b.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(..._),a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:S.data.complete?"ok":"partial",count:_.length,complete:S.data.complete,next:S.data.next,source:"opensea"})}else a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"unavailable",error:S.error,source:"opensea"});if(!r.evm)for(let b of i.filter(S=>S.family!=="solana"))a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let b=await Yi("opensea-solana",()=>Go({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(b.ok){let S=b.data.nfts.map(_=>({..._,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...S),a.push({family:"solana",chain:"solana",status:b.data.complete?"ok":"partial",count:S.length,complete:b.data.complete,next:b.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:b.error,source:"opensea"})}else(!o||o.has("solana"))&&a.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let b=await Yi("satflow-wallet-contents",()=>As({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},mr(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let S=v2(b.data.contents).map(T=>E2(T,r.bitcoin));s.push(...S);let _=S.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:_?"ok":"partial",count:S.length,complete:_,source:"satflow"})}else{let S=await Yi("bitcoin-meta-inscriptions",()=>qr({address:r.bitcoin},mr(t,"bitcoinMeta")),t.timeoutMs??35e3),_=S.ok&&S.data?.ok&&Array.isArray(S.data.inscriptions)?S.data.inscriptions:[];s.push(..._.map(T=>A2(T,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:_.length?"partial":"unavailable",count:_.length,complete:!1,source:_.length?"bitcoin-meta":"satflow",error:_.length?"Satflow unavailable; fallback has IDs only":b.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let b of[...new Set([r.evm,r.solana].filter(Boolean))]){let S=await Yi(`opensea-pnl-${b}`,()=>Xa({address:b},c),t.timeoutMs??35e3);d.push(S.ok?{status:"ok",...S.data}:{status:"unavailable",address:b,source:"opensea-indexed-account-pnl",error:S.error})}let p=I2(e.costBasis),m=T2(s).map(b=>_2(b,p)).map(b=>wS(b)),f=m.filter(b=>!b.spam),h=m.filter(b=>b.spam),g=f.filter(b=>b.estimatedValueUsd!=null&&Number.isFinite(Number(b.estimatedValueUsd))),w=Math.round(g.reduce((b,S)=>b+Number(S.estimatedValueUsd),0)*100)/100,x=f.length-g.length,y=a.filter(b=>b.status!=="ok"||b.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:k2,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:g.length,unvaluedItems:x,complete:x===0&&y.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:N2(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 xS(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 P2(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 ES(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 Qo(e,mr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=xS(e.expiry??e.endTime,"Solana NFT listing expiry");return Ys({...e,expiry:r},mr(t,"magiceden"))}if(n==="satflow"){let r=xS(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Is({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:P2(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},mr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Bp(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 Mp(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Sc(e){return String(e??"").trim().toLowerCase()}function C2(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Sc(t),i=Sc(n);return!o||!i?!1:r.some(a=>Sc(a.trait_type??a.traitType??a.type)===o&&Sc(a.value??a.trait_value??a.traitValue)===i)}function O2(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function SS(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 Fp(e){return Math.round(Number(e)*1e6)/1e6}function Pn(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 AS(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Pn(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(T=>e[T]==null||e[T]==="");if(o.length)return Pn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Bp(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Bp(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Bp(e.traitFloorEth,"traitFloorEth"),d=Mp(e.collectionFloorEth),p=Mp(e.maxListingAgeMs),m=Mp(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Pn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Pn(e,"invalid-min-trait-sales");if(u<=0)return Pn(e,"trait-floor-unavailable");let f=T=>C2(T,e.traitType,e.traitValue)&&O2(T,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(T=>{if(!m)return!0;let E=SS(T,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=Fp(h.reduce((T,E)=>T+Number(E.priceEth??E.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return Pn(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(T=>{let E=Number(T.priceEth??T.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let A=SS(T,["listedAt","createdAt","timestamp"]);return A!=null&&i-A<=p}).map(T=>{let E=Number(T.priceEth??T.price),A=Math.round((u-E)/u*1e4);return{...T,priceEth:E,discountBps:A}}).filter(T=>T.discountBps>=s).sort((T,E)=>T.priceEth-E.priceEth||E.discountBps-T.discountBps),y={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.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."},b=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(b)||b<1)return Pn(e,"invalid-min-trait-listings",y);if(x.length<b)return Pn(e,"trait-listing-depth-insufficient",y);let S=x[0],_=O({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:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Fp(S.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:y,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:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Fp(S.priceEth),discountBps:S.discountBps},evidence:y,prepareIntent:_}}async function IS(e={},t={}){let n=await mo({...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 _S(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await mo({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await bS({...e,items:n},mr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var TS=10*1024*1024,CS=1e3;function Cn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ho(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function NS(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 OS(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 D2(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function RS(e={}){return`portfolio_${F2("sha256").update(D2(e)).digest("hex").slice(0,20)}`}function $S(e={}){if(e.historyFile)return fo.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return fo.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||fo.join(q2.homedir(),".hermes");return fo.join(fo.resolve(n),"state","oracle","portfolio-history.jsonl")}function H2(e){let t=Cn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?ho(t):null}function j2(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Cn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?ho(t):null}function z2(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Cn(c.usdValue);return l==null?s:s+l},0),i=Cn(n.perps?.accountValueUsd),a=ho(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Cn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Cn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:ho(r)})}return t}function V2(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 W2(e,t){let n=$S(t),r=`${JSON.stringify(e)}
145
- `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await L2(fo.dirname(n),{recursive:!0,mode:448});let o=kc.O_APPEND|kc.O_CREAT|kc.O_WRONLY|(kc.O_NOFOLLOW||0),i=await B2(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await $2(n,384),n}async function LS(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||xc,o=t.nftInventoryImpl||mo,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(S=>({status:"unavailable",error:String(S?.message||S).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=H2(s),u=j2(c),d=[l,u].filter(S=>S!=null),p=d.length?ho(d.reduce((S,_)=>S+_,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||pr(e,t.env||process.env),w=RS(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let y={schemaVersion:1,id:`snapshot_${U2()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(S=>[S,!!g?.[S]])),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(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:z2(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:V2(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await W2(y,t),snapshot:y,balance:s,nfts:c}}async function G2(e){let t=$S(e);try{let n=await M2(t);if(n.byteLength>TS)throw new Error(`portfolio history exceeds ${TS} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
146
- `))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):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 K2(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=pr(e,t.env||process.env);return Object.values(n).some(Boolean)?RS(n):null}async function Up(e={},t={}){let n=OS(e.limit,100,1,CS,"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=NS(e.since,"portfolio history since"),i=NS(e.until,"portfolio history until"),a=K2(e,t),s=await G2(t),c=s.snapshots.filter(d=>!(a&&d.portfolioId!==a||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=>Cn(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:s.file,portfolioId:a,order:r,totalStored:s.snapshots.length,totalMatching:l,corruptLines:s.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 PS(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function vc(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function Y2(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 X2(e,t){let c=e.map(y=>y.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let y=Math.max(1,Math.abs(l)*.05);l-=y,u+=y}else{let y=(u-l)*.1;l=Math.max(0,l-y),u+=y}let d=y=>e.length===1?1240/2:100+1040*y/(e.length-1),p=y=>570-(y-l)/(u-l)*470,m=e.map((y,b)=>`${b?"L":"M"}${d(b).toFixed(2)},${p(y.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(y,b)=>{let S=b/4,_=100+S*470,T=u-S*(u-l);return`<line x1="100" y1="${_}" x2="1140" y2="${_}" stroke="#26313c" stroke-width="1"/><text x="86" y="${_+5}" text-anchor="end" fill="#8795a5" font-size="15">${PS(T)}</text>`}).join(""),h=e.map((y,b)=>`<circle cx="${d(b)}" cy="${p(y.value)}" r="5" fill="#b8f0ff"><title>${vc(y.recordedAt)}: ${PS(y.value)}</title></circle>`).join(""),g=vc(e[0].recordedAt.slice(0,10)),w=vc(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 ${vc(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">${w}</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 BS(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=OS(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Up({...e,order:"asc",limit:e.limit??CS},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:Cn(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=Y2(o,n),a=i[0].value,s=i.at(-1).value,c=ho(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=X2(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:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}ge();var J2=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"}}),Z2=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),eL=`0x${"0".repeat(64)}`;function tL(e){return!e||e==="0x"||e===eL}async function fr(e={},t={}){let n=t.rpcCall||q,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(f){return{address:r,chainId:o,status:"unavailable",error:f?.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 a=[],s=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(J2))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of Z2)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!tL(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{a.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=s.filter(f=>f.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function MS(e={}){let t=Date.now();try{let n=await fr({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"}}}qe();var rL=/^0x[0-9a-fA-F]{40}$/,FS=4663;function Ec(e,t){let n=String(e||"").trim();if(!rL.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function qp(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 Xi(e,t){return e==null||e===""?null:qp(e,t)}function oL({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:a,unsignedTx:s,args:c,opts:l}){let u=s?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=Ec(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=qp(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=Xi(u.gasLimit??c.gasLimit,"gasLimit"),h=Xi(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()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),x=Xl({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:w,secret:l.routeAttestationSecret}),y=ye(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),b={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:y.selectedBps,expiresAtMs:g+w},S=Xi(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return S&&(b.maxPriorityFeePerGas=S),c.nonce!==void 0&&(b.nonce=Number(c.nonce)),(c.txType!==void 0||S)&&(b.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(b.l1FeeWei=Xi(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(b.operatorFeeWei=Xi(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:y.selectedBps,expiresAtMs:g+w,fee:{oracleFeeBps:5},autoSlippage:y,artifact:{chainId:e,owner:o,transactions:[b]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function iL(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}ti();let n=lu(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function aL({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==K.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!==z.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==z.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==K.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),s.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),a.tokenIn||c.push("tokenIn is required to prepare"),a.amountIn||c.push("amountIn is required to prepare"),a.recipient||c.push("recipient is required to prepare"),c}async function US(e={},t={}){let n=Number(e.chainId??FS);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Ec(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Ec(e.tokenIn,"tokenIn"):null,i=e.recipient?Ec(e.recipient,"recipient"):null,a=e.amountIn==null?null:qp(e.amountIn,"amountIn"),s=iL(n,t.scanner),c=t.scanContractRisk||fr,[l,u,d]=await Promise.all([s.resolveToken(r),s.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await s.scoreRisk(r),m=null;s.supports?.("sellSimulation")&&a?m=await s.sellSimulation({token:r,amountIn:a,base:o||void 0}):s.supports?.("sellSimulation")&&(m=await s.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;s.supports?.("quote")&&o&&a&&(f=await s.quote({tokenIn:o,tokenOut:r,amountIn:a}));let h={...e,tokenIn:o,amountIn:a,recipient:i},g=aL({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,y=null;if(e.prepare===!0&&g.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{x=oL({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(b){y=String(b?.message||b).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!x,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!w,unsignedTx:w,localSignerEnvelope:x,localSignerBlockedReason:y,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function qS(){ti();let e=uu();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:FS,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"}}ge();ge();var cL=5,Dp=[50,75,90],DS=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function hr(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 lL(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 Ac(e={},t={}){let n=t.rpcCall||q,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=DS[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(DS).join(", ")}`};let i,a,s,c;try{i=hr(e.maxFeePerGasWei,"maxFeePerGasWei"),a=hr(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=hr(e.gasLimit,"gasLimit"),c=hr(e.maxTotalGasWei,"maxTotalGasWei")}catch(T){return{status:"error",viable:!1,error:T.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${cL.toString(16)}`,"pending",Dp],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(T){return{status:"unavailable",viable:!1,error:T?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=hr(u?.baseFeePerGas,"baseFeePerGas")??hr(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(T=>{try{return hr(T?.[o.percentile],"reward")}catch{return null}}).filter(T=>T!=null&&T>0n),f=lL(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,w=d*o.baseFeeMultiplier+g,x=[];a!=null&&g>a&&(x.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,w=d*o.baseFeeMultiplier+g),i!=null&&w>i&&(x.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,g>w&&(g=w));let y=s!=null?s*w:null;c!=null&&y!=null&&y>c&&x.push({field:"totalGas",wanted:y.toString(),capped:c.toString()});let b=f==null||g>=f,S=c==null||y==null||y<=c,_=b&&S;return b||h.push(`tip cap ${g} is below the observed ${Dp[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),S||h.push(`worst-case gas ${y} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:_,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:Dp[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:y==null?null:y.toString(),clamps:x,notes:h}}ge();var dL="08c379a0",pL="4e487b71",mL=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 fL(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===dL)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===pL){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:mL[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 hL(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 gL(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 yL(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 Qi(e={},t={}){let n=t.rpcCall||q,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=yL(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=hL(f);if(!gL(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=fL(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,a.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){a.push(`gas estimation failed: ${f?.message||"unknown"}`)}a.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=s===p;return m&&a.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:s,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:a}}async function HS(e={}){let t=Date.now();try{let n=await Qi({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 wL=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:[]}]);function xL(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 SL(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 jS(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=SL(t);else if(o==="quantity")r+=xL(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function kL({address:e,chainId:t,minter:n,quantity:r,tx:o,nowMs:i,ttlMs:a=3e4}){if(!o?.gasLimit||!o?.maxFeePerGas)throw new Error("local-signer envelope requires gasLimit and maxFeePerGas");let s=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:s+Math.min(Math.max(Number(a)||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 Ic(e={},t={}){let n=t.rpcCall||q,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 a=i.slice(2).toLowerCase(),s=wL.filter(c=>a.includes(c.selector));return{status:"ok",address:r,chainId:o,found:s,notes:s.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function zS(e={}){let t=Date.now();try{let n=await Ic({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 Hp(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 a=await Ic({address:n,chainId:r},t);if(a.status!=="ok")return{status:a.status,error:a.error};if(!a.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:a.notes};let s=e.signature?a.found.find(y=>y.signature===e.signature):a.found[0];if(!s)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:a.found.map(y=>y.signature)};let c=a.found.length>1&&!e.signature,l=await fr({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Qi({chainId:r,tx:{from:o,to:n,data:jS(s,{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:s.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 Ac({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=jS(s,{minter:o,quantity:i})}catch(y){return{status:"error",error:y.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=Ga({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 ${a.found.length} mint entrypoints (${a.found.map(y=>y.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(y=>y.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 w=null,x=null;try{w=kL({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(y){x=String(y?.message||y).slice(0,200)}return{status:"ok",execution:w?"armed-local":"prepare-only",signed:w?"pending-local-signer":!1,broadcast:w?"pending-local-signer":!1,tx:f,localSignerEnvelope:w,localSignerBlockedReason:x,mintFunction:s.signature,alternatives:a.found.map(y=>y.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}X();import{createHash as wB}from"node:crypto";import{createHash as EL}from"node:crypto";var AL=1,IL=8,Oe=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},_L=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),TL=new Set(["family","id"]),NL=new Set(["id","startsAt","endsAt","eligibility"]),PL=new Set(["kind","proofFormat","proofDigest"]),CL=new Set(["amount","unit"]),OL=new Set(["value","unit"]);function go(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Oe(`${t} must be a plain object`);return e}function yo(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Oe(`${n} has unknown field ${r}`,"unknown-field")}function yt(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Oe(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function RL(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Oe(`${t} must be a positive safe integer`);return e}function jp(e,t){if(e=go(e,t),yo(e,CL,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Oe(`${t} requires amount and unit`,"ambiguous-unit");let n=yt(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Oe(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:yt(e.unit,`${t}.unit`)}}function zp(e,t){if(e=go(e,t),yo(e,OL,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Oe(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function $L(e,t){e=go(e,t),yo(e,PL,t);let n=yt(e.kind,`${t}.kind`),r=yt(e.proofFormat,`${t}.proofFormat`),o=yt(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Oe(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function LL(e,t){let n=`stages[${t}]`;e=go(e,n),yo(e,NL,n);let r=zp(e.startsAt,`${n}.startsAt`),o=zp(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Oe(`${n} must end after it starts`,"invalid-stage-range");return{id:yt(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:$L(e.eligibility,`${n}.eligibility`)}}function Vp(e){if(e=go(e,"input"),yo(e,_L,"input"),e.version!==AL)throw new Oe("version must be 1");let t=go(e.chain,"chain");yo(t,TL,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>IL)throw new Oe("stages must contain 1 through 8 entries","stage-count");let r=n.map(LL).sort((a,s)=>a.startsAt.value-s.startsAt.value||a.id.localeCompare(s.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new Oe("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new Oe("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Oe("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:yt(t.family,"chain.family"),id:yt(t.id,"chain.id")},marketplace:yt(e.marketplace,"marketplace"),mechanism:yt(e.mechanism,"mechanism"),collection:yt(e.collection,"collection"),recipient:yt(e.recipient,"recipient"),quantity:RL(e.quantity,"quantity"),stages:r,mintValueCap:jp(e.mintValueCap,"mintValueCap"),networkFeeCap:jp(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:jp(e.priorityFeeCap,"priorityFeeCap"),expiry:zp(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Oe("every stage must end no later than expiry","stage-after-expiry");return i}function BL(e){return JSON.stringify(Vp(e))}function VS(e){return`sha256:${EL("sha256").update(BL(e),"utf8").digest("hex")}`}var Wp=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),gr=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Gp=Object.freeze(Object.values(gr)),WS=new Set(Gp),GS=Object.freeze(Gp.slice(0,4)),ML=Gp,FL=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),He=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function _c(e,t){if(!Array.isArray(e)||e.length===0)throw new He(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new He(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new He(`${t} contains duplicates`);return[...n].sort()}function UL(e){if(!Array.isArray(e))throw new He("capabilities must be an array");let t=new Set(e);for(let n of t)if(!WS.has(n))throw new He(`unknown capability ${n}`,"unknown-capability");return ML.every(n=>t.has(n))?Wp.AUTOMINT_READY:GS.every(n=>t.has(n))?Wp.PREPARE_READY:Wp.RESEARCH_ONLY}function Kp(e=[]){if(!Array.isArray(e))throw new He("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new He("entry must be an object");for(let i of Object.keys(n))if(!FL.has(i))throw new He(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new He("entry id must be an exact string");if(t.has(n.id))throw new He(`duplicate entry id ${n.id}`,"duplicate-entry");let r=_c(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(_c(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(_c(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(_c(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:UL(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=GS){let o=t.get(n);if(!o)throw new He(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!WS.has(i))throw new He(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new He(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var Y7=Kp([]);X();import{getAddress as qL,Interface as Yp,keccak256 as DL}from"ethers";var On=Object.freeze({manifold:new Yp(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Yp(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Yp(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Qp=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"})}),Z7=Object.freeze(Object.fromEntries(Object.entries(Qp).map(([e,t])=>[On[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function ae(e){throw new Error(`evm-mint-launchpads: ${e}`)}function ot(e,t){try{return qL(String(e||""))}catch{return ae(`invalid ${t}`)}}function je(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&ae(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return ae(`${t} must be an unsigned integer`)}}function Xp(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&ae(`invalid ${t}`),e.map(String)}function HL(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&ae("invalid chainId");let o=ot(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&ot(u.contract,"reviewed contract")===o);a||ae("unsupported contract or wrong chain");let s=ot(a.mintTarget||a.contract,"reviewed mint target"),c=On[e].getFunction(Qp[e].signature).selector.toLowerCase();return(!(a.selectors||[c]).map(u=>String(u).toLowerCase()).includes(c)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&ae("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function jL(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);ae("runtime bytecode verification required")}function zL(e,t){let n=e.stage;if(!n)return null;let r=je(n.startTime,"stage startTime"),o=je(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&ae("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function VL(e,t){let n=Qp[e];String(t).slice(0,10).toLowerCase()!==On[e].getFunction(n.signature).selector.toLowerCase()&&ae("unknown selector");let r;try{r=On[e].decodeFunctionData(n.signature,t)}catch{ae("invalid calldata layout")}let o;return e==="manifold"&&(o=On.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=On.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=On.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&ae("calldata must be canonical with no suffix"),r}async function KS(e,t={},n={}){On[e]||ae("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=HL(e,t,n),s=ot(t.recipient||t.minter,"recipient"),c=je(t.quantity,"quantity",{positive:!0}),l=je(t.priceWei,"priceWei"),u=je(t.maxValueWei,"maxValueWei"),d=je(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&ae("transaction chain mismatch"),ot(p.to,"transaction target")!==i&&ae("transaction target mismatch");let m=await jL(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||DL(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&ae("runtime bytecode is not reviewed");let f=VL(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=zL(t,h),w,x,y,b=null,S=[];if(e==="manifold")ot(f[0],"calldata contract")!==o&&ae("calldata contract mismatch"),(t.instanceId==null||je(f[1],"instanceId")!==je(t.instanceId,"instanceId"))&&ae("instance/stage mismatch"),(t.mintIndex==null||je(f[2],"mintIndex")!==je(t.mintIndex,"mintIndex"))&&ae("mint index/stage mismatch"),S=Xp([...f[3]]),w=ot(f[4],"calldata recipient"),x=1n,y=l;else if(e==="zora")w=ot(f[0],"calldata recipient"),x=BigInt(f[1]),y=l,t.comment!=null&&f[2]!==String(t.comment)&&ae("comment mismatch"),t.mintReferral!=null&&ot(f[3],"mint referral")!==ot(t.mintReferral,"expected mint referral")&&ae("mint referral mismatch");else{w=ot(f[0],"calldata recipient"),x=BigInt(f[1]),y=BigInt(f[3]);let v=f[4];S=Xp([...v.proof]),b=BigInt(v.quantityLimitPerWallet),b<c&&ae("wallet allowance below quantity"),(BigInt(v.pricePerToken)!==l||ot(v.currency,"allowlist currency")!==ot(f[2],"currency"))&&ae("allowlist terms mismatch")}w!==s&&ae("recipient mismatch"),x!==c&&ae("quantity mismatch"),y!==l&&ae("price mismatch"),t.proof!=null&&JSON.stringify(S.map(v=>v.toLowerCase()))!==JSON.stringify(Xp(t.proof).map(v=>v.toLowerCase()))&&ae("proof mismatch");let _=je(p.value??0,"transaction value"),T=l*c;(_<T||_-T>d||_>u)&&ae("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:je(p.gasLimit,"gasLimit"),A=p.maxFeePerGas==null?null:je(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>je(t.maxGasLimit,"maxGasLimit"))&&ae("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(A==null||A>je(t.maxFeePerGasWei,"maxFeePerGasWei"))&&ae("gas fee cap exceeded"),O({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:_.toString(),platformFeeWei:(_-T).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...b==null?{}:{walletAllowance:b.toString()},proof:S,transaction:{chainId:r,to:i,data:p.data,value:_.toString(),...E==null?{}:{gasLimit:E.toString()},...A==null?{}:{maxFeePerGas:A.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var WL="RESEARCH_ONLY";var GL="canonical serialized-message decoding and program-specific instruction validation are not implemented",Tc=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),tj=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function KL(){throw new Error(`solana-mint: ${WL}; disabled until ${GL}`)}function YS(){KL()}X();import{Address as YL,CompactSize as XL,NETWORK as QL,OutScript as ak,Script as JL,TEST_NETWORK as XS,Transaction as ZL,utils as eB}from"@scure/btc-signer";import{createHash as Ji}from"node:crypto";var QS="universal-ordinals-mint",JS="bitcoin-ordinals-mint-plan",tB=1800*1e3,nB=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),ZS=new Set,rB=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Nt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function Rn(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 Jp(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 sk(e,t){let n=Nt(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 oB(e){return e==="bitcoin"||e==="mainnet"?QL:e==="regtest"?{...XS,bech32:"bcrt"}:XS}function ek(e,t){try{let n=ak.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 iB(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function aB(e){let t=Ji("sha256").update(e.unsignedTx).digest();return Ji("sha256").update(t).digest().reverse().toString("hex")}function tk(e,...t){let n=Ji("sha256").update(e,"ascii").digest();return Ji("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function sB(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),a=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 s=tk("TapLeaf",Buffer.from([a]),Buffer.from(XL.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=tk("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=eB.taprootTweakPubkey(e.internalKey,s);if(!Buffer.from(c).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function nk(e,t){let n=Nt(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=ZL.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},(s,c)=>{let l=o.getInput(c);for(let p of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(iB(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=ek(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)=>sB(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}}),a=Array.from({length:o.outputsLength},(s,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 ek(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:aB(o),inputs:i,outputs:a,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 cB(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 lB(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]}var uB=new Set([1,3]);function dB(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=lB(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!uB.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let s=r.get(i)||[];s.push(Buffer.from(a)),r.set(i,s)}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 pB(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=JL.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(dB(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],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(s!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(Ji("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||cB(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 rk(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 mB(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 ck(e,t="parentId"){let n=Nt(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 lk(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Nt(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=Rn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function fB(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((a,s)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${s} invalid`);return{role:Nt(a.role,`revealOutputs[${s}].role`),address:Nt(a.address,`revealOutputs[${s}].address`),valueSats:Rn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:sk(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:ck(a.parentId,`revealOutputs[${s}].parentId`)}}}),i=o.filter(a=>a.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 hB(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Nt(n?.role,`commitOutputs[${r}].role`),valueSats:Rn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:sk(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 ok(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 ik(e,t,n){try{return Buffer.from(ak.encode(YL(oB(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 gB(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,a)=>lk({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function yB(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");mB(e);for(let N of["content","contentBytes","body","file","path","url","contentUrl"])if(e[N]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let N of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[N]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Nt(e.network,"network").toLowerCase();if(!nB.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Nt(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=Nt(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=ck(e.parentId??e.parentInscriptionId),a=Nt(e.recipient??e.destination,"recipient"),s=Rn(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(lk);if(new Set(c.map(N=>N.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");gB(e,c);let l=nk(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=nk(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=hB(e.commitOutputs),p=fB(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((N,B)=>N.txid!==c[B].txid||N.vout!==c[B].vout||N.valueSats!==c[B].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");ok(l.outputs,d,"commit PSBT"),ok(u.outputs,p,"reveal PSBT");let m=ik(a,n,"recipient");if(p.find(N=>N.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[N,B]of p.entries())if(B.scriptHex!==ik(B.address,n,`revealOutputs[${N}].address`))throw new Error(`ordinals mint: reveal output ${N} script does not pay its bound address`);let f=d.findIndex(N=>N.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(N=>N.txid===l.txid&&N.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");pB(u,{contentHash:r,contentType:o,parentId:i});let g=Jp(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Jp(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Jp(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let y=Rn(e.commitFeeSats,"commitFeeSats"),b=Rn(e.revealFeeSats,"revealFeeSats"),S=Rn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(y+b>S)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==y.toString()||u.feeSats!==b.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(y)/l.vsizeLowerBound>g||Number(b)/u.vsizeLowerBound>w)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(N=>N.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:Rn(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(N=>N.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let A=Number(t.nowMs??Date.now()),v=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(v)||v<=A||v-A>tB)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:s,commitInputs:l.inputs.map(rk),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(rk),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:y.toString(),revealFee:b.toString(),maxTotalFee:S.toString(),rbf:e.rbf,cpfp:E,expiresAt:v}}function bB(e={},t={}){let n=yB(e,t),r=n.commitInputs.find(s=>ZS.has(s.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:QS,kind:JS,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...rB},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."},a=O(i,{provider:QS,kind:JS,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)ZS.add(s.outpoint);return a}var uk=bB;var xB=Object.freeze([gr.DISCOVERY,gr.ELIGIBILITY,gr.PREPARATION,gr.SIMULATION]),dk=[["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",Tc.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Tc.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Tc.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Zp=Object.freeze(dk.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([gr.DISCOVERY]):xB,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),SB=Kp(Zp.map(({family:e,tier:t,enabled:n,...r})=>r)),pk=new Map(dk.map(e=>[e[0],e])),kB=new Set(["intent","adapterId","input"]),vB=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Zi=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function de(e,t,n){throw new Zi(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&de("intent-mismatch",`${n} does not match canonical intent`)}function Te(e,t,n){let r=e[t];return r.unit!==n&&de("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function mk(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))vB.test(n)&&de("custody-refused",`${t}.${n} is outside the prepare-only boundary`),mk(r,`${t}.${n}`)}function EB(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function AB(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&de("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||de("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${wB("sha256").update(JSON.stringify(EB(n,t))).digest("hex")}`;M(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),s=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(s))&&de("invalid-request","decoded input requires exact stage bounds"),M(a,o.startsAt.value,"stage start"),M(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&de("expired-intent","canonical mint stage is not active at authoritative now"),o}function IB(e,t){let n=pk.get(t);n||de("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return M(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&de("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function _B(e,t){e.chain.family==="evm"?(M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.maxValueWei??t.maxTotalWei,Te(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Te(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Te(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Te(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Te(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Te(e,"priorityFeeCap","lamports"),"priority-fee cap")):(M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Te(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Te(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Te(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function TB(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==Je(e))&&de("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&de("custody-refused","leaf artifact is not strictly prepare-only")}function NB(e,t,n){M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity");let r=Te(e,"mintValueCap","wei"),o=Te(e,"networkFeeCap","wei"),i=Te(e,"priorityFeeCap","wei-per-gas");M(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||de("artifact-mismatch","prepared EVM transaction is missing"),M(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&de("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&de("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),M(n.contract,e.collection,"artifact collection/drop"),M(n.recipient??n.buyer,e.recipient,"artifact recipient"),M(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&de("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function PB(e,t,n){M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Te(e,"mintValueCap","lamports"),"mint-value cap");let r=Te(e,"networkFeeCap","lamports"),o=Te(e,"priorityFeeCap","lamports");M(t.networkFeeCapLamports,r,"network-fee cap"),M(t.priorityFeeCapLamports,o,"priority-fee cap"),M(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let s of a.instructions)if(String(s.decoded?.type).toLowerCase().includes("price")){let c=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(c)*BigInt(s.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&de("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function CB(e,t,n){return M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Te(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Te(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Te(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),M(n.plan.network,e.chain.id,"artifact network"),M(n.plan.parentId,e.collection,"artifact collection/drop"),M(n.plan.recipient,e.recipient,"artifact recipient"),M(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),M(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),M(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 ea(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Zp})}async function Nc(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:ea()}}async function ta(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&de("invalid-request","request must be a plain object");for(let u of Object.keys(e))kB.has(u)||de("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&de("invalid-request","explicit adapterId is required; adapter inference is refused"),pk.has(e.adapterId)||de("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&de("invalid-request","family-specific decoded input is required"),mk(n);let r;try{r=Vp(e.intent)}catch(u){de("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||de("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&de("expired-intent","canonical mint intent has expired");let i=IB(r,e.adapterId);i[1]==="solana"&&de("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=AB(r,n,r.chain.family,o);_B(r,n);let s;try{i[4]==="evm"?s=await KS(i[5],n,t):i[4]==="opensea"?s=await Xo(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await YS(n,t)):s=await uk(n,t)}catch(u){if(u instanceof Zi)throw u;de("adapter-refused",u?.message||"adapter preparation failed",u)}TB(s);let c=i[4]==="bitcoin"?CB(r,n,s):i[4]==="solana"?PB(r,n,s):NB(r,n,s),l=Object.freeze({intentHash:VS(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:a.id,proofDigest:a.eligibility.proofDigest,mintValueCap:r.mintValueCap,networkFeeCap:r.networkFeeCap,priorityFeeCap:r.priorityFeeCap,observedNetworkFee:c.networkFee,observedPriorityFee:c.priorityFee});return O({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:s},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(s.expiresAt))})}var OB=ta,RB=ta,$B=ea,LB=Nc;var Pc="ROUTE_ONLY",Cc=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),hk=new Set(Object.values(Cc)),MB=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),FB=new Set(["amount","currency"]),UB=new Set(["value","unit"]),qB=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),DB=new Set(["provider","operations"]),ce=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function xo(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new ce(`${t} must be a plain object`);return e}function na(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new ce(`${n} has unknown field ${r}`,"unknown-field")}function we(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new ce(`${t} must be an exact non-empty string`);return e}function gk(e,t,{positive:n=!1}={}){if(e=we(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new ce(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function bo(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new ce(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>we(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new ce(`${t} contains duplicates`);return r}function yk(e,t){return e=xo(e,t),na(e,FB,t),{amount:gk(e.amount,`${t}.amount`),currency:we(e.currency,`${t}.currency`)}}function fk(e,t){if(!Array.isArray(e))throw new ce(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>yk(n,`${t}[${r}]`))}function HB(e){if(e=xo(e,"expiry"),na(e,UB,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new ce("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function jB(e,t,n){Object.hasOwn(e,n)&&(t[n]=we(e[n],n))}function em(e){e=xo(e,"intent"),na(e,MB,"intent");let t=we(e.action,"action");if(!hk.has(t))throw new ce(`unsupported action ${t}`,"invalid-action");let n={action:t,family:we(e.family,"family"),network:we(e.network,"network"),standard:we(e.standard,"standard"),collection:we(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])jB(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 ce("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new ce("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new ce("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=we(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new ce("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=we(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=we(e.sender,"sender"))}else n.owner=we(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=we(e.recipient,"recipient")),n.quantity=gk(e.quantity,"quantity",{positive:!0}),n.marketplace=we(e.marketplace,"marketplace"),n.protocol=we(e.protocol,"protocol"),n.artifactKind=we(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new ce(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=yk(e.price,"price"),n.expiry=HB(e.expiry),n.fees=fk(e.fees,"fees"),n.royalties=fk(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=we(e.listingId,"listingId")),n}function zB(e){e=xo(e,"adapter"),na(e,qB,"adapter");let t=bo(e.actions,"adapter.actions");for(let o of t)if(!hk.has(o))throw new ce(`adapter has unknown action ${o}`,"invalid-action");let n=xo(e.surface,"adapter.surface");na(n,DB,"adapter.surface");let r=xo(n.operations,"adapter.surface.operations");for(let o of t)we(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new ce(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:we(e.id,"adapter.id"),family:we(e.family,"adapter.family"),networks:Object.freeze(bo(e.networks,"adapter.networks")),standards:Object.freeze(bo(e.standards,"adapter.standards")),marketplaces:Object.freeze(bo(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(bo(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(bo(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Pc,custody:"user",surface:Object.freeze({provider:we(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function bk(e=[]){if(!Array.isArray(e))throw new ce("entries must be an array");let t=e.map(zB);if(new Set(t.map(r=>r.id)).size!==t.length)throw new ce("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:Pc,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=em(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new ce("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new ce(`adapter lacks ${o.action}`,"unsupported-operation"):new ce("no exact adapter route","unsupported-operation")}})}var wo=(e,t,n,r,o,i,a,s,c,l)=>({id:e,family:t,networks:n,standards:r,marketplaces:o,protocols:i,artifactKinds:a,actions:s,surface:{provider:c,operations:l}}),Oc=bk([wo("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"}),wo("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"}),wo("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"}),wo("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),wo("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),wo("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function wk(e,{access:t="public",feeProfile:n="default",registry:r=Oc,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new ce("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new ce("nowMs must be a non-negative safe integer","invalid-expiry");let i=em(e);if(i.expiry&&o>=i.expiry.value)throw new ce("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Pc,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:we(n,"feeProfile"),fees:Object.freeze({oracle:"0",currency:"none"}),adapterId:a.id,surface:Object.freeze({provider:a.surface.provider,operation:a.surface.operations[i.action]}),intent:Object.freeze(i)})}X();var oa="universal-evm-nft-transfer",nm="evm-nft-safe-transfer",WB=1800*1e3,GB=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),KB=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function rm(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(KB.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);rm(r,t)}}}function tm(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 yr(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}var ra=e=>e.toString(16).padStart(64,"0"),Rc=e=>e.slice(2).padStart(64,"0");function YB(e,t,n,r,o){return e==="erc721"?`0x42842e0e${Rc(t)}${Rc(n)}${ra(r)}`:`0xf242432a${Rc(t)}${Rc(n)}${ra(r)}${ra(o)}${ra(160n)}${ra(0n)}`}function xk(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(rm(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=yr(e.chainId,"chainId",{positive:!0,safe:!0}),o=tm(e.sender??e.from,"sender"),i=tm(e.recipient??e.to,"recipient"),a=tm(e.contract??e.contractAddress??e.tokenContract,"contract"),s=yr(e.tokenId,"tokenId"),c=yr(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(yr(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=yr(e.gasLimit,"gasLimit",{positive:!0}),u=yr(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=yr(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)>WB)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=YB(n,o,i,s,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:a,tokenId:s.toString(),quantity:c.toString(),gasLimit:l.toString(),maxFeePerGasWei:u.toString(),maxPriorityFeePerGasWei:d.toString(),expiresAt:p,data:m}}function ia(e={},t={}){let n=xk(e,t),r={provider:oa,kind:nm,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...GB},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 O(r,{provider:oa,kind:nm,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}function XB(e,{nowMs:t=Date.now()}={}){if(!e||typeof e!="object")throw new Error("evm nft transfer: prepared envelope required");if(rm({payload:e.transfer,transaction:e.transaction}),e.prepareHash!==Je(e))throw new Error("evm nft transfer: prepareHash mismatch \u2014 payload was altered");if(e.provider!==oa||e.kind!==nm||e.oraclePrepared!==!0)throw new Error("evm nft transfer: envelope identity mutation refused");if(e.execution!=="prepare-only"||e.signed!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)throw new Error("evm nft transfer: executable or signed mutation refused");if(Number(e.expiresAt)<=Number(t))throw new Error("evm nft transfer: reviewed expiry elapsed");let n=e.transfer||{},r=e.transaction||{},o=xk({standard:n.standard,chainId:r.chainId,sender:n.sender,recipient:n.recipient,contract:n.contract,tokenId:n.tokenId,quantity:n.quantity,valueWei:r.value,gasLimit:r.gasLimit,maxFeePerGasWei:r.maxFeePerGasWei,maxPriorityFeePerGasWei:r.maxPriorityFeePerGasWei,expiresAt:e.expiresAt,reviewed:!0,calldata:r.data},{nowMs:t});if(r.from!==o.sender||r.to!==o.contract)throw new Error("evm nft transfer: sender or contract mutation refused");return!0}var QB=ia,JB=ia;X();var aa="universal-solana-nft-transfer",om="solana-verified-nft-transfer",kk="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",br=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Sk=new Set(Object.values(br)),eM=new Set([br.token,br.token2022]),tM=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),nM=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function G(e){throw new Error(`solana nft transfer: ${e}`)}function Pt(e,t){let n=String(e??"").trim();return n||G(`${t} required`),n}function zt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||G(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&G(`${t} must be positive`),r}function Ee(e,t,n){String(e??"")!==String(t)&&G(`${n} mismatch; mutation refused`)}function im(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))nM.test(r)&&o!=null&&o!==!1&&G(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),im(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&G(`${r} refused; adapter is prepare-only`)}}function rM(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&G(`${t} must be decoded`),Array.isArray(e.accounts)||G(`${t} decoded accounts required`),e.decoded}function oM(e,t,n){for(let r of e.accounts){let o=Pt(r.pubkey,"account pubkey");t.has(o)||G(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&G(`unexpected writable account ${o}`)}}function vk(e={}){(!e||typeof e!="object"||Array.isArray(e))&&G("request object required"),im(e),(e.network!=="mainnet-beta"||e.genesisHash!==kk)&&G("mainnet genesis/network mismatch"),e.reviewed!==!0&&G("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Pt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&G("standard must be metaplex or core");let n=Pt(e.mint??e.asset,"mint/asset"),r=Pt(e.collection,"collection");e.collectionVerified!==!0&&G("verified collection required");let o=Pt(e.owner,"owner"),i=Pt(e.recipient,"recipient"),a=zt(e.quantity,"quantity",{positive:!0}),s=zt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&G("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&G("Core quantity must be exactly 1");let c=Pt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==br.core:!eM.has(c))&&G("reviewed transfer program mismatch");let l=t==="metaplex"?Pt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Pt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Ee(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(zt(e.decimals??0,"decimals")):null,p=zt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=zt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=zt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&G("priority fee exceeds reviewed cap");let g=zt(e.networkFeeLamports,"networkFeeLamports"),w=zt(e.networkFeeCapLamports,"networkFeeCapLamports");g>w&&G("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&G("transaction object required"),x.version!==0&&x.version!=="legacy"&&G("transaction version must be 0 or legacy");let y=Pt(x.recentBlockhash,"recentBlockhash");Ee(y,e.approvedBlockhash,"blockhash mutation after approval");let b=zt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),S=zt(e.currentBlockHeight,"currentBlockHeight");S>b&&G("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&G("canonical instructions required");let _=new Set([o,n,l,u].filter(Boolean)),T=new Set([o,i,n,r,l,u,...Sk].filter(Boolean)),E=0,A=0,v=0,N=0;for(let[B,te]of x.instructions.entries()){let Z=Pt(te.programId,`instructions[${B}].programId`);Sk.has(Z)||G(`unknown program ${Z}`);let $=rM(te,`instructions[${B}]`);oM(te,T,_);let H=String($.type??$.instruction??"").toLowerCase();Z===br.computeBudget?H.includes("limit")?(Ee($.units??$.computeUnitLimit,p,"compute-unit limit"),E++):H.includes("price")?(Ee($.microLamports??$.computeUnitPriceMicroLamports,m,"compute-unit price"),A++):G("unsupported compute budget instruction"):Z===br.associatedToken?((t!=="metaplex"||H!=="createassociatedtokenaccountidempotent")&&G("non-canonical associated token instruction"),Ee($.payer,o,"ATA payer"),Ee($.owner,i,"ATA recipient"),Ee($.mint,n,"ATA mint"),Ee($.tokenAccount,u,"recipient ATA"),Ee($.tokenProgramId,c,"ATA token program"),N++):t==="metaplex"&&Z===c?(H!=="transferchecked"&&G("only canonical transferChecked is allowed"),Ee($.mint,n,"mint"),Ee($.owner,o,"owner"),Ee($.recipient,i,"recipient"),Ee($.sourceTokenAccount,l,"source token account"),Ee($.destinationTokenAccount,u,"recipient ATA"),Ee($.amount,a,"quantity"),Ee($.decimals,d,"decimals"),v++):t==="core"&&Z===br.core?(H!=="transfer"&&G("only canonical Core transfer is allowed"),Ee($.asset,n,"mint/asset"),Ee($.collection,r,"collection"),$.collectionVerified!==!0&&G("verified collection required in Core instruction"),Ee($.owner,o,"owner"),Ee($.newOwner,i,"recipient"),Ee($.amount??1,1,"quantity"),v++):G(`program ${Z} is not valid for ${t} transfer`)}return(E!==1||A!==1)&&G("exactly one compute-unit limit and price instruction required"),v!==1&&G("exactly one canonical transfer instruction required"),t==="metaplex"&&N>1&&G("at most one idempotent recipient ATA instruction allowed"),{standard:t,mint:n,collection:r,owner:o,recipient:i,quantity:a.toString(),maxEditionQuantity:s.toString(),tokenProgramId:c,sourceTokenAccount:l,recipientTokenAccount:u,decimals:d,recentBlockhash:y,lastValidBlockHeight:b.toString(),currentBlockHeight:S.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:w.toString(),transaction:x}}function sa(e={},t={}){let n=vk(e),r=Number(t.nowMs??Date.now()),o={provider:aa,kind:om,chain:"solana-mainnet-beta",genesisHash:kk,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...tM},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 O(o,{provider:aa,kind:om,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}function iM(e,{nowMs:t=Date.now()}={}){(!e||typeof e!="object")&&G("prepared envelope required"),im(e,"prepared"),e.prepareHash!==Je(e)&&G("prepareHash mismatch; payload was altered"),(e.provider!==aa||e.kind!==om||e.oraclePrepared!==!0)&&G("envelope identity mutation refused"),(e.execution!=="prepare-only"||e.prepareOnly!==!0||e.signed!==!1||e.broadcast!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)&&G("execution state mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeLamports!=="0")&&G("NFT Oracle fee mutation refused"),Number(t)>Number(e.expiresAt)&&G("prepared envelope expired");let n=e.transfer||{},r=e.caps||{},o=e.transaction||{};return vk({network:"mainnet-beta",genesisHash:e.genesisHash,standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:n.collectionVerified,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,derivedRecipientAta:n.recipientTokenAccount,decimals:n.decimals,approvedBlockhash:o.recentBlockhash,currentBlockHeight:r.currentBlockHeight,computeUnitLimit:r.computeUnitLimit,computeUnitPriceMicroLamports:r.computeUnitPriceMicroLamports,priorityFeeCapLamports:r.priorityFeeCapLamports,networkFeeLamports:r.networkFeeLamports,networkFeeCapLamports:r.networkFeeCapLamports,reviewed:e.reviewed,transaction:o}),!0}var aM=sa,sM=sa;X();var ca="universal-ordinals-transfer",am="bitcoin-ordinals-transfer-plan",Ek=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),lM=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ne(e){throw new Error(`ordinals transfer: ${e}`)}function Ln(e,t){let n=String(e??"").trim();return n||ne(`${t} required`),n}function $n(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ne(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ne(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ne(`${t} out of range`),o}function Ak(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ne(`${t} must be positive`),n}function Nk(e,t){let n=Ln(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ne(`${t} must be 64 hex`),n}function Pk(e,t="inscriptionId"){let n=Ln(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ne(`${t} must be canonical`),n}function Ck(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&&ne(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Ck(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ne(`${r} bypass refused; adapter is prepare-only`)}function Ok(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ne(`${t}.${n} arbitrary script refused; use a bound address`)}function Ik(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Ok(e,t);let n=Nk(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ne(`${t}.vout invalid`),{txid:n,vout:r,valueSats:$n(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:Ln(e.address,`${t}.address`),sequence:Number($n(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function _k(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Ok(e,t),{role:Ln(e.role,`${t}.role`),address:Ln(e.address,`${t}.address`),valueSats:$n(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Pk(e.inscriptionId,`${t}.inscriptionId`)}}}function Tk(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ne(`${n} mismatch; mutation refused`)}function Rk(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ne("request object required"),Ck(e);let t=Ln(e.network,"network").toLowerCase(),n=Nk(e.genesisHash,"genesisHash");(!Ek[t]||n!==Ek[t])&&ne("network/genesis mismatch");let r=Pk(e.inscriptionId),o=Ik(e.ownerInput,"ownerInput");Ln(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ne("current inscription outpoint mismatch");let i=Ln(e.destination,"destination"),a=$n(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:_k(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ne("exact change output invalid");let c=Ak(e.feeRateSatVb,"feeRateSatVb"),l=Ak(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ne("fee rate exceeds reviewed cap");let u=$n(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=$n(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ne("total fee exceeds reviewed cap");let p=Number($n(e.locktime,"locktime",{max:0xffffffffn})),m=Number($n(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&ne("RBF sequence refused"),o.sequence!==m&&ne("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&ne("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&ne("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&ne("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&ne("exactly one PSBT input required; extra inputs refused"),Tk(Ik(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((y,b)=>_k(y,`psbt.outputs[${b}]`)):ne("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};Tk(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(y=>y.role==="inscription"&&y.inscriptionId===r).length!==1&&ne("exactly one inscription-carrying output required");let x=h.reduce((y,b)=>y+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==x+u&&ne("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:a,changeOutput:s,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 la(e={},t={}){let n=Rk(e);return O({provider:ca,kind:am,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...lM},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:ca,kind:am,env:t.env})}function uM(e){return(!e||typeof e!="object")&&ne("prepared plan required"),e.prepareHash!==Je(e)&&ne("prepareHash mismatch; plan was altered"),(e.provider!==ca||e.kind!==am||e.oraclePrepared!==!0)&&ne("invalid prepared identity"),(e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1||e.signed!==!1||e.finalized!==!1||e.broadcast!==!1)&&ne("executable, signed or finalized mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeSats!=="0")&&ne("NFT Oracle fee must be zero"),Rk(e.plan),!0}var dM=la,pM=la;ge();function fM(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 $k(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),a=[];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 s=r;if(r==="execute")if(!Dr(t.env||process.env))s="alert_only",a.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=fM(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(s="alert_only",a.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(s="alert_only",a.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return s==="alert_only"?a.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):a.push("ARMED until mint opens: this trigger will submit one prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:s,requestedMode:r,downgraded:s!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:s==="execute"?e.grant:null,armedUntil:s==="execute"?"mint-opens":null,notes:a}}async function Lk(e={},t={}){let n=t.rpcCall||q,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 a of i)try{let s=await n(o,"eth_call",[{to:r,data:a.selector},"latest"],t);if(s&&s!=="0x"){let c=BigInt(s)===1n;return{status:"ok",open:a.openWhen?c:!c,evidence:a.name,raw:s}}}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"]}}var gM=1440*60*1e3;function yM(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>gM&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}var Bk="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",bM=4663,wM="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Mk="a22cb465",xM="a0712d68";function sm(e){return String(e||"").trim().toLowerCase()}function So(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function SM(e){let t=So(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Mk}${t.padStart(64,"0")}${"0".repeat(64)}`}function kM(e){return So(e).includes(So(Bk))}function vM(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>So(n?.data).startsWith(Mk))}function EM(e={},t){let n=So(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return sm(i[0])!==wM?!1:So(i[2])===n})}function AM(e=1){return`0x${xM}${BigInt(e).toString(16).padStart(64,"0")}`}function Fk(e={},t={}){let n=sm(e.contract),r=sm(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),a=[];/^0x[a-f0-9]{40}$/.test(n)||a.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||a.push("minter must be a 0x address"),o!==bM&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),kM(e.bytecode||"")||a.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let s=e.simulation||{};s.willRevert===!0&&a.push("mint simulation reverts"),vM(s)&&a.push("simulation sets approval / setApprovalForAll"),EM(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:AM(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:SM(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Ey(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=yM(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?a.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:a.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:Bk.toLowerCase(),reasons:a,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"]}}L();qe();X();ui();var _M="https://api.paraswap.io",cm=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||_M).replace(/\/$/,"");function ko(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 lm(e={},t={}){let n=Number(e.chainId||1);return k(`${cm(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Bn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:ko(e.srcToken,"srcToken"),destToken:ko(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 gs({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(M0(o)))r.set(s,c);let i=await k(`${cm(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...ie(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:a,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 Uk(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=ko(e.userAddress,"userAddress"),o=await Bn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:ko(e.srcToken,"srcToken"),destToken:ko(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(s.receiver=ko(e.receiver,"receiver"));let c=await k(`${cm(t)}/transactions/${n}`,{method:"POST",body:s,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()!==a)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return O({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:s.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:s.srcToken,spender:i.tokenTransferProxy||a,amount:s.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:ye(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function qk(e={}){let t=await lm({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as NM}from"node:crypto";import{getAddress as Wk,isAddress as um}from"ethers";var Dk="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",PM=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),CM=Object.freeze(["lifi"]),Hk=/^0x[0-9a-fA-F]{64}$/,OM=/^\d+$/;function xe(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function jk(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&xe(t,"must be a positive chainId"),n}function $c(e,t){let n=String(e??"").trim();return(!OM.test(n)||BigInt(n)<=0n)&&xe(t,"must be a positive integer string"),n}function RM(e,t){return e==null||e===""?null:$c(e,t)}function zk(e,t){let n=String(e??"").trim();return n.toLowerCase()===Dk.toLowerCase()?Dk:(um(n)||xe(t,"must be an EVM address or native token sentinel"),Wk(n))}function Gk(e,t){let n=String(e??"").trim();return um(n)||xe(t,"must be an EVM address"),Wk(n)}function $M(e,t){return e==null||e===""?null:Gk(e,t)}function Vk(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||xe(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function LM(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||xe(r,"must be a finite millisecond timestamp"),o<=t&&xe(r,"expired"),o>t+n&&xe(r,"exceeds maxDeadlineMs"),Math.floor(o)}function vo(e){if(Array.isArray(e))return e.map(vo);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=vo(e[n]));return t}return e}function BM(e){return JSON.stringify(vo(e))}function Lc(e){return`0x${NM("sha256").update(BM(e)).digest("hex")}`}function Kk(e,t){let n={...e};for(let r of t)delete n[r];return n}function Yk(e){return Lc(Kk(e,["intentHash"]))}function Xk(e){return Lc(Kk(e,["firmQuoteHash"]))}function Bc(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&xe("time","is invalid");let o=jk(e.fromChainId??e.fromChain,"fromChainId"),i=jk(e.toChainId??e.toChain,"toChainId"),s=o===i?PM:CM,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:zk(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:zk(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:$c(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Gk(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:LM(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:RM(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Vk(e.allowedSources,"allowedSources",s),allowedRouters:Vk(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)?vo(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&xe("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Lc({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Yk(c),Object.freeze(c)}function MM(e){return(!e||typeof e!="object"||Array.isArray(e))&&xe("artifact","required"),e.typedDataHash!=null&&!Hk.test(String(e.typedDataHash))&&xe("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Hk.test(String(e.calldataHash))&&xe("artifact.calldataHash","must be bytes32"),e.to!=null&&!um(String(e.to))&&xe("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&xe("artifact.data","must be hex"),vo(e)}function dm(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&xe("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||xe("quote expiry","required"),o<=r&&xe("quote","expired"),o>e.deadlineMs&&xe("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||xe("source","required"),e.allowedSources.includes(i)||xe("source","not allowed by intent");let a=$c(t.amountOut??t.buyAmount,"amountOut"),s=$c(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&xe("minBuyAmount","exceeds amountOut");let c=MM(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||xe("quotedAtMs","must be finite");let u=$M(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:a,minBuyAmount:s,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)?vo(t.metadata):{}};return d.quoteId||(d.quoteId=Lc({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Xk(d),Object.freeze(d)}function ua(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Qk(e,t){return String(e?.[t]??"").trim()}function da(e,t){return Object.freeze({source:e,run:t})}function Jk(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??De,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return ua(e,"lifi")&&a.push(da("lifi",async()=>{let c=await(r.lifiQuote??vn)({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 FM(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(ua(e,"paraswap")&&a.push(da("paraswap",async()=>{let c=await(r.paraswapPrice??Bn)({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}}})),ua(e,"0x")&&(Qk(n,"ZEROX_API_KEY")||Qk(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(da("0x",async()=>{let c=await(r.zeroxQuote??ir)({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}}})),ua(e,"cow")&&a.push(da("cow",async()=>{let c=await(r.cowQuote??An)({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}}})),ua(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(da("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??pn)({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}}}))),a}async function FM(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function UM(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function Zk(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>UM(s,r))),i=[],a=[];for(let s=0;s<o.length;s++){let c=t[s],l=o[s];if(l.status==="rejected"){a.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(dm(e,{...l.value,source:c.source},n))}catch(u){a.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:a}}function ev(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(a=>Number(a.expiryMs??0)>n);r.sort((a,s)=>{let c=BigInt(s.minBuyAmount??0)-BigInt(a.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(s.amountOut??0)-BigInt(a.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(a=>({...a,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 pm(e,t={}){let n=Jk(e,t),{quotes:r,failed:o}=await Zk(e,n,t),i=ev(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}}function tv(e={},t={}){return Bc(e,t)}async function nv(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Bc(e,t);return pm(n,t)}async function rv(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var DM="https://app.across.to";function mm(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||DM).replace(/\/$/,"")}async function ov(e={}){try{let t=await k(`${mm(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 iv(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return k(`${mm(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function av(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)),k(`${mm(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var jM="https://api.beefy.finance";function fm(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||jM).replace(/\/$/,"")}async function sv(e={}){try{let t=await k(`${fm(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 cv(e={},t={}){let n=await k(`${fm(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,a]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=a);return o}return n}async function lv(e={}){return k(`${fm(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var VM="https://public-api.birdeye.so";function uv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||VM).replace(/\/$/,"")}async function dv(e={}){try{let t=await k(`${uv(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 pv(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 k(`${uv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var GM="https://api.celenium.io";function hm(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||GM).replace(/\/$/,"")}async function mv(e={}){try{let t=await k(`${hm(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 fv(e={}){return k(`${hm(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function hv(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 k(`${hm(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var YM="https://api.mainnet-beta.solana.com";function XM(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||YM).replace(/\/$/,"")}async function Mc(e,t,n={}){let r=XM(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),s=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(s.error)throw new Error(`das-assets ${e}: ${s.error.message||JSON.stringify(s.error)}`);return s.result}async function gv(e={}){try{let t=await Mc("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 yv(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 Mc("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function bv(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)),Mc("searchAssets",o,t)}async function wv(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Mc("getAssetProof",{id:n},t)}L();var JM="https://api.l2beat.com";function gm(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||JM).replace(/\/$/,"")}async function xv(e={}){try{let t=await k(`${gm(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 Sv(e={},t={}){let n=await k(`${gm(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(([a])=>String(a).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function kv(e={},t={}){return k(`${gm(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var eF="https://api.spark.fi";function ym(e={}){return(e.baseUrl||process.env.SPARK_API_URL||eF).replace(/\/$/,"")}async function vv(e={}){try{return{ok:(await k(`${ym(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 Ev(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?k(`${ym(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):k(`${ym(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var nF="https://api.symbiotic.fi";function bm(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||nF).replace(/\/$/,"")}async function Av(e={}){try{let t=await k(`${bm(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 Iv(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await k(`${bm(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 _v(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return k(`${bm(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var oF="https://staking-api.polygon.technology/api/v2",iF=18,aF=200,sF=50,cF=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function xm(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||oF).replace(/\/$/,"")}function lF(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 uF(e,t=sF){let n=Number(e??t);return Number.isFinite(n)?Math.min(aF,Math.max(1,Math.trunc(n))):t}function wm(e){let t=Number(e);return Number.isFinite(t)?t/10**iF:null}async function Sm(e,t={}){let n=await k(`${xm(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 Tv(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:wm(e.totalStaked),selfStakePolApprox:wm(e.selfStake),delegatedStakePolApprox:wm(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function Nv(e={},t={}){let n=await Sm("/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=cF.has(String(e.sortBy))?String(e.sortBy):"id",a=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 a?-h:h});let s=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=uF(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:s,total:o,limit:l,offset:c,sortBy:i,direction:a?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(Tv)}}async function Pv(e={},t={}){let n=lF(e.id??e.validatorId,"id"),o=(await Sm(`/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:{...Tv(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 Cv(e={}){try{let t=await Sm("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:xm(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:xm(e),error:String(t?.message||t),exec:!1}}}L();var pF="https://api.v3.aave.com/graphql",Yj=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),mF=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||pF;async function Fc(e,t,n={}){let r=await k(mF(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}var fF=`query Markets($request: MarketsRequest!) {
143
+ - `)}`);let o=e.capabilities||{},i=Nr.filter(s=>typeof o[s]=="function"),a={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(s=>({...s})),warnings:r,capabilities(){return{chainId:e.chainId,key:e.key,supported:[...i],unsupported:Nr.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Nr)i.includes(s)?a[s]=async(...c)=>o[s](...c,{scanner:a}):a[s]=async()=>{throw new Error(`${e.key} (chain ${e.chainId}) does not implement "${s}". 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(a)}var Zo=new Map;function ns(e){let t=o0(e);return Zo.set(t.chainId,t),t}function uu(e){return Zo.get(Number(e))||null}function du(){return[...Zo.values()]}function $T(){let e={};for(let t of Zo.values())e[t.chainId]={key:t.key,name:t.name,...t.capabilities(),venueCount:t.venues.length,failClosed:t.venues.length===0};return{generatedAt:new Date().toISOString(),chainCount:Zo.size,capabilities:[...Nr],chains:e}}ge();var mu={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},ut=e=>BigInt(e).toString(16).padStart(64,"0"),ei=e=>e.slice(2).toLowerCase().padStart(64,"0");function LT(e,t){return`0x${mu.getAmountsOut}`+ut(e)+ut(64)+ut(t.length)+t.map(ei).join("")}function BT(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 pu(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var fu=100;function MT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>fu)throw new Error(`slippageBps ${n} exceeds the ${fu} 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 i0(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await q(t,"eth_call",[{to:o,data:LT(i,a)},"latest"],s);return BT(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=pu(c.scanner);if(!l)return{chainId:t,evidence:K.UNAVAILABLE,reason:"no verified router configured for this chain; quoting stays fail-closed rather than guessing a venue address"};let u=s||[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,a,u,c);return d?{chainId:t,router:l,path:u,amountIn:String(a),amountOut:d[d.length-1].toString(),hops:u.length-1,evidence:K.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:K.UNKNOWN,reason:"router returned no amounts -- no pool for this path, or the call reverted"}},async sellSimulation({token:o,amountIn:i,base:a},s={}){let c=pu(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:K.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:z.UNKNOWN,evidence:K.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],s);if(!u)return{chainId:t,token:o,verdict:z.FAIL,evidence:K.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:z.FAIL,evidence:K.LIVE,leg:"buy",reason:"buy leg quotes zero output"};let p=await r(c,d,[o,l],s);if(!p)return{chainId:t,token:o,verdict:z.FAIL,evidence:K.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=z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.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:K.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:o,tokenOut:i,amountIn:a,recipient:s,slippageBps:c=50,deadlineSeconds:l=900,path:u},d={}){let p=d.scanner,m=pu(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(s||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let f=u||[o,i],h=await this.quote({tokenIn:o,tokenOut:i,amountIn:a,path:f},d);if(h.evidence!==K.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=MT(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let w=BigInt(Math.floor(Date.now()/1e3)+Number(l)),x=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,y=x?`0x${mu.swapExactETHForTokens}`+ut(g)+ut(128)+ei(s)+ut(w)+ut(f.length)+f.map(ei).join(""):`0x${mu.swapExactTokensForTokens}`+ut(a)+ut(g)+ut(160)+ei(s)+ut(w)+ut(f.length)+f.map(ei).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:y,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:fu,deadline:w.toString()},requires:x?[]:[{step:"approve",token:f[0],spender:m,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."}}}}ge();var FT=[100,500,3e3,1e4],a0={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},rr=e=>BigInt(e).toString(16).padStart(64,"0"),ti=e=>e.slice(2).toLowerCase().padStart(64,"0"),s0=/^0x[0-9a-fA-F]{40}$/,gu=100;function UT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>gu)throw new Error(`slippageBps ${n} exceeds the ${gu} 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 hu(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function c0(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${a0.quoteExactInputSingle}`+ti(a)+ti(s)+rr(c)+rr(l)+rr(0),p=await q(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:a,tokenOut:s,amountIn:c},l){let u=[],d=null;for(let p of FT){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=hu(c.scanner,"quoter");if(!l)return{chainId:t,evidence:K.UNAVAILABLE,reason:"no verified quoter configured for this chain; quoting stays fail-closed rather than guessing a venue address"};for(let p of[i,a])if(!s0.test(p||""))throw new Error("quote requires valid 20-byte addresses");let{best:u,tried:d}=await o({quoter:l,tokenIn:i,tokenOut:a,amountIn:s},c);return u?{chainId:t,venue:"uniswap-v3",quoter:l,tokenIn:i,tokenOut:a,amountIn:String(s),amountOut:u.amountOut.toString(),fee:u.fee,useNative:!!n&&String(i).toLowerCase()===String(n).toLowerCase(),triedFeeTiers:d,evidence:K.LIVE,note:"exact-input single-hop quote at current tick; not a guaranteed fill"}:{chainId:t,quoter:l,tokenIn:i,tokenOut:a,triedFeeTiers:d,evidence:K.UNKNOWN,reason:"no fee tier returned a quote -- no V3 pool for this pair, or no liquidity"}},async sellSimulation({token:i,amountIn:a,base:s},c={}){let l=hu(c.scanner,"quoter"),u=s||n;if(u&&String(i).toLowerCase()===String(u).toLowerCase())return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:K.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||!u)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:K.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let d=await o({quoter:l,tokenIn:u,tokenOut:i,amountIn:a},c);if(!d.best)return{chainId:t,token:i,verdict:z.FAIL,evidence:K.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier"};let p=await o({quoter:l,tokenIn:i,tokenOut:u,amountIn:d.best.amountOut},c);if(!p.best)return{chainId:t,token:i,verdict:z.FAIL,evidence:K.LIVE,leg:"sell",bought:d.best.amountOut.toString(),reason:"SELL LEG FAILED while the buy leg quoted fine. This is the honeypot signature: do not trade."};let m=p.best.amountOut,f=Number(m*10000n/BigInt(a)),h=z.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.CAUTION,g=`round trip returns ${(f/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:u,verdict:h,reason:g,amountIn:String(a),bought:d.best.amountOut.toString(),returned:m.toString(),retentionBps:f,buyFee:d.best.fee,sellFee:p.best.fee,evidence:K.LIVE,note:"Quote-level round trip. It does not prove transfer hooks absent at execution time."}},async prepareUnsignedTx({tokenIn:i,tokenOut:a,amountIn:s,recipient:c,slippageBps:l=50,fee:u},d={}){let p=hu(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(!s0.test(c||""))throw new Error("prepareUnsignedTx requires a valid recipient address");let m=await this.quote({tokenIn:i,tokenOut:a,amountIn:s},d);if(m.evidence!==K.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=UT(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(),w=`0x${a0.exactInputSingle}`+ti(i)+ti(a)+rr(f)+ti(c)+rr(s)+rr(h)+rr(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:g?String(s):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:gu,fee:f},requires:g?[]:[{step:"approve",token:i,spender:p,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 rs={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function l0(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function u0(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 qT(e){let{chainId:t}=e;async function n(r,o,i){return q(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Uo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:K.LIVE}},async nativeBalance(r,o={}){let i=await Qn(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:K.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await qo({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:K.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:K.UNKNOWN,error:"resolveToken needs a 20-byte address; symbol lookup is a market-data concern"};let[i,a,s,c]=await Promise.all([n(r,rs.decimals,o).catch(()=>null),n(r,rs.symbol,o).catch(()=>null),n(r,rs.name,o).catch(()=>null),n(r,rs.totalSupply,o).catch(()=>null)]),l=l0(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:u0(a?.result??a),name:u0(s?.result??s),totalSupply:(l0(c?.result??c)??null)?.toString()??null,evidence:u?K.LIVE:K.UNKNOWN,warning:u?void 0:"no ERC-20 metadata returned -- may not be a token contract"}},async resolvePools(r,o={}){let i=e.dexscreenerSlug;if(!i)return{chainId:t,token:r,pools:[],evidence:K.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await Jn(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(l=>String(l.chainId).toLowerCase()===String(i).toLowerCase()).map(l=>({pair:l.pairAddress,dex:l.dexId,base:l.baseToken?.address,quote:l.quoteToken?.address,liquidityUsd:l.liquidity?.usd??null,priceUsd:l.priceUsd??null,volume24hUsd:l.volume?.h24??null,createdAt:l.pairCreatedAt??null})).sort((l,u)=>(u.liquidityUsd??0)-(l.liquidityUsd??0));return{chainId:t,token:r,pools:c,evidence:c.length?K.LIVE:K.UNKNOWN}},async scanBlocks({fromBlock:r,toBlock:o,address:i,topics:a,chunkSize:s=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 d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),a&&(m.topics=a);let f=await q(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence:K.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:K.LIVE}},async scoreRisk(r,o={}){let i=[],a=z.PASS,s=u=>{let d={[z.PASS]:0,[z.CAUTION]:1,[z.UNKNOWN]:2,[z.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==K.LIVE?(i.push({check:"erc20-metadata",result:z.UNKNOWN,detail:c.warning}),s(z.UNKNOWN)):i.push({check:"erc20-metadata",result:z.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===K.UNAVAILABLE)i.push({check:"liquidity",result:z.UNKNOWN,detail:l.reason}),s(z.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:z.FAIL,detail:"no pool with liquidity found"}),s(z.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:z.CAUTION,detail:`top pool only $${d}`}),s(z.CAUTION)):i.push({check:"liquidity",result:z.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:z.CAUTION,detail:"pool under 24h old"}),s(z.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:z.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}),s(u.verdict)}else i.push({check:"sellability",result:z.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."}),s(z.UNKNOWN);return{chainId:t,token:r,verdict:a,checks:i,note:"Structural checks only. UNKNOWN is not PASS. A token is not tradeable until a sell simulation succeeds."}}}}function yu(e){let n={...qT(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,c0({chainId:e.chainId,wrappedNative:e.wrappedNative})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,i0({chainId:e.chainId,wrappedNative:e.wrappedNative}));let o={};for(let[i,a]of Object.entries(n))o[i]=a.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 fn=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",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",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",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",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",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",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",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",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}}]}]);function ni(){return fn.map(e=>ns(yu(e)))}function d0(e){return ns(yu(e))}var ri=new Map,DT=Object.keys(De).map(Number),HT=Object.keys(ct).map(Number),jT=fn.map(e=>e.chainId),zT=[...new Set(Object.values(Yo))],bu=new Set,p0=!1;function N(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(p0&&bu.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return ri.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),ri.get(t)}function os(e){return ri.get(e)||null}function oi({venue:e,op:t}={}){let n=[...ri.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function VT(){bu.clear();for(let e of ri.keys())bu.add(e);p0=!0}N({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"});N({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."});N({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."});N({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."});N({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"});N({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."});N({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."});N({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."});N({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."});N({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."});N({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."});N({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"],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."});N({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."});N({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."]])N({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});N({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."});N({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:jT,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:fn.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."});N({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)"});N({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)"});N({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"});N({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."});N({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."});N({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 v1 quote + local-signer Solana swap handoff"});N({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."});N({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."});N({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."});N({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."});N({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."});N({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"});N({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)"});N({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});N({id:"uniswap-v3",venue:"dex",chainIds:DT,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"});N({id:"uniswap-v4",venue:"dex",chainIds:HT,auth:"none",ops:["health","quote","chains"],execution:"read-only",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 Quoter exact-in quotes via eth_call across official deployments plus Robinhood Chain. Quote-only until Universal Router prepare is classified."});N({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)"});N({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)"});N({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)"});N({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});N({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)"});N({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains"],execution:"intent",baseEnv:[],description:"CowSwap batch auction quotes + guarded EIP-712 order intents (public)"});N({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)"});N({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)"});N({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"});N({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"});N({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"});N({id:"opensea-nft",venue:"nft",chainIds:zT,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"});N({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity"],execution:"prepare",baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 agent identity registration and inspection using an exact configured registry; the connected wallet signs and pays network gas"});N({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"});N({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"});N({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"});N({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"});N({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"});N({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)"});N({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"});N({id:"odos",venue:"dex",chainIds:[1,10,56,137,8453,42161,43114,4663],auth:"none",ops:["health","chains","quote","prepare"],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)"});N({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"});N({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"});N({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."});N({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."});VT();N({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});N({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."});N({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."});N({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. Confidential addresses return TXO counts only \u2014 amounts are blinded on chain and reported as such."});N({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."});N({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)."});N({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."});N({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."});N({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."});N({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."});N({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."});N({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"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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."});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});N({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)"});L();et();et();var XT=/^0x[0-9a-fA-F]{40}$/,ai="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function wu(e,t){let n=String(e||"").trim();if(!XT.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function y0(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function b0(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 QT(e){return[...e].sort((t,n)=>(y0(n.tvl)??-1)-(y0(t.tvl)??-1))}function xu(e){return e.hlInfo||le}function Su(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function ku(e={},t={}){let n=await xu(t)({type:"vaultSummaries"},t),r=QT((Array.isArray(n)?n:[]).map(b0));return Su({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function ls(e={},t={}){let r={type:"vaultDetails",vaultAddress:wu(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=wu(e.user,"user"));let o=await xu(t)(r,t);return Su({provider:"hl-vaults",vault:b0(o||{}),raw:o})}async function vu(e={},t={}){let n=wu(e.user||e.address,"user"),r=await xu(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 Su({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Eu(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return ls({...e,vaultAddress:ai},t);if(n==="summaries")return ku(e,t);if(n==="details")return ls(e,t);if(n==="mine")return vu(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function w0(e={}){try{let t=await Eu({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ai&&!!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}}}ge();import{AbiCoder as ZT}from"ethers";var Au=999;var Ce=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Iu=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),eP=ZT.defaultAbiCoder();function si(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 ci(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 or(e,t){return e.length?eP.encode(e,t):"0x"}function Zt(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 tP(e,t=0){let n=Zt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function hn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Au});let r=await q(Au,"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 gn(e){return{provider:"hl-precompiles",chainId:Au,...Iu,...e}}async function us(e={}){let t=await hn(Ce.l1BlockNumber,"0x",e);return gn({op:"l1BlockNumber",precompile:Ce.l1BlockNumber,l1BlockNumber:Zt(t).toString(),raw:t})}async function _u(e={},t={}){let n=ci(e.index??e.assetId??0,"index",32),r=await hn(Ce.markPx,or(["uint32"],[n]),t);return gn({op:"markPx",precompile:Ce.markPx,index:n,markPx:Zt(r).toString(),raw:r})}async function Tu(e={},t={}){let n=ci(e.index??e.assetId??0,"index",32),r=await hn(Ce.oraclePx,or(["uint32"],[n]),t);return gn({op:"oraclePx",precompile:Ce.oraclePx,index:n,oraclePx:Zt(r).toString(),raw:r})}async function Pu(e={},t={}){let n=ci(e.index??e.assetId??0,"index",32),r=await hn(Ce.spotPx,or(["uint32"],[n]),t);return gn({op:"spotPx",precompile:Ce.spotPx,index:n,spotPx:Zt(r).toString(),raw:r})}async function Nu(e={},t={}){let n=si(e.user,"user"),r=ci(e.perp??e.assetId??0,"perp",16),o=await hn(Ce.position,or(["address","uint16"],[n,r]),t);return gn({op:"position",precompile:Ce.position,user:n,perp:r,szi:tP(o,0),raw:o})}async function Cu(e={},t={}){let n=si(e.user,"user"),r=ci(e.token??0,"token",64),o=await hn(Ce.spotBalance,or(["address","uint64"],[n,r]),t);return gn({op:"spotBalance",precompile:Ce.spotBalance,user:n,token:r,total:Zt(o,0).toString(),hold:Zt(o,1).toString(),raw:o})}async function Ou(e={},t={}){let n=si(e.user,"user"),r=si(e.vaultAddress??e.vault??ai,"vault"),o=await hn(Ce.vaultEquity,or(["address","address"],[n,r]),t);return gn({op:"vaultEquity",precompile:Ce.vaultEquity,user:n,vaultAddress:r,hlp:r===ai,equity:Zt(o,0).toString(),raw:o})}async function Ru(e={},t={}){let n=si(e.user,"user"),r=await hn(Ce.withdrawable,or(["address"],[n]),t);return gn({op:"withdrawable",precompile:Ce.withdrawable,user:n,withdrawable:Zt(r).toString(),raw:r})}async function x0(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return us(t);if(n==="markPx")return _u(e,t);if(n==="oraclePx")return Tu(e,t);if(n==="spotPx")return Pu(e,t);if(n==="position")return Nu(e,t);if(n==="spotBalance")return Cu(e,t);if(n==="vaultEquity"||n==="hlp")return Ou(e,t);if(n==="withdrawable")return Ru(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function S0(e={}){try{let t=await us(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Iu,l1BlockNumber:t.l1BlockNumber,precompiles:Ce}}catch(t){return{ok:!1,provider:"hl-precompiles",...Iu,error:String(t?.message||t).slice(0,160)}}}et();X();function k0(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ps(e={},t,n){let r=String(t||""),o=k0(e);if(o){let a=li(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=li(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function ms(e={},t=[],n){let r=k0(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(li(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&li(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(li(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var $u=Number.MAX_SAFE_INTEGER,ds=String($u);function li(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=$u?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>ds.length||t.length===ds.length&&t>ds||t===ds&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=$u?r:null}function z0(){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 tn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function V0(e){let t=tn(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function WP(e,t,n=4){let r=tn(e),o=tn(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 a=10**i;return String(Math.floor(r/o*a+1e-12)/a)}function W0(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]||{},a=n[o]||{},s=String(i.name||"").trim(),c=tn(a.funding),l=tn(a.markPx??a.oraclePx),u=tn(a.openInterest)??0;!s||c==null||!(l>0)||r.push({coin:s,szDecimals:Number.isInteger(Number(i.szDecimals))?Number(i.szDecimals):4,funding:c,markPx:l,oraclePx:tn(a.oraclePx),openInterest:u,fundingAprPct:V0(c)})}return r}function G0(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=tn(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=V0(n),o=n>0,i={coin:e.coin,notionalUsd:tn(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?WP(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 Zu(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await dt(t),i=W0(o).filter(a=>a.funding>0&&a.openInterest>=r).sort((a,s)=>s.funding-a.funding||s.openInterest-a.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 ed(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 dt(t),i=W0(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return G0(i,r)}async function td(e={},t={}){Y0(e,t,"hl-delta-neutral");let n=X0(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await ed(e,t);if(r.verdict==="skip")return O({...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=ps(e,r.coin,"hl-delta-neutral");if(!K0.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(()=>(ws(),Ju)),a=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(a?.signed===!0||a?.broadcast===!0)throw new Error("hl-delta-neutral: prepare cannot sign or broadcast");let s=a?.localSignerEnvelope||null,c=a?.localSignerBlockedReason||null;return O({...r,prepared:!!s,surface:"hl",hedge:a,localSignerEnvelope:s,localSignerBlockedReason:c,signed:!1,broadcast:!1,signing:s?"awaiting-hl-signer":"blocked",oraclePrepared:!!s},{provider:"hl-delta-neutral",kind:"hl-carry-hedge"})}var K0=/^0x[0-9a-fA-F]{40}$/;function Y0(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 GP(e,t,n){Y0(e,t,n)}function KP(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=X0(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"&&ms(e,n,"hl-delta-neutral"),t==="live"&&!K0.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 X0(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 Q0(e={},t={}){GP(e,t,"hl-delta-neutral");let n=KP(e),r=await Zu({limit:e.limit??16,minOpenInterest:e.minOpenInterest},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.coin))continue;let c=G0(s,a);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 td({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,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(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();X();$r();var XP=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),gi=14,J0=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Fr(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function nd(e){let t=String(e||"").replace(/\/$/,"");if(!XP.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Z0(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=J0(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=nd(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(ir(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(ir(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Fr(n.orderType,0,"orderType"),Fr(n.timeInForce,1,"timeInForce"),Fr(n.reduceOnly,0,"reduceOnly"),Fr(n.triggerPrice,0,"triggerPrice"),Fr(n.orderExpiry,-1,"orderExpiry");let c=J0(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=mt(n.baseAmount,"lighter: baseAmount"),d=mt(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,w=u*d,x=_e(n.notionalUsd,g,"lighter: notionalUsd");if(x<=0n)throw new Error("lighter: notionalUsd required");if(w!==x)throw new Error("lighter: notionalUsd must match size and price");let y=_e(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>y)throw new Error("lighter: notional exceeds cap");let b=Te(n.notionalUsd,"lighter: notionalUsd");return Fr(n.txType,gi,"txType"),Object.freeze({unit:"usd",value:String(b),notional:String(b),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(b)})}function QP(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 eg(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=nd(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:QP(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??gi,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return Z0(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var ng="https://mainnet.zklighter.elliot.ai",rg="https://testnet.zklighter.elliot.ai";function JP(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?rg:ng}function og(){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 Sn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function ZP(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 ig(e){let t=Sn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function eN(e,t,n=4){let r=Sn(e),o=Sn(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 a=10**i;return Math.floor(r/o*a+1e-12)}function tg(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function ag(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 a of r){let s=tg(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=tg(a.market_id);if(s==null)continue;let c=o.get(s),l=Sn(c?.mark_price??c?.index_price),u=Sn(a.rate),d=String(a.symbol||c?.symbol||"").trim();!d||u==null||!(l>0)||i.push({coin:d,symbol:d,marketIndex:s,funding:u,markPx:l,openInterest:Sn(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:ig(u)})}return i}function sg(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Sn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=ig(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Sn(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?eN(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 cg(e={}){let t=JP(e),n=e.fetchImpl,r=await k(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await k(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function rd(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await cg(t),i=ag(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function od(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 cg(t),a=ag(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return sg(a,r)}async function id(e={},t={}){ug(e,t,"lighter");let n=dg(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 od(e,t);if(o.verdict==="skip")return O({...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=ps(e,o.coin,"lighter");if(!lg.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 s=!!(t.testnet||process.env.LIGHTER_TESTNET==="1"),c=Number(o.sizeDecimals||0)+Number(o.priceDecimals||0),l=ZP(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:gi,submitTo:`${s?rg:ng}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=eg(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return O({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var lg=/^0x[0-9a-fA-F]{40}$/;function ug(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 tN(e,t,n){ug(e,t,n)}function nN(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=dg(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"&&ms(e,n,"lighter"),t==="live"&&!lg.test(String(e.owner||"")))throw new Error("lighter: live loop requires owner");let a=e.accountIndex;if(t==="live"&&(typeof a!="number"||!Number.isSafeInteger(a)||a<0))throw new Error("lighter: live loop requires accountIndex");return{mode:t,allowlist:n,maxCoins:o,maxNotionalUsd:i,accountIndex:a}}function dg(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 pg(e={},t={}){tN(e,t,"lighter");let n=nN(e),r=await rd({limit:e.limit??16},t),o=new Set(n.allowlist),i=[],a=Math.floor(n.maxNotionalUsd/n.maxCoins);for(let s of r.candidates){if(o.size&&!o.has(s.symbol)&&!o.has(s.coin))continue;let c=sg(s,a);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 id({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,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(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var oN="https://clob.polymarket.com",iN="https://gamma-api.polymarket.com";function yi(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||oN).replace(/\/$/,"")}function mg(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||iN).replace(/\/$/,"")}async function ad(e={}){return k(`${yi(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function fg(e={}){let t=await ad(e);return{ok:t!=null&&t!=="",time:t}}async function hg({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,a])=>[i,String(a)]))});return k(`${mg(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function gg(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${yi(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yg(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${yi(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function bg(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${yi(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function wg(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 k(`${yi(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function xg({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,a])=>[i,String(a)]))});return k(`${mg(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}ge();L();import{createHash as Sg}from"node:crypto";var Ur="mainnet-beta",sN="https://api.mainnet-beta.solana.com",sd="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function cN(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||sN).trim()}function me(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 lN(e,t){return t?[...e,{commitment:t}]:e}async function bi(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=await k(cN(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:e,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(o?.error)throw new Error(`solana-rpc ${e}: ${o.error.message||JSON.stringify(o.error)}`);return o?.result}async function cd(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await bi("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Ur,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function kg(e={}){try{let[t,n]=await Promise.all([bi("getHealth",[],e),cd({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Ur,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Ur,error:String(t?.message||t),exec:!1}}}async function xs(e={},t={}){let n=me(e.address||e.owner,"address"),r=await bi("getBalance",lN([n],e.commitment),t);return{provider:"solana-rpc",cluster:Ur,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function uN(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 wi(e={},t={}){let n=me(e.owner||e.address,"owner"),r=e.mint?{mint:me(e.mint,"mint")}:{programId:me(e.programId||sd,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await bi("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(uN):[];return{provider:"solana-rpc",cluster:Ur,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function dN(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 pN(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 a=e[o++];if(n|=(a&127)<<r,(a&128)===0)return{value:n,offset:o};r+=7}throw new Error("solana-rpc: transaction shortvec too long")}function mN(e){let t=Buffer.from(e,"base64");try{let n=pN(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Sg("sha256").update(t.subarray(r)).digest("hex")}catch{return Sg("sha256").update(t).digest("hex")}}async function vg(e={},t={}){let n=dN(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await bi("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Ur,ok:i.err==null,transactionHash:mN(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var hN="mainnet",gN="https://mempool.space/api",yN="https://mempool.space/testnet/api";function Ht(e={}){return String(e.network||process.env.BTC_NETWORK||hN).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ud(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):Ht(e)==="testnet"?yN:gN}function ld(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 At(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 bN(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 dd(e,t={}){let n=`${ud(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 Ss(e,t={}){let n=await dd(e,t);try{return JSON.parse(n)}catch{return n}}async function Eg(e={}){try{let t=await dd("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:Ht(e),baseUrl:ld(ud(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:Ht(e),baseUrl:ld(ud(e)),error:ld(t?.message||t),exec:!1}}}async function Ag(e={}){let t=await dd("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:Ht(e),tipHeight:Number(t)}}async function Ig(e={}){try{let t=await Ss("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:Ht(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:Ht(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ks(e={},t={}){let n=At(e.address||e.addr,"address"),r=await Ss(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),s=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"bitcoin-esplora",network:Ht(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function _g(e={},t={}){let n=At(e.address||e.addr,"address"),r=await Ss(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:Ht(t),address:n,count:o.length,totalSats:String(o.reduce((i,a)=>i+Number(a.value||0),0)),utxos:o.map(i=>({txid:i.txid,vout:i.vout,value:Number(i.value||0),status:i.status||null}))}}async function Tg(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 Ss(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:Ht(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 Pg(e={},t={}){let n=bN(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:Ht(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 pd="https://ordinals.com";function vs(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var xN=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Ng(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=vs(e);if(r){let o=new URL(r).host,i=new URL(r).protocol,a=/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(o);n=xN.includes(o)&&(i==="https:"||a)}}catch{n=!1}return lt({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function qr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Ng(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 Cg(e={}){let t=vs(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 a=await(e.fetchImpl||fetch)(`${t}${o}`,{headers:Ng(e),signal:AbortSignal.timeout(8e3)});if(r={ok:a.status>0&&a.status<500,path:o,status:a.status},a.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 Es(e={},t={}){let n=At(e.address||e.addr,"address"),r=vs(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 a of o)try{let s=await qr(a,t),c=SN(s);return{provider:"bitcoin-meta",address:n,ok:!0,count:c.length,balances:c,source:a}}catch(s){i=s}return{provider:"bitcoin-meta",address:n,ok:!1,balances:[],error:String(i?.message||i||"all indexer paths failed")}}function SN(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 Dr(e={},t={}){let n=At(e.address||e.addr,"address"),r=vs(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}`],a=null;for(let s of i)try{let c=await qr(s,t),l=kN(c);return{provider:"bitcoin-meta",address:n,ok:!0,count:l.length,inscriptions:l,source:s}}catch(c){a=c}return{provider:"bitcoin-meta",address:n,ok:!1,inscriptions:[],error:String(a?.message||a||"all indexer paths failed")}}async function Og(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||pd,o=await qr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Rg(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||pd,o=Number(e.page||0),i=await qr(`${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 $g(e={},t={}){let n=t.ordinalsBase||pd,r=e.height??await qr(`${n}/r/blockheight`,t),o=await qr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function kN(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}))}X();var EN=["unsigned","notsigned","tosign","signable"],AN=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),IN=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function md(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function _N(e){return EN.some(t=>e.startsWith(t))||AN.has(e)}function TN(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=md(t);return _N(n)?!1:IN.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function PN(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 fd(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=>fd(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(TN(c)){o.push(c);continue}o.push(...fd(l,t+1,n,r))}let a=Object.keys(e).map(md).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(md(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),PN(e)&&o.push("v/r/s"),o}function nn(e,t){let n=fd(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 NN="https://api.satflow.com/v1";function Lg(e={}){return Et({provider:"satflow",defaultUrl:NN,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function As(e={}){return Lg(e).baseUrl}function gd(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function CN(e={}){return lt({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":gd(e)},Lg(e).trusted)}async function kn(e,{method:t="GET",body:n,opts:r={}}={}){if(!gd(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${As(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:CN(r),body:n!=null?JSON.stringify(n):void 0,signal:AbortSignal.timeout(r.timeoutMs??2e4)}),c=await s.text(),l;try{l=JSON.parse(c)}catch{l=c}if(!s.ok)throw new Error(`satflow ${t} ${e}: HTTP ${s.status} ${String(c).slice(0,200)}`);return l}async function Bg(e={}){if(!!!gd(e))return{ok:!1,provider:"satflow",baseUrl:As(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 kn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:As(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:As(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Mg(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 kn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Fg(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 kn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Ug(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 kn(`/item?${r}`,{opts:t})}}async function Is(e={},t={}){let n=At(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 kn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function qg(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 kn(`/orders/floor?${r}`,{opts:t})}}var ON=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Dg(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))ON.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var RN=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"]),$N=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function hd(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 LN(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=At(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=At(e.destination||e.seller_address||e.sellerAddress||e.payment_destination,"destination"),a=String(e.network||"bitcoin").toLowerCase();if(!["bitcoin","mainnet","testnet","signet","regtest"].includes(a))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:a,psbt:t},meta:{provider:"satflow",kind:"purchase-intent",priceSats:String(n)}}}async function Hg(e={},t={}){let n=Dg(e,RN);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=hd(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await kn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=hd(a)??hd(a?.intent);if(s==null)throw new Error("satflow: purchase intent did not report a price \u2014 refusing to return an unverifiable PSBT");if(s>o)throw new Error(`satflow: purchase price ${s} sats exceeds maxSats cap ${o} \u2014 PSBT withheld`);nn("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=LN(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return O({provider:"satflow",kind:"purchase-intent",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,marketplace:"satflow",magicEdenOrdinals:"deprecated-dead",priceSats:s.toString(),maxSats:o.toString(),intent:a,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 _s(e={},t={}){let n=Dg(e,$N);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 kn("/intent/sell",{method:"POST",body:n,opts:t});return nn("satflow",r),O({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."})}L();X();var Ps="https://lite-api.jup.ag/swap/v1",bd="So11111111111111111111111111111111111111112",Vg="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",MN=100,jg=2e4;function Wg(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Ps).replace(/\/$/,"")}function xi(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 Gg(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>MN)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Ts(e,t){return e==null?t:!!e}function FN(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 UN(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 Kg(e){let t=Buffer.from(e,"base64"),n=UN(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 yd(e={},{quotedAtMs:t=Date.now(),ttlMs:n=jg}={}){let r=me(e.inputMint,"inputMint"),o=me(e.outputMint,"outputMint"),i=xi(e.inAmount,"inAmount"),a=xi(e.outAmount,"outAmount"),s=xi(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Gg(e.slippageBps??50),l=(BigInt(a)-BigInt(a)*BigInt(c)/10000n).toString();if(s!==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:a,otherAmountThreshold:s,slippageBps:c,contextSlot:e.contextSlot??null,quotedAtMs:t,expiresAtMs:t+Math.min(Math.max(Number(n)||jg,1e3),3e4)}}function qN({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==bd)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=Kg(n),a=xi(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:a}}}var DN=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),HN="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function zg(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=HN.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 Yg(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(`${Ps}/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(),a=Object.entries(i),s=a.filter(([p])=>zg(p)),c=[],l=a.filter(([p])=>!zg(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Ps}/program-id-to-label`,verified:s.map(([p,m])=>({programId:p,label:m})),unresolved:l,verifiedOnChain:!1,totals:{fromRouterMap:a.length,verified:s.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<s.length;p+=90){let m=s.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[w,x]=m[g];h&&h.executable===!0&&DN.has(h.owner)?c.push({programId:w,label:x,owner:h.owner}):l.push({programId:w,label:x,reason:h?h.executable!==!0?"not executable":`unknown owner ${h.owner}`:"account not found"})}),p+90<s.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:`${Ps}/program-id-to-label`,verifiedOnChain:!0,verifiedAt:new Date().toISOString(),totals:{fromRouterMap:a.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 Xg(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Ns({inputMint:bd,outputMint:Vg,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 Ns(e={},t={}){let n=me(e.inputMint||e.fromMint||bd,"inputMint"),r=me(e.outputMint||e.toMint||Vg,"outputMint"),o=xi(e.amount||e.inAmount,"amount"),i=Gg(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Wg(t)}/quote`);a.searchParams.set("inputMint",n),a.searchParams.set("outputMint",r),a.searchParams.set("amount",o),a.searchParams.set("slippageBps",String(i)),a.searchParams.set("swapMode",e.swapMode||"ExactIn"),e.onlyDirectRoutes!=null&&a.searchParams.set("onlyDirectRoutes",String(!!e.onlyDirectRoutes)),e.platformFeeBps!=null&&a.searchParams.set("platformFeeBps",String(e.platformFeeBps));let s=await k(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=yd({...s,slippageBps:i},t);return{provider:"jupiter",chain:"solana-mainnet-beta",quoteReady:!0,executionReady:!1,inputMint:n,outputMint:r,amount:o,quote:s,solanaGuard:c}}function jN(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Qg(e={},t={}){let n=me(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:yd(e.quoteResponse,t)}:await Ns(e,t),o=r.quote,i=r.solanaGuard||yd(o,t);if(Ts(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await k(`${Wg(t)}/swap`,{method:"POST",body:jN({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Ts(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Ts(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Ts(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=FN(a?.swapTransaction);Kg(s),nn("jupiter",a);let c=a?.quoteResponse??a?.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=qN({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return O({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:s,localSignerEnvelope:d,localSignerBlockedReason:p,swapTransactionEncoding:"base64",lastValidBlockHeight:a?.lastValidBlockHeight??null,prioritizationFeeLamports:a?.prioritizationFeeLamports??null,computeUnitLimit:a?.computeUnitLimit??null,raw:a},{provider:"jupiter",kind:"jupiter-swap"})}L();var VN="https://coins.llama.fi",WN="https://api.llama.fi",GN="https://yields.llama.fi",KN="https://stablecoins.llama.fi";function YN(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||VN).replace(/\/$/,"")}function Jg(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||WN).replace(/\/$/,"")}async function It(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return k(`${YN(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Zg(e={}){let n=(await It(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Cs(e={}){return k(`${Jg(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function ey(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||GN).replace(/\/$/,""),r=await k(`${n}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(r?.data)?r.data:[];e.chain&&(o=o.filter(a=>String(a.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(a=>String(a.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(a=>!!a.stablecoin==!!e.stablecoin)),o.sort((a,s)=>Number(s.tvlUsd||0)-Number(a.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 Os(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||KN).replace(/\/$/,""),r=e.includePrices!==!1;return k(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function ty(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 k(`${Jg(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function ny(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await It(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();qe();Rs();X();di();var QN="https://li.quest/v1";function Sd(e={}){return(e.baseUrl||process.env.LIFI_API_URL||QN).replace(/\/$/,"")}var xd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",JN="0x0000000000000000000000000000000000000000";function ZN(e){let t=String(e||xd).toLowerCase();return t===xd.toLowerCase()||t===JN}function ry(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 oy(e={}){let t=await k(`${Sd(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 En(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=xd,toToken:i,fromAmount:a,fromAddress:s=vn}=e;if(n==null||!i||!a)throw new Error("lifiQuote requires fromChain, toToken, fromAmount");let c=new URLSearchParams({fromChain:String(n),toChain:String(r),fromToken:o,toToken:i,fromAmount:String(a),fromAddress:s}),l=We({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 ys({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(B0(u)))c.set(g,w);let d=await k(`${Sd(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=ie(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 iy(e={},t={}){let n=await En(e,t),r=n?.transactionRequest;if(!r?.to||!r?.data)throw new Error("lifi: quote did not return an executable transactionRequest");let o=Number(e.fromChain);if(r.chainId!=null&&Number(r.chainId)!==o)throw new Error("lifi: transaction chain mismatch");if(e.fromAddress&&r.from&&String(r.from).toLowerCase()!==String(e.fromAddress).toLowerCase())throw new Error("lifi: transaction sender mismatch");let i=null;if(!ZN(e.fromToken)){let a=n?.estimate?.approvalAddress||n?.approvalAddress;if(!a)throw new Error("lifi: ERC20 route missing approvalAddress");let s=n?.action?.fromToken?.address||n?.estimate?.fromToken?.address||e.fromToken;i={token:ry(s,"approval token"),spender:ry(a,"approval spender"),amount:String(e.fromAmount)}}return O({provider:"lifi",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:o,quote:n,autoSlippage:n.autoSlippage,requiresApproval:i,transaction:{chainId:o,from:r.from||e.fromAddress,to:r.to,data:r.data,value:r.value??"0x0",...r.gasLimit!=null?{gasLimit:r.gasLimit}:{},slippageGuard:ye(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function ay(e={}){return k(`${Sd(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}ge();qe();X();import{Interface as ly,getAddress as Si,isAddress as tC}from"ethers";var An={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},nC=[1,50,100,200,2e3],sy=new ly(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),rC=new ly(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),uy="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",dy="0x0000000000000000000000000000000000000000";function py(e){let t=Number(e),n=An[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(An).join(", ")})`);return{chainId:t,...n}}function cy(e,t){let n=An[Number(t)];if(!e||e===uy||e===dy||/^eth$/i.test(String(e)))return Si(n.weth);let r=String(e);if(/^weth$/i.test(r))return Si(n.weth);if(/^usdc$/i.test(r))return Si(n.usdc);if(!tC(r))throw new Error(`invalid token address: ${e}`);return Si(r)}async function $s(e={},t={}){let{chainId:n,quoter:r,router:o}=py(e.chainId??8453),i=cy(e.tokenIn||"WETH",n),a=cy(e.tokenOut||An[n].usdc,n),s=BigInt(e.amountIn??0);if(s<=0n)throw new Error("amountIn required (raw base units)");let c=e.tickSpacing!=null?[Number(e.tickSpacing)]:e.tryTickSpacings===!1?[100]:[...nC],l=[],u=null;for(let d of c){let p=sy.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await q(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=sy.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return ie({venue:"aerodrome",chainId:n,chain:An[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function my(e={},t={}){let n=Number(e.chainId??8453),r=py(n),o=Si(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===uy||i===dy||/^eth$/i.test(i),s=await $s(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=rC.encodeFunctionData("exactInputSingle",[{tokenIn:s.tokenIn,tokenOut:s.tokenOut,tickSpacing:s.tickSpacing,recipient:o,deadline:u,amountIn:BigInt(s.amountIn),amountOutMinimum:BigInt(s.amountOutMinimum),sqrtPriceLimitX96:0n}]);return O({provider:"aerodrome",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,deadline:u,quote:s,autoSlippage:s.autoSlippage,requiresApproval:a?null:{token:s.tokenIn,spender:r.router,amount:s.amountIn},transaction:{chainId:n,from:o,to:r.router,data:d,value:a?s.amountIn:"0",slippageGuard:ye(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function fy(e={}){let t=Number(e.chainId??8453);try{let n=await $s({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:An[t]?.router,quoter:An[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function hy(){return Object.entries(An).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();qe();X();var iC="https://api.0x.org";function gy(e={}){return Et({provider:"zerox",defaultUrl:iC,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function yy(e={}){return gy(e).baseUrl}function Ls(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function by(e={}){return lt({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Ls(e)},gy(e).trusted)}async function wy(e={}){if(!Ls(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await kd({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 kd(e={},t={}){if(!Ls(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxPrice requires sellToken, buyToken, sellAmount");let s=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i)});return a&&s.set("taker",a),k(`${yy(t)}/swap/allowance-holder/price?${s}`,{headers:by(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ar(e={},t={}){if(!Ls(t))throw new Error("ZEROX_API_KEY required for 0x");let{chainId:n=8453,sellToken:r,buyToken:o,sellAmount:i,taker:a}=e;if(!r||!o||!i)throw new Error("zeroxQuote requires sellToken, buyToken, sellAmount");let s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`0x: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({chainId:String(n),sellToken:r,buyToken:o,sellAmount:String(i),slippageBps:String(s.selectedBps)});a&&c.set("taker",a);let l=await k(`${yy(t)}/swap/allowance-holder/quote?${c}`,{headers:by(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?ie(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:s}}async function xy(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await ar(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 O({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:ye(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}Us();L();qe();import{TypedDataEncoder as mC,getAddress as vi,isAddress as fC}from"ethers";var z8=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"}),cC=new Set(["evm:execute","btc:execute","solana:execute","nft:buy","nft:mint","cow:submit"]),lC=new Set(["evm:prepare"]),uC="this capability plane prepares only; sign with the user wallet or oracle signer";function Hr(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function Ey(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}function Ay(e,{env:t=process.env,userInitiated:n=!1,autonomous:r=!1}={}){return cC.has(e)?{capability:e,armed:!1,allowed:!1,reason:uC}:lC.has(e)?String(t.ORACLE_EVM_ADDRESS??"").trim()?!n&&!r?{capability:e,armed:!1,allowed:!1,reason:"preparation requires an explicit request or enabled unattended preparation"}:r&&!Hr(t)?{capability:e,armed:!1,allowed:!1,reason:"unattended preparation is off"}:{capability:e,armed:!1,allowed:!0,reason:null}:{capability:e,armed:!1,allowed:!1,reason:"a public address is required to prepare this action"}:{capability:e,armed:!1,allowed:!1,reason:`unknown capability: ${e}`}}function dC(e,t={}){let n=Ay(e,t);if(!n.allowed){let r=new Error(`oracle: ${e} not permitted: ${n.reason}`);throw r.status=n,r}return n}function pC(e=process.env){return{model:"read/prepare plane; sign and broadcast through wallet or oracle signer",armed:[],autonomousTrading:"off",autonomousPreparation:Hr(e)?"ENABLED":"off",note:"Oracle prepares actions. The user wallet or oracle signer signs and submits after confirmation."}}Rs();X();var _y={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"},hC=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),gC=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Td={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Ty={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Iy=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"}]}),Z8=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function Pd(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=_y[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function qs(e,t){let n=String(e||"").trim();if(!fC(n))throw new Error(`cowswap: ${t} must be an address`);return vi(n).toLowerCase()}function _d(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 yC(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 bC(e){let t=hC[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:vi(t)}}function wC(e={},t,n){let r=qs(e.sellToken,"sellToken"),o=qs(e.buyToken,"buyToken"),i=qs(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=yC(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:_d(e.sellAmount,"sellAmount"),buyAmount:_d(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:_d(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Py(e={}){try{let t=await In({chainId:1,sellToken:Td[1],buyToken:Ty[1],sellAmountBeforeFee:"1000000000000000",from:vn},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 In(e={},t={}){let n=Number(e.chainId??1),r=wd(e.from||e.owner),o=e.sellToken||Td[n],i=e.buyToken||Ty[n],a=String(e.sellAmountBeforeFee||e.sellAmount||"0");if(!o||!i||a==="0")throw new Error("cowQuote requires sellToken, buyToken, sellAmountBeforeFee");if(/eeeeeeee|native|^eth$/i.test(o)&&(o=Td[n],!o))throw new Error("no WETH mapping for chain");let s={sellToken:o,buyToken:i,from:r,receiver:e.receiver||r,sellAmountBeforeFee:a,kind:e.kind||"sell",signingScheme:e.signingScheme||"eip1271"},c=await k(`${Pd(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?ie(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Ny(e={},t={}){let n=Number(e.chainId??1),r=qs(wd(e.from||e.owner||e.signer),"owner"),o=await In({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=wC(o?.quote||o,n,r),a=bC(n),s={domain:a,types:Iy,primaryType:"Order",message:i},c=mC.hash(a,Iy,i),l=gC[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return O({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:vi(l).toLowerCase(),quote:o,quoteId:o?.id??e.quoteId??null,typedData:s,cowGuard:{mode:"cow-order",version:1,provider:"cowswap",chainId:n,owner:r,settlement:a.verifyingContract.toLowerCase(),vaultRelayer:vi(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:vi(l).toLowerCase(),amount:i.sellAmount}},{provider:"cowswap",kind:"cow-order"})}async function Cy(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return k(`${Pd(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Oy(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return k(`${Pd(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function Ry(){return Object.keys(_y).map(Number)}L();qe();X();var SC="https://api.1inch.dev/swap/v6.0";function $y(e={}){return Et({provider:"oneinch",defaultUrl:SC,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Nd(e={}){return $y(e).baseUrl}function Ei(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Cd(e={}){let t=Ei(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},$y(e).trusted)}async function Ly(e={}){if(!Ei(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Ai({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 Ai(e={},t={}){if(!Ei(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 a=new URLSearchParams({src:r,dst:o,amount:String(i)}),s=await k(`${Nd(t)}/${n}/quote?${a}`,{headers:Cd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?ie(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function kC(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Od(e={},t={}){if(!Ei(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return k(`${Nd(t)}/${n}/approve/spender`,{headers:Cd(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function By(e={},t={}){if(!Ei(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1),{src:r,dst:o,amount:i}=e,a=e.from||e.fromAddress||e.userAddress||e.taker;if(!r||!o||!i||!a)throw new Error("oneinchPrepare requires src, dst, amount, from");let s=We({liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});if(!s.executable)throw new Error(`1inch: route requires ${s.requiredBps} bps above cap ${s.capBps}`);let c=new URLSearchParams({src:r,dst:o,amount:String(i),from:a,slippage:String(s.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 k(`${Nd(t)}/${n}/swap?${c}`,{headers:Cd(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(a).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=ie(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!kC(r)){let f=l?.spender||l?.approvalAddress||(await Od({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 O({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||a,to:u.to,data:u.data,value:u.value??"0x0",...u.gas!=null?{gasLimit:u.gas}:{},slippageGuard:ye(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}var EC=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Ii(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||EC,a=Date.now();return new Promise((s,c)=>{let l=!1,u=[],d=0,p=new o(i),m=setTimeout(()=>{f(),l||(l=!0,u.length?s({ok:!0,partial:!0,ms:Date.now()-a,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,s({ok:!0,ms:Date.now()-a,subscription:e,messages:u,last:u[u.length-1]})))}),p.addEventListener("error",()=>{f(),l||(l=!0,c(new Error("hl ws error")))})})}async function My(e={}){try{let t=await Ii({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 Fy(e={}){let t=await Ii({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Uy(e,t={}){if(!e)throw new Error("coin required");let n=await Ii({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var IC=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Ds(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 a=t.url||IC,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,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 w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function qy(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Ds([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 Dy(e,t={}){if(!e)throw new Error("assetId required");let n=await Ds([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}L();import{getAddress as $C,Interface as zr,keccak256 as Ld}from"ethers";import{createHash as Bd,createHmac as LC,timingSafeEqual as nb}from"node:crypto";ge();import{Interface as zy,getAddress as Rd,isAddress as TC}from"ethers";var PC="0x0000000000000000000000000000000000000000",Vy=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),NC=new zy(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),CC=new zy(["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)"]);function OC(e){let t=Number(e??4663),n=Vy[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Hy(e,t){if(/^weth$/i.test(String(e||"")))return Rd(Vy[t].weth);if(!TC(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Rd(e)}function RC(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function jy(e,t,n,r,o,i){let a=r.encodeFunctionData(o,i),s=await e(t,"eth_call",[{to:n,data:a},"latest"]);if(!s||s==="0x")throw new Error(`up33: empty ${o} result`);return r.decodeFunctionResult(o,s)}async function Wy(e,t={},n={}){try{let r=OC(t.chainId),o=Hy(t.tokenIn,r.chainId),i=Hy(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=RC(e==="exact-input"?t.amountIn:t.amountOut,e==="exact-input"?"amountIn":"amountOut"),s=Number(t.tickSpacing??2e3);if(!Number.isInteger(s)||s<=0)throw new Error("up33: invalid tickSpacing");let c=n.rpcCall||q,l=await jy(c,r.chainId,r.factory,NC,"getPool",[o,i,s]),u=Rd(l[0]);if(u.toLowerCase()===PC)throw new Error("up33: exact pool unavailable");let d=e==="exact-input"?"quoteExactInputSingle":"quoteExactOutputSingle",p=e==="exact-input"?{tokenIn:o,tokenOut:i,amountIn:a,tickSpacing:s,sqrtPriceLimitX96:0n}:{tokenIn:o,tokenOut:i,amount:a,tickSpacing:s,sqrtPriceLimitX96:0n},m=await jy(c,r.chainId,r.quoter,CC,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:s,sqrtPriceX96After:m[1].toString(),initializedTicksCrossed:Number(m[2]),gasEstimate:m[3].toString(),executionReady:!1,preparable:!1,readOnly:!0};return e==="exact-input"?{...f,amountIn:a.toString(),amountOut:m[0].toString()}:{...f,amountIn:m[0].toString(),amountOut:a.toString()}}catch(r){return{error:String(r.message||r).slice(0,200)}}}async function Gy(e={},t={}){return Wy("exact-input",e,t)}async function Ky(e={},t={}){return Wy("exact-output",e,t)}X();var j=4663,Hs="https://anvil.clutch.market",BC=`${Hs}/api/markets/snapshot?chainId=${j}`,MC=`${Hs}/api/rpc?chainId=${j}`,FC=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),tt="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Md="0x0000000000000000000000000000000000000000",sr=1e5,UC=256e3,Yy=256,qC=3e4,DC=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"}),ft=Object.freeze({chainId:j,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Be=new zr(["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"]),HC=new zr(["function allowance(address owner,address spender) view returns (uint256)"]),rb=new zr(["function decimals() view returns (uint8)"]),Xy=new zr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),ht=new zr(["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)"]),_n=new zr(["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)"]);function D(e,t){try{return $C(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function on(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 nt(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 ee(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(j,"eth_call",[{to:D(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function ob(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 Qy(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>Yy)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Yy}`);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)!==j)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${j}`);return{name:n.name||n.collectionName||null,chainId:j,collection:D(n.collection||n.collectionAddress,"Anvil collection"),market:D(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?D(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 jC(e,t,n=[],r={}){if(Number(e)!==j)throw new Error(`stonkbrokers: Anvil supports chain ${j} only`);if(!FC.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await k(MC,{method:"POST",headers:{origin:Hs,referer:`${Hs}/`,"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 _t(e={}){return e.rpcCall||((t,n,r)=>jC(t,n,r,e))}async function Vr(e={},t={}){if(e.snapshot){let s=Qy(e.snapshot),c={kind:"anvil-markets",chainId:j,total:s.length,contentHash:Bd("sha256").update(jr(s)).digest("hex")},l=Fd(e.snapshotCompletenessEvidence,c,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return Object.defineProperty(s,"snapshotCoverage",{value:{complete:l.valid,evidence:l.evidence,error:l.error},enumerable:!1}),s}let n=s=>{let c=String(s?.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 k(BC,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:UC,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=Qy(r),i={kind:"anvil-markets",chainId:j,total:o.length,contentHash:Bd("sha256").update(jr(o)).digest("hex")},a=Fd(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:a.valid,evidence:a.evidence,error:a.error},enumerable:!1}),o}function js(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 ib({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 Vr({},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 a=DC[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=_t(n),c=js(await s(j,"eth_blockNumber",[])),l=await s(j,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||js(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 s(j,"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=Ld(p).toLowerCase();if(m!==a)throw new Error("stonkbrokers: Anvil market runtime identity is not reviewed");return{rpc:s,record:i,blockNumber:c,blockHash:u,blockRef:d,runtimeCodeHash:m,snapshotFetchedAtMs:r,snapshotExpiresAtMs:r+qC}}function ab(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:j,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 Ti(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=on(e.tokenId),i=await ib({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Be,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Be,"inventory",[BigInt(o)],s),ee(a,r,ht,"ownerOf",[BigInt(o)],s),ee(a,n,Be,"collection",[],s),ee(a,n,Be,"token",[],s),ee(a,n,Be,"robinhoodSwapFeeWei",[],s)]),f=D(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=D(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await ee(a,h,rb,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(m[0]).toString(),x=ab(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),y=!!c[4],b=!!l[0],S=D(u[0],"NFT owner")===n,I=y&&b&&S;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:j,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:w,fees:ob(c[2],c[3]),available:I,evidence:{quoteAvailable:y,inventory:b,ownerIsMarket:S,marketCollection:f,attestation:x},reason:I?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function zs(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await ib({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Be,"quoteSellNFT",[],a),ee(i,n,Be,"collection",[],a),ee(i,n,Be,"token",[],a),ee(i,n,Be,"robinhoodSwapFeeWei",[],a)]),d=D(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=D(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await ee(i,p,rb,"decimals",[],a))[0]);if(!Number.isSafeInteger(m)||m<0||m>255)throw new Error("stonkbrokers: invalid payment token decimals");let f=BigInt(u[0]).toString(),h=ab(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:j,market:n,collection:r,paymentToken:p,paymentTokenDecimals:m,amountUnits:"payment-token-raw",netPayoutRaw:BigInt(s[0]).toString(),grossPayoutRaw:BigInt(s[1]).toString(),nativeSwapFeeWei:f,fees:ob(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function sb(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 rn(e,t){let n=nt(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function cb({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:j,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:rn(o,"gasLimit").toString(),maxFeePerGas:rn(i,"maxFeePerGasWei").toString(),nonce:Number(s),type:2};if(!Number.isSafeInteger(c.nonce)||c.nonce<0)throw new Error("stonkbrokers: explicit non-negative nonce required");return a!=null&&a!==""&&(c.maxPriorityFeePerGas=rn(a,"maxPriorityFeePerGasWei").toString()),c}function lb(e,t){return O({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 ub(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=D(e.market,"Anvil market"),o=D(e.collection,"NFT collection"),i=on(e.tokenId),a=rn(e.maxTotalCostRaw,"maxTotalCostRaw"),s=nt(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 Ti({market:r,collection:o,tokenId:i},t);if(!l.available)throw new Error("stonkbrokers: NFT is not provably available");if(BigInt(l.totalCostRaw)>a||BigInt(l.nativeSwapFeeWei)>s)throw new Error("stonkbrokers: live quote exceeds reviewed cap");let u=BigInt(l.totalCostRaw),d=rn(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=D(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,w={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await ee(_t(t),f,HC,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let y={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},b=[cb({...y,to:r,data:Be.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],S={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:S,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:sb(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:S,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return lb(I,l)}async function db(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=_t(t),r=D(e.seller,"seller"),o=D(e.market,"Anvil market"),i=D(e.collection,"NFT collection"),a=on(e.tokenId),s=rn(e.minPayoutRaw,"minPayoutRaw"),c=nt(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 zs({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ee(n,i,ht,"ownerOf",[BigInt(a)],p).then(v=>D(v[0],"NFT owner")),ee(n,i,ht,"getApproved",[BigInt(a)],p).then(v=>D(v[0],"NFT approval")),ee(n,i,ht,"isApprovedForAll",[r,o],p).then(v=>!!v[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)<s||BigInt(u.nativeSwapFeeWei)>c)throw new Error("stonkbrokers: live quote violates reviewed limit");let g=BigInt(u.netPayoutRaw),w=rn(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),y=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),b=D(u.paymentToken,"Anvil payment token"),S=Number(u.paymentTokenDecimals),I={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},T=[cb({...I,to:o,data:Be.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},A={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:b,paymentTokenDecimals:S,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:w.toString()},tradeId:sb(e.tradeId),slippageBps:0,expiresAtMs:x+y,fee:{oracleFeeBps:0},artifact:{chainId:j,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:T}};return lb(A,u)}async function zC(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(S=>on(S)),y={kind:"anvil-inventory",chainId:j,market:D(e.market,"Anvil market"),collection:D(e.collection,"NFT collection"),total:x.length,contentHash:Bd("sha256").update(jr(x)).digest("hex")},b=Fd(e.inventoryCompletenessEvidence,y,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:x,total:x.length,scanned:x.length,complete:b.valid,continuation:b.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:b.evidence,completenessError:b.error}}let n=_t(t),r=D(e.market,"Anvil market"),o=js(await n(j,"eth_blockNumber",[])),i=await n(j,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||js(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Be,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>sr)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${sr}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>sr))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${sr}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:sr};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Be,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let x=f.toString();g.add(x),h.push(x),f=BigInt((await ee(n,r,Be,"getNextTokenId",[f],s))[0])}let w=h.length===l;return{ids:h,total:l,scanned:h.length,complete:w,continuation:w?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function VC(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 WC(e,t,n){let r=_t(n);try{let o=String((await ee(r,e,ht,"tokenURI",[BigInt(t)]))[0]),i=VC(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await k(a,{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 ee(r,e,ht,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function pb(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 GC(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),a=String(r?.op||"eq").trim().toLowerCase();if(a==="exists")return i!=null;if(i==null)return!1;let s=i.value;if(a==="eq")return String(s).toLowerCase()===String(r.value).toLowerCase();if(a==="in")return Array.isArray(r.values)&&r.values.some(u=>String(s).toLowerCase()===String(u).toLowerCase());let c=Number(s),l=Number(r.value);if(!Number.isFinite(c)||!Number.isFinite(l))return!1;if(a==="gte")return c>=l;if(a==="lte")return c<=l;throw new Error(`stonkbrokers: unsupported trait filter op ${a}`)})}async function Vs(e={},t={}){let n=D(e.market,"Anvil market"),r=D(e.collection,"NFT collection"),o=await zC({...e,market:n},t),i=o.ids,a=Math.min(Math.max(Number(e.minStars??4)||4,1),5),s=Math.min(Math.max(Number(e.concurrency??8)||8,1),16);if(e.raritySource==="rarityOf"){let u=_t(t),p=(await Ve(i,s,async h=>{try{let g=await ee(u,r,ht,"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>=a),f=(await Ve(p,s,async h=>{try{let g=await Ti({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:j,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 Ve(i,s,async u=>{try{let[d,p]=await Promise.all([WC(r,u,t),Ti({market:n,collection:r,tokenId:u},t)]),m=pb(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?GC(d,f):e.includeAll===!0?!0:m!=null&&m>=a)?{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:j,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 mb(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Jy(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 fb(e={}){return{maxMarkets:Jy(e,"maxMarkets",sr),maxItemsPerMarket:Jy(e,"maxItemsPerMarket",sr)}}function hb(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function _i(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,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function gb(e,t){let n=t.length,r=n===e.length,o=e.snapshotCoverage?.complete===!0,i=o&&r&&t.every(s=>s.complete===!0),a=t.filter(s=>s.complete!==!0).map(s=>({market:s.market,continuation:s.continuation}));return{marketTotal:e.length,marketScanned:n,complete:i,truncated:!i,snapshotCompletenessEvidence:e.snapshotCoverage?.evidence||null,continuation:r?o?a.length?{markets:a}:null:{snapshotEvidenceRequired:!0,...a.length?{markets:a}:{}}:{marketOffset:n}}}async function yb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=fb(e),o=await Vr(e,t),i=hb(o,e,n),a=t.scanCollection||Vs,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Ve(i,s,async l=>{let u=mb(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 a(d,t);return{...l,status:"ok",scan:p,..._i(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),..._i(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:j,marketCount:i.length,...gb(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 bb(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=fb(e),o=await Vr(e,t),i=o.snapshotCoverage?.complete===!0,a=hb(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Ud,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Ve(a,l,async d=>{let p=mb(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",..._i(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=_i(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),..._i(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:j,marketCount:a.length,...gb(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 Zy(e,t){return e>t?"ARB":"PASS"}async function KC(e={},t={}){let n=String(e.direction||""),r=nt(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=D(e.paymentToken,"Anvil payment token"),i={chainId:j,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:_t(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Ky)({chainId:j,tokenIn:tt,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:tt,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||Nh)({...i,tokenIn:tt,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:tt,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 s=await(t.up33QuoteExactIn||Gy)({chainId:j,tokenIn:o,tokenOut:tt,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:tt,amountInRaw:r.toString(),amountOutWei:String(s.amountOut),source:`up33:${s.pool}`,venue:s.venue||"up33-v3",tickSpacing:s.tickSpacing,pool:s.pool,quoter:s.quoter,gasEstimate:s.gasEstimate};let c=await(t.uniV4QuoteExactIn||Tr)({...i,tokenIn:o,tokenOut:tt,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:tt,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 eb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=D(e.quoteToken,"conversion quote token");if(n!==tt)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=nt(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=nt(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function YC(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 jr(e){return Array.isArray(e)?`[${e.map(jr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${jr(e[t])}`).join(",")}}`:JSON.stringify(e)}function wb(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:LC("sha256",n).update(jr(r)).digest("hex")}}function XC(e,t){return wb(e,t)}function Fd(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=XC(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!nb(a,s))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 QC(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:YC(e,t)}function $d(e,t,n,r,o,i){let a=QC(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==j)throw new Error(`${r} evidence chainId mismatch`);if(String(a.route||"")!==t)throw new Error(`${r} evidence route mismatch`);if(String(a.leg||"")!==o.leg)throw new Error(`${r} evidence leg mismatch`);if(!String(a.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 s=String(a.mac||"").toLowerCase(),c=wb(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!nb(l,u))throw new Error(`${r} evidence authentication failed`);if(!/^0x[0-9a-f]{64}$/.test(String(a.calldataHash||"").toLowerCase()))throw new Error(`${r} evidence calldata hash is invalid`);if(o.calldataHash!=null&&String(a.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} evidence calldata mismatch`);if(String(a.blockHash||"").toLowerCase()!==o.blockHash||String(a.blockNumber)!==o.blockNumber)throw new Error(`${r} evidence block mismatch`);if(o.orderHash!=null&&String(a.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} evidence order mismatch`);if(o.protocolAddress!=null&&D(a.protocolAddress,`${r} protocol address`)!==o.protocolAddress)throw new Error(`${r} evidence protocol mismatch`);let d=Number(a.quotedAtMs),p=Number(a.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=a.amountWei??a.amount??a.gasCostWei??a.gasPriceWei,f=nt(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=rn(a.gasLimit,`${r} evidence gasLimit`),g=rn(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let w=a.simulation;if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`${r} simulation evidence is required`);if(Number(w.chainId)!==j)throw new Error(`${r} simulation chainId mismatch`);if(String(w.route||"")!==t||String(w.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(w.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(w.blockHash||"").toLowerCase()!==o.blockHash||String(w.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(w.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(D(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let y=D(w.sender,`${r} simulation sender`),b=D(w.owner,`${r} simulation owner`);if(!o.owner||y!==o.owner||b!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(nt(w.valueWei,`${r} simulation valueWei`))!==String(nt(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(w.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&D(w.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(w.success!==!0||w.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(w.result??"")))throw new Error(`${r} simulation did not return a successful result`);let S=Number(w.quotedAtMs),I=Number(w.expiresAtMs);if(!Number.isFinite(S)||!Number.isFinite(I)||S>n||I<=n||I<=S)throw new Error(`${r} simulation is stale or has invalid freshness bounds`);return{amount:f,evidence:{...a,amountWei:f.toString()},error:null}}catch(s){return{amount:null,evidence:null,error:String(s.message||s)}}}function tb(e){let t=D(e,"OpenSea payment token");if(t!==Md&&t!==tt)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Ud(e={},t={}){let n=await Vs(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=D(e.owner,"execution owner")}catch{}let a=(w,x,y,b={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:y,owner:i,...b}),s=(w,x,y,b,S)=>$d(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(y,b,x,S),o),c=(w,x)=>{let y=null;try{y=D(w?.target,"conversion target")}catch{}let b=a(w?.calldataHash,w,"conversion",{target:y,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(b.calldataHash)||!/^0x[0-9a-f]{64}$/.test(b.blockHash)||!/^\d+$/.test(b.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let S=$d(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",b,o);if(S.amount!=null||w?.gasEstimate==null)return S;let I=$d(e.gasPriceEvidence,x,r,"gas price",{...b,leg:"conversion-gas-price"},o);if(I.amount==null)return{amount:null,evidence:null,error:I.error};let T=nt(w.gasEstimate,"conversion gasEstimate");return{amount:T*I.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:T.toString(),gasPriceEvidence:I.evidence},error:null}},l=(w,x,y,b,S)=>{try{let I=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(I))throw new Error("exact Seaport order hash is required");let T=D(x?.protocolAddress,"Seaport protocol address"),E=String(x?.executionCalldataHash||"").toLowerCase(),A=/^0x[0-9a-f]{64}$/.test(E)?E:null,v=b==="seaport-fulfillment"&&S===Md?String(x?.priceWei??""):"0",P={orderHash:I,protocolAddress:T,target:T,valueWei:v},B=s(w,b,A,y,P);if(B.amount==null)throw new Error(B.error);if(B.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let te=B.evidence?.approvalRequired;if(typeof te!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==te)throw new Error("Seaport approval requirement evidence mismatch");let Z=[B];if(te){let H=String(x?.approvalCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(H)?H:null,J=b==="seaport-offer-acceptance"?n.collection:S;Z.push(s(w,"seaport-approval",U,y,{...P,target:J,valueWei:"0"}))}if(S===Md){let H=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",U=String(x?.prerequisiteCalldataHash||"").toLowerCase(),J=/^0x[0-9a-f]{64}$/.test(U)?U:null,ke=H==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";Z.push(s(w,H,J,y,{...P,target:tt,valueWei:ke}))}let $=Z.find(H=>H.amount==null);if($)throw new Error($.error);return{amount:Z.reduce((H,U)=>H+U.amount,0n),evidence:Z.map(H=>H.evidence),error:null}}catch(I){return{amount:null,evidence:null,error:String(I.message||I)}}},u=nt(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Za,p=t.openSeaBestOffer||es,m=t.paymentTokenConversion||(w=>KC({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await zs({market:n.market,collection:n.collection},t),h=[];for(let w of n.candidates){let x=null;try{x=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId},t)}catch{}let y=w.quote,b=Ld(Be.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(y.totalCostRaw)])).toLowerCase(),S=s("anvil-to-opensea","anvil-call",b,y.evidence.attestation,{target:n.market,valueWei:y.nativeSwapFeeWei}),I=null,T=null;if(x)try{I=tb(x.paymentToken)}catch(U){T=String(U.message||U)}let E=T||!x?{amount:null,evidence:null,error:T||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,y.evidence.attestation,"seaport-offer-acceptance",I),A={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:y.paymentToken,amountUnits:y.amountUnits,anvilTotalCostRaw:y.totalCostRaw,anvilBaseCostRaw:y.baseCostRaw,anvilFeeRaw:y.fees.totalFeeRaw,paymentTokenDecimals:y.paymentTokenDecimals,nativeSwapFeeWei:y.nativeSwapFeeWei,openSeaGrossOfferWei:x?.grossOfferWei==null?null:String(x.grossOfferWei),openSeaSellingValueWei:x?.sellerNetWei==null?null:String(x.sellerNetWei),openSeaFeeWei:x?.feeWei==null?null:String(x.feeWei),openSeaPaymentToken:I,gasCostWei:S.amount==null?null:S.amount.toString(),gasEvidence:S.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!y.available)h.push({...A,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(T)h.push({...A,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${T}`});else if(S.amount==null)h.push({...A,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${S.error}`});else if(E.amount==null)h.push({...A,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({...A,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let U=eb(await m({chainId:j,direction:"acquire-exact-output",amountRaw:y.totalCostRaw,paymentToken:y.paymentToken,quoteToken:tt}),{direction:"acquire-exact-output",amountRaw:y.totalCostRaw}),J=c(U,"anvil-to-opensea");if(J.amount==null)h.push({...A,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${J.error}`});else{let ke=S.amount+E.amount+J.amount,pe=BigInt(x.sellerNetWei)-BigInt(U.amountInWei)-BigInt(y.nativeSwapFeeWei)-ke;h.push({...A,conversionGasCostWei:J.amount.toString(),conversionGasEvidence:J.evidence,totalExecutionGasWei:ke.toString(),anvilCostInWethWei:U.amountInWei,conversion:U,netWei:pe.toString(),decision:Zy(pe,u),reason:pe>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(U){h.push({...A,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}let v=null;try{v=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!v)continue;let P=Ld(Be.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),B=s("opensea-to-anvil","anvil-call",P,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),te=null,Z=null;try{te=tb(v.paymentToken)}catch(U){Z=String(U.message||U)}let $=Z?{amount:null,evidence:null,error:Z}:l("opensea-to-anvil",v,f.evidence.attestation,"seaport-fulfillment",te),H={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(v.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:te,gasCostWei:B.amount==null?null:B.amount.toString(),gasEvidence:B.evidence,marketplaceGasCostWei:$.amount==null?null:$.amount.toString(),marketplaceGasEvidence:$.evidence,conversionGasCostWei:null};if(Z){h.push({...H,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${Z}`});continue}if(B.amount==null){h.push({...H,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${B.error}`});continue}if($.amount==null){h.push({...H,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({...H,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let U=eb(await m({chainId:j,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:tt}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),J=c(U,"opensea-to-anvil");if(J.amount==null)h.push({...H,conversion:U,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${J.error}`});else{let ke=B.amount+$.amount+J.amount,pe=BigInt(U.amountOutWei)-BigInt(v.priceWei)-BigInt(f.nativeSwapFeeWei)-ke;h.push({...H,conversionGasCostWei:J.amount.toString(),conversionGasEvidence:J.evidence,totalExecutionGasWei:ke.toString(),anvilPayoutInWethWei:U.amountOutWei,conversion:U,netWei:pe.toString(),decision:Zy(pe,u),reason:pe>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(U){h.push({...H,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(U.message||U)}`})}}let g=n.complete===!0?h:h.map(w=>w.decision==="ARB"?{...w,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:w);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:j,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((w,x)=>{let y=BigInt(w.netWei??"-1"),b=BigInt(x.netWei??"-1");return b>y?1:b<y?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Ws(e={},t={}){let n=_t(t),r=on(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,ft.ammVault,Xy,"quoteSpecificBuy",[BigInt(r)]),ee(n,ft.ammVault,Xy,"inventory",[BigInt(r)]),ee(n,ft.nft,ht,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:D(a[0],"broker owner")===ft.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:j,brokerTokenId:r,tokenCostWei:BigInt(o[0]).toString(),ethFeeWei:BigInt(o[1]).toString(),available:c,evidence:s,reason:c?null:"broker-not-provably-in-inventory",exec:!1,readOnly:!0}}async function xb(e,t){try{return D((await ee(t,ft.nft,ht,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return D((await ee(t,ft.nft,ht,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Sb(e={},t={}){let n=_t(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Ve(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=on(a.brokerTokenId,"brokerTokenId"),c=on(a.nestedTokenId,"nestedTokenId"),l=D(a.tba,"TBA"),u=D(a.nestedCollection,"nested collection"),d=pb({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([xb(s,n),ee(n,u,ht,"ownerOf",[BigInt(c)]).then(g=>D(g[0],"nested owner")),Ws({brokerTokenId:s},t)]),h=p===l&&m===l&&f.available;return{brokerTokenId:s,tba:l,nestedCollection:u,nestedTokenId:c,stars:d,traits:a.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((a,s)=>s.stars-a.stars);return{provider:"stonkbrokers",chainId:j,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function kb(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=D(e.buyer,"buyer"),r=on(e.brokerTokenId,"brokerTokenId"),o=nt(e.maxTokenCostWei,"maxTokenCostWei"),i=nt(e.maxEthFeeWei,"maxEthFeeWei"),a=await Ws({brokerTokenId:r},t);if(!a.available)throw new Error("stonkbrokers: broker is not provably available");if(BigInt(a.tokenCostWei)>o||BigInt(a.ethFeeWei)>i)throw new Error("stonkbrokers: live quote exceeds reviewed cap");return O({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:j,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:ft.ammVault,maxTokenCostWei:o.toString(),maxEthFeeWei:i.toString(),quotedTokenCostWei:a.tokenCostWei,quotedEthFeeWei:a.ethFeeWei}},{provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",env:t.env})}async function Pi(e={},t={}){let n=_t(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?ft.overtimeBooster:ft.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,_n,"pendingEth"),ee(n,o,_n,"minDropWei"),ee(n,o,_n,"roundActive"),ee(n,o,_n,"currentRound"),ee(n,o,_n,"roundState").catch(()=>null),ee(n,o,_n,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:j,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=>D(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function vb(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?ft.overtimeBooster:ft.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?_n.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):_n.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return O({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:j,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:j,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Eb(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>on(s,"brokerTokenId")):[],r=_t(t),o=await Ve(n,8,async s=>{let[c,l]=await Promise.all([ee(r,ft.nft,ht,"ownerOf",[BigInt(s)]).then(u=>D(u[0],"broker owner")),xb(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Pi({which:"stock"},t),Pi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:j,owner:e.owner?D(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Ab(e={},t={}){try{let n=await Vr(e,t);return{ok:!0,chainId:j,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Ib(e={},t={}){try{let n=await Pi({which:"stock"},t);return{ok:!0,chainId:j,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:j,error:String(n.message||n).slice(0,180)}}}X();import{createHash as ZC}from"node:crypto";var Ni="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",Nb=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"}]),an=Object.freeze(Object.fromEntries(Nb.map(e=>[e.name,e.selector]))),eO=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),tO=new Set(["name","endpoint","version","skills","domains"]),nO=new Set(["agentId","agentRegistry"]),_b=new Set(["reputation","crypto-economic","tee-attestation"]),rO=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,oO=64*1024;function Gr(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 qd(e,t,n){for(let r of Object.keys(e)){if(rO.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 Wr(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 Tb(e,t,{service:n=!1}={}){let r=Wr(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 Gs(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 cr(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function Ks(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 Ys(e){let t=cr(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Gs(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Dd(){let e=[];try{let t=cr(process.env.ORACLE_ERC8004_CHAIN_ID);Ys(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 iO(e){return JSON.parse(JSON.stringify(e))}function Oi(e){let t=Gr(e,"registration file");if(qd(t,eO,"registration"),t.type!==Ni)throw new Error("erc8004: registration-v1 type required");let n={type:Ni,name:Wr(t.name,"name",128),description:Wr(t.description,"description",4096),image:Tb(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((a,s)=>{let c=Gr(a,`services[${s}]`);qd(c,tO,`services[${s}]`);let l=Wr(c.name,`services[${s}].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:Tb(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=Wr(c.version,`services[${s}].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[${s}].${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((a,s)=>{let c=Gr(a,`registrations[${s}]`);qd(c,nO,`registrations[${s}]`);let l=Ks(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[${s}].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>_b.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!_b.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>oO)throw new Error("erc8004: registration metadata oversized");return iO(n)}function Cb(e){if(Gr(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ni)throw new Error("erc8004: registration-v1 type required");return Oi({type:Ni,...e})}function Ob(e){let t=Oi(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Ci(e){return BigInt(e).toString(16).padStart(64,"0")}function Rb(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Ci(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function $b(e){return`${an.register}${Ci(32)}${Rb(e)}`}function Lb(e,t){return`${an.setAgentURI}${Ci(e)}${Ci(64)}${Rb(t)}`}function aO(e,t){return`${e}${Ci(t)}`}function Bb(e){return ZC("sha256").update(e,"utf8").digest("hex")}function Hd(e,t){Gr(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 Mb(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=cr(e.chainId),c=Gs(e.owner,"owner"),l=Ys(s),u=Number(t?.nowMs??Date.now());return O({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:Bb(r),selector:o,custody:"public-keyless",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,transaction:{chainId:s,from:c,to:l,data:i,value:"0x0"}},{provider:"erc8004-identity",kind:n,nowMs:u,expiresAtMs:t?.expiresAtMs})}function jd(e={},t={}){Hd(e,new Set(["chainId","owner","registration"]));let n=Ob(Cb(e.registration));return Mb(e,t,{kind:"erc8004-register",uri:n,selector:an.register,data:$b(n)})}function zd(e={},t={}){Hd(e,new Set(["chainId","owner","agentId","agentURI"]));let n=Ks(e.agentId),r=Fb(e.agentURI);return Mb(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:an.setAgentURI,data:Lb(n,r),id:n})}function Fb(e){let t=Wr(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 Oi(o),t}function sO(e,t={}){$a(e,{nowMs:t.nowMs,providers:["erc8004-identity"],kinds:["erc8004-register","erc8004-set-agent-uri"],label:"erc8004"});let n=Ys(cr(e.chainId));if(e.registry!==n||e.transaction?.to!==n)throw new Error("erc8004: registry mismatch");let r=Gs(e.owner,"owner");if(e.taker!==r||e.transaction?.from!==r)throw new Error("erc8004: owner/taker mismatch");if(e.transaction?.value!=="0x0")throw new Error("erc8004: transaction value must be zero");if(e.custody!=="public-keyless"||e.signingReady||e.broadcastReady||e.executionReady)throw new Error("erc8004: public custody flags mismatch");let o=e.kind==="erc8004-register"?an.register:an.setAgentURI;if(e.selector!==o)throw new Error("erc8004: selector mismatch");if(e.agentURIHash!==Bb(e.agentURI))throw new Error("erc8004: agentURI hash mismatch");let i=e.kind==="erc8004-register"?$b(e.agentURI):Lb(Ks(e.agentId),e.agentURI);if(e.transaction?.data!==i)throw new Error("erc8004: calldata mismatch");if(cr(e.transaction?.chainId)!==cr(e.chainId))throw new Error("erc8004: transaction chain mismatch");let a=Object.keys(Gr(e.transaction,"transaction")).sort();if(JSON.stringify(a)!==JSON.stringify(["chainId","data","from","to","value"]))throw new Error("erc8004: transaction authority fields mismatch");return e}function Pb(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 Gs(`0x${e.slice(-40)}`,t)}function cO(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 Vd(e={},t={}){Hd(e,new Set(["chainId","agentId"]));let n=cr(e.chainId),r=Ks(e.agentId),o=Ys(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:aO(d,r)},"latest"]),[a,s,c]=await Promise.all([i(an.ownerOf),i(an.tokenURI),i(an.getAgentWallet)]),l=Fb(cO(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Oi(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Pb(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Pb(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}ge();var Ub=999;async function qb(e={}){let t={chainId:Ub,rpc:null,dex:null};try{t.rpc=await _r(Ub,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Ho("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 Db(e="HYPE",t={}){let r=(await Ho(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 Hb(e,t={}){return Jn(e,t)}L();X();var dO="https://api-mainnet.magiceden.dev/v2",Ri=1e9;function jb(e={}){return Et({provider:"magiceden",defaultUrl:dO,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function Yr(e={}){return jb(e).baseUrl}function lr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function Xr(e={}){let t=lr(e);return lt({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},jb(e).trusted)}function Wd(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 Kr(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 pO(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 mO(e){return Math.round(Kr(e,"priceSol")*Ri)}function fO(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 hO({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function gO(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=hO(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function zb(e={}){try{let t=await Gd({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!lr(e),readTier:"keyless",prepareTier:lr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!lr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Gd(e={},t={}){let n=Wd(e.symbol||e.collection),r=await k(`${Yr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:Xr(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/Ri:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Ri:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Ri:null,exec:!1,raw:r}}function Vb(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*Ri):null,tokenSize:e.tokenSize??1}}async function Wb(e={},t={}){let n=Wd(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(`${Yr(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 a=await k(i.toString(),{headers:Xr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Vb);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Gb(e={},t={}){let n=me(e.tokenMint||e.mint,"tokenMint"),r=await k(`${Yr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:Xr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Vb);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Kb(e={},t={}){if(!lr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=me(e.buyer||e.userPublicKey,"buyer"),r=me(e.seller,"seller"),o=me(e.tokenMint,"tokenMint"),i=me(e.tokenATA||e.tokenAddress,"tokenATA"),a=me(e.auctionHouse,"auctionHouse"),s=Kr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Kr(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${Yr(t)}/instructions/buy_now`);l.searchParams.set("buyer",n),l.searchParams.set("seller",r),l.searchParams.set("auctionHouseAddress",a),l.searchParams.set("tokenMint",o),l.searchParams.set("tokenATA",i),l.searchParams.set("price",String(s)),e.sellerReferral&&l.searchParams.set("sellerReferral",String(e.sellerReferral)),e.buyerReferral&&l.searchParams.set("buyerReferral",String(e.buyerReferral));let u=await k(l.toString(),{headers:Xr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});nn("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 O({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:s,maxPriceSol:c,lamports:mO(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Xs(e={},t={}){if(!lr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=me(e.seller||e.userPublicKey,"seller"),r=me(e.tokenMint,"tokenMint"),o=me(e.tokenATA||e.tokenAddress,"tokenATA"),i=me(e.auctionHouse,"auctionHouse"),a=Kr(e.priceSol??e.price,"priceSol"),s=fO(e.expiry),c=gO(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${Yr(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(a)),e.sellerReferral&&l.searchParams.set("sellerReferral",me(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await k(l.toString(),{headers:Xr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});nn("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 O({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:a,expiry:s,confirmation:c,transaction:p,transactionEncoding:"base64",raw:u})}async function Yb(e={},t={}){if(!lr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=me(e.buyer||e.userPublicKey,"buyer"),r=Wd(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=Kr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Kr(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${Yr(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await k(a.toString(),{headers:Xr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=pO(s);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`);nn("magiceden",s);let u=s?.v0?.tx?.data??s?.tx?.data??null;if(!Array.isArray(u))throw s?.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 O({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:s})}X();Fu();L();et();var Qr=8,Kd=10n**BigInt(Qr),bO="0xa4b1",Xb=7,Yd=1,wO=2n**64n-1n;function xO(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 Li(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function Zr(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 $i(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>Qr)throw new Error(`hl-staking: ${t} has more than ${Qr} decimals`);let i=BigInt(r)*Kd+BigInt((o+"0".repeat(Qr)).slice(0,Qr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>wO)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Jr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function sn(e){let t=BigInt(String(e||"0")),n=t/Kd,r=(t%Kd).toString().padStart(Qr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Qb(e={}){try{let t=await Xd(e);return{ok:t.count>0,provider:"hl-staking",chain:Li(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 Xd(e={}){let t=await le({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 Qd(e={},t={}){let n=Zr(e.user||e.address,"user"),r=await le({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 Jd(e={},t={}){let n=Zr(e.user||e.address,"user"),r=await le({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 Jb(e={},t={}){let n=Zr(e.user||e.address,"user"),r=await le({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Zb(e={},t={}){let n=Zr(e.user||e.address,"user"),r=await le({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Zd(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 Qs(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||bO)}function SO(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Qs(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function ep({kind:e,action:t,types:n,primaryType:r,message:o,opts:i,notes:a,caps:s,args:c={}}){let l={provider:"hl-staking",venue:"hypercore",chain:Li(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:xO(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:SO(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=hs(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,O(l,{provider:"hl-staking",kind:e})}function ew(e={},t={}){let n=$i(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:$i(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${sn(n)} HYPE exceeds maxHype cap ${sn(r)} HYPE`);let o=Zd(e),i=Li(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Qs(t),wei:Jr(n),nonce:o};return ep({kind:"hype-stake-deposit",action:a,primaryType:"HyperliquidTransaction:CDeposit",types:{"HyperliquidTransaction:CDeposit":[{name:"hyperliquidChain",type:"string"},{name:"wei",type:"uint64"},{name:"nonce",type:"uint64"}]},message:{hyperliquidChain:i,wei:Jr(n),nonce:o},opts:t,args:e,caps:{amountHype:sn(n),maxHype:r?sn(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 tw(e={},t={}){let n=$i(e.amountHype??e.amount,"amountHype"),r=Zd(e),o=Li(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Qs(t),wei:Jr(n),nonce:r};return ep({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:Jr(n),nonce:r},opts:t,args:e,caps:{amountHype:sn(n)},notes:[`Starts the ${Xb} 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 nw(e={},t={}){let n=Zr(e.validator,"validator"),r=$i(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 a=o?e.isUndelegate:i?e.undelegate:!1,s=e.maxHype==null?null:$i(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${sn(r)} HYPE exceeds maxHype cap ${sn(s)} HYPE`);let c=Zd(e),l=Li(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Qs(t),validator:n,wei:Jr(r),isUndelegate:a,nonce:c};return ep({kind:a?"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:Jr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:sn(r),maxHype:s?sn(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Yd} 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 ${Yd} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function rw(e={},t={}){let n=Zr(e.user||e.address,"user"),r=await Qd({user:n},t),o=await Jd({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Xb,validatorLockupDays:Yd,exec:!1}}et();async function tp(e={}){let t=Date.now();try{let n=await Jt(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}}}var vO=24*365,EO=8;function Me(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function AO(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Js(e={},t={}){let[n,r]=await Promise.all([dt(t),Jt(t).catch(()=>({}))]),o=n?.[0]?.universe??n?.universe??[],i=Array.isArray(n?.[1])?n[1]:[],s=o.map((c,l)=>{let u=i[l]||{},d=Me(u.markPx),p=Me(u.prevDayPx),m=Me(u.openInterest),f=Me(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Me(u.oraclePx),midPx:Me(u.midPx)??Me(r?.[c.name]),prevDayPx:p,change24hPct:AO(d,p),dayNtlVolumeUsd:Me(u.dayNtlVlm),premium:Me(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(vO/EO)*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:s.length,markets:s,totals:{openInterestUsd:s.reduce((c,l)=>c+(l.openInterestUsd||0),0),dayNtlVolumeUsd:s.reduce((c,l)=>c+(l.dayNtlVolumeUsd||0),0)}}}async function ow(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Js(e,t),a=(s,c=-1)=>r.filter(l=>l[s]!=null).sort((l,u)=>(l[s]-u[s])*c).slice(0,n);return{provider:"hl-info",venue:"hyperliquid",kind:"leaderboards",asOfMs:o,totals:i,gainers:a("change24hPct"),losers:a("change24hPct",1),byVolume:a("dayNtlVolumeUsd"),byOpenInterest:a("openInterestUsd"),fundingHighest:a("fundingRateAprPct"),fundingLowest:a("fundingRateAprPct",1)}}async function iw(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(),a=i-o,[s,c,l]=await Promise.all([Js({},t),Or({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Cr(n,t).catch(()=>null)]),u=s.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:Me(h.o),high:Me(h.h),low:Me(h.l),close:Me(h.c),volume:Me(h.v)})),p=l?.levels??[],m=Me(p?.[0]?.[0]?.px),f=Me(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 aw(e={},t={}){let n=await cs(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}))}}import{mkdirSync as QO,readFileSync as JO,readdirSync as ZO,renameSync as eR,writeFileSync as tR}from"node:fs";import{homedir as nR}from"node:os";import{join as nc}from"node:path";var rt=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"}),_O=new Set(["watch","watch this","ping","ping me","alert","notify"]),TO=new Set(["watching","armed"]);function sw(e){if(typeof e!="string"||!e.trim())throw new TypeError("explicit action verb required");let t=e.trim().toLowerCase().replace(/\s+/g," ");if(_O.has(t))return rt.ALERT_ONLY;if(t==="arm")return rt.EXECUTE;throw new TypeError(`unsupported action verb: ${t}`)}function PO(e={}){let{verb:t,...n}=e;return{...n,active:!0,actionMode:sw(t)}}function NO(e){if(!e||typeof e!="object"||typeof e.active!="boolean")throw new TypeError("active must be boolean");if(!Object.values(rt).includes(e.actionMode))throw new TypeError("actionMode must be alert_only or execute");return e}function CO(e){return e?.active===!0&&e?.actionMode===rt.ALERT_ONLY}function OO(e){return e?.active===!0&&e?.actionMode===rt.EXECUTE}function RO(e={}){if(e.actionMode!==void 0&&e.actionMode!==rt.ALERT_ONLY)throw new TypeError("non-alert record cannot enter alert-only watch migration");let t=typeof e.active=="boolean"?e.active:TO.has(String(e.status||"").toLowerCase());return{...e,active:t,actionMode:rt.ALERT_ONLY}}L();ge();X();import{Interface as np,getAddress as fw,isAddress as $O}from"ethers";var cw=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),lw=Object.freeze({42161:{name:"arbitrum",api:cw[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:cw[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),uw="0x0000000000000000000000000000000000000000",LO=`0x${"0".repeat(64)}`,dw=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),pw=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Zs=new np(["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"]),hw=new np(["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)"]),BO=new np(["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)"]),MO=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function to(e){let t=Number(e??42161),n=lw[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(lw).join(", ")})`);return{chainId:t,...n}}function ec(e,t={}){let n=to(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function gt(e,t){if(!$O(e))throw new Error(`${t} must be a valid EVM address`);return fw(e)}function re(e){return fw(e).toLowerCase()}function eo(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 ur(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 FO(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 UO(e){let t=String(e||"marketIncrease").trim();if(!(t in dw))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:dw[t]}}function qO(e){let t=String(e||"noSwap").trim();if(!(t in pw))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:pw[t]}}function DO(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function HO(e,t){let n=re(t);return e.find(r=>re(r.marketToken||r.market||r.address)===n)||null}function jO(e,t){let n=re(t);return e.find(r=>re(r.tokenAddress||r.address)===n)||null}function zO({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=eo(e?.minPrice,"gmx minPrice"),i=eo(e?.maxPrice,"gmx maxPrice"),a=BigInt(r),s=10000n;return n==="marketIncrease"?(t?i*(s+a)/s:o*(s-a)/s).toString():(t?o*(s-a)/s:i*(s+a)/s).toString()}function VO(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function WO(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function jt(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 GO(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:jt(t,"account",a=>re(a)),market:jt(t,"market",a=>re(a)),initialCollateralToken:jt(t,"initialCollateralToken",a=>re(a)),key:jt(o,"key",a=>String(a).toLowerCase()),reason:jt(i,"reason",a=>String(a)),sizeDeltaUsd:jt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:jt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:jt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:jt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:jt(r,"isLong",a=>!!a)}}function KO(e={},t){if(re(e.address)!==re(t.eventEmitter))return null;let n;try{n=BO.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=MO[r];if(!o)return null;let i=GO(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||WO(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?re(s):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 mw(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function YO(e=[],{chainId:t}={}){let n=to(t);return(Array.isArray(e)?e:[]).map(r=>KO(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function gw(e={},t={}){return k(`${ec(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rp(e={},t={}){return k(`${ec(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function yw(e={},t={}){return k(`${ec(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function no(e={},t={}){return k(`${ec(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function bw(e={}){let t=await no({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function ww(e={},t={}){let n=to(e.chainId??42161),r=gt(e.account||e.owner||e.user,"gmx account"),o=ur(e.start??0,"gmx start"),i=ur(e.end??e.limit??20,"gmx end"),a=hw.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:re(n.reader),dataStore:re(n.dataStore),account:re(r),raw:c}}async function xw(e={},t={}){let n=to(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=hw.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:re(n.reader),dataStore:re(n.dataStore),key:r,raw:a}}async function Sw(e={},t={}){let n=to(e.chainId??42161),r=t.receipt||await Do({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=YO(r.logs||[],{chainId:n.chainId}),a=e.expectedOrderKey||e.orderKey?String(e.expectedOrderKey||e.orderKey).toLowerCase():null,s=a?i.filter(u=>u.orderKey===a):i;if(s.length===0)return{ok:!1,provider:"gmx",chainId:n.chainId,txHash:o,status:"unknown",reason:a?"order key not found in GMX EventEmitter logs":"no GMX order lifecycle event found",events:i,receipt:r};let c=s.reduce((u,d)=>mw(d.status)>=mw(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?re(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:re(n.eventEmitter),events:s,receipt:r}}async function kw(e={},t={}){let n=to(e.chainId??42161),r=UO(e.orderType||e.type),o=qO(e.decreasePositionSwapType),i=gt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=gt(e.receiver||i,"gmx receiver"),s=gt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?gt(e.callbackContract,"gmx callbackContract"):uw,l=e.uiFeeReceiver?gt(e.uiFeeReceiver,"gmx uiFeeReceiver"):uw,u=gt(e.market||e.marketToken,"gmx market"),d=gt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?eo(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):ur(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=eo(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=eo(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 w=FO(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[y,b]=await Promise.all([rp({chainId:n.chainId},t),no({chainId:n.chainId},t)]),S=HO(DO(y,"markets"),u);if(!S)throw new Error("gmx market not found in public registry");if(S.isListed===!1)throw new Error("gmx market is not listed");let I=gt(S.indexToken,"gmx market indexToken"),T=gt(S.longToken,"gmx market longToken"),E=gt(S.shortToken,"gmx market shortToken"),A=re(d);if(![re(T),re(E)].includes(A))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let v=VO(S,x);if(v>0n&&m>v)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let P=jO(b,I);if(!P)throw new Error("gmx index ticker not found");let B=e.acceptablePrice?eo(e.acceptablePrice,"gmx acceptablePrice").toString():zO({ticker:P,isLong:x,typeKey:r.key,maxSlippageBps:w}),te=(e.swapPath||[]).map(he=>gt(he,"gmx swapPath market"));if(te.length>3)throw new Error("gmx swapPath too long for guarded slice");let Z=ur(e.triggerPrice??"0","gmx triggerPrice"),$=ur(e.callbackGasLimit??"0","gmx callbackGasLimit"),H=ur(e.minOutputAmount??"0","gmx minOutputAmount"),U=ur(e.validFromTime??"0","gmx validFromTime"),J=!!e.shouldUnwrapNativeToken,ke=e.autoCancel==null?!0:!!e.autoCancel,pe=String(e.referralCode||LO);if(!/^0x[0-9a-fA-F]{64}$/.test(pe))throw new Error("gmx referralCode must be bytes32 hex");let Xt=Array.isArray(e.dataList)?e.dataList:[];for(let he of Xt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(he)))throw new Error("gmx dataList entries must be bytes32 hex");let dn={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:te},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:Z,acceptablePrice:BigInt(B),executionFee:f,callbackGasLimit:$,minOutputAmount:H,validFromTime:U},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:J,autoCancel:ke,referralCode:pe,dataList:Xt},R=[];r.key==="marketIncrease"&&p>0n&&R.push(Zs.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(Zs.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(Zs.encodeFunctionData("createOrder",[dn]));let F=Zs.encodeFunctionData("multicall",[R]),Y={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:re(i),receiver:re(a),exchangeRouter:re(n.exchangeRouter),router:re(n.router),orderVault:re(n.orderVault),market:re(u),indexToken:re(I),initialCollateralToken:re(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:B,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return O({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:re(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:re(d),spender:re(n.router),amount:p.toString()}:null,gmxGuard:Y,transaction:{chainId:n.chainId,from:re(i),to:re(n.exchangeRouter),data:F,value:f.toString(),gmxGuard:Y}},{provider:"gmx",kind:"gmx-order"})}et();var Tn="oracle.hl.entry-state.v1",rR=8,oR=24*365;function ue(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ro(e){return e==null||e===0?0:e>0?1:-1}function Bi(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function iR(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||nc(nR(),".config","oracle")}function Aw(e={}){return nc(iR(e),"hl-entry-states")}function tc(e,t,n){return n==null&&e.push(t),n}function aR(e,t){let n=String(t||"").toUpperCase(),r=e?.[0]?.universe??e?.universe??[],o=Array.isArray(e?.[1])?e[1]:[],i=r.findIndex(a=>String(a?.name||"").toUpperCase()===n);return i<0?null:{asset:r[i],ctx:o[i]||{},index:i}}function cn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function sR(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:ue(a.time),rate:ue(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return cn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)ro(o[a].rate)!==ro(o[a-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 cR(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return cn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=ue(a.peggedUSD??a.usd??i.circulatingPrevDay?.peggedUSD);s!=null&&(r+=s,o+=1)}return o?{source:"defillama.stablecoins",asOfMs:t,unknown:!1,assets:o,mcapUsd:r}:cn("defillama.stablecoins","no peggedUSD")}function vw(e,t){let n=ue(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 lR(e,{coin:t,hlMark:n,asOfMs:r}={}){let o=Array.isArray(e)?e:[],i=String(t||"").toUpperCase(),a=i==="BTC"?["BTC","WBTC","BTC.B"]:i==="ETH"?["ETH","WETH"]:[i],s=o.find(p=>a.includes(String(p.tokenSymbol||p.symbol||"").toUpperCase()));if(!s)return cn("gmx.tickers","no matching symbol");let c=vw(s.minPrice,n),l=vw(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return cn("gmx.tickers","unreadable price");let d=n!=null&&n>0?Bi(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?cn("gmx.tickers","price scale mismatch"):{source:"gmx.tickers",asOfMs:r??Date.now(),unknown:!1,chainId:42161,symbol:String(s.tokenSymbol||s.symbol),minPx:c,maxPx:l,midPx:u,hlMark:n??null,basisBps:d}}function uR({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?cn("hl-info.fundingHistory","not fetched"):sR(r,{coin:e,asOfMs:n}),llamaStables:o==null?cn("defillama.stablecoins","not fetched"):cR(o,n),gmxTicker:i==null?cn("gmx.tickers","not fetched"):lR(i,{coin:e,hlMark:t,asOfMs:n})}}function Ew(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=ue(s?.px),l=ue(s?.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 a=i>0?o/i:null;return{side:n,requestedNotionalUsd:t,fillableUsd:o,fillable:o+1e-9>=t,avgFillPx:a}}function dR(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 a=ue(i.szi),s=ue(i.positionValue)!=null&&a?Math.abs(ue(i.positionValue)/a):null,c=ue(i.entryPx),l=ue(i.liquidationPx),u=a==null?null:a>0?"long":a<0?"short":null,d=null,p=s??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 a==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:a,entryPx:c,liquidationPx:l,leverage:ue(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function pR({coin:e,notionalUsd:t=1e4,meta:n,book:r,userState:o=null,priorOiCoin:i=null,asOfMs:a=Date.now(),fundingHistory:s=null,llamaStables:c=null,gmxTickers:l=null}={}){let u=[];if(!e)return{schema:Tn,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=aR(n,e);if(!d)return{schema:Tn,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=tc(u,"markPx",ue(m.markPx)),h=tc(u,"oraclePx",ue(m.oraclePx)),g=ue(m.midPx),w=ue(m.premium),x=tc(u,"fundingRate",ue(m.funding)),y=tc(u,"openInterestCoin",ue(m.openInterest)),b=ue(m.dayNtlVlm),S=Array.isArray(m.impactPxs)?m.impactPxs:[],I=ue(S[0]),T=ue(S[1]),E=x==null?null:x*(oR/rR)*100,A=y==null||f==null?null:y*f,v=i==null||i===0||y==null?null:(y-i)/i*100;v==null&&u.push("oiDeltaPct");let P=r?.levels,B=Array.isArray(P)?P[0]:[],te=Array.isArray(P)?P[1]:[],Z=ue(B?.[0]?.px),$=ue(te?.[0]?.px);Z==null&&u.push("book.bidPx"),$==null&&u.push("book.askPx");let H=Ew(te,Number(t)||0,"buy"),U=Ew(B,Number(t)||0,"sell");H.fillable||u.push("book.buyFillable"),U.fillable||u.push("book.sellFillable");let J=g??f,ke=H.avgFillPx==null||J==null?null:Bi(H.avgFillPx,J),pe=U.avgFillPx==null||J==null?null:Bi(J,U.avgFillPx),Xt=dR(o,e);for(let Y of Xt.unknown||[])u.push(Y);let dn=ue(m.prevDayPx),R=f==null||dn==null||dn===0?null:(f-dn)/dn*100;R==null&&u.push("change24hPct");let F=uR({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return F.fundingPath.unknown&&u.push("overlays.fundingPath"),F.llamaStables.unknown&&u.push("overlays.llamaStables"),F.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Tn,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:Bi(f,h),fundingRate:x,fundingAprPct:E,openInterestCoin:y,openInterestUsd:A,oiDeltaPct:v,dayNtlVolumeUsd:b,change24hPct:R,impactBidPx:I,impactAskPx:T,maxLeverage:p.maxLeverage??null,book:{bidPx:Z,askPx:$,spreadBps:Z==null||$==null?null:Bi($,Z),notionalUsd:Number(t)||0,buy:H,sell:U,buySlipBps:ke,sellSlipBps:pe},position:Xt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Iw(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 a=n==="long"?e.book?.buy:e.book?.sell;if(!a)r.push({key:"book",status:"unverifiable",note:"no book walk"});else if(!a.fillable)r.push({key:"book",status:"counter",note:`cannot fill ${a.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 s=e.position?.liqDistancePct;e.position?.present?s==null?r.push({key:"liqDistancePct",status:"unverifiable",note:"liquidationPx unknown"}):r.push({key:"liqDistancePct",status:s<5?"counter":"aligned",note:`${s.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 mR(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 fR({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Tn||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=mR(n),a=Iw(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Tn,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:rt.ALERT_ONLY},c=Aw({...o,configDir:r||o.configDir});QO(c,{recursive:!0,mode:448});let l=nc(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return tR(u,`${JSON.stringify(s,null,2)}
144
+ `,{mode:384}),eR(u,l),s}function op(e={}){let t=Aw(e),n=[];try{n=ZO(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(JO(nc(t,r),"utf8")))}function hR(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:rt.ALERT_ONLY};let r=e.see,o=t;ro(r.fundingRate)!==ro(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),ro(r.premium)!==ro(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,a=o.position?.liqDistancePct;i!=null&&a!=null&&(a<5||a<i*.7)&&n.push({key:"liqDistancePct",level:"thesis-broke",from:i,to:a});let s=e.side,c=s==="long"?r.book?.buy:r.book?.sell,l=s==="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:Tn,id:e.id,coin:e.see.coin,side:e.side,actionMode:rt.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function _w(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await dt(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 Mi(e={},t={}){let n=e.coin,r=ue(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([dt(t),n?Cr(n,t).catch(()=>null):Promise.resolve(null),e.user?Rr(e.user,t).catch(()=>null):Promise.resolve(null),n?ss({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Os({},t).catch(()=>null),no({chainId:42161},t).catch(()=>null)]);return pR({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:ue(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Tw(e={},t={}){let n=e.see&&e.see.schema===Tn?e.see:await Mi(e,t);return{see:n,...Iw(n,e.side)}}async function Pw(e={},t={}){let n=e.see&&e.see.schema===Tn?e.see:await Mi(e,t);return fR({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Nw(e={},t={}){let n=e.locked||op(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:rt.ALERT_ONLY};let r=await Mi({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return hR(n,r)}et();fs();ws();async function Cw(e={}){let t=await ii(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Ow(e={},t={}){let n=e.coin,r=e.outcome==null?null:yn(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=$w(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=ip(i)));let a=n==null?null:bn(n);if(n!=null&&!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(e.sideName){let l=r??a?.outcome;if(l==null)throw new Error("hl-outcome: sideName requires outcome identity");let d=((await ii(t))?.outcomes||[]).find(f=>{try{return yn(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=ip(p);if(i!=null&&i!==m)throw new Error("hl-outcome: sideName does not match outcome side");if(a&&a.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=yn(r,i).coin}if(a=bn(n),!a)throw new Error(`hl-outcome: invalid outcome coin ${n}`);if(r!=null&&a.outcome!==r)throw new Error("hl-outcome: coin does not match outcome");if(i!=null&&a.side!==i)throw new Error("hl-outcome: coin does not match outcome side");let s=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,s==null?delete c.side:c.side=s,Mr(c,t)}async function Rw(e={},t={}){let n=e.coin,r=e.outcome==null?null:yn(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=$w(e.outcomeSide):(o=e.side,o!=null&&(o=ip(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=yn(r,o).coin}let i=bn(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 a={...e,coin:n,outcome:void 0,outcomeSide:i.side};return delete a.side,hi(a,t)}function $w(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function ip(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")}X();$r();var VH="0x"+"00".repeat(32);function bR(e){let t=typeof e=="bigint"?e:mt(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 Lw(e,t){let n=mt(e.makerAmount,"poly: makerAmount"),r=mt(e.takerAmount,"poly: takerAmount");return bR(t==="BUY"?n:r)}$r();var wR=new Set(["https://clob.polymarket.com/order"]),Fi=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),YH=Object.freeze(Fi.map(e=>e[0])),xR=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),SR="0xe111180000d2663c0091e4f400237545b87b996b",kR="0xe2222d279d744050d28e00520010520000310f59",Bw=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function Mw(e){let t=String(e||"").replace(/\/$/,"");if(!wR.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Fw(e){let t=pt(e,"poly: exchange").toLowerCase();if(!xR.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Uw(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=Bw(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(pt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Mw(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(Fw(o.verifyingContract),Fw(n.exchange),pt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==pt(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?kR:SR;if(pt(n.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=n.message||n.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let s=n.types?.Order;if(!Array.isArray(s)||s.length!==Fi.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let T=0;T<Fi.length;T+=1)if(s[T]?.name!==Fi[T][0]||s[T]?.type!==Fi[T][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(pt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(pt(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let l=Bw(n.tokenId,"tokenId",80);if(pt(a.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(a.side)===0?"BUY":"SELL";if(n.side&&n.side!==d)throw new Error("poly: side mismatch");let p=mt(a.makerAmount,"poly: makerAmount"),m=mt(a.takerAmount,"poly: takerAmount"),f=mt(n.makerAmount,"poly: prepared makerAmount"),h=mt(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,w=d==="BUY"?m:p,x=_e(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let y=_e(n.price,6,"poly: price");if(y<=0n||y>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*y!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(_e(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let S=Lw(a,d);if(_e(S,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 T=_e(I,6,"poly: maxNotionalUsd");if(g>T)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:S,submitTo:Mw(n.submitTo)})}function vR(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 qw(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)),a={version:1,surface:"poly",action:"order",owner:vR({...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 Uw(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as n9,randomInt as ER}from"node:crypto";import{keccak256 as o9,concat as i9,zeroPadValue as a9,getCreate2Address as s9,AbiCoder as c9}from"ethers";var Vw=137;var AR="0xE111180000d2663C0091e4f400237545B87B996B",IR="0xe2222d279d744050d28e00520010520000310F59",Dw="0x0000000000000000000000000000000000000000000000000000000000000000",ap=6;var _R={name:"Polymarket CTF Exchange",version:"2",chainId:Vw},TR={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"}]},Hw={"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}};function rc(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function oc(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function jw(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Ww(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function PR(e,t,n,r){let o=Ww(Number(n),r.price);if(e==="BUY"){let c=oc(Number(t),r.size),l=c*o;return rc(l)>r.amount&&(l=jw(l,r.amount+4),rc(l)>r.amount&&(l=oc(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=oc(Number(t),r.size),s=a*o;return rc(s)>r.amount&&(s=jw(s,r.amount+4),rc(s)>r.amount&&(s=oc(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function zw(e){let t=Number(e).toFixed(ap),[n,r=""]=t.split(".");return(n+r.padEnd(ap,"0").slice(0,ap)).replace(/^0+/,"")||"0"}function NR(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:a,negRisk:s=!1,tickSize:c="0.01",orderType:l="GTC",signatureType:u=0,metadata:d=Dw,builder:p=Dw}=e;if(!t)throw new Error("tokenId required");if(n!=="BUY"&&n!=="SELL")throw new Error("side must be BUY or SELL");if(!i||!a)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=Hw[String(c)]||Hw["0.01"],g=Ww(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=PR(n,f,g,h),y=zw(w),b=zw(x),S=String(ER(1,2**31-1)),I=Date.now().toString(),T=n==="BUY"?0:1,E=s?IR:AR,A={salt:S,maker:i,signer:a,tokenId:String(t),makerAmount:y,takerAmount:b,side:T,signatureType:u,timestamp:I,metadata:d,builder:p},v={..._R,verifyingContract:E},P=n==="BUY"?w:x;return{domain:v,types:TR,value:A,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:P,exchange:E,negRisk:s}}function Gw(){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 Kw(e={},t={}){let n=NR(e),r={provider:"poly-clob",kind:"poly-order",chainId:Vw,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=qw(r,e,t)}catch{r.oraclePrepared=!1}return O(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as n$,keccak256 as px}from"ethers";import{createHash as OR}from"node:crypto";import{wordlists as RR}from"ethers";var Qw=1,$R=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),LR=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],BR=new Set([12,15,18,21,24]);function MR(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return BR.has(t.length)&&t.every(n=>RR.en.getWordIndex(n)>=0)}var FR=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,UR=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,qR=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function DR(e){let t=Jw(e);return qR.has(t)||UR.test(t)}var ao=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Jw(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function HR(e){let t=Jw(e);return[...$R].some(n=>t.includes(n))}function jR(e,t,n){if(typeof t=="string"){if(LR.some(r=>r.test(t))||MR(t))throw new ao(n);if(FR.test(t)&&!DR(e))throw new ao(n)}}function so(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return jR(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)=>so(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(HR(o))throw new ao(i);e[o]!==void 0&&(r[o]=so(e[o],i,o))}return r}function Tt(e){return so(e)}function sp(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(sp).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${sp(e[t])}`).join(",")}}`}function Zw(e){return sp(so(e))}function ex(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: object required");let{receiptId:t,summary:n,...r}=e;return OR("sha256").update(Zw(r)).digest("hex")}function io(e,...t){for(let n of t)if(e[n]!==void 0)return e[n]}function oo(e,t,n){let r=io(e,...t);if(r==null)throw new TypeError(`action receipt: ${n} required`);return r}function zR(e){let t=io(e,"balances","balanceChanges"),n=io(e,"beforeBalances","balancesBefore","before"),r=io(e,"afterBalances","balancesAfter","after");return t!==void 0?{balances:t}:n===void 0&&r===void 0?{}:{balances:{...n===void 0?{}:{before:n},...r===void 0?{}:{after:r}}}}function tx(e={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("action receipt: input object required");so(e);let t=io(e,"txHash","transactionHash"),n=io(e,"phase","stage","resultType")??(t==null?"prepare":"execute");if(n!=="prepare"&&n!=="execute")throw new TypeError('action receipt: phase must be "prepare" or "execute"');let r={receiptVersion:Qw,phase:n,intent:oo(e,["intent"],"intent"),route:oo(e,["route"],"route"),decodedAction:oo(e,["decodedAction","action"],"decodedAction"),policyChecks:oo(e,["policyChecks","checks"],"policyChecks"),allowlistHits:oo(e,["allowlistHits","allowlistMatches"],"allowlistHits"),prepareHash:oo(e,["prepareHash"],"prepareHash"),...t==null?{}:{txHash:t},...zR(e)},o=so(r);return Object.freeze({...o,receiptId:ex(o)})}var VR=tx;function Yw(e,t=[]){if(typeof e=="string"||typeof e=="number")return String(e);for(let n of t)if(e?.[n]!=null)return String(e[n]);return"recorded"}function Xw(e){if(typeof e=="boolean")return e;if(e&&typeof e=="object"){if(typeof e.ok=="boolean")return e.ok;if(typeof e.allowed=="boolean")return e.allowed;if(typeof e.passed=="boolean")return e.passed}return null}function nx(e){if(!e||typeof e!="object")throw new TypeError("action receipt: object required");let t=Yw(e.decodedAction,["type","action","method","name"]),n=Yw(e.route,["name","provider","venue","id"]),r=Array.isArray(e.policyChecks)?e.policyChecks:Object.values(e.policyChecks||{}),o=r.filter(l=>Xw(l)===!0).length,i=r.filter(l=>Xw(l)===!1).length,a=Array.isArray(e.allowlistHits)?e.allowlistHits.length:Object.keys(e.allowlistHits||{}).length,s=e.txHash==null?"no transaction hash":`tx ${e.txHash}`,c=e.balances==null?"balances not provided":"before/after balances recorded";return`${e.phase} ${t} via ${n}; policy ${o} passed, ${i} failed; ${a} allowlist hit${a===1?"":"s"}; ${s}; ${c}; receipt ${e.receiptId}`}var WR=nx;X();dc();sc();var r$=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function o$(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Tt(e);for(let o of Object.keys(n))if(!r$.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 mx(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=ax(n,o),a=dx(n,{contractName:e.contractName,allowSkipStatic:t.allowSkipStatic!==!1,allowStaticFail:t.allowStaticFail===!0});if(!a.bytecode||a.bytecode==="0x")throw new Error("prepareTemplateDeploy: empty bytecode");let s=a.bytecode.startsWith("0x")?a.bytecode:`0x${a.bytecode}`,u=(await new n$(a.abi,s).getDeployTransaction(...o)).data,d=t.localForkSimulationReceipt??e.localForkSimulationReceipt??null,p=d===null?{status:"not-run",injected:!1,trusted:!1,gateDecision:!1,networkSideEffects:!1}:{...o$(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return O({provider:"protocol-templates",kind:"template-deploy",templateId:n,contractName:a.contractName,template:i,chainId:r,transaction:m,unsignedDeployEnvelope:{transaction:m,signed:!1,broadcast:!1},abi:a.abi,sourceHash:a.gate.sourceHash,bytecodeHash:px(s),authorityReport:sx(i),simulationReceipt:p,verificationManifest:{contractName:a.contractName,source:i.source,compiler:"0.8.24",optimizer:{enabled:!0,runs:200},openZeppelin:i.dependency,sourceHash:a.gate.sourceHash,creationBytecodeHash:px(s),constructorData:`0x${u.slice(s.length)}`},addressBookRecord:{status:"pending-deployment",address:null,chainId:r,label:`${n}:${a.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:a.gate.forgeBuild,forgeTests:a.gate.forgeTests,staticAnalysis:{tool:a.gate.staticAnalysis.tool,ok:a.gate.staticAnalysis.ok,skipped:a.gate.staticAnalysis.skipped},firmAudit:!1,disclaimer:lc},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"})}dc();fp();ws();L();var g$="https://api.geckoterminal.com/api/v2",fc=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||g$).replace(/\/$/,""),uo=e=>encodeURIComponent(String(e));async function hp(e={},t={}){let n=Math.max(1,Number(e.page||1));return k(`${fc(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Sx(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return k(`${fc(t)}/networks/${uo(e.network)}/pools/${uo(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function kx(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return k(`${fc(t)}/networks/${uo(e.network)}/tokens/${uo(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function vx(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)),k(`${fc(t)}/networks/${uo(e.network)}/pools/${uo(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ex(e={}){let t=await hp({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();ge();qe();X();import{Interface as Tx,getAddress as Px,isAddress as b$}from"ethers";var w$="https://api.curve.finance/v1",Nx=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||w$).replace(/\/$/,""),x$=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),Cx="0x0000000000000000000000000000000000000000",gp=new Tx(["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)"]),Ax=new Tx(["function coins(uint256) view returns (address)"]);function Ox(e){let t=x$[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Wi(e,t){if(!b$(e))throw new Error(`${t} must be a valid EVM address`);return Px(e)}function S$(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 Ix(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 Rx(e,t,n){return[e,t,n,...Array(8).fill(Cx)]}function $x(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Lx(e){return[e,...Array(4).fill(Cx)]}async function k$({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Ax.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Ax.decodeFunctionResult("coins",c);i.push(Px(l[0]))}return i}function _x(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 Bx(e={}){return k(`${Nx(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function yp(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 k(`${Nx(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Mx(e={}){let t=await yp({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function bp(e={},t={}){let n=Number(e.chainId??8453),r=Ox(n),o=Wi(e.pool,"curve pool"),i=Wi(e.tokenIn,"curve tokenIn"),a=Wi(e.tokenOut,"curve tokenOut"),s=S$(e.amountIn,"curve amountIn"),c=Ix(e.nCoins??2,"curve nCoins",2,8),l=Ix(e.poolType,"curve poolType",1,4),u=t.rpcCall||q,d=await k$({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=_x(d,i,"tokenIn"),m=_x(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=Rx(i,o,a),h=$x(p,m,l,c),g=Lx(o),w=gp.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),y=gp.decodeFunctionResult("get_dy",x),b=BigInt(y[0]);if(b<=0n)throw new Error("curve quote returned zero output");return ie({venue:"curve",router:r,chainId:n,pool:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),amountOut:b.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(S=>S.map(I=>I.toString())),pools:g},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Fx(e={},t={}){let n=Number(e.chainId??8453),r=Ox(n),o=Wi(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Wi(e.receiver||e.recipient||o,"curve receiver"),a=await bp({...e,sender:o},t),s=Rx(a.tokenIn,a.pool,a.tokenOut),c=$x(a.i,a.j,a.poolType,a.nCoins),l=Lx(a.pool),u=gp.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return O({provider:"curve",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:a,autoSlippage:a.autoSlippage,requiresApproval:{token:a.tokenIn,spender:r,amount:a.amountIn},transaction:{chainId:n,from:o,to:r,data:u,value:"0",slippageGuard:ye(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}L();ge();X();import{Interface as E$,getAddress as A$,isAddress as I$,keccak256 as Ux,toUtf8Bytes as qx}from"ethers";var _$="https://api.morpho.org/graphql",hc=new E$(["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)"]),T$=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||_$;async function xp(e,t,n={}){return k(T$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var P$="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 } } } }",N$="query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }";function Gi(e,t){let n=String(e||"").trim();if(!I$(n))throw new Error(`morpho: ${t} must be an address`);return A$(n).toLowerCase()}function C$(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 wp(e){return Array.isArray(e)?`[${e.map(wp).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${wp(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Ki(e,t,n,r,o={}){let i=hc.encodeFunctionData(n,r),s=await(o.rpcCall||q)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return hc.decodeFunctionResult(n,s)}function O$(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Dx(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return xp(P$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Sp(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return xp(N$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Hx(e={}){return{ok:(await xp("query { __typename }",{},e))?.data?.__typename==="Query"}}async function jx(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=Gi(e.vault||e.vaultAddress,"vault"),i=Gi(e.owner||e.from||e.sender,"owner"),a=Gi(e.receiver||i,"receiver"),s=C$(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Sp({chainId:n,first:100},t),u=O$(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await Ki(n,o,"asset",[],t),m=Gi(p,"vault asset");if((u?.asset?.address?Gi(u.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[x]=await Ki(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[y]=await Ki(n,o,"previewDeposit",[s],t);if(BigInt(y.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:y.toString()},h=hc.encodeFunctionData("deposit",[s,a])}else{let[x]=await Ki(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[y]=await Ki(n,o,"previewWithdraw",[s],t);if(BigInt(y.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:y.toString()},h=hc.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...g,calldataHash:Ux(qx(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=Ux(qx(wp(w))),O({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:a,amount:s,vaultInfo:u,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();ge();qe();X();import{Interface as $$,getAddress as kp,isAddress as L$}from"ethers";var B$="https://api-v3.balancer.fi/",M$=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||B$;async function Wx(e,t,n={}){return k(M$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var F$="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",zx=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"}}),U$="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",q$="0x0000000000000000000000000000000000000000",vp=new $$(["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)"]);function Gx(e){let t=Number(e??8453),n=zx[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(zx).join(", ")})`);return{chainId:t,...n}}function Kx(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===q$||t===U$.toLowerCase()}function gc(e,t){if(!L$(e))throw new Error(`${t} must be a valid EVM address`);return kp(e)}function Vx(e,t,n){let r=String(e||"");return Kx(r)||/^weth$/i.test(r)?kp(t.weth):/^usdc$/i.test(r)?kp(t.usdc):gc(r,n)}function D$(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 Yx(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 Xx(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 Wx(F$,{first:n,chains:r,where:{chainIn:r}},t)}async function Qx(e={}){return{ok:(await Wx("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Ep(e={},t={}){let n=Gx(e.chainId),r=gc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Vx(o,n,"balancer tokenIn"),a=Vx(e.tokenOut||"USDC",n,"balancer tokenOut"),s=D$(e.amountIn,"balancer amountIn"),c=gc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=vp.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Yx(e.userData)]),d=await(t.rpcCall||q)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=vp.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return ie({venue:"balancer",protocolVersion:3,chainId:n.chainId,chain:n.name,router:n.router,pool:r,tokenIn:i,tokenOut:a,amountIn:s.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 Jx(e={},t={}){let n=Gx(e.chainId),r=gc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Kx(o),a=await Ep({...e,sender:r},t),s=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),c=Number(t.nowSeconds??Math.floor(Date.now()/1e3)),l=BigInt(c+s),u=e.wethIsEth!=null?!!e.wethIsEth:i,d=vp.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Yx(e.userData)]);return O({provider:"balancer",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n.chainId,deadline:l.toString(),quote:a,autoSlippage:a.autoSlippage,requiresApproval:i?null:{token:a.tokenIn,spender:n.router,amount:a.amountIn},transaction:{chainId:n.chainId,from:r,to:n.router,data:d,value:i?a.amountIn:"0",slippageGuard:ye(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}L();qe();X();import{getAddress as j$}from"ethers";var z$="https://api-v2.pendle.finance/core",V$=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),W$="0x0000000000000000000000000000000000000000",G$="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Zx=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||z$).replace(/\/$/,"");function yc(e,t){try{return j$(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function po(e,t){return yc(e,t).toLowerCase()}function K$(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===G$||t===W$}function Ap(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 Y$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:yc(t.token,`pendle input ${n} token`),amount:Ap(t.amount,`pendle input ${n} amount`)}))}function X$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>yc(t,`pendle output ${n} token`))}function Q$(e){let t=V$[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function J$(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 Ap(t,"pendle output amount")}function Z$(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!K$(r.token)).map(r=>({token:po(r.token,"pendle approval token"),spender:po(t,"pendle approval spender"),amount:Ap(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Ip(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)),k(`${Zx(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function eS(e={}){let t=await Ip({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function _p(e={},t={}){let n=Number(e.chainId??42161),r=Q$(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=yc(e.receiver||o,"pendle receiver"),a=Y$(e.inputs),s=X$(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=We({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:a,outputs:s,...e.redeemRewards!=null?{redeemRewards:!!e.redeemRewards}:{},...e.needScale!=null?{needScale:!!e.needScale}:{},...e.additionalData?{additionalData:String(e.additionalData)}:{}},u=await k(`${Zx(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(po(p.to,"pendle tx target")!==po(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&po(p.from,"pendle tx sender")!==po(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=J$(u),f=ie(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return O({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:Z$(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:ye(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function tS(e={},t={}){let n=await _p(e,t),{transaction:r,...o}=n;return o}L();qe();X();import{isAddress as t2}from"ethers";var n2="https://api.odos.xyz",Tp=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||n2).replace(/\/$/,"");async function Pp(e={}){return k(`${Tp(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function r2(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(!t2(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function nS(e={},t={}){let n=r2(e),r=We({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 k(`${Tp(t)}/sor/quote/v3`,{method:"POST",body:o,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),a=i?.outAmounts?.[0];if(!i?.pathId||!a)throw new Error("odos: quote missing pathId or outAmounts[0]");return{chainId:n,selected:r,quote:i,amountOut:a}}async function rS(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await nS(e,t);return{...ie(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 oS(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await nS(e,t),i=await k(`${Tp(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}),a=i?.transaction;if(!a?.to||!a?.data)throw new Error("odos: assemble returned no executable transaction");if(Number(a.chainId??n)!==n)throw new Error("odos: transaction chain mismatch");if(a.from&&String(a.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 s=ie(r,{chainId:n,venue:a.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(s.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:a.to,amount:String(p.amount)}));return O({provider:"odos",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:s,simulation:i.simulation,requiresApproval:d,autoSlippage:s.autoSlippage,transaction:{chainId:n,from:a.from||e.userAddr,to:a.to,data:a.data,value:a.value??"0x0",...a.gas!=null?{gasLimit:a.gas}:{},...a.nonce!=null?{nonce:a.nonce}:{},slippageGuard:ye(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function iS(e={}){let t=await Pp(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var aS=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,i2=/[<>&`*_~[\]()|\\]/g,a2=/[\u0000-\u001F\u007F]/g;function Np(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(aS,"").replace(a2,"").replace(i2,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Cp(e){if(e==null)return!1;let t=String(e);return aS.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var sS=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"});function bc(e,t={}){let n=Number(e),r=t.baseUrl||sS[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function cS(e){return!!sS[Number(e)]}async function Op(e={},t={}){return k(`${bc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lS(e={},t={}){if(!e.address)throw new Error("address required");return k(`${bc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function uS(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return k(`${bc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function dS(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${bc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await k(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function pS(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 a=o.address_hash||o.address||r.token_address||r.tokenAddress||null;if(!a||typeof a!="string")continue;let s=String(r.value??r.balance??"0").replace(/^0x/i,"");if(!/^\d+$/.test(s)||s==="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=Np(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Np(o.name,{max:80,fallback:""})||null;n.push({address:a.toLowerCase().startsWith("0x")?a:`0x${a}`,symbol:l,name:u,decimals:c,amountRaw:s,tokenType:i||"ERC-20",source:"blockscout",verification:"indexer-reported",displaySuspicious:Cp(o.symbol)||Cp(o.name)||void 0})}return n}async function mS(e={}){let t=await Op({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as c2}from"ethers";L();ge();et();var l2="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",hS=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function Pn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function wc(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function fS(e){if(!e)return null;try{return c2(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function mr(e={},t=process.env){let n=e.addresses||{},r=fS(n.evm||e.evmAddress||wc(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||wc(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||wc(t,"ORACLE_BITCOIN_ADDRESS"),a=fS(n.hyperliquid||e.hyperliquidAddress||wc(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?me(o,"portfolio Solana address"):null,bitcoin:i?At(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Yi(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,a=10n**BigInt(r),s=i/a,c=String(i%a).padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${c?`.${c}`:""}`}function mo(e){let t=Number(e);return Number.isFinite(t)?t:null}function xc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Nn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function gS(e,t){let n=hS[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 u2(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"}`,a=t.get(i)||{mint:r.mint,amountRaw:0n,decimals:r.decimals??null,programs:new Set,accounts:0};a.amountRaw+=o,a.accounts+=1,n.program&&a.programs.add(n.program),t.set(i,a)}return[...t.values()].map(n=>{let r=n.amountRaw.toString(),o=n.decimals==null?null:Yi(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 Rp(e,t){return{family:e,status:"unsupported",reason:t}}function $p(e,t){if(!e||e.status!=="ok")return e;let n=gS(t,e.symbol),r=mo(e.amount),o=r!=null&&n.priceUsd!=null?xc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function yS(e={}){let t=mr({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Sc(e={},t={}){let n=new Date().toISOString(),r=mr(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(fn.map(R=>[R.chainId,R])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(hS))],u=o?Ie(()=>It(l,Pn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Ve(c,e.concurrency||5,async R=>{let F=s.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 Y={...Pn(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},he=await Ie(()=>Qn(R,r.evm,Y));if(!he.ok)return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"unavailable",latencyMs:he.ms,error:he.error};let Le=F.nativeCurrency?.decimals??18,Qe=F.nativeCurrency?.symbol||"NATIVE",V=he.data.balanceWei,ve={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&cS(R)){let Kn=await Ie(()=>dS({chainId:R,address:r.evm},{...Pn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Kn.ok?ve={status:"ok",assets:pS(Kn.data,{fungibleOnly:!0}).map($o=>{let Lo=Yi($o.amountRaw,$o.decimals);return{...$o,amount:Lo,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Kn.ms}:ve={status:"unavailable",assets:[],reason:Kn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Kn.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"ok",latencyMs:he.ms,native:{status:"ok",symbol:Qe,amountRaw:V,decimals:Le,amount:Yi(V,Le)},fungibleTokens:ve,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:ve.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=Pn(t,"solana"),F=await Ie(()=>xs({address:r.solana},R)),Y=i||a?await Promise.all([Ie(()=>wi({owner:r.solana,programId:sd},R)).then(ve=>({...ve,program:"spl-token"})),Ie(()=>wi({owner:r.solana,programId:l2},R)).then(ve=>({...ve,program:"token-2022"}))]):[],he=u2(Y),Le=he.filter(ve=>ve.classification==="collectible-candidate"),Qe=he.filter(ve=>ve.classification!=="collectible-candidate"),V=Y.filter(ve=>!ve.ok).map(ve=>ve.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Y.some(ve=>ve.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:Yi(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?V.length===Y.length?"unavailable":V.length?"partial":"ok":"not-requested",assets:i?Qe:[],errors:V,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?V.length===Y.length?"unavailable":"partial":"not-requested",assets:a?Le:[],errors:V,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=Pn(t,"bitcoin"),F=Pn(t,"bitcoinMeta"),[Y,he,Le]=await Promise.all([Ie(()=>ks({address:r.bitcoin},R)),i?Ie(()=>Es({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Ie(()=>Dr({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),Qe=he.ok?he.data:null,V=Le.ok?Le.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:Y.ok||Qe?.ok||V?.ok?"ok":"unavailable",native:Y.ok?{status:"ok",symbol:"BTC",amountRaw:Y.data.balanceSats,decimals:8,amount:Yi(Y.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:Y.error},fungibleTokens:{status:i?Qe?.ok?"ok":"unavailable":"not-requested",assets:Qe?.balances||[],error:Qe?.ok?null:Qe?.error||he.error,verification:"indexer-reported"},collectibles:{status:a?V?.ok?"ok":"unavailable":"not-requested",assets:V?.inscriptions||[],error:V?.ok?null:V?.error||Le.error,unknownNotEmpty:!!V?.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=Pn(t,"hyperliquid"),[F,Y,he]=await Promise.all([Ie(()=>is(r.hyperliquid,R)),Ie(()=>Rr(r.hyperliquid,R)),Ie(()=>Jt(R))]),Le=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(V=>Nn(V.total)||Nn(V.hold)).map(V=>({coin:V.coin||null,total:String(V.total??"0"),hold:String(V.hold??"0"),priceUsd:null,usdValue:null})),Qe=(Y.ok&&Array.isArray(Y.data?.assetPositions)?Y.data.assetPositions:[]).map(V=>V.position||V).filter(V=>Nn(V.szi)).map(V=>({coin:V.coin||null,size:String(V.szi??"0"),entryPrice:V.entryPx??null,positionValueUsd:V.positionValue??null,unrealizedPnlUsd:V.unrealizedPnl??null,liquidationPrice:V.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||Y.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Le,error:F.ok?null:F.error},perps:{status:Y.ok?"ok":"unavailable",accountValueUsd:Y.data?.marginSummary?.accountValue??null,withdrawableUsd:Y.data?.withdrawable??null,positions:Qe,error:Y.ok?null:Y.error},mids:he.ok?he.data:{},source:"hyperliquid-info"}})(),[h,g,w,x,y]=await Promise.all([d,p,m,f,u]),b=y.ok?y.data:null,S=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=S[R.chainId];if(F)for(let Y of R.fungibleTokens.assets||[])Y.address&&I.push(`${F}:${String(Y.address).toLowerCase()}`)}let T=null;if(o&&I.length){let R=[...new Set(I)],F=await Ie(()=>It(R,Pn(t,"prices")));F.ok&&(T=F.data)}let E=h.map(R=>{let F=R.native?{...R,native:$p(R.native,b)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Y=S[F.chainId],he=F.fungibleTokens.assets.map(Le=>{let Qe=String(Le.symbol||"").toUpperCase(),V=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(Qe)&&(V=1),V==null&&Y&&Le.address&&T?.coins){let Qf=`${Y}:${String(Le.address).toLowerCase()}`,$o=T.coins[Qf],Lo=Number($o?.price);Number.isFinite(Lo)&&Lo>0&&(V=Lo)}let ve=mo(Le.amount),Kn=ve!=null&&V!=null?xc(ve*V):null;return{...Le,priceUsd:V,usdValue:Kn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:he}}}return F});g.native&&(g.native=$p(g.native,b)),w.native&&(w.native=$p(w.native,b));let A=0,v=0,P=0;for(let R of[...E,g,w]){R.native?.status==="ok"&&Nn(R.native.amount)&&(R.native.usdValue!=null?(A+=R.native.usdValue,v+=1):P+=1);for(let F of R.fungibleTokens?.assets||[])!Nn(F.amount)&&!Nn(F.amountRaw)||(F.usdValue!=null?(A+=F.usdValue,v+=1):P+=1)}let B=gS(b,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),Y=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?B.priceUsd||mo(x.mids?.HYPE):mo(x.mids?.[R.coin]),he=mo(R.total);R.priceUsd=Y,R.usdValue=he!=null&&Y!=null?xc(he*Y):null,Nn(R.total)&&(R.usdValue!=null?(A+=R.usdValue,v+=1):P+=1)}let te=mo(x.perps?.accountValueUsd);te!=null&&te!==0&&(A+=te,v+=1);let Z=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>Nn(R.amount)).length,$=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;P+=Z+$;let H=[...E,g,w,x],U=R=>H.filter(F=>F.status===R).length,J=[],ke=E.filter(R=>R.fungibleTokens?.status==="unavailable"),pe=E.filter(R=>R.fungibleTokens?.status==="ok");ke.length&&!pe.length?J.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):ke.length&&J.push(`EVM token discovery partial: Blockscout covered ${pe.length} chain(s); ${ke.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&J.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&J.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),y.ok||J.push(`Price provider unavailable: ${y.error}`);let Xt=[Rp("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Rp("sui","Sui balance adapter is not installed"),Rp("aptos","Aptos balance adapter is not installed")],dn=H.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:H.length,ok:U("ok"),unavailable:U("unavailable"),notConfigured:U("not-configured"),unsupported:U("unsupported")+Xt.length,evmChainsRequested:c.length,evmChainsOk:E.filter(R=>R.status==="ok").length},valuation:{knownUsd:xc(A),label:"known priced value, not a complete portfolio total",pricedItems:v,unpricedNonzeroItems:P,complete:P===0&&!dn&&U("unavailable")===0&&U("not-configured")===0&&Xt.length===0,priceSource:o?"DefiLlama":null,priceStatus:y.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,g,w,x],unsupportedFamilies:Xt,warnings:J}}import{constants as vc}from"node:fs";import{chmod as L2,mkdir as B2,open as M2,readFile as F2}from"node:fs/promises";import{createHash as U2,randomUUID as q2}from"node:crypto";import D2 from"node:os";import ho from"node:path";L();L();var p2=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"]),m2=new Set(["image/jpeg","image/png","image/webp"]);function f2(e){let t=String(e||"").toLowerCase();return p2.some(n=>t===n||t.endsWith(`.${n}`))}function h2(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 bS(e){let t=h2(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!f2(n.hostname)?null:n}async function g2(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=bS(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 a=await Ie(()=>n(r.toString(),{method:"GET",redirect:"manual",headers:{accept:"image/jpeg,image/png,image/webp"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}));if(!a.ok)throw new Error(a.error);let s=a.data;if(s.status>=300&&s.status<400){let d=s.headers?.get?.("location");if(!d)throw new Error("image redirect missing location");let p=bS(new URL(d,r).toString());if(!p)throw new Error("image redirect left the host allowlist");r=p;continue}if(!s.ok)throw new Error(`image HTTP ${s.status}`);let c=String(s.headers?.get?.("content-type")||"").split(";",1)[0].toLowerCase();if(!m2.has(c))throw new Error(`unsafe or unsupported image type ${c||"unknown"}`);if(Number(s.headers?.get?.("content-length")||0)>o)throw new Error("image exceeds gallery byte cap");let u=Buffer.from(await s.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 Lp(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function y2(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function wS(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 a=n.slice((o-1)*r,o*r),s=[],c=0,l=Math.min(Math.max(Number(e.maxTotalBytes??8e6),25e4),12e6);for(let y of a){if(c>=l){s.push({item:y,image:null,error:"gallery page byte cap reached"});continue}try{let b=await g2(y.imageUrl||y.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=b.bytes,s.push({item:y,image:b,error:null})}catch(b){s.push({item:y,image:null,error:String(b?.message||b).slice(0,180)})}}let u=3,d=340,p=400,m=76,f=Math.ceil(a.length/u),h=u*d,g=m+f*p,w=s.map(({item:y,image:b,error:S},I)=>{let T=I%u,E=Math.floor(I/u),A=T*d,v=m+E*p,P=b?`<image x="${A+14}" y="${v+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${A+14}" y="${v+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${A+170}" y="${v+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,B=Lp(y2(y,I).slice(0,34)),te=Lp(y.chain||"unknown chain");return`${P}<text x="${A+16}" y="${v+350}" fill="#f3f5f7" font-size="17" font-weight="600">${B}</text><text x="${A+16}" y="${v+376}" fill="#8d98a8" font-size="13">${te}${S?" \xB7 placeholder":""}</text>`}).join(""),x=`<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 ${Lp(new Date().toISOString())}</text>${w}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(x).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(y=>y.image).length,placeholders:s.filter(y=>!y.image).map(y=>({assetKey:y.item.assetKey||null,name:y.item.name||null,sourceUrl:y.item.imageUrl||null,error:y.error})),rasterOnly:!0,externalScripts:!1}}var b2=[/\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],w2=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,x2=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function S2(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;w2.test(n)&&t.push("url-in-name");let i=b2.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),x2.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 a=e.estimatedValueUsd==null&&e.estimatedValueSats==null,s=!Array.isArray(e.traits)||e.traits.length===0;a&&s&&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 xS(e={}){let t=S2(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}X();var k2=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"}]),v2=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}]);function fr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Xi(e,t){let n=await Ie(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function E2(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 A2(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 I2(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 vS(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function _2(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 T2(e,t){let n=vS(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,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-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function P2(e){let t=new Map;for(let n of e){let r=vS(n);t.has(r)||t.set(r,n)}return[...t.values()]}function N2(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.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 ES(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function fo(e={},t={}){let n=new Date().toISOString(),r=mr(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=k2.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=fr(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await Ve(l,4,async b=>({row:b,result:await Xi(`opensea-${b.chain}`,()=>Ko({chain:b.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:b,result:S}of u)if(S.ok){let I=S.data.nfts.map(T=>({...T,family:b.family,chainId:b.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...I),a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:S.data.complete?"ok":"partial",count:I.length,complete:S.data.complete,next:S.data.next,source:"opensea"})}else a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"unavailable",error:S.error,source:"opensea"});if(!r.evm)for(let b of i.filter(S=>S.family!=="solana"))a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let b=await Xi("opensea-solana",()=>Ko({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(b.ok){let S=b.data.nfts.map(I=>({...I,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...S),a.push({family:"solana",chain:"solana",status:b.data.complete?"ok":"partial",count:S.length,complete:b.data.complete,next:b.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:b.error,source:"opensea"})}else(!o||o.has("solana"))&&a.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(r.bitcoin&&(!o||o.has("bitcoin"))){let b=await Xi("satflow-wallet-contents",()=>Is({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},fr(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let S=E2(b.data.contents).map(T=>A2(T,r.bitcoin));s.push(...S);let I=S.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:I?"ok":"partial",count:S.length,complete:I,source:"satflow"})}else{let S=await Xi("bitcoin-meta-inscriptions",()=>Dr({address:r.bitcoin},fr(t,"bitcoinMeta")),t.timeoutMs??35e3),I=S.ok&&S.data?.ok&&Array.isArray(S.data.inscriptions)?S.data.inscriptions:[];s.push(...I.map(T=>I2(T,r.bitcoin))),a.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":b.error})}}else(!o||o.has("bitcoin"))&&a.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let d=[];if(e.includePnl!==!1)for(let b of[...new Set([r.evm,r.solana].filter(Boolean))]){let S=await Xi(`opensea-pnl-${b}`,()=>Qa({address:b},c),t.timeoutMs??35e3);d.push(S.ok?{status:"ok",...S.data}:{status:"unavailable",address:b,source:"opensea-indexed-account-pnl",error:S.error})}let p=_2(e.costBasis),m=P2(s).map(b=>T2(b,p)).map(b=>xS(b)),f=m.filter(b=>!b.spam),h=m.filter(b=>b.spam),g=f.filter(b=>b.estimatedValueUsd!=null&&Number.isFinite(Number(b.estimatedValueUsd))),w=Math.round(g.reduce((b,S)=>b+Number(S.estimatedValueUsd),0)*100)/100,x=f.length-g.length,y=a.filter(b=>b.status!=="ok"||b.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:v2,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:g.length,unvaluedItems:x,complete:x===0&&y.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:N2(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 SS(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 C2(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 AS(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 Jo(e,fr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=SS(e.expiry??e.endTime,"Solana NFT listing expiry");return Xs({...e,expiry:r},fr(t,"magiceden"))}if(n==="satflow"){let r=SS(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return _s({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:C2(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},fr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Bp(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 Mp(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function kc(e){return String(e??"").trim().toLowerCase()}function O2(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=kc(t),i=kc(n);return!o||!i?!1:r.some(a=>kc(a.trait_type??a.traitType??a.type)===o&&kc(a.value??a.trait_value??a.traitValue)===i)}function R2(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function kS(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 Fp(e){return Math.round(Number(e)*1e6)/1e6}function Cn(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 IS(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return Cn(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(T=>e[T]==null||e[T]==="");if(o.length)return Cn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Bp(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Bp(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Bp(e.traitFloorEth,"traitFloorEth"),d=Mp(e.collectionFloorEth),p=Mp(e.maxListingAgeMs),m=Mp(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return Cn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return Cn(e,"invalid-min-trait-sales");if(u<=0)return Cn(e,"trait-floor-unavailable");let f=T=>O2(T,e.traitType,e.traitValue)&&R2(T,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(T=>{if(!m)return!0;let E=kS(T,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=Fp(h.reduce((T,E)=>T+Number(E.priceEth??E.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return Cn(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(T=>{let E=Number(T.priceEth??T.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let A=kS(T,["listedAt","createdAt","timestamp"]);return A!=null&&i-A<=p}).map(T=>{let E=Number(T.priceEth??T.price),A=Math.round((u-E)/u*1e4);return{...T,priceEth:E,discountBps:A}}).filter(T=>T.discountBps>=s).sort((T,E)=>T.priceEth-E.priceEth||E.discountBps-T.discountBps),y={traitSales:w,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:x.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."},b=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(b)||b<1)return Cn(e,"invalid-min-trait-listings",y);if(x.length<b)return Cn(e,"trait-listing-depth-insufficient",y);let S=x[0],I=O({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:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Fp(S.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:y,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:S.tokenId==null?null:String(S.tokenId),listingId:S.listingId||null,orderHash:S.orderHash||null,priceEth:Fp(S.priceEth),discountBps:S.discountBps},evidence:y,prepareIntent:I}}async function _S(e={},t={}){let n=await fo({...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 TS(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await fo({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await wS({...e,items:n},fr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var PS=10*1024*1024,OS=1e3;function On(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function go(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function NS(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 RS(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 H2(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function $S(e={}){return`portfolio_${U2("sha256").update(H2(e)).digest("hex").slice(0,20)}`}function LS(e={}){if(e.historyFile)return ho.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return ho.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||ho.join(D2.homedir(),".hermes");return ho.join(ho.resolve(n),"state","oracle","portfolio-history.jsonl")}function j2(e){let t=On(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?go(t):null}function z2(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=On(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?go(t):null}function V2(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=On(c.usdValue);return l==null?s:s+l},0),i=On(n.perps?.accountValueUsd),a=go(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>On(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=On(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:go(r)})}return t}function W2(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 G2(e,t){let n=LS(t),r=`${JSON.stringify(e)}
145
+ `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await B2(ho.dirname(n),{recursive:!0,mode:448});let o=vc.O_APPEND|vc.O_CREAT|vc.O_WRONLY|(vc.O_NOFOLLOW||0),i=await M2(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await L2(n,384),n}async function BS(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||Sc,o=t.nftInventoryImpl||fo,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(S=>({status:"unavailable",error:String(S?.message||S).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=j2(s),u=z2(c),d=[l,u].filter(S=>S!=null),p=d.length?go(d.reduce((S,I)=>S+I,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||mr(e,t.env||process.env),w=$S(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let y={schemaVersion:1,id:`snapshot_${q2()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(S=>[S,!!g?.[S]])),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(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:V2(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:W2(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await G2(y,t),snapshot:y,balance:s,nfts:c}}async function K2(e){let t=LS(e);try{let n=await F2(t);if(n.byteLength>PS)throw new Error(`portfolio history exceeds ${PS} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
146
+ `))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):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 Y2(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=mr(e,t.env||process.env);return Object.values(n).some(Boolean)?$S(n):null}async function Up(e={},t={}){let n=RS(e.limit,100,1,OS,"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=NS(e.since,"portfolio history since"),i=NS(e.until,"portfolio history until"),a=Y2(e,t),s=await K2(t),c=s.snapshots.filter(d=>!(a&&d.portfolioId!==a||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=>On(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:s.file,portfolioId:a,order:r,totalStored:s.snapshots.length,totalMatching:l,corruptLines:s.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 CS(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Ec(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function X2(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 Q2(e,t){let c=e.map(y=>y.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let y=Math.max(1,Math.abs(l)*.05);l-=y,u+=y}else{let y=(u-l)*.1;l=Math.max(0,l-y),u+=y}let d=y=>e.length===1?1240/2:100+1040*y/(e.length-1),p=y=>570-(y-l)/(u-l)*470,m=e.map((y,b)=>`${b?"L":"M"}${d(b).toFixed(2)},${p(y.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(y,b)=>{let S=b/4,I=100+S*470,T=u-S*(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">${CS(T)}</text>`}).join(""),h=e.map((y,b)=>`<circle cx="${d(b)}" cy="${p(y.value)}" r="5" fill="#b8f0ff"><title>${Ec(y.recordedAt)}: ${CS(y.value)}</title></circle>`).join(""),g=Ec(e[0].recordedAt.slice(0,10)),w=Ec(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 ${Ec(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">${w}</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 MS(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=RS(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Up({...e,order:"asc",limit:e.limit??OS},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:On(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=X2(o,n),a=i[0].value,s=i.at(-1).value,c=go(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=Q2(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:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}ge();var Z2=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"}}),eL=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),tL=`0x${"0".repeat(64)}`;function nL(e){return!e||e==="0x"||e===tL}async function hr(e={},t={}){let n=t.rpcCall||q,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(f){return{address:r,chainId:o,status:"unavailable",error:f?.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 a=[],s=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(Z2))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of eL)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!nL(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{a.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=s.filter(f=>f.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function FS(e={}){let t=Date.now();try{let n=await hr({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"}}}qe();var oL=/^0x[0-9a-fA-F]{40}$/,US=4663;function Ac(e,t){let n=String(e||"").trim();if(!oL.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function qp(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 Qi(e,t){return e==null||e===""?null:qp(e,t)}function iL({chainId:e,tokenAddress:t,tokenIn:n,amountIn:r,recipient:o,quote:i,topPool:a,unsignedTx:s,args:c,opts:l}){let u=s?.tx;if(!u||typeof u!="object")throw new Error("local-signer envelope requires unsigned tx object");let d=Ac(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=qp(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=Qi(u.gasLimit??c.gasLimit,"gasLimit"),h=Qi(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()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),x=Ql({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:w,secret:l.routeAttestationSecret}),y=ye(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),b={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:y.selectedBps,expiresAtMs:g+w},S=Qi(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return S&&(b.maxPriorityFeePerGas=S),c.nonce!==void 0&&(b.nonce=Number(c.nonce)),(c.txType!==void 0||S)&&(b.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(b.l1FeeWei=Qi(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(b.operatorFeeWei=Qi(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:y.selectedBps,expiresAtMs:g+w,fee:{oracleFeeBps:5},autoSlippage:y,artifact:{chainId:e,owner:o,transactions:[b]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function aL(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}ni();let n=uu(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function sL({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==K.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!==z.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==z.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==K.LIVE&&c.push("no live quote was returned"):c.push("live quoting is unavailable on this chain"),s.supports?.("prepareUnsignedTx")||c.push("unsigned transaction preparation is unavailable on this chain"),a.tokenIn||c.push("tokenIn is required to prepare"),a.amountIn||c.push("amountIn is required to prepare"),a.recipient||c.push("recipient is required to prepare"),c}async function qS(e={},t={}){let n=Number(e.chainId??US);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=Ac(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?Ac(e.tokenIn,"tokenIn"):null,i=e.recipient?Ac(e.recipient,"recipient"):null,a=e.amountIn==null?null:qp(e.amountIn,"amountIn"),s=aL(n,t.scanner),c=t.scanContractRisk||hr,[l,u,d]=await Promise.all([s.resolveToken(r),s.resolvePools(r),c({address:r,chainId:n},t.contractRiskOpts||t)]),p=await s.scoreRisk(r),m=null;s.supports?.("sellSimulation")&&a?m=await s.sellSimulation({token:r,amountIn:a,base:o||void 0}):s.supports?.("sellSimulation")&&(m=await s.sellSimulation({token:r,amountIn:"10000000000000000"}));let f=null;s.supports?.("quote")&&o&&a&&(f=await s.quote({tokenIn:o,tokenOut:r,amountIn:a}));let h={...e,tokenIn:o,amountIn:a,recipient:i},g=sL({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,y=null;if(e.prepare===!0&&g.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{x=iL({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(b){y=String(b?.message||b).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!x,signing:"local-signer",broadcasting:"local-signer",chainId:n,chain:{key:s.key,name:s.name,nativeCurrency:s.nativeCurrency},token:l,pools:u,topPool:u?.pools?.[0]||null,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,blockedReasons:g,prepared:!!w,unsignedTx:w,localSignerEnvelope:x,localSignerBlockedReason:y,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function DS(){ni();let e=du();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:US,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"}}ge();ge();var lL=5,Dp=[50,75,90],HS=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function gr(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 uL(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 Ic(e={},t={}){let n=t.rpcCall||q,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=HS[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(HS).join(", ")}`};let i,a,s,c;try{i=gr(e.maxFeePerGasWei,"maxFeePerGasWei"),a=gr(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=gr(e.gasLimit,"gasLimit"),c=gr(e.maxTotalGasWei,"maxTotalGasWei")}catch(T){return{status:"error",viable:!1,error:T.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${lL.toString(16)}`,"pending",Dp],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(T){return{status:"unavailable",viable:!1,error:T?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=gr(u?.baseFeePerGas,"baseFeePerGas")??gr(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(T=>{try{return gr(T?.[o.percentile],"reward")}catch{return null}}).filter(T=>T!=null&&T>0n),f=uL(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,w=d*o.baseFeeMultiplier+g,x=[];a!=null&&g>a&&(x.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,w=d*o.baseFeeMultiplier+g),i!=null&&w>i&&(x.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,g>w&&(g=w));let y=s!=null?s*w:null;c!=null&&y!=null&&y>c&&x.push({field:"totalGas",wanted:y.toString(),capped:c.toString()});let b=f==null||g>=f,S=c==null||y==null||y<=c,I=b&&S;return b||h.push(`tip cap ${g} is below the observed ${Dp[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),S||h.push(`worst-case gas ${y} 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:Dp[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:y==null?null:y.toString(),clamps:x,notes:h}}ge();var pL="08c379a0",mL="4e487b71",fL=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 hL(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===pL)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===mL){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:fL[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 gL(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 yL(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 bL(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 Ji(e={},t={}){let n=t.rpcCall||q,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=bL(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=gL(f);if(!yL(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=hL(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,a.push(`gasLimit includes a ${h}% buffer over the ${u} estimate`)}catch(f){a.push(`gas estimation failed: ${f?.message||"unknown"}`)}a.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=s===p;return m&&a.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:s,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:a}}async function jS(e={}){let t=Date.now();try{let n=await Ji({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 xL=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:[]}]);function SL(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 kL(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 zS(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=kL(t);else if(o==="quantity")r+=SL(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function vL({address:e,chainId:t,minter:n,quantity:r,tx:o,nowMs:i,ttlMs:a=3e4}){if(!o?.gasLimit||!o?.maxFeePerGas)throw new Error("local-signer envelope requires gasLimit and maxFeePerGas");let s=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:s+Math.min(Math.max(Number(a)||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 _c(e={},t={}){let n=t.rpcCall||q,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 a=i.slice(2).toLowerCase(),s=xL.filter(c=>a.includes(c.selector));return{status:"ok",address:r,chainId:o,found:s,notes:s.length?[]:["no known public mint selector found; this contract may use a custom or allowlist-only entrypoint"]}}async function VS(e={}){let t=Date.now();try{let n=await _c({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 Hp(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 a=await _c({address:n,chainId:r},t);if(a.status!=="ok")return{status:a.status,error:a.error};if(!a.found.length)return{status:"unsupported",error:"no known public mint function found in this contract's bytecode",notes:a.notes};let s=e.signature?a.found.find(y=>y.signature===e.signature):a.found[0];if(!s)return{status:"error",error:`requested signature ${e.signature} not present in this contract`,available:a.found.map(y=>y.signature)};let c=a.found.length>1&&!e.signature,l=await hr({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Ji({chainId:r,tx:{from:o,to:n,data:zS(s,{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:s.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 Ic({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=zS(s,{minter:o,quantity:i})}catch(y){return{status:"error",error:y.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=Ka({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 ${a.found.length} mint entrypoints (${a.found.map(y=>y.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(y=>y.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 w=null,x=null;try{w=vL({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(y){x=String(y?.message||y).slice(0,200)}return{status:"ok",execution:w?"armed-local":"prepare-only",signed:w?"pending-local-signer":!1,broadcast:w?"pending-local-signer":!1,tx:f,localSignerEnvelope:w,localSignerBlockedReason:x,mintFunction:s.signature,alternatives:a.found.map(y=>y.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}X();import{createHash as xB}from"node:crypto";import{createHash as AL}from"node:crypto";var IL=1,_L=8,Oe=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},TL=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),PL=new Set(["family","id"]),NL=new Set(["id","startsAt","endsAt","eligibility"]),CL=new Set(["kind","proofFormat","proofDigest"]),OL=new Set(["amount","unit"]),RL=new Set(["value","unit"]);function yo(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Oe(`${t} must be a plain object`);return e}function bo(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Oe(`${n} has unknown field ${r}`,"unknown-field")}function bt(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Oe(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function $L(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Oe(`${t} must be a positive safe integer`);return e}function jp(e,t){if(e=yo(e,t),bo(e,OL,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Oe(`${t} requires amount and unit`,"ambiguous-unit");let n=bt(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Oe(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:bt(e.unit,`${t}.unit`)}}function zp(e,t){if(e=yo(e,t),bo(e,RL,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Oe(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function LL(e,t){e=yo(e,t),bo(e,CL,t);let n=bt(e.kind,`${t}.kind`),r=bt(e.proofFormat,`${t}.proofFormat`),o=bt(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Oe(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function BL(e,t){let n=`stages[${t}]`;e=yo(e,n),bo(e,NL,n);let r=zp(e.startsAt,`${n}.startsAt`),o=zp(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Oe(`${n} must end after it starts`,"invalid-stage-range");return{id:bt(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:LL(e.eligibility,`${n}.eligibility`)}}function Vp(e){if(e=yo(e,"input"),bo(e,TL,"input"),e.version!==IL)throw new Oe("version must be 1");let t=yo(e.chain,"chain");bo(t,PL,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>_L)throw new Oe("stages must contain 1 through 8 entries","stage-count");let r=n.map(BL).sort((a,s)=>a.startsAt.value-s.startsAt.value||a.id.localeCompare(s.id)),o=new Set;for(let a=0;a<r.length;a+=1){if(o.has(r[a].id))throw new Oe("stage ids must be unique","duplicate-stage");if(o.add(r[a].id),a&&r[a].startsAt.value<r[a-1].endsAt.value)throw new Oe("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Oe("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:bt(t.family,"chain.family"),id:bt(t.id,"chain.id")},marketplace:bt(e.marketplace,"marketplace"),mechanism:bt(e.mechanism,"mechanism"),collection:bt(e.collection,"collection"),recipient:bt(e.recipient,"recipient"),quantity:$L(e.quantity,"quantity"),stages:r,mintValueCap:jp(e.mintValueCap,"mintValueCap"),networkFeeCap:jp(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:jp(e.priorityFeeCap,"priorityFeeCap"),expiry:zp(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Oe("every stage must end no later than expiry","stage-after-expiry");return i}function ML(e){return JSON.stringify(Vp(e))}function WS(e){return`sha256:${AL("sha256").update(ML(e),"utf8").digest("hex")}`}var Wp=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),yr=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Gp=Object.freeze(Object.values(yr)),GS=new Set(Gp),KS=Object.freeze(Gp.slice(0,4)),FL=Gp,UL=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),He=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Tc(e,t){if(!Array.isArray(e)||e.length===0)throw new He(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new He(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new He(`${t} contains duplicates`);return[...n].sort()}function qL(e){if(!Array.isArray(e))throw new He("capabilities must be an array");let t=new Set(e);for(let n of t)if(!GS.has(n))throw new He(`unknown capability ${n}`,"unknown-capability");return FL.every(n=>t.has(n))?Wp.AUTOMINT_READY:KS.every(n=>t.has(n))?Wp.PREPARE_READY:Wp.RESEARCH_ONLY}function Kp(e=[]){if(!Array.isArray(e))throw new He("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new He("entry must be an object");for(let i of Object.keys(n))if(!UL.has(i))throw new He(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new He("entry id must be an exact string");if(t.has(n.id))throw new He(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Tc(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Tc(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Tc(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Tc(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:qL(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=KS){let o=t.get(n);if(!o)throw new He(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!GS.has(i))throw new He(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new He(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var X7=Kp([]);X();import{getAddress as DL,Interface as Yp,keccak256 as HL}from"ethers";var Rn=Object.freeze({manifold:new Yp(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Yp(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Yp(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Qp=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"})}),ej=Object.freeze(Object.fromEntries(Object.entries(Qp).map(([e,t])=>[Rn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function ae(e){throw new Error(`evm-mint-launchpads: ${e}`)}function ot(e,t){try{return DL(String(e||""))}catch{return ae(`invalid ${t}`)}}function je(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&ae(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return ae(`${t} must be an unsigned integer`)}}function Xp(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&ae(`invalid ${t}`),e.map(String)}function jL(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&ae("invalid chainId");let o=ot(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&ot(u.contract,"reviewed contract")===o);a||ae("unsupported contract or wrong chain");let s=ot(a.mintTarget||a.contract,"reviewed mint target"),c=Rn[e].getFunction(Qp[e].signature).selector.toLowerCase();return(!(a.selectors||[c]).map(u=>String(u).toLowerCase()).includes(c)||!a.codeHash||!/^0x[0-9a-fA-F]{64}$/.test(a.codeHash))&&ae("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function zL(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);ae("runtime bytecode verification required")}function VL(e,t){let n=e.stage;if(!n)return null;let r=je(n.startTime,"stage startTime"),o=je(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&ae("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function WL(e,t){let n=Qp[e];String(t).slice(0,10).toLowerCase()!==Rn[e].getFunction(n.signature).selector.toLowerCase()&&ae("unknown selector");let r;try{r=Rn[e].decodeFunctionData(n.signature,t)}catch{ae("invalid calldata layout")}let o;return e==="manifold"&&(o=Rn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=Rn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=Rn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&ae("calldata must be canonical with no suffix"),r}async function YS(e,t={},n={}){Rn[e]||ae("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=jL(e,t,n),s=ot(t.recipient||t.minter,"recipient"),c=je(t.quantity,"quantity",{positive:!0}),l=je(t.priceWei,"priceWei"),u=je(t.maxValueWei,"maxValueWei"),d=je(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&ae("transaction chain mismatch"),ot(p.to,"transaction target")!==i&&ae("transaction target mismatch");let m=await zL(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||HL(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&ae("runtime bytecode is not reviewed");let f=WL(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=VL(t,h),w,x,y,b=null,S=[];if(e==="manifold")ot(f[0],"calldata contract")!==o&&ae("calldata contract mismatch"),(t.instanceId==null||je(f[1],"instanceId")!==je(t.instanceId,"instanceId"))&&ae("instance/stage mismatch"),(t.mintIndex==null||je(f[2],"mintIndex")!==je(t.mintIndex,"mintIndex"))&&ae("mint index/stage mismatch"),S=Xp([...f[3]]),w=ot(f[4],"calldata recipient"),x=1n,y=l;else if(e==="zora")w=ot(f[0],"calldata recipient"),x=BigInt(f[1]),y=l,t.comment!=null&&f[2]!==String(t.comment)&&ae("comment mismatch"),t.mintReferral!=null&&ot(f[3],"mint referral")!==ot(t.mintReferral,"expected mint referral")&&ae("mint referral mismatch");else{w=ot(f[0],"calldata recipient"),x=BigInt(f[1]),y=BigInt(f[3]);let v=f[4];S=Xp([...v.proof]),b=BigInt(v.quantityLimitPerWallet),b<c&&ae("wallet allowance below quantity"),(BigInt(v.pricePerToken)!==l||ot(v.currency,"allowlist currency")!==ot(f[2],"currency"))&&ae("allowlist terms mismatch")}w!==s&&ae("recipient mismatch"),x!==c&&ae("quantity mismatch"),y!==l&&ae("price mismatch"),t.proof!=null&&JSON.stringify(S.map(v=>v.toLowerCase()))!==JSON.stringify(Xp(t.proof).map(v=>v.toLowerCase()))&&ae("proof mismatch");let I=je(p.value??0,"transaction value"),T=l*c;(I<T||I-T>d||I>u)&&ae("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:je(p.gasLimit,"gasLimit"),A=p.maxFeePerGas==null?null:je(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>je(t.maxGasLimit,"maxGasLimit"))&&ae("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(A==null||A>je(t.maxFeePerGasWei,"maxFeePerGasWei"))&&ae("gas fee cap exceeded"),O({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:I.toString(),platformFeeWei:(I-T).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...b==null?{}:{walletAllowance:b.toString()},proof:S,transaction:{chainId:r,to:i,data:p.data,value:I.toString(),...E==null?{}:{gasLimit:E.toString()},...A==null?{}:{maxFeePerGas:A.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var GL="RESEARCH_ONLY";var KL="canonical serialized-message decoding and program-specific instruction validation are not implemented",Pc=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),nj=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function YL(){throw new Error(`solana-mint: ${GL}; disabled until ${KL}`)}function XS(){YL()}X();import{Address as XL,CompactSize as QL,NETWORK as JL,OutScript as sk,Script as ZL,TEST_NETWORK as QS,Transaction as eB,utils as tB}from"@scure/btc-signer";import{createHash as Zi}from"node:crypto";var JS="universal-ordinals-mint",ZS="bitcoin-ordinals-mint-plan",nB=1800*1e3,rB=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),ek=new Set,oB=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Nt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function $n(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 Jp(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 ck(e,t){let n=Nt(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 iB(e){return e==="bitcoin"||e==="mainnet"?JL:e==="regtest"?{...QS,bech32:"bcrt"}:QS}function tk(e,t){try{let n=sk.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 aB(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function sB(e){let t=Zi("sha256").update(e.unsignedTx).digest();return Zi("sha256").update(t).digest().reverse().toString("hex")}function nk(e,...t){let n=Zi("sha256").update(e,"ascii").digest();return Zi("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function cB(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),a=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 s=nk("TapLeaf",Buffer.from([a]),Buffer.from(QL.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=nk("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=tB.taprootTweakPubkey(e.internalKey,s);if(!Buffer.from(c).equals(Buffer.from(n.pubkey))||(Number(e.version)&1)!==l||(Number(e.version)&254)!==a)throw new Error(`${r} tapLeafScript is not committed by its taproot prevout`);return Buffer.from(i)}function rk(e,t){let n=Nt(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=eB.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},(s,c)=>{let l=o.getInput(c);for(let p of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(aB(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=tk(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)=>cB(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}}),a=Array.from({length:o.outputsLength},(s,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 tk(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:sB(o),inputs:i,outputs:a,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 lB(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 uB(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]}var dB=new Set([1,3]);function pB(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=uB(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!dB.has(i))throw new Error(`ordinals mint: unsupported inscription envelope tag ${i}`);let s=r.get(i)||[];s.push(Buffer.from(a)),r.set(i,s)}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 mB(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=ZL.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(pB(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],a=i.fields.get(1)||[];if(a.length!==1)throw new Error("ordinals mint: inscription envelope requires exactly one content type");let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a[0]).toLowerCase()}catch{throw new Error("ordinals mint: inscription envelope content type is not valid UTF-8")}if(s!==n)throw new Error("ordinals mint: inscription envelope MIME content type does not match contentType");if(Zi("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||lB(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 ok(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 fB(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 lk(e,t="parentId"){let n=Nt(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 uk(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Nt(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=$n(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function hB(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((a,s)=>{if(!a||typeof a!="object")throw new Error(`ordinals mint: reveal output ${s} invalid`);return{role:Nt(a.role,`revealOutputs[${s}].role`),address:Nt(a.address,`revealOutputs[${s}].address`),valueSats:$n(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:ck(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:lk(a.parentId,`revealOutputs[${s}].parentId`)}}}),i=o.filter(a=>a.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 gB(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Nt(n?.role,`commitOutputs[${r}].role`),valueSats:$n(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:ck(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 ik(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 ak(e,t,n){try{return Buffer.from(sk.encode(XL(iB(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 yB(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,a)=>uk({...i,valueSats:i.valueSats??i.value??t[a]?.valueSats},a).outpoint),o=t.map(i=>i.outpoint);if(r.length!==o.length||r.some((i,a)=>i!==o[a]))throw new Error("ordinals mint: unknown PSBT input; commit PSBT inputs must exactly match commitInputs")}function bB(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");fB(e);for(let P of["content","contentBytes","body","file","path","url","contentUrl"])if(e[P]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let P of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[P]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Nt(e.network,"network").toLowerCase();if(!rB.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Nt(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=Nt(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=lk(e.parentId??e.parentInscriptionId),a=Nt(e.recipient??e.destination,"recipient"),s=$n(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(uk);if(new Set(c.map(P=>P.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");yB(e,c);let l=rk(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=rk(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=gB(e.commitOutputs),p=hB(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((P,B)=>P.txid!==c[B].txid||P.vout!==c[B].vout||P.valueSats!==c[B].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");ik(l.outputs,d,"commit PSBT"),ik(u.outputs,p,"reveal PSBT");let m=ak(a,n,"recipient");if(p.find(P=>P.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[P,B]of p.entries())if(B.scriptHex!==ak(B.address,n,`revealOutputs[${P}].address`))throw new Error(`ordinals mint: reveal output ${P} script does not pay its bound address`);let f=d.findIndex(P=>P.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(P=>P.txid===l.txid&&P.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");mB(u,{contentHash:r,contentType:o,parentId:i});let g=Jp(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Jp(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Jp(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let y=$n(e.commitFeeSats,"commitFeeSats"),b=$n(e.revealFeeSats,"revealFeeSats"),S=$n(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(y+b>S)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==y.toString()||u.feeSats!==b.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(y)/l.vsizeLowerBound>g||Number(b)/u.vsizeLowerBound>w)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(P=>P.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:$n(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(P=>P.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let A=Number(t.nowMs??Date.now()),v=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(v)||v<=A||v-A>nB)throw new Error("ordinals mint: expiry must be future and within 30 minutes");return{network:n,contentHash:r,contentType:o,parentId:i,recipient:a,postageSats:s,commitInputs:l.inputs.map(ok),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(ok),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:y.toString(),revealFee:b.toString(),maxTotalFee:S.toString(),rbf:e.rbf,cpfp:E,expiresAt:v}}function wB(e={},t={}){let n=bB(e,t),r=n.commitInputs.find(s=>ek.has(s.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:JS,kind:ZS,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...oB},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."},a=O(i,{provider:JS,kind:ZS,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)ek.add(s.outpoint);return a}var dk=wB;var SB=Object.freeze([yr.DISCOVERY,yr.ELIGIBILITY,yr.PREPARATION,yr.SIMULATION]),pk=[["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",Pc.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Pc.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Pc.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Zp=Object.freeze(pk.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([yr.DISCOVERY]):SB,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),kB=Kp(Zp.map(({family:e,tier:t,enabled:n,...r})=>r)),mk=new Map(pk.map(e=>[e[0],e])),vB=new Set(["intent","adapterId","input"]),EB=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,ea=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function de(e,t,n){throw new ea(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&de("intent-mismatch",`${n} does not match canonical intent`)}function Pe(e,t,n){let r=e[t];return r.unit!==n&&de("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function fk(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))EB.test(n)&&de("custody-refused",`${t}.${n} is outside the prepare-only boundary`),fk(r,`${t}.${n}`)}function AB(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function IB(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&de("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||de("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${xB("sha256").update(JSON.stringify(AB(n,t))).digest("hex")}`;M(i,o.eligibility.proofDigest,"decoded proof digest");let a=t.stage?.startTime!=null?Number(t.stage.startTime)*1e3:t.stageStartsAt!=null?Number(t.stageStartsAt)*1e3:Number(t.stageStartsAtMs),s=t.stage?.endTime!=null?Number(t.stage.endTime)*1e3:t.stageEndsAt!=null?Number(t.stageEndsAt)*1e3:Number(t.stageEndsAtMs);return(!Number.isSafeInteger(a)||!Number.isSafeInteger(s))&&de("invalid-request","decoded input requires exact stage bounds"),M(a,o.startsAt.value,"stage start"),M(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&de("expired-intent","canonical mint stage is not active at authoritative now"),o}function _B(e,t){let n=mk.get(t);n||de("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return M(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&de("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function TB(e,t){e.chain.family==="evm"?(M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.maxValueWei??t.maxTotalWei,Pe(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Pe(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Pe(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Pe(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Pe(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Pe(e,"priorityFeeCap","lamports"),"priority-fee cap")):(M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Pe(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Pe(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Pe(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function PB(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==Je(e))&&de("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&de("custody-refused","leaf artifact is not strictly prepare-only")}function NB(e,t,n){M(t.chainId,e.chain.id,"network"),M(t.contract,e.collection,"collection/drop"),M(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity");let r=Pe(e,"mintValueCap","wei"),o=Pe(e,"networkFeeCap","wei"),i=Pe(e,"priorityFeeCap","wei-per-gas");M(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||de("artifact-mismatch","prepared EVM transaction is missing"),M(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&de("artifact-mismatch","artifact network fee exceeds or omits canonical cap evidence");let l=BigInt(a.maxPriorityFeePerGas??t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei??-1);return(l<0n||l>i)&&de("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),M(n.contract,e.collection,"artifact collection/drop"),M(n.recipient??n.buyer,e.recipient,"artifact recipient"),M(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&de("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function CB(e,t,n){M(t.network,e.chain.id,"network"),M(t.collection??t.drop??t.identity,e.collection,"collection/drop"),M(t.recipientOwner??t.recipient,e.recipient,"recipient"),M(t.quantity,e.quantity,"quantity"),M(t.priceLamports,Pe(e,"mintValueCap","lamports"),"mint-value cap");let r=Pe(e,"networkFeeCap","lamports"),o=Pe(e,"priorityFeeCap","lamports");M(t.networkFeeCapLamports,r,"network-fee cap"),M(t.priorityFeeCapLamports,o,"priority-fee cap"),M(n.chain,`solana-${e.chain.id}`,"artifact network");let i=0n;for(let a of n.transactions)for(let s of a.instructions)if(String(s.decoded?.type).toLowerCase().includes("price")){let c=a.instructions.find(l=>String(l.decoded?.type).toLowerCase().includes("limit"))?.decoded?.units;i+=(BigInt(c)*BigInt(s.decoded.microLamports)+999999n)/1000000n}return(i>o||i>r)&&de("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function OB(e,t,n){return M(t.network,e.chain.id,"network"),M(t.parentId,e.collection,"collection/drop"),M(t.recipient,e.recipient,"recipient"),M(e.quantity,1,"Ordinals quantity"),M(t.postageSats,Pe(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Pe(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Pe(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),M(n.plan.network,e.chain.id,"artifact network"),M(n.plan.parentId,e.collection,"artifact collection/drop"),M(n.plan.recipient,e.recipient,"artifact recipient"),M(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),M(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),M(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 ta(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Zp})}async function Nc(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:ta()}}async function na(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&de("invalid-request","request must be a plain object");for(let u of Object.keys(e))vB.has(u)||de("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&de("invalid-request","explicit adapterId is required; adapter inference is refused"),mk.has(e.adapterId)||de("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&de("invalid-request","family-specific decoded input is required"),fk(n);let r;try{r=Vp(e.intent)}catch(u){de("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||de("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&de("expired-intent","canonical mint intent has expired");let i=_B(r,e.adapterId);i[1]==="solana"&&de("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=IB(r,n,r.chain.family,o);TB(r,n);let s;try{i[4]==="evm"?s=await YS(i[5],n,t):i[4]==="opensea"?s=await Qo(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await XS(n,t)):s=await dk(n,t)}catch(u){if(u instanceof ea)throw u;de("adapter-refused",u?.message||"adapter preparation failed",u)}PB(s);let c=i[4]==="bitcoin"?OB(r,n,s):i[4]==="solana"?CB(r,n,s):NB(r,n,s),l=Object.freeze({intentHash:WS(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:a.id,proofDigest:a.eligibility.proofDigest,mintValueCap:r.mintValueCap,networkFeeCap:r.networkFeeCap,priorityFeeCap:r.priorityFeeCap,observedNetworkFee:c.networkFee,observedPriorityFee:c.priorityFee});return O({provider:"universal-mint-router",kind:"universal-nft-mint",execution:"prepare-only",signed:!1,adapterId:e.adapterId,tier:"PREPARE_READY",intent:r,binding:l,leafArtifact:s},{provider:"universal-mint-router",kind:"universal-nft-mint",env:t.env,nowMs:o,expiresAtMs:Math.min(r.expiry.value,a.endsAt.value,Number(s.expiresAt))})}var RB=na,$B=na,LB=ta,BB=Nc;var Cc="ROUTE_ONLY",Oc=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),gk=new Set(Object.values(Oc)),FB=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),UB=new Set(["amount","currency"]),qB=new Set(["value","unit"]),DB=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),HB=new Set(["provider","operations"]),ce=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function So(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new ce(`${t} must be a plain object`);return e}function ra(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new ce(`${n} has unknown field ${r}`,"unknown-field")}function we(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new ce(`${t} must be an exact non-empty string`);return e}function yk(e,t,{positive:n=!1}={}){if(e=we(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new ce(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function wo(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new ce(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>we(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new ce(`${t} contains duplicates`);return r}function bk(e,t){return e=So(e,t),ra(e,UB,t),{amount:yk(e.amount,`${t}.amount`),currency:we(e.currency,`${t}.currency`)}}function hk(e,t){if(!Array.isArray(e))throw new ce(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>bk(n,`${t}[${r}]`))}function jB(e){if(e=So(e,"expiry"),ra(e,qB,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new ce("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function zB(e,t,n){Object.hasOwn(e,n)&&(t[n]=we(e[n],n))}function em(e){e=So(e,"intent"),ra(e,FB,"intent");let t=we(e.action,"action");if(!gk.has(t))throw new ce(`unsupported action ${t}`,"invalid-action");let n={action:t,family:we(e.family,"family"),network:we(e.network,"network"),standard:we(e.standard,"standard"),collection:we(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])zB(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 ce("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new ce("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new ce("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=we(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new ce("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=we(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=we(e.sender,"sender"))}else n.owner=we(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=we(e.recipient,"recipient")),n.quantity=yk(e.quantity,"quantity",{positive:!0}),n.marketplace=we(e.marketplace,"marketplace"),n.protocol=we(e.protocol,"protocol"),n.artifactKind=we(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new ce(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=bk(e.price,"price"),n.expiry=jB(e.expiry),n.fees=hk(e.fees,"fees"),n.royalties=hk(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=we(e.listingId,"listingId")),n}function VB(e){e=So(e,"adapter"),ra(e,DB,"adapter");let t=wo(e.actions,"adapter.actions");for(let o of t)if(!gk.has(o))throw new ce(`adapter has unknown action ${o}`,"invalid-action");let n=So(e.surface,"adapter.surface");ra(n,HB,"adapter.surface");let r=So(n.operations,"adapter.surface.operations");for(let o of t)we(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new ce(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:we(e.id,"adapter.id"),family:we(e.family,"adapter.family"),networks:Object.freeze(wo(e.networks,"adapter.networks")),standards:Object.freeze(wo(e.standards,"adapter.standards")),marketplaces:Object.freeze(wo(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(wo(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(wo(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Cc,custody:"user",surface:Object.freeze({provider:we(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function wk(e=[]){if(!Array.isArray(e))throw new ce("entries must be an array");let t=e.map(VB);if(new Set(t.map(r=>r.id)).size!==t.length)throw new ce("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:Cc,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=em(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new ce("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new ce(`adapter lacks ${o.action}`,"unsupported-operation"):new ce("no exact adapter route","unsupported-operation")}})}var xo=(e,t,n,r,o,i,a,s,c,l)=>({id:e,family:t,networks:n,standards:r,marketplaces:o,protocols:i,artifactKinds:a,actions:s,surface:{provider:c,operations:l}}),Rc=wk([xo("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"}),xo("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"}),xo("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"}),xo("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),xo("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),xo("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function xk(e,{access:t="public",feeProfile:n="default",registry:r=Rc,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new ce("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new ce("nowMs must be a non-negative safe integer","invalid-expiry");let i=em(e);if(i.expiry&&o>=i.expiry.value)throw new ce("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Cc,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:we(n,"feeProfile"),fees:Object.freeze({oracle:"0",currency:"none"}),adapterId:a.id,surface:Object.freeze({provider:a.surface.provider,operation:a.surface.operations[i.action]}),intent:Object.freeze(i)})}X();var ia="universal-evm-nft-transfer",nm="evm-nft-safe-transfer",GB=1800*1e3,KB=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),YB=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function rm(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(YB.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);rm(r,t)}}}function tm(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 br(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}var oa=e=>e.toString(16).padStart(64,"0"),$c=e=>e.slice(2).padStart(64,"0");function XB(e,t,n,r,o){return e==="erc721"?`0x42842e0e${$c(t)}${$c(n)}${oa(r)}`:`0xf242432a${$c(t)}${$c(n)}${oa(r)}${oa(o)}${oa(160n)}${oa(0n)}`}function Sk(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(rm(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=br(e.chainId,"chainId",{positive:!0,safe:!0}),o=tm(e.sender??e.from,"sender"),i=tm(e.recipient??e.to,"recipient"),a=tm(e.contract??e.contractAddress??e.tokenContract,"contract"),s=br(e.tokenId,"tokenId"),c=br(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(br(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=br(e.gasLimit,"gasLimit",{positive:!0}),u=br(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=br(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)>GB)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=XB(n,o,i,s,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:a,tokenId:s.toString(),quantity:c.toString(),gasLimit:l.toString(),maxFeePerGasWei:u.toString(),maxPriorityFeePerGasWei:d.toString(),expiresAt:p,data:m}}function aa(e={},t={}){let n=Sk(e,t),r={provider:ia,kind:nm,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...KB},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 O(r,{provider:ia,kind:nm,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}function QB(e,{nowMs:t=Date.now()}={}){if(!e||typeof e!="object")throw new Error("evm nft transfer: prepared envelope required");if(rm({payload:e.transfer,transaction:e.transaction}),e.prepareHash!==Je(e))throw new Error("evm nft transfer: prepareHash mismatch \u2014 payload was altered");if(e.provider!==ia||e.kind!==nm||e.oraclePrepared!==!0)throw new Error("evm nft transfer: envelope identity mutation refused");if(e.execution!=="prepare-only"||e.signed!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)throw new Error("evm nft transfer: executable or signed mutation refused");if(Number(e.expiresAt)<=Number(t))throw new Error("evm nft transfer: reviewed expiry elapsed");let n=e.transfer||{},r=e.transaction||{},o=Sk({standard:n.standard,chainId:r.chainId,sender:n.sender,recipient:n.recipient,contract:n.contract,tokenId:n.tokenId,quantity:n.quantity,valueWei:r.value,gasLimit:r.gasLimit,maxFeePerGasWei:r.maxFeePerGasWei,maxPriorityFeePerGasWei:r.maxPriorityFeePerGasWei,expiresAt:e.expiresAt,reviewed:!0,calldata:r.data},{nowMs:t});if(r.from!==o.sender||r.to!==o.contract)throw new Error("evm nft transfer: sender or contract mutation refused");return!0}var JB=aa,ZB=aa;X();var sa="universal-solana-nft-transfer",om="solana-verified-nft-transfer",vk="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",wr=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),kk=new Set(Object.values(wr)),tM=new Set([wr.token,wr.token2022]),nM=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),rM=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function G(e){throw new Error(`solana nft transfer: ${e}`)}function Ct(e,t){let n=String(e??"").trim();return n||G(`${t} required`),n}function Vt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||G(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&G(`${t} must be positive`),r}function Ee(e,t,n){String(e??"")!==String(t)&&G(`${n} mismatch; mutation refused`)}function im(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))rM.test(r)&&o!=null&&o!==!1&&G(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),im(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&G(`${r} refused; adapter is prepare-only`)}}function oM(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&G(`${t} must be decoded`),Array.isArray(e.accounts)||G(`${t} decoded accounts required`),e.decoded}function iM(e,t,n){for(let r of e.accounts){let o=Ct(r.pubkey,"account pubkey");t.has(o)||G(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&G(`unexpected writable account ${o}`)}}function Ek(e={}){(!e||typeof e!="object"||Array.isArray(e))&&G("request object required"),im(e),(e.network!=="mainnet-beta"||e.genesisHash!==vk)&&G("mainnet genesis/network mismatch"),e.reviewed!==!0&&G("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Ct(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&G("standard must be metaplex or core");let n=Ct(e.mint??e.asset,"mint/asset"),r=Ct(e.collection,"collection");e.collectionVerified!==!0&&G("verified collection required");let o=Ct(e.owner,"owner"),i=Ct(e.recipient,"recipient"),a=Vt(e.quantity,"quantity",{positive:!0}),s=Vt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&G("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&G("Core quantity must be exactly 1");let c=Ct(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==wr.core:!tM.has(c))&&G("reviewed transfer program mismatch");let l=t==="metaplex"?Ct(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Ct(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Ee(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Vt(e.decimals??0,"decimals")):null,p=Vt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Vt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Vt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&G("priority fee exceeds reviewed cap");let g=Vt(e.networkFeeLamports,"networkFeeLamports"),w=Vt(e.networkFeeCapLamports,"networkFeeCapLamports");g>w&&G("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&G("transaction object required"),x.version!==0&&x.version!=="legacy"&&G("transaction version must be 0 or legacy");let y=Ct(x.recentBlockhash,"recentBlockhash");Ee(y,e.approvedBlockhash,"blockhash mutation after approval");let b=Vt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),S=Vt(e.currentBlockHeight,"currentBlockHeight");S>b&&G("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&G("canonical instructions required");let I=new Set([o,n,l,u].filter(Boolean)),T=new Set([o,i,n,r,l,u,...kk].filter(Boolean)),E=0,A=0,v=0,P=0;for(let[B,te]of x.instructions.entries()){let Z=Ct(te.programId,`instructions[${B}].programId`);kk.has(Z)||G(`unknown program ${Z}`);let $=oM(te,`instructions[${B}]`);iM(te,T,I);let H=String($.type??$.instruction??"").toLowerCase();Z===wr.computeBudget?H.includes("limit")?(Ee($.units??$.computeUnitLimit,p,"compute-unit limit"),E++):H.includes("price")?(Ee($.microLamports??$.computeUnitPriceMicroLamports,m,"compute-unit price"),A++):G("unsupported compute budget instruction"):Z===wr.associatedToken?((t!=="metaplex"||H!=="createassociatedtokenaccountidempotent")&&G("non-canonical associated token instruction"),Ee($.payer,o,"ATA payer"),Ee($.owner,i,"ATA recipient"),Ee($.mint,n,"ATA mint"),Ee($.tokenAccount,u,"recipient ATA"),Ee($.tokenProgramId,c,"ATA token program"),P++):t==="metaplex"&&Z===c?(H!=="transferchecked"&&G("only canonical transferChecked is allowed"),Ee($.mint,n,"mint"),Ee($.owner,o,"owner"),Ee($.recipient,i,"recipient"),Ee($.sourceTokenAccount,l,"source token account"),Ee($.destinationTokenAccount,u,"recipient ATA"),Ee($.amount,a,"quantity"),Ee($.decimals,d,"decimals"),v++):t==="core"&&Z===wr.core?(H!=="transfer"&&G("only canonical Core transfer is allowed"),Ee($.asset,n,"mint/asset"),Ee($.collection,r,"collection"),$.collectionVerified!==!0&&G("verified collection required in Core instruction"),Ee($.owner,o,"owner"),Ee($.newOwner,i,"recipient"),Ee($.amount??1,1,"quantity"),v++):G(`program ${Z} is not valid for ${t} transfer`)}return(E!==1||A!==1)&&G("exactly one compute-unit limit and price instruction required"),v!==1&&G("exactly one canonical transfer instruction required"),t==="metaplex"&&P>1&&G("at most one idempotent recipient ATA instruction allowed"),{standard:t,mint:n,collection:r,owner:o,recipient:i,quantity:a.toString(),maxEditionQuantity:s.toString(),tokenProgramId:c,sourceTokenAccount:l,recipientTokenAccount:u,decimals:d,recentBlockhash:y,lastValidBlockHeight:b.toString(),currentBlockHeight:S.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:w.toString(),transaction:x}}function ca(e={},t={}){let n=Ek(e),r=Number(t.nowMs??Date.now()),o={provider:sa,kind:om,chain:"solana-mainnet-beta",genesisHash:vk,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...nM},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 O(o,{provider:sa,kind:om,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}function aM(e,{nowMs:t=Date.now()}={}){(!e||typeof e!="object")&&G("prepared envelope required"),im(e,"prepared"),e.prepareHash!==Je(e)&&G("prepareHash mismatch; payload was altered"),(e.provider!==sa||e.kind!==om||e.oraclePrepared!==!0)&&G("envelope identity mutation refused"),(e.execution!=="prepare-only"||e.prepareOnly!==!0||e.signed!==!1||e.broadcast!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)&&G("execution state mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeLamports!=="0")&&G("NFT Oracle fee mutation refused"),Number(t)>Number(e.expiresAt)&&G("prepared envelope expired");let n=e.transfer||{},r=e.caps||{},o=e.transaction||{};return Ek({network:"mainnet-beta",genesisHash:e.genesisHash,standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:n.collectionVerified,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,derivedRecipientAta:n.recipientTokenAccount,decimals:n.decimals,approvedBlockhash:o.recentBlockhash,currentBlockHeight:r.currentBlockHeight,computeUnitLimit:r.computeUnitLimit,computeUnitPriceMicroLamports:r.computeUnitPriceMicroLamports,priorityFeeCapLamports:r.priorityFeeCapLamports,networkFeeLamports:r.networkFeeLamports,networkFeeCapLamports:r.networkFeeCapLamports,reviewed:e.reviewed,transaction:o}),!0}var sM=ca,cM=ca;X();var la="universal-ordinals-transfer",am="bitcoin-ordinals-transfer-plan",Ak=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),uM=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ne(e){throw new Error(`ordinals transfer: ${e}`)}function Bn(e,t){let n=String(e??"").trim();return n||ne(`${t} required`),n}function Ln(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ne(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ne(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ne(`${t} out of range`),o}function Ik(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ne(`${t} must be positive`),n}function Nk(e,t){let n=Bn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ne(`${t} must be 64 hex`),n}function Ck(e,t="inscriptionId"){let n=Bn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ne(`${t} must be canonical`),n}function Ok(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&&ne(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Ok(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ne(`${r} bypass refused; adapter is prepare-only`)}function Rk(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ne(`${t}.${n} arbitrary script refused; use a bound address`)}function _k(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Rk(e,t);let n=Nk(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ne(`${t}.vout invalid`),{txid:n,vout:r,valueSats:Ln(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:Bn(e.address,`${t}.address`),sequence:Number(Ln(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Tk(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ne(`${t} must be an object`),Rk(e,t),{role:Bn(e.role,`${t}.role`),address:Bn(e.address,`${t}.address`),valueSats:Ln(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:Ck(e.inscriptionId,`${t}.inscriptionId`)}}}function Pk(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ne(`${n} mismatch; mutation refused`)}function $k(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ne("request object required"),Ok(e);let t=Bn(e.network,"network").toLowerCase(),n=Nk(e.genesisHash,"genesisHash");(!Ak[t]||n!==Ak[t])&&ne("network/genesis mismatch");let r=Ck(e.inscriptionId),o=_k(e.ownerInput,"ownerInput");Bn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ne("current inscription outpoint mismatch");let i=Bn(e.destination,"destination"),a=Ln(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Tk(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ne("exact change output invalid");let c=Ik(e.feeRateSatVb,"feeRateSatVb"),l=Ik(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ne("fee rate exceeds reviewed cap");let u=Ln(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=Ln(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ne("total fee exceeds reviewed cap");let p=Number(Ln(e.locktime,"locktime",{max:0xffffffffn})),m=Number(Ln(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&ne("RBF sequence refused"),o.sequence!==m&&ne("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&ne("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&ne("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&ne("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&ne("exactly one PSBT input required; extra inputs refused"),Pk(_k(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((y,b)=>Tk(y,`psbt.outputs[${b}]`)):ne("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};Pk(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(y=>y.role==="inscription"&&y.inscriptionId===r).length!==1&&ne("exactly one inscription-carrying output required");let x=h.reduce((y,b)=>y+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==x+u&&ne("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:a,changeOutput:s,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 ua(e={},t={}){let n=$k(e);return O({provider:la,kind:am,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...uM},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:la,kind:am,env:t.env})}function dM(e){return(!e||typeof e!="object")&&ne("prepared plan required"),e.prepareHash!==Je(e)&&ne("prepareHash mismatch; plan was altered"),(e.provider!==la||e.kind!==am||e.oraclePrepared!==!0)&&ne("invalid prepared identity"),(e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1||e.signed!==!1||e.finalized!==!1||e.broadcast!==!1)&&ne("executable, signed or finalized mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeSats!=="0")&&ne("NFT Oracle fee must be zero"),$k(e.plan),!0}var pM=ua,mM=ua;ge();function hM(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 Lk(e={},t={}){let r=e.actionMode==="execute"?"execute":e.actionMode||"alert_only",o=String(e.contract||"").trim().toLowerCase(),i=Number(e.chainId),a=[];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 s=r;if(r==="execute")if(!Hr(t.env||process.env))s="alert_only",a.push("DOWNGRADED to alert_only: autonomous trading is off \u2014 set ORACLE_AUTONOMOUS_TRADING=1 to let a trigger fire unattended");else{let c=hM(e.grant,{nowMs:t.nowMs});c.ok?(c.contract!==o||c.chainId!==i)&&(s="alert_only",a.push("DOWNGRADED to alert_only: grant does not match this contract/chain \u2014 a grant authorizes one exact target")):(s="alert_only",a.push(`DOWNGRADED to alert_only: ${c.problems.join("; ")}`))}return s==="alert_only"?a.push("alert_only: Oracle will notify and prepare an artifact; you sign it"):a.push("ARMED until mint opens: this trigger will submit one prepared, capped mint automatically when the mint opens"),{status:"ok",actionMode:s,requestedMode:r,downgraded:s!==r,contract:o,chainId:i,quantity:e.quantity==null?1:Number(e.quantity),urgency:e.urgency||"war",grant:s==="execute"?e.grant:null,armedUntil:s==="execute"?"mint-opens":null,notes:a}}async function Bk(e={},t={}){let n=t.rpcCall||q,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 a of i)try{let s=await n(o,"eth_call",[{to:r,data:a.selector},"latest"],t);if(s&&s!=="0x"){let c=BigInt(s)===1n;return{status:"ok",open:a.openWhen?c:!c,evidence:a.name,raw:s}}}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"]}}var yM=1440*60*1e3;function bM(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>yM&&n.push("grant TTL exceeds 24h"):n.push("grant.expiresAt is required"),{ok:n.length===0,problems:n,contract:r,chainId:Number(e.chainId)}}var Mk="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",wM=4663,xM="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Fk="a22cb465",SM="a0712d68";function sm(e){return String(e||"").trim().toLowerCase()}function ko(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function kM(e){let t=ko(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Fk}${t.padStart(64,"0")}${"0".repeat(64)}`}function vM(e){return ko(e).includes(ko(Mk))}function EM(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>ko(n?.data).startsWith(Fk))}function AM(e={},t){let n=ko(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return sm(i[0])!==xM?!1:ko(i[2])===n})}function IM(e=1){return`0x${SM}${BigInt(e).toString(16).padStart(64,"0")}`}function Uk(e={},t={}){let n=sm(e.contract),r=sm(e.minter),o=Number(e.chainId),i=e.valueWei==null?"0":String(e.valueWei),a=[];/^0x[a-f0-9]{40}$/.test(n)||a.push("contract must be a 0x address"),/^0x[a-f0-9]{40}$/.test(r)||a.push("minter must be a 0x address"),o!==wM&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),vM(e.bytecode||"")||a.push("bytecode does not reference Mancers 0x797a\u20268cA57 \u2014 no allowlist gate found");let s=e.simulation||{};s.willRevert===!0&&a.push("mint simulation reverts"),EM(s)&&a.push("simulation sets approval / setApprovalForAll"),AM(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:IM(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:kM(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!Ey(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=bM(e.grant,{nowMs:t.nowMs});p.ok?p.contract!==n||p.chainId!==o?a.push("DOWNGRADED: grant does not match this contract/chain"):d=!0:a.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:Mk.toLowerCase(),reasons:a,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"]}}L();qe();X();di();var TM="https://api.paraswap.io",cm=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||TM).replace(/\/$/,"");function vo(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 lm(e={},t={}){let n=Number(e.chainId||1);return k(`${cm(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Mn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:vo(e.srcToken,"srcToken"),destToken:vo(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 ys({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(M0(o)))r.set(s,c);let i=await k(`${cm(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...ie(i,{chainId:n,venue:i?.priceRoute?.contractAddress||"paraswap-quote",amountOut:a,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 qk(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=vo(e.userAddress,"userAddress"),o=await Mn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:vo(e.srcToken,"srcToken"),destToken:vo(e.destToken,"destToken"),srcAmount:String(i.srcAmount||e.amount),destAmount:String(o.amountOutMinimum),priceRoute:i,userAddress:r,ignoreChecks:!1,ignoreGasEstimate:!1};e.receiver&&(s.receiver=vo(e.receiver,"receiver"));let c=await k(`${cm(t)}/transactions/${n}`,{method:"POST",body:s,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()!==a)throw new Error("paraswap: transaction target mismatch");if(c.from&&String(c.from).toLowerCase()!==r)throw new Error("paraswap: transaction sender mismatch");return O({provider:"paraswap",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,quote:o,autoSlippage:o.autoSlippage,requiresApproval:s.srcToken!=="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"?{token:s.srcToken,spender:i.tokenTransferProxy||a,amount:s.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:ye(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Dk(e={}){let t=await lm({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}import{createHash as NM}from"node:crypto";import{getAddress as Gk,isAddress as um}from"ethers";var Hk="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",CM=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),OM=Object.freeze(["lifi"]),jk=/^0x[0-9a-fA-F]{64}$/,RM=/^\d+$/;function xe(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function zk(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&xe(t,"must be a positive chainId"),n}function Lc(e,t){let n=String(e??"").trim();return(!RM.test(n)||BigInt(n)<=0n)&&xe(t,"must be a positive integer string"),n}function $M(e,t){return e==null||e===""?null:Lc(e,t)}function Vk(e,t){let n=String(e??"").trim();return n.toLowerCase()===Hk.toLowerCase()?Hk:(um(n)||xe(t,"must be an EVM address or native token sentinel"),Gk(n))}function Kk(e,t){let n=String(e??"").trim();return um(n)||xe(t,"must be an EVM address"),Gk(n)}function LM(e,t){return e==null||e===""?null:Kk(e,t)}function Wk(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||xe(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function BM(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||xe(r,"must be a finite millisecond timestamp"),o<=t&&xe(r,"expired"),o>t+n&&xe(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Eo(e){if(Array.isArray(e))return e.map(Eo);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Eo(e[n]));return t}return e}function MM(e){return JSON.stringify(Eo(e))}function Bc(e){return`0x${NM("sha256").update(MM(e)).digest("hex")}`}function Yk(e,t){let n={...e};for(let r of t)delete n[r];return n}function Xk(e){return Bc(Yk(e,["intentHash"]))}function Qk(e){return Bc(Yk(e,["firmQuoteHash"]))}function Mc(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&xe("time","is invalid");let o=zk(e.fromChainId??e.fromChain,"fromChainId"),i=zk(e.toChainId??e.toChain,"toChainId"),s=o===i?CM:OM,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Vk(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Vk(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Lc(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Kk(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:BM(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:$M(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Wk(e.allowedSources,"allowedSources",s),allowedRouters:Wk(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)?Eo(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&xe("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Bc({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=Xk(c),Object.freeze(c)}function FM(e){return(!e||typeof e!="object"||Array.isArray(e))&&xe("artifact","required"),e.typedDataHash!=null&&!jk.test(String(e.typedDataHash))&&xe("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!jk.test(String(e.calldataHash))&&xe("artifact.calldataHash","must be bytes32"),e.to!=null&&!um(String(e.to))&&xe("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&xe("artifact.data","must be hex"),Eo(e)}function dm(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&xe("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||xe("quote expiry","required"),o<=r&&xe("quote","expired"),o>e.deadlineMs&&xe("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||xe("source","required"),e.allowedSources.includes(i)||xe("source","not allowed by intent");let a=Lc(t.amountOut??t.buyAmount,"amountOut"),s=Lc(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&xe("minBuyAmount","exceeds amountOut");let c=FM(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||xe("quotedAtMs","must be finite");let u=LM(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:a,minBuyAmount:s,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)?Eo(t.metadata):{}};return d.quoteId||(d.quoteId=Bc({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=Qk(d),Object.freeze(d)}function da(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Jk(e,t){return String(e?.[t]??"").trim()}function pa(e,t){return Object.freeze({source:e,run:t})}function Zk(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??De,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return da(e,"lifi")&&a.push(pa("lifi",async()=>{let c=await(r.lifiQuote??En)({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 UM(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(da(e,"paraswap")&&a.push(pa("paraswap",async()=>{let c=await(r.paraswapPrice??Mn)({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}}})),da(e,"0x")&&(Jk(n,"ZEROX_API_KEY")||Jk(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(pa("0x",async()=>{let c=await(r.zeroxQuote??ar)({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}}})),da(e,"cow")&&a.push(pa("cow",async()=>{let c=await(r.cowQuote??In)({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}}})),da(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(pa("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??mn)({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}}}))),a}async function UM(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function qM(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function ev(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>qM(s,r))),i=[],a=[];for(let s=0;s<o.length;s++){let c=t[s],l=o[s];if(l.status==="rejected"){a.push({source:c.source,error:String(l.reason?.message||l.reason)});continue}try{i.push(dm(e,{...l.value,source:c.source},n))}catch(u){a.push({source:c.source,error:String(u?.message||u)})}}return{quotes:i,failed:a}}function tv(e=[],t={}){let n=Number(t.nowMs??Date.now()),r=e.filter(a=>Number(a.expiryMs??0)>n);r.sort((a,s)=>{let c=BigInt(s.minBuyAmount??0)-BigInt(a.minBuyAmount??0);if(c!==0n)return c>0n?1:-1;let l=BigInt(s.amountOut??0)-BigInt(a.amountOut??0);return l>0n?1:l<0n?-1:0});let o=r.map(a=>({...a,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 pm(e,t={}){let n=Zk(e,t),{quotes:r,failed:o}=await ev(e,n,t),i=tv(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}}function nv(e={},t={}){return Mc(e,t)}async function rv(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Mc(e,t);return pm(n,t)}async function ov(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var HM="https://app.across.to";function mm(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||HM).replace(/\/$/,"")}async function iv(e={}){try{let t=await k(`${mm(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 av(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return k(`${mm(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sv(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)),k(`${mm(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var zM="https://api.beefy.finance";function fm(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||zM).replace(/\/$/,"")}async function cv(e={}){try{let t=await k(`${fm(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 lv(e={},t={}){let n=await k(`${fm(t)}/apy`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});if(e.chain){let r=String(e.chain).toLowerCase(),o={};for(let[i,a]of Object.entries(n))String(i).toLowerCase().startsWith(r)&&(o[i]=a);return o}return n}async function uv(e={}){return k(`${fm(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var WM="https://public-api.birdeye.so";function dv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||WM).replace(/\/$/,"")}async function pv(e={}){try{let t=await k(`${dv(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 mv(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 k(`${dv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var KM="https://api.celenium.io";function hm(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||KM).replace(/\/$/,"")}async function fv(e={}){try{let t=await k(`${hm(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 hv(e={}){return k(`${hm(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function gv(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 k(`${hm(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var XM="https://api.mainnet-beta.solana.com";function QM(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||XM).replace(/\/$/,"")}async function Fc(e,t,n={}){let r=QM(n),o=JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:t}),s=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(s.error)throw new Error(`das-assets ${e}: ${s.error.message||JSON.stringify(s.error)}`);return s.result}async function yv(e={}){try{let t=await Fc("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 bv(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 Fc("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function wv(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)),Fc("searchAssets",o,t)}async function xv(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Fc("getAssetProof",{id:n},t)}L();var ZM="https://api.l2beat.com";function gm(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||ZM).replace(/\/$/,"")}async function Sv(e={}){try{let t=await k(`${gm(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 kv(e={},t={}){let n=await k(`${gm(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(([a])=>String(a).toLowerCase()===r);return i?{[i[0]]:i[1]}:{}}return n}async function vv(e={},t={}){return k(`${gm(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var tF="https://api.spark.fi";function ym(e={}){return(e.baseUrl||process.env.SPARK_API_URL||tF).replace(/\/$/,"")}async function Ev(e={}){try{return{ok:(await k(`${ym(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 Av(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?k(`${ym(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):k(`${ym(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var rF="https://api.symbiotic.fi";function bm(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||rF).replace(/\/$/,"")}async function Iv(e={}){try{let t=await k(`${bm(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 _v(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await k(`${bm(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 Tv(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return k(`${bm(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var iF="https://staking-api.polygon.technology/api/v2",aF=18,sF=200,cF=50,lF=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function xm(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||iF).replace(/\/$/,"")}function uF(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 dF(e,t=cF){let n=Number(e??t);return Number.isFinite(n)?Math.min(sF,Math.max(1,Math.trunc(n))):t}function wm(e){let t=Number(e);return Number.isFinite(t)?t/10**aF:null}async function Sm(e,t={}){let n=await k(`${xm(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 Pv(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:wm(e.totalStaked),selfStakePolApprox:wm(e.selfStake),delegatedStakePolApprox:wm(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function Nv(e={},t={}){let n=await Sm("/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=lF.has(String(e.sortBy))?String(e.sortBy):"id",a=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 a?-h:h});let s=r.length,c=Math.max(0,Math.trunc(Number(e.offset||0))||0),l=dF(e.limit),u=r.slice(c,c+l);return{provider:"polygon-staking",chainId:137,count:u.length,matched:s,total:o,limit:l,offset:c,sortBy:i,direction:a?"DESC":"ASC",paginatedBy:"client \u2014 upstream /validators ignores limit/offset",validators:e.raw?u:u.map(Pv)}}async function Cv(e={},t={}){let n=uF(e.id??e.validatorId,"id"),o=(await Sm(`/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:{...Pv(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 Ov(e={}){try{let t=await Sm("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:xm(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:xm(e),error:String(t?.message||t),exec:!1}}}L();var mF="https://api.v3.aave.com/graphql",Xj=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),fF=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||mF;async function Uc(e,t,n={}){let r=await k(fF(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}var hF=`query Markets($request: MarketsRequest!) {
147
147
  markets(request: $request) {
148
148
  name
149
149
  address
@@ -151,7 +151,7 @@ anchor-lang = "0.31.1"
151
151
  totalMarketSize
152
152
  totalAvailableLiquidity
153
153
  }
154
- }`,hF=`query Market($request: MarketRequest!) {
154
+ }`,gF=`query Market($request: MarketRequest!) {
155
155
  market(request: $request) {
156
156
  name
157
157
  address
@@ -184,13 +184,13 @@ anchor-lang = "0.31.1"
184
184
  }
185
185
  }
186
186
  }
187
- }`,gF=`query Chains($filter: ChainsFilter!) {
187
+ }`,yF=`query Chains($filter: ChainsFilter!) {
188
188
  chains(filter: $filter) { chainId name isTestnet explorerUrl }
189
- }`;function yF(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 Ov(e={},t={}){let n={chainIds:yF(e)};return e.user&&(n.user=String(e.user)),{markets:(await Fc(fF,{request:n},t))?.data?.markets??[]}}async function Rv(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 a=(await Fc(hF,{request:o},t))?.data?.market??null;if(!a)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:a}}async function $v(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 Fc(gF,{filter:r},t))?.data?.chains??[]}}async function Lv(e={}){return{ok:(await Fc("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var wF="https://staking-api.babylonlabs.io";function km(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||wF).replace(/\/$/,"")}function Uc(e,t={}){return k(`${km(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function Bv(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 Mv(e={}){try{let n=(await Uc("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:km(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:km(e),error:String(t?.message||t),exec:!1}}}async function Fv(e={},t={}){let r=(await Uc("/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 Uv(e={},t={}){let n=await Uc("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(a=>String(a.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=Bv(e.btcPk,"btcPk");r=r.filter(a=>String(a.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 qv(e={},t={}){let n=Bv(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 Uc(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var SF="https://markets.bisq.network";function vm(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||SF).replace(/\/$/,"")}function Dv(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 qc(e,t={}){return k(`${vm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Hv(e={}){try{let t=await qc("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:vm(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:vm(e),error:String(t?.message||t),exec:!1}}}async function jv(e={},t={}){let n=await qc("/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 zv(e={},t={}){let n=Dv(e.market||e.pair||"btc_usd","market"),r=await qc(`/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 Vv(e={},t={}){let n=Dv(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 qc(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.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}))}}L();var cn=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"}}),vF=new Map([["bob",60808],["rootstock",30],["rsk",30]]),EF=60808;function pa(e){if(e==null||e==="")return EF;let t=vF.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!cn[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(cn).join(", ")} / bob, rootstock)`);return n}function Em(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=pa(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||cn[n].url).replace(/\/$/,"")}function Wv(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 Dc(e,t,n={}){return k(`${Em(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Gv(e={},t={}){let n;try{n=pa(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=cn[n];try{let o=await Dc(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Em(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:Em(n,e),error:String(o?.message||o),exec:!1}}}async function Am(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(cn).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Am({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:cn[c].name,error:String(l?.message||l)}}}))}}let r=pa(n),o=cn[r],i=await Dc(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 Kv(e={},t={}){let n=pa(e.chainId??e.chain),r=Wv(e.address||e.addr,"address"),o=cn[n],i=await Dc(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 Yv(e={},t={}){let n=pa(e.chainId??e.chain),r=Wv(e.address||e.addr,"address"),o=await Dc(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],a=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:cn[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var IF="https://insights.braiins.com/api/v1.0";function Im(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||IF).replace(/\/$/,"")}function _m(e,t={}){return k(`${Im(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Xv(e={}){try{let t=await _m("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Im(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Im(e),error:String(t?.message||t),exec:!1}}}async function Qv(e={},t={}){let n=await _m("/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 Jv(e={},t={}){let n=await _m("/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,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.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:a.length,pools:a.slice(0,s).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:a.slice(0,s)}}L();var TF="https://api.cow.fi",Zv=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function eE(e={}){return(e.baseUrl||process.env.COW_API_URL||TF).replace(/\/$/,"")}function NF(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Zv[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Zv).join(", ")})`);return n}function Tm(e,t,n){return`${eE(n)}/${NF(e)}/api/v1${t}`}function tE(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 nE(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function rE(e={},t={}){return k(Tm(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function oE(e={},t={}){let n=tE(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(nE(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await k(`${Tm(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],a=e.openOnly===!1?i:i.filter(s=>String(s?.status||"").toLowerCase()==="open");return{owner:n,count:a.length,total:i.length,orders:a}}async function iE(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",tE(e.owner||e.address||e.user,"owner"));let r=await k(`${Tm(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,nE(e))}}async function aE(e={}){let t=await k(`${eE(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}}L();var CF="https://api.hiro.so",OF=20;function Nm(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||CF).replace(/\/$/,"")}function RF(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function ma(e,t={}){return k(`${Nm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:RF(t)})}async function sE(e={}){try{let t=await ma("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Nm(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:OF,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Nm(e),error:String(t?.message||t),exec:!1}}}async function cE(e={},t={}){let n=await ma("/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 lE(e={},t={}){let n=await ma("/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 uE(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await ma(`/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(a=>({cycleNumber:a.cycle_number??null,blockHeight:a.block_height??null,totalStackedAmount:a.total_stacked_amount==null?null:String(a.total_stacked_amount),totalWeight:a.total_weight??null,totalSigners:a.total_signers??null}))}}async function dE(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await ma(`/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}))}}L();var LF="https://bundles.jito.wtf",mE=1e9;function Pm(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||LF).replace(/\/$/,"")}function BF(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function pE(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*mE):null}function MF(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/mE:null,raw:e}}async function fE(e={}){try{let t=await k(`${Pm(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 hE(e={},t={}){let n=BF(e.limit,5,100),r=new URL(`${Pm(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 k(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(MF),s=a.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:a.length,totalTipLamports:s.reduce((c,l)=>c+l,0),maxTipLamports:s.length?Math.max(...s):null,bundles:a}}async function gE(e={}){let t=await k(`${Pm(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,pE(i)])),suggestedTipLamports:pE(r.p75||r.p50),raw:n}}L();var UF="https://api.kamino.finance";function qF(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||UF).replace(/\/$/,"")}function it(e){let t=Number(e);return Number.isFinite(t)?t:null}function yE(e={}){let t=it(e.totalValueLocked)??0,n=it(e.apy?.totalApy)??0,r=it(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:it(e.sharePrice),sharesIssued:it(e.sharesIssued),profitAndLoss:it(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:it(e.apy?.vault?.totalApr),apy24h:it(e.kaminoApy?.vault?.apy24h),apy7d:it(e.kaminoApy?.vault?.apy7d),apy30d:it(e.kaminoApy?.vault?.apy30d),poolPrice:it(e.apy?.vault?.poolPrice),priceLower:it(e.apy?.vault?.priceLower),priceUpper:it(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Cm(e={},t={}){let n=new URL(`${qF(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function bE(e={}){try{let t=await Cm({},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 wE(e={},t={}){let r=(await Cm(e,t)).map(yE),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 a=String(e.sortBy||"apy");r.sort((l,u)=>a==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let s=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,s);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 xE(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Cm({...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",...yE(o),raw:o}}L();var HF="https://blockstream.info/liquid/api",SE="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Hc(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||HF).replace(/\/$/,"")}function jF(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function zF(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 kE(e,t={}){let n=`${Hc(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}function vE(e,t={}){return k(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function EE(e={}){try{let t=await kE("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Hc(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}async function AE(e={},t={}){let n=await kE("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function IE(e={},t={}){let n=jF(e.address||e.addr,"address"),r=await vE(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=o.funded_txo_sum!=null,s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:a?String(s-c):null,confidential:!a,note:a?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function _E(e={},t={}){let n=zF(e.assetId||e.asset||SE,"assetId"),r=await vE(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===SE,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}}L();var WF="https://api-mainnet.magiceden.dev/v2/ord/btc",GF=600;function Om(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||WF).replace(/\/$/,"")}function KF(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function TE(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 NE(e,t={}){return k(`${Om(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:KF(t),retries:t.retries??1})}async function PE(e={}){let t=TE(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await NE(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Om(e),probeCollection:t,rateLimitRpm:GF,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Om(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 CE(e={},t={}){let n=TE(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await NE(`/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."}}}L();var XF="https://mempool.space/api",QF=7;function Rm(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||XF).replace(/\/$/,"")}function jc(e,t={}){return k(`${Rm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function OE(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>QF}}async function RE(e={}){try{let n=(await jc("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=OE(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Rm(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:Rm(e),error:String(t?.message||t),exec:!1}}}async function $E(e={},t={}){let r=(await jc("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=OE(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 LE(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 jc(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],a=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,a).map(s=>({publicKey:s.publicKey??null,alias:s.alias??null,channels:s.channels??null,capacitySats:s.capacity==null?null:String(s.capacity),firstSeen:s.firstSeen??null,updatedAt:s.updatedAt??null,city:s.city?.en??s.city??null,country:s.country?.en??s.country??null,iso:s.iso_code??null}))}}async function BE(e={},t={}){let n=await jc("/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((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var ZF="https://mempool.space/api",ME=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function $m(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||ZF).replace(/\/$/,"")}function FE(e,t){let n=String(e||t).trim().toLowerCase();if(!ME.has(n))throw new Error(`mempool-mining: window must be one of ${[...ME].join(", ")}`);return n}function fa(e,t={}){return k(`${$m(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function UE(e={}){try{let t=await fa("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:$m(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:$m(e),error:String(t?.message||t),exec:!1}}}async function qE(e={},t={}){let n=await fa("/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 DE(e={},t={}){let n=FE(e.window||e.timeframe,"1w"),r=await fa(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),a=l=>i>0?Number(l.blockCount||0)/i*100:null,s=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||s.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:s[0]?a(s[0]):null,top3SharePct:s.slice(0,3).reduce((l,u)=>l+(a(u)||0),0)||null,pools:s.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:a(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function HE(e={},t={}){let n=FE(e.window||e.timeframe,"3d"),r=await fa(`/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 jE(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await fa(`/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}}L();var tU="https://amm-v2.meteora.ag",zE=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),VE=new Set(["dynamic","multitoken","lst","farms"]),nU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function rU(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||tU).replace(/\/$/,"")}function ze(e){let t=Number(e);return Number.isFinite(t)?t:null}function oU(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:ze(e.pool_lp_price_in_usd),tvlUsd:ze(e.pool_tvl),farmTvlUsd:ze(e.farm_tvl),volume24hUsd:ze(e.trading_volume),volume7dUsd:ze(e.weekly_trading_volume),fee24hUsd:ze(e.fee_volume),fee7dUsd:ze(e.weekly_fee_volume),tradeApyPct:ze(e.trade_apy),weeklyTradeApyPct:ze(e.weekly_trade_apy),baseApyPct:ze(e.daily_base_apy),farmingApyPct:ze(e.farming_apy),totalApyPct:(ze(e.trade_apy)??0)+(ze(e.farming_apy)??0),aprPct:ze(e.apr),feePct:ze(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 iU(e={},t={}){let n=new URL(`${rU(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 s=String(e.sortKey);if(!zE.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...zE].join(", ")}`);n.searchParams.set("sort_key",s),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let s=String(e.poolType);if(!VE.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...VE].join(", ")}`);n.searchParams.set("pool_type",s)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let a=e.mints||e.includeTokenMints;if(a){let s=(Array.isArray(a)?a:[a]).map(c=>String(c).trim());for(let c of s)if(!nU.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",s.join(","))}return{url:n,page:r,size:o}}async function Lm(e={},t={}){let{url:n,page:r,size:o}=iU(e,t),i=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(oU),totalCount:i?.total_count??null,page:r,size:o}}async function WE(e={}){try{let{pools:t,totalCount:n}=await Lm({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 GE(e={},t={}){let n=await Lm({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,a)=>i+(a.tvlUsd??0),0),pools:r}}async function KE(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 Lm({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}}L();var sU="https://ordinals.com";function zc(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||sU).replace(/\/$/,"")}function cU(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 YE(e,t={}){let n=`${zc(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 Bm(e,t={}){return k(`${zc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function XE(e={}){try{let t=await YE("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:zc(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:zc(e),error:String(t?.message||t),exec:!1}}}async function QE(e={},t={}){let n=await YE("/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 JE(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 Bm(`/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 ZE(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}`,a=await Bm(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function eA(e={},t={}){let n=cU(e.name||e.rune||e.runeName,"name"),r=await Bm(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=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:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var uU="https://hermes.pyth.network",Fm={"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"},dU=/^[0-9a-fA-F]{64}$/;function tA(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||uU).replace(/\/$/,"")}function nA(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Fm[n.toUpperCase()]||Fm[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!dU.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 Mm(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Um(e={}){let t=Mm({price:Number(e.price?.conf),expo:e.price?.expo}),n=Mm(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Mm(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 qm(e,t={}){let n=new URL(`${tA(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"),k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function rA(e={}){try{let t=await qm([Fm["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Um):[])[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 oA(e={},t={}){let n=nA(e.feedId||e.id||e.symbol,"feedId"),r=await qm([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Um):[],i=o.find(a=>String(a.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 iA(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>nA(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=[];for(let l of i)a.push(await qm(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Um):[]),c=Object.fromEntries(s.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:s.length,missing:r.filter(l=>!c[l]),prices:s,byId:c}}async function aA(e={},t={}){let n=new URL(`${tA(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 k(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}))}}L();var mU="https://relayscan.io",sA=new Set(["1h","12h","24h","7d"]);function Dm(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||mU).replace(/\/$/,"")}function cA(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!sA.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...sA].join(", ")}`);return t}function fU(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 Hm(e={},t={}){return k(`${Dm(t)}/overview/json?t=${cA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function lA(e={},t={}){return k(`${Dm(t)}/builder-profit/json?t=${cA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function uA(e={},t={}){let n=fU(e);return k(`${Dm(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function dA(e={}){let t=await Hm({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}}L();var gU="https://extra-api.sanctum.so",yU=30,bU=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function jm(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||gU).replace(/\/$/,"")}function pA(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 wU(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function wr(e,t,n={}){let r={},o={};for(let i of wU(t,yU)){let a=new URL(`${jm(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await k(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function mA(e={}){try{let[t,n]=await Promise.all([k(`${jm(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),wr("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 zm(e={},t={}){let n=await k(`${jm(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(a=>String(a.symbol||"").toLowerCase()===i||a.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 fA(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await zm({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=bU);let r=[...new Set(n.map(s=>pA(s,"lsts[]")))],[o,i]=await Promise.all([wr("apy/latest",r,t),wr("apy/inception",r,t)]),a=r.map(s=>{let c=Number(o.values[s]),l=Number(i.values[s]);return{lst:s,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[s]||i.errs[s]||null}});return a.sort((s,c)=>(c.apyInception??-1)-(s.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:a.length,apys:a,byLst:Object.fromEntries(a.map(s=>[s.lst,s]))}}async function hA(e={},t={}){let n=pA(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([wr("apy/latest",[n],t),wr("apy/inception",[n],t),wr("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),wr("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*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}}L();var SU="https://api.save.finance",kU="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",gA="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",vU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Vm(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||SU).replace(/\/$/,"")}function yA(e,t="address"){let n=String(e??"").trim();if(!vU.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function bA(e){let t=Number(e);return Number.isFinite(t)?t:null}function EU(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 AU(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:bA(e.rates?.supplyInterest),borrowApyPct:bA(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 wA(e={}){try{let t=await k(`${Vm(e)}/v1/reserves?ids=${gA}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:gA,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function Wm(e={},t={}){let n=new URL(`${Vm(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 k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(EU);if(e.includeHidden!==!0&&(o=o.filter(a=>!a.hidden)),e.name){let a=String(e.name).toLowerCase();o=o.filter(s=>String(s.name||"").toLowerCase()===a)}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 xA(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(s=>yA(String(s).trim(),"reserve"));else{let a=yA(e.market||e.marketAddress||kU,"market"),c=(await Wm({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===a);if(!c)throw new Error(`solend-lending: market ${a} 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 k(`${Vm(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...AU(a),address:a.address||a.reserve?.address||n[s]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function Gm(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 xr(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 ha(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:Gm(e.amount,"amount")}}function Km(e,t){let n=t.map(a=>BigInt(a)),r=n.reduce((a,s)=>a+s,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(a=>e*a/r),i=e-o.reduce((a,s)=>a+s,0n);for(let a=0;i>0n;a=(a+1)%o.length)o[a]+=1n,i-=1n;return o}function ga(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 Ym(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 _U(e={},t={}){let n=ha(e),r=xr(e.slices??10,"slices",2,100),o=xr(e.durationSec??3600,"durationSec",r,604800),i=Km(n.total,Array(r).fill(1));return ga(n,"TWAP",Ym(i,o,t.nowMs),{durationSec:o})}function TU(e={},t={}){let n=ha(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=xr(e.durationSec??3600,"durationSec",r.length,604800),i=Km(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Ym(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return ga(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function NU(e={}){let t=ha(e),n=xr(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,a]of e.observedMarketVolumes.entries()){let s=Gm(a,"observedMarketVolumes"),c=s*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(s)}),r-=l,r===0n)break}return ga(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function PU(e={}){let t=ha(e),n=Gm(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 ga(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function CU(e={},t={}){let n=ha(e),r=xr(e.slices??10,"slices",2,100),o=xr(e.durationSec??3600,"durationSec",r,604800),i=xr(e.urgencyBps??5e3,"urgencyBps",1,1e4),a=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),s=Km(n.total,a);return ga(n,"IS",Ym(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function SA(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return _U(e,t);if(n==="VWAP")return TU(e,t);if(n==="POV")return NU(e,t);if(n==="ICEBERG")return PU(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return CU(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function kA(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var _A=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"})})});function Xm(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Cc,adapters:Object.freeze(Oc.adapters.map(e=>{let t=_A[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function TA(e,t={}){let n=wk(e,t),r=_A[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new ce(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var KU={"hl-info":{health:e=>m0(e),allMids:e=>Qt(e),l2Book:(e,t={})=>Pr(t.coin,e),outcomeMeta:e=>oi(e),clearinghouse:(e,t={})=>os(t.user,e),userFills:(e,t={})=>f0(t.user,e),meta:e=>is(e),metaAndAssetCtxs:e=>dt(e),candleSnapshot:(e,t={})=>Cr(t,e),openOrders:(e,t={})=>h0(t.user,e),frontendOpenOrders:(e,t={})=>g0(t.user,e),userState:(e,t={})=>Or(t.user,e),spotMeta:e=>ss(e)},"hl-vaults":{health:e=>w0(e),summaries:(e,t={})=>Su(t,e),details:(e,t={})=>cs(t,e),userEquities:(e,t={})=>ku(t,e),tracker:(e,t={})=>vu(t,e)},"hl-precompiles":{health:e=>S0(e),read:(e,t={})=>x0(t,e),l1BlockNumber:e=>ls(e),markPx:(e,t={})=>Iu(t,e),oraclePx:(e,t={})=>_u(t,e),spotPx:(e,t={})=>Tu(t,e),position:(e,t={})=>Nu(t,e),spotBalance:(e,t={})=>Pu(t,e),vaultEquity:(e,t={})=>Cu(t,e),withdrawable:(e,t={})=>Ou(t,e)},"hl-delta-neutral":{health:()=>z0(),scan:(e,t={})=>Zu(t,e),quote:(e,t={})=>ed(t,e),prepare:(e,t={})=>td(t,e),loop:(e,t={})=>Q0(t,e)},"lighter-delta-neutral":{health:()=>og(),scan:(e,t={})=>rd(t,e),quote:(e,t={})=>od(t,e),prepare:(e,t={})=>id(t,e),loop:(e,t={})=>pg(t,e)},"poly-public":{health:e=>fg(e),time:e=>ad(e),markets:(e,t={})=>hg(t,e),book:(e,t={})=>gg(t.tokenId,e),midpoint:(e,t={})=>yg(t.tokenId,e),spread:(e,t={})=>bg(t.tokenId,e),price:(e,t={})=>wg(t.tokenId,{side:t.side},e),events:(e,t={})=>xg(t,e)},"evm-rpc":{health:(e,t={})=>Ir(t.chainId??1,e),healthAll:(e,t={})=>Gl({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Fo(t.chainId??1,e),chainId:(e,t={})=>zl(t.chainId??1,e),getBalance:(e,t={})=>Xn(t.chainId??1,t.address,e),call:(e,t={})=>q(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Wl(t,e),erc20Balance:(e,t={})=>Uo(t,e),transactionReceipt:(e,t={})=>qo(t,e)},portfolio:{health:e=>gS(e),balances:(e,t={})=>xc(t,e),snapshot:(e,t={})=>LS(t,e),history:(e,t={})=>Up(t,e),valueGraph:(e,t={})=>BS(t,e)},"nft-portfolio":{health:e=>vS(e),inventory:(e,t={})=>mo(t,e),gallery:(e,t={})=>_S(t,e),pnl:(e,t={})=>IS(t,e),prepareList:(e,t={})=>ES(t,e),traitSnipe:(e,t={})=>AS(t,e)},"contract-risk":{health:e=>MS(e),scan:(e,t={})=>fr(t,e)},"evm-token-sniper":{health:e=>qS(e),scan:(e,t={})=>US(t,e)},"evm-simulate":{health:e=>HS(e),simulate:(e,t={})=>Qi(t,e)},"nft-mint":{health:e=>zS(e),discover:(e,t={})=>Ic(t,e),prepare:(e,t={})=>Hp(t,e),priceGas:(e,t={})=>Ac(t,e),createTrigger:(e,t={})=>$k(t,e),checkOpen:(e,t={})=>Lk(t,e),evaluateMancerOs:(e,t={})=>Fk(t,e)},"universal-mint-router":{health:()=>Nc(),capabilities:()=>ea(),prepare:(e,t={})=>ta(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:Xm()}),capabilities:()=>Xm(),route:(e,t={})=>TA(t,e)},"erc8004-identity":{health:()=>Dd(),prepareIdentityRegistration:(e,t={})=>jd(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>zd(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Vd(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:oa,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>ia(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:aa,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>sa(t,e)},"universal-ordinals-transfer":{health:()=>({provider:ca,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>la(t,e)},"solana-rpc":{health:e=>kg(e),latestBlockhash:(e,t={})=>cd(t,e),getBalance:(e,t={})=>ws(t,e),tokenAccounts:(e,t={})=>bi(t,e),simulate:(e,t={})=>vg(t,e)},"bitcoin-esplora":{health:e=>Eg(e),tipHeight:e=>Ag(e),fees:e=>Ig(e),address:(e,t={})=>Ss(t,e),utxos:(e,t={})=>_g(t,e),tx:(e,t={})=>Tg(t,e),decode:(e,t={})=>Ng(t,e)},"bitcoin-meta":{health:e=>Cg(e),runeBalances:(e,t={})=>vs(t,e),inscriptions:(e,t={})=>qr(t,e),inscriptionInfo:(e,t={})=>Og(t,e),inscriptionChildren:(e,t={})=>Rg(t,e),ordBlockInfo:(e,t={})=>$g(t,e)},satflow:{health:e=>Bg(e),collectionFloors:(e,t={})=>Mg(t,e),collectionStats:(e,t={})=>Fg(t,e),item:(e,t={})=>Ug(t,e),walletContents:(e,t={})=>As(t,e),floorListings:(e,t={})=>qg(t,e),preparePurchase:(e,t={})=>Hg(t,e),prepareList:(e,t={})=>Is(t,e)},jupiter:{health:e=>Xg(e),venues:(e,t={})=>Yg(t,e),quote:(e,t={})=>Ns(t,e),prepare:(e,t={})=>Qg(t,e)},defillama:{health:e=>Zg(e),prices:(e,t={})=>At(t.coins||[],e),pricesBySymbol:(e,t={})=>ny(t.symbols,e),protocols:e=>Ps(e),yields:(e,t={})=>ey(t,e),stablecoins:(e,t={})=>Cs(t,e),dexVolumes:(e,t={})=>ty(t,e)},lifi:{health:e=>oy(e),quote:(e,t={})=>vn(t,e),prepare:(e,t={})=>iy(t,e),chains:e=>ay(e)},dexscreener:{health:e=>ch(e),token:(e,t={})=>Qn(t.address||t.tokenAddress,e),search:(e,t={})=>Do(t.q||t.query,e),pair:(e,t={})=>lh(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>vh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>pn(t,e),prepare:(e,t={})=>kh(t,e),quotePath:(e,t={})=>Sh(t,e),ethUsdc:(e,t={})=>eu(t,e),chains:()=>Eh()},"uniswap-v4":{health:(e,t={})=>Oh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>_r(t,e),chains:()=>Ch()},aerodrome:{health:(e,t={})=>fy({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Rs(t,e),prepare:(e,t={})=>my(t,e),chains:()=>hy()},zerox:{health:e=>wy(e),price:(e,t={})=>kd(t,e),quote:(e,t={})=>ir(t,e),prepare:(e,t={})=>xy(t,e)},across:{health:e=>vd(e),suggestedFees:(e,t={})=>Ls(t,e)},hop:{health:e=>Ed(e),quote:(e,t={})=>Bs(t,e)},relay:{health:e=>Ad(e),quote:(e,t={})=>Si(t,e),prepare:(e,t={})=>Id(t,e)},cowswap:{health:e=>Ny(e),quote:(e,t={})=>An(t,e),prepareOrder:(e,t={})=>Py(t,e),order:(e,t={})=>Oy(t,e),status:(e,t={})=>Cy(t,e),chains:()=>Ry()},oneinch:{health:e=>Ly(e),quote:(e,t={})=>Ei(t,e),prepare:(e,t={})=>By(t,e),approveSpender:(e,t={})=>Od(t,e)},"hl-ws":{health:e=>My(e),allMids:e=>Fy(e),l2Book:(e,t={})=>Uy(t.coin,e),snapshot:(e,t={})=>Ai(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>qy({...e,assetId:t.assetId}),book:(e,t={})=>Dy(t.assetId||t.tokenId,e),snapshot:(e,t={})=>qs(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>zh(e),collection:(e,t={})=>Wo(t.slug,e),floor:(e,t={})=>Vh(t.slug,e),bestListings:(e,t={})=>Qa(t,e),bestListing:(e,t={})=>Ja(t,e),bestOffer:(e,t={})=>Za(t,e),accountNfts:(e,t={})=>Go(t,e),accountPnl:(e,t={})=>Xa(t,e),prepareBuy:(e,t={})=>au(t,e),prepareSweep:(e,t={})=>su(t,e),prepareMint:(e,t={})=>Xo(t,e),prepareList:(e,t={})=>Qo(t,e),prepareCancel:(e,t={})=>cu(t,e)},"anvil-nft":{health:(e,t={})=>Ab(t,e),markets:(e,t={})=>zr(t,e),quoteSpecificBuy:(e,t={})=>_i(t,e),quoteSell:(e,t={})=>js(t,e),scanCollection:(e,t={})=>zs(t,e),scanAllMarkets:(e,t={})=>yb(t,e),scanCrossVenueArb:(e,t={})=>Ud(t,e),scanAllMarketsArb:(e,t={})=>bb(t,e),prepareSpecificBuy:(e,t={})=>ub(t,e),prepareSell:(e,t={})=>db(t,e)},stonkbrokers:{health:(e,t={})=>Ib(t,e),quoteBrokerBuy:(e,t={})=>Vs(t,e),scanBrokerLoot:(e,t={})=>Sb(t,e),prepareBrokerBuy:(e,t={})=>kb(t,e),brokerDesk:(e,t={})=>Eb(t,e),clockInStatus:(e,t={})=>Ti(t,e),prepareClockIn:(e,t={})=>vb(t,e)},"hl-outcome":{list:e=>Cw(e),prepareOrder:(e,t={})=>Ow(t,e),prepareCancel:(e,t={})=>Rw(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:lc().map(e=>e.id),nativeTemplates:ji().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>lc(),listNative:()=>ji(),gate:(e,t={})=>Di(t.templateId||t.id,e),prepareDeploy:(e,t={})=>px(t,e),buildNative:(e,t={})=>zi(t),eval:async()=>(await Promise.resolve().then(()=>(AA(),EA))).runContractsEval()},"poly-clob":{health:()=>Ww(),prepareOrder:(e,t={})=>Gw(t||{},e)},"hl-perps":{health:e=>tp(e),assetInfo:(e,t={})=>wn(t,e),prepareOrder:(e,t={})=>Br(t,e),prepareCancel:(e,t={})=>fi(t,e),prepareLeverage:(e,t={})=>Yu(t,e),prepareIsolatedMargin:(e,t={})=>Xu(t,e),prepareBracket:(e,t={})=>Qu(t,e),prepareBuilderApproval:(e,t={})=>Ku(t,e)},"hl-markets":{health:e=>tp(e),markets:(e,t={})=>Qs(t,e),leaderboards:(e,t={})=>ow(t,e),coin:(e,t={})=>iw(t,e),spot:(e,t={})=>aw(t,e)},"hl-entry-state":{health:e=>_w(e),see:(e,t={})=>Bi(t,e),qualify:(e,t={})=>Tw(t,e),lock:(e,t={})=>Nw(t,e),list:e=>op(e),watch:(e,t={})=>Pw(t,e)},"magiceden-sol":{health:e=>zb(e),stats:(e,t={})=>Gd(t,e),listings:(e,t={})=>Wb(t,e),tokenListings:(e,t={})=>Gb(t,e),prepareBuy:(e,t={})=>Kb(t,e),prepareList:(e,t={})=>Ys(t,e),prepareMint:(e,t={})=>Yb(t,e)},"hl-staking":{health:e=>Qb(e),validators:e=>Xd(e),delegatorSummary:(e,t={})=>Qd(t,e),delegations:(e,t={})=>Jd(t,e),rewards:(e,t={})=>Jb(t,e),history:(e,t={})=>Zb(t,e),preflight:(e,t={})=>rw(t,e),prepareStakeDeposit:(e,t={})=>ew(t,e),prepareStakeWithdraw:(e,t={})=>tw(t,e),prepareDelegate:(e,t={})=>nw(t,e)},"hyperevm-dex":{health:e=>qb(e),search:(e,t={})=>Db(t.q||t.query||"HYPE",e),token:(e,t={})=>Hb(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>vx(e),networks:(e,t={})=>hp(t,e),pool:(e,t={})=>xx(t,e),token:(e,t={})=>Sx(t,e),ohlcv:(e,t={})=>kx(t,e)},curve:{health:e=>Bx(e),openapi:e=>Lx(e),pools:(e,t={})=>yp(t,e),quote:(e,t={})=>bp(t,e),prepare:(e,t={})=>Mx(t,e)},gmx:{health:e=>bw(e),tickers:(e,t={})=>to(t,e),markets:(e,t={})=>gw(t,e),marketsInfo:(e,t={})=>rp(t,e),tokens:(e,t={})=>yw(t,e),prepareOrder:(e,t={})=>kw(t,e),positions:(e,t={})=>ww(t,e),orderStatus:(e,t={})=>xw(t,e),verifyOrder:(e,t={})=>Sw(t,e)},morpho:{health:e=>Dx(e),markets:(e,t={})=>qx(t,e),vaults:(e,t={})=>Sp(t,e),prepareVault:(e,t={})=>Hx(t,e)},balancer:{health:e=>Xx(e),pools:(e,t={})=>Yx(t,e),quote:(e,t={})=>Ep(t,e),prepare:(e,t={})=>Qx(t,e)},pendle:{health:e=>Zx(e),markets:(e,t={})=>Ip(t,e),quote:(e,t={})=>eS(t,e),prepare:(e,t={})=>_p(t,e)},odos:{health:e=>oS(e),chains:e=>Np(e),quote:(e,t={})=>nS(t,e),prepare:(e,t={})=>rS(t,e)},blockscout:{health:e=>pS(e),stats:(e,t={})=>Op(t,e),address:(e,t={})=>cS(t,e),token:(e,t={})=>lS(t,e)},paraswap:{health:e=>qk(e),tokens:(e,t={})=>lm(t,e),price:(e,t={})=>Bn(t,e),quote:(e,t={})=>Bn(t,e),prepare:(e,t={})=>Uk(t,e)},rfq:{health:e=>rv(e),intent:(e,t={})=>tv(t,e),quote:(e,t={})=>nv(t,e)},"polygon-staking":{health:e=>Cv(e),validators:(e,t={})=>Nv(t,e),validatorDetail:(e,t={})=>Pv(t,e)},"aave-v3":{health:e=>Lv(e),markets:(e,t={})=>Ov(t,e),marketReserves:(e,t={})=>Rv(t,e),chains:e=>$v(e)},"babylon-staking":{health:e=>Mv(e),stats:e=>Fv(e),finalityProviders:e=>Uv(e),delegations:(e,t={})=>qv(t,e)},"bisq-markets":{health:e=>Hv(e),markets:e=>jv(e),ticker:(e,t={})=>zv(t,e),trades:(e,t={})=>Vv(t,e)},"bob-rootstock":{health:(e,t={})=>Gv(t.chainId,e),stats:(e,t={})=>Am(t,e),addressInfo:(e,t={})=>Kv(t,e),tokenBalances:(e,t={})=>Yv(t,e)},"braiins-insights":{health:e=>Xv(e),priceStats:e=>Qv(e),poolStats:e=>Jv(e)},"cow-protocol":{health:e=>aE(e),auction:e=>rE(e),openOrders:(e,t={})=>oE(t,e),recentTrades:(e,t={})=>iE(t,e)},"hiro-stacks":{health:e=>sE(e),networkInfo:e=>cE(e),stackingInfo:e=>lE(e),poxCycles:e=>uE(e),blocks:(e,t={})=>dE(t,e)},"jito-mev":{health:e=>fE(e),recentBundles:(e,t={})=>hE(t,e),tipFloor:e=>gE(e)},"kamino-strategies":{health:e=>bE(e),strategies:(e,t={})=>wE(t,e),strategyMetrics:(e,t={})=>xE(t,e)},"liquid-esplora":{health:e=>EE(e),tipHeight:e=>AE(e),addressInfo:(e,t={})=>IE(t,e),assetInfo:(e,t={})=>_E(t,e)},"magiceden-ordinals":{health:e=>PE(e),collectionStat:(e,t={})=>CE(t,e)},"mempool-lightning":{health:e=>RE(e),statistics:e=>$E(e),nodeRankings:(e,t={})=>LE(t,e),nodeCountries:e=>BE(e)},"mempool-mining":{health:e=>UE(e),difficulty:e=>qE(e),poolShare:(e,t={})=>DE(t,e),hashrate:(e,t={})=>HE(t,e),rewardStats:(e,t={})=>jE(t,e)},"meteora-dlmm":{health:e=>WE(e),pools:(e,t={})=>GE(t,e),poolSearch:(e,t={})=>KE(t,e)},"ordinals-runes":{health:e=>XE(e),blockHeight:e=>QE(e),blockInfo:(e,t={})=>JE(t,e),satInfo:(e,t={})=>ZE(t,e),runeInfo:(e,t={})=>eA(t,e)},"pyth-price-feeds":{health:e=>rA(e),latestPrice:(e,t={})=>oA(t,e),latestPrices:(e,t={})=>iA(t,e),feedDirectory:e=>aA(e)},"relayscan-mev":{health:e=>dA(e),overview:(e,t={})=>Hm(t,e),builderProfit:(e,t={})=>lA(t,e),dailyStats:(e,t={})=>uA(t,e)},"sanctum-lst":{health:e=>mA(e),lstList:e=>zm(e),apyAll:e=>fA(e),apyIndividual:(e,t={})=>hA(t,e)},"solend-lending":{health:e=>wA(e),markets:e=>Wm(e),reserves:(e,t={})=>xA(t,e)},"execution-strategies":{health:()=>kA(),plan:(e,t={})=>SA(t)},"across-bridge":{health:e=>ov(e),pools:(e,t={})=>iv(t,e),suggestedFees:(e,t={})=>av(t,e)},"beefy-yields":{health:e=>sv(e),apy:(e,t={})=>cv(t,e),apyBreakdown:e=>lv(e)},"birdeye-tokens":{health:e=>dv(e),tokenList:(e,t={})=>pv(t,e)},"celestia-da":{health:e=>mv(e),stats:e=>fv(e),blockStats:(e,t={})=>hv(t,e)},"das-assets":{health:e=>gv(e),assetsByOwner:(e,t={})=>yv(t,e),searchAssets:(e,t={})=>bv(t,e),assetProof:(e,t={})=>wv(t,e)},"l2beat-tvl":{health:e=>xv(e),tvl:(e,t={})=>Sv(t,e),activity:(e,t={})=>kv(t,e)},"spark-lend":{health:e=>vv(e),markets:(e,t={})=>Ev(t,e)},"symbiotic-restaking":{health:e=>Av(e),vaults:(e,t={})=>Iv(t,e),vaultDetail:(e,t={})=>_v(t,e)}},IA=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),NA=new Set(["hl-exec"]);function YU(e){return NA.has(String(e||""))}function XU(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(NA.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ri().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!IA.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(IA.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let a=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(a))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${a||"<missing>"}`)}}async function I(e,t,n={},r={}){if(YU(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.`);XU(e,t,n);let o=rs(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=KU[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function PA({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||ri().map(d=>d.id);!o&&!e&&(s=s.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof a=="function"?a:(d,p,m)=>I(d,"health",p,m),u={};return await Ve(s,i??8,async d=>{if(!rs(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await Ie(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function CA(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function QU(e){return e.execution==="prepare"&&CA(e).length?"armed-local":e.execution||"read-only"}function OA(){return ri().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:QU(e),localSignerSurfaces:CA(e),description:e.description}))}var JU={catalog:OA,health:PA,call:I,hl:{health:e=>I("hl-info","health",{},e),allMids:e=>I("hl-info","allMids",{},e),l2Book:(e,t)=>I("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>I("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>I("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>I("hl-info","userFills",{user:e},t),meta:e=>I("hl-info","meta",{},e),metaAndAssetCtxs:e=>I("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>I("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>I("hl-info","openOrders",{user:e},t),userState:(e,t)=>I("hl-info","userState",{user:e},t),spotMeta:e=>I("hl-info","spotMeta",{},e),vaults:{health:e=>I("hl-vaults","health",{},e),summaries:(e,t)=>I("hl-vaults","summaries",e||{},t),details:(e,t)=>I("hl-vaults","details",e||{},t),mine:(e,t)=>I("hl-vaults","userEquities",{user:e},t),track:(e,t)=>I("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>I("hl-entry-state","see",e||{},t),qualify:(e,t)=>I("hl-entry-state","qualify",e||{},t),lock:(e,t)=>I("hl-entry-state","lock",e||{},t),list:e=>I("hl-entry-state","list",{},e),watch:(e,t)=>I("hl-entry-state","watch",e||{},t)},staking:{health:e=>I("hl-staking","health",{},e),validators:e=>I("hl-staking","validators",{},e),summary:(e,t)=>I("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>I("hl-staking","delegations",{user:e},t),rewards:(e,t)=>I("hl-staking","rewards",{user:e},t),history:(e,t)=>I("hl-staking","history",{user:e},t),preflight:(e,t)=>I("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>I("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>I("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>I("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>I("poly-public","health",{},e),time:e=>I("poly-public","time",{},e),markets:(e,t)=>I("poly-public","markets",e||{},t),book:(e,t)=>I("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>I("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>I("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>I("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>I("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>I("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>I("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>I("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>I("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>I("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>I("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>I("evm-token-sniper","health",{},e),scan:(e,t)=>I("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>I("portfolio","balances",e||{},t),snapshot:(e,t)=>I("portfolio","snapshot",e||{},t),history:(e,t)=>I("portfolio","history",e||{},t),valueGraph:(e,t)=>I("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>I("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>I("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>I("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>I("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>I("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>I("opensea-nft","floor",{slug:e},t),collection:(e,t)=>I("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>I("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>I("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>I("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>I("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>I("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>I("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>I("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>I("universal-mint-router","health",{},e),capabilities:e=>I("universal-mint-router","capabilities",{},e),prepare:(e,t)=>I("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>I("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>I("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>I("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>I("solana-rpc","health",{},e),latestBlockhash:(e,t)=>I("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>I("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>I("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>I("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>I("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>I("jupiter","prepare",e||{},t),nftStats:(e,t)=>I("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>I("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>I("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>I("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>I("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>I("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>I("bitcoin-esplora","health",{},e),tipHeight:e=>I("bitcoin-esplora","tipHeight",{},e),fees:e=>I("bitcoin-esplora","fees",{},e),address:(e,t)=>I("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>I("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>I("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>I("bitcoin-esplora","decode",e||{},t),metaHealth:e=>I("bitcoin-meta","health",{},e),runeBalances:(e,t)=>I("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>I("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>I("satflow","health",{},e),satflowFloors:(e,t)=>I("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>I("satflow","walletContents",{address:e},t)},prices:{health:e=>I("defillama","health",{},e),current:(e,t)=>I("defillama","prices",{coins:e},t),bySymbol:(e,t)=>I("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>I("defillama","protocols",{},e)},lifi:{health:e=>I("lifi","health",{},e),quote:(e,t)=>I("lifi","quote",e||{},t),chains:e=>I("lifi","chains",{},e)},dex:{health:e=>I("dexscreener","health",{},e),token:(e,t)=>I("dexscreener","token",{address:e},t),search:(e,t)=>I("dexscreener","search",{q:e},t),pair:(e,t,n)=>I("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>I("uniswap-v3","health",e||{},t),quote:(e,t)=>I("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>I("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>I("uniswap-v3","ethUsdc",e||{},t),chains:e=>I("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>I("uniswap-v4","health",e||{},t),quote:(e,t)=>I("uniswap-v4","quote",e||{},t),chains:e=>I("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>I("across","suggestedFees",e||{},t),hop:(e,t)=>I("hop","quote",e||{},t),relay:(e,t)=>I("relay","quote",e||{},t)},cow:{quote:(e,t)=>I("cowswap","quote",e||{},t)},hlWs:{allMids:e=>I("hl-ws","allMids",{},e),l2Book:(e,t)=>I("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>I("poly-ws","book",{assetId:e},t)}};ql();var Ct=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),$A={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"},ya=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function RA(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:a=0,estimatedGas:s=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Ct.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=ya(n);if(p==null||p<=0n)return{source:t,quality:Ct.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?Ct.NO_GAS:Ct.FULL,amountOut:p.toString(),minOut:ya(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:s==null?null:String(s),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function LA(e,t,{divisor:n=1000n}={}){let r=ya(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,a;try{[i,a]=await Promise.all([e(o),e(r)])}catch{return null}let s=ya(i),c=ya(a);if(s==null||c==null||s<=0n)return null;let l=Number(s)/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:s.toString(),fullAmountOut:c.toString()}}function BA(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(s=>{let c=t?.[s.source];return c?c.impactPct>n?(r.push({source:s.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(s.source),!0)}),a=[...e.warnings??[]];return r.length&&a.push(`dropped ${r.length} route(s) on price impact: `+r.map(s=>`${s.source} (${s.impactPct}%)`).join(", ")),o.length&&a.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:a}}function Qm(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:a=null}={}){let s=e.filter(E=>E.quality!==Ct.FAILED),c=e.filter(E=>E.quality===Ct.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(a),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=s.map(E=>{let A=BigInt(E.amountOut),v=0n,N=!1,B=!1,te=BigInt(E.oracleFeeBps??0),Z=te>0n?A*te/10000n:0n;if(l){let U=E.gasUsd,J=Number(E.meta?.gasUnits??E.estimatedGas);if(U==null&&p&&Number.isFinite(J)&&J>0){let pe=J*u/1e18*d;Number.isFinite(pe)&&pe>=0&&(U=pe,B=!0)}let ke=(U??0)+(E.feeUsd??0);if(ke>0){let pe=ke/t*10**n;Number.isFinite(pe)&&pe>=0&&(v=BigInt(Math.floor(pe)),N=!0)}else U===0&&(N=!0)}let $=v+Z,H=A>$?A-$:0n;return{...E,grossOut:A.toString(),netOut:H.toString(),costInDest:v.toString(),oracleFeeInDest:Z.toString(),costAccounted:N,gasEstimated:B}}),f=Number(o)>0?Number(o):0,h=m.reduce((E,A)=>BigInt(A.netOut)>E?BigInt(A.netOut):E,0n),g=E=>h>0n?Number((h-BigInt(E))*10000n/h):0,w=[],x=m.slice().sort((E,A)=>BigInt(A.netOut)>BigInt(E.netOut)?1:-1)[0]??null;m.sort((E,A)=>{let v=g(E.netOut)<=f?0:1,N=g(A.netOut)<=f?0:1;if(r&&f>0&&v!==N)return v-N;if(r&&f>0){let B=E.liquidityUsd??-1,te=A.liquidityUsd??-1;if(B!==te)return te-B}return BigInt(A.netOut)>BigInt(E.netOut)?1:-1}),r&&f>0&&x&&m[0]&&m[0].source!==x.source&&w.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${x.source} within ${f} bps`);let y=m.filter(E=>!E.costAccounted).map(E=>E.source);l?y.length&&w.push(`gas not reported by: ${y.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let b=m[0];if(l&&b&&b.costAccounted===!1){let E=m.find(A=>A.costAccounted&&g(A.netOut)<=f);E&&w.push(`winner ${b.source} has UNMEASURED gas; gas-measured ${E.source} is within ${f} bps and may net more once ${b.source}'s real gas is paid \u2014 prefer it if unsure.`)}let S=m.filter(E=>E.gasEstimated).map(E=>E.source);S.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${S.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let _=null,T=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let E=BigInt(m[0].netOut),A=BigInt(m[1].netOut);A>0n&&(_=Number((E-A)*10000n/A),T=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:_,spreadBasis:T,rankedOn:l?"net-of-cost":"gross",warnings:w}}async function Wc(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((a,s)=>setTimeout(()=>s(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let a=e[i].source;return o.status==="rejected"?RA({source:a,error:String(o.reason?.message||o.reason)}):RA({source:a,...o.value})})}var Vt=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Gc(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Vt(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function FA(e,t={}){let n=$A[Number(e)];if(!n)return null;try{let r=await At([n],t);return Vt(r?.coins?.[n]?.price)}catch{return null}}var Fn=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),MA=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"]});async function ZU(e={}){try{let t=await Ps({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function eq(e,t={}){let n=Fn(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...MA[n]||[n]),r.push(...MA[Fn(e)]||[e]),r}function tq(e,t,n={}){let r=Array.isArray(e)?e:[],o=eq(t,n).map(Fn).filter(Boolean);for(let i of o){let a=r.find(c=>Fn(c?.slug)===i||Fn(c?.name)===i),s=Vt(a?.tvl);if(s!=null)return{liquidityUsd:s,protocol:a?.name??a?.slug??i}}for(let i of o){let a=r.find(c=>{let l=Fn(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:Fn(c?.slug).includes(i)||Fn(c?.name).includes(i)}),s=Vt(a?.tvl);if(s!=null)return{liquidityUsd:s,protocol:a?.name??a?.slug??i}}return null}function Jm({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:a,decimalsOut:s,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await vn({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:Gc(m?.gasCosts),feeUsd:Gc(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),a!=null&&d.push({source:"paraswap",run:async()=>{let p=s??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await Bn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:Vt(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await ir({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Ei({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await An({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),De[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await pn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),ct[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await _r({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function UA({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:a={}}){let s=[],c=null,l=async(u,d={})=>(c||=ZU(a),tq(await c,u,d));return s.push({source:"lifi",run:async()=>{let u=await vn({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},a),d=u?.estimate??u?.[0]?.estimate,p={tool:u?.tool??u?.toolDetails?.name,durationSeconds:Vt(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Gc(d?.gasCosts),feeUsd:Gc(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol,oracleFee:u?.oracleFee??null}}}}),s.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(Fs(),Ms)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},a))?.details,m={durationSeconds:Vt(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Vt(p?.totalImpact?.usd)!=null?Math.abs(Vt(p.totalImpact.usd)):null,liquidityUsd:f?.liquidityUsd??null,meta:{...m,liquidityProtocol:f?.protocol}}}}),s.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(Fs(),Ms)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},a),p=d?.totalRelayFee?.total,m=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(m=h.toString())}catch{}let f=await l("across");return{amountOut:m,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Vt(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),s}ui();ge();var nq={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function qA(e,t,n){let r=nq[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await At([o],n))?.coins?.[o],s=Number(a?.price),c=Number(a?.decimals);return{priceUsd:Number.isFinite(s)?s:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function rq(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 a=FA(n,t),s=qA(n,o,t),c=Vl(n,t).catch(()=>null),l=Jm({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([Wc(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=Qm(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,x=await LA(async y=>{let b=Jm({...e,amountIn:y.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(_=>_.source===g);return b.length?(await Wc(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(x){let y=BA(f,{[g]:x},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...y,sourcesTried:l.length,sourcesAnswered:u.filter(b=>b.quality!==Ct.FAILED).length,note:Zm(y,l.length),priceImpact:{[g]:Number(x.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!==Ct.FAILED).length,note:Zm(f,l.length)}}async function oq(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:a}=e;if(n==null||r==null||!o||!i||a==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 s=qA(r,i,t),c=UA({...e,opts:t}),[l,u]=await Promise.all([Wc(c,{timeoutMs:t.timeoutMs??15e3}),s]),d=Qm(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(a),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Ct.FAILED).length,note:Zm(d,c.length)}}function iq(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${L0(t)}`:""}function Zm(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=iq(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 a=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${a} 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 Yz=Object.freeze({mantissa:10000n,scale:0});function Sr(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Wt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return Sr(t),Object.freeze({mantissa:e,scale:t})}function Un(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);Sr(e.scale)}function Kc(e){return Sr(e),10n**BigInt(e)}function Q(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,a=BigInt(i)*(t?-1n:1n);return Wt(a,o.length)}function Ye(e,t){if(Sr(t),typeof e=="bigint")return Wt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Wt(BigInt(e),t)}function Ot(e){Un(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function ba(e,t){return Un(e),Sr(t),t===e.scale?Wt(e.mantissa,e.scale):t>e.scale?Wt(e.mantissa*Kc(t-e.scale),t):Wt(e.mantissa/Kc(e.scale-t),t)}function ef(e,t){Un(e,"left"),Un(t,"right");let n=Math.max(e.scale,t.scale);return[ba(e,n),ba(t,n),n]}function qn(e,t){let[n,r,o]=ef(e,t);return Wt(n.mantissa+r.mantissa,o)}function wa(e,t){let[n,r,o]=ef(e,t);return Wt(n.mantissa-r.mantissa,o)}function at(e,t){Un(e,"left"),Un(t,"right");let n=e.scale+t.scale;return Sr(n),Wt(e.mantissa*t.mantissa,n)}function Rt(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(Un(e,"left"),Un(t,"right"),Sr(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Kc(t.scale+n),o=t.mantissa*Kc(e.scale);return Wt(r/o,n)}function Dn(e,t){let[n,r]=ef(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}oc();import{readFileSync as aq,existsSync as sq}from"node:fs";import{fileURLToPath as cq}from"node:url";import{dirname as lq,join as HA}from"node:path";var uq=HA(lq(cq(import.meta.url)),"fixtures");function dq(){try{let e=so("equities-fixtures",import.meta.url);if(e&&sq(e))return e}catch{}return uq}var pq=dq();var jA=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});function mq(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function oe(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function Ae(e,t,n){mq(e)||oe(t,`${n} must be an object`)}function se(e,t,n){(typeof e!="string"||e.length===0)&&oe(t,`${n} must be a nonempty string`)}function Gt(e,t,n){Number.isSafeInteger(e)||oe(t,`${n} must be a safe integer`)}function Hn(e,t,n){Ae(e,t,n);for(let[r,o]of Object.entries(e))se(r,t,`${n} key`),Ae(o,t,`${n}.${r}`)}function fq(e,t){Ae(e,t,"root"),Gt(e.capturedAt,t,"capturedAt"),Ae(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];Ae(i,t,`venues.${r}`),se(i.type,t,`venues.${r}.type`),se(i.chain,t,`venues.${r}.chain`),se(i.tier,t,`venues.${r}.tier`),Hn(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))Hn(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function hq(e,t){Hn(e,t,"root"),Object.keys(e).length===0&&oe(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||oe(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>se(o,t,`${n}.venues[${i}]`))}function gq(e,t){Ae(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Gt(e[n],t,n);se(e.usdg,t,"usdg"),Hn(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))se(r.oracle,t,`assets.${n}.oracle`),se(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&oe(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&oe(t,`assets.${n}.usd must be a nonnegative finite source number`)}function yq(e,t){Ae(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||oe(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&oe(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Gt(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>se(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&oe(t,`dates[${o}] must use YYYY-MM-DD`)})}function bq(e,t){Ae(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&oe(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{Ae(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Gt(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&oe(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&oe(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function wq(e,t){Hn(e,t,"root"),Object.keys(e).length===0&&oe(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])se(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&oe(t,`${n}.liq must be a nonnegative finite source number`)}}function xq(e,t){Ae(e,t,"root"),Gt(e.capturedAt,t,"capturedAt"),Gt(e.block,t,"block"),Gt(e.chainId,t,"chainId"),se(e.gasPriceWei,t,"gasPriceWei"),se(e.stateView,t,"stateView"),Hn(e.pools,t,"pools"),Object.keys(e.pools).length===0&&oe(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])se(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&oe(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&oe(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&oe(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function Sq(e,t){Ae(e,t,"root"),Gt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),Ae(e.books,t,"books"),Object.keys(e.books).length===0&&oe(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){Ae(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&oe(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())Ae(i,t,`books.${n}.bids[${o}]`),se(i.px,t,`books.${n}.bids[${o}].px`),se(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())Ae(i,t,`books.${n}.asks[${o}]`),se(i.px,t,`books.${n}.asks[${o}].px`),se(i.sz,t,`books.${n}.asks[${o}].sz`)}}function kq(e,t){Ae(e,t,"root"),Gt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),se(e.chain,t,"chain"),Hn(e.tokens,t,"tokens"),Ae(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&oe(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){se(r.symbolRaw,t,`tokens.${n}.symbolRaw`),se(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||oe(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&oe(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ae(i,t,`pairs.${n}[${o}]`),se(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),se(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&oe(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&oe(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function vq(e,t){Ae(e,t,"root"),Gt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),se(e.chain,t,"chain"),e.chain!=="ton"&&oe(t,'chain must be "ton"'),Hn(e.tokens,t,"tokens"),Ae(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&oe(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){se(r.symbolRaw,t,`tokens.${n}.symbolRaw`),se(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||oe(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&oe(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ae(i,t,`pairs.${n}[${o}]`),se(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),se(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&oe(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&oe(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}var Eq=Object.freeze({venues:fq,universe:hq,oracles:gq,nyseHolidays:yq,dstTransitions:bq,equityDexPools:wq,rhPoolState:xq,solanaXstocks:kq,tonXstocks:vq,hip3L2Books:Sq});function Aq(e,t){let n=jA[t],r=HA(e,n),o;try{o=aq(r,"utf8")}catch(a){throw a?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${a.message}`)}let i;try{i=JSON.parse(o)}catch(a){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${a.message}`)}return Eq[t](i,n),i}function zA(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zA(t)}return e}function VA({fixtureDir:e=pq}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(jA))t[n]=Aq(e,n);return zA(t)}var DA;function jn(){return DA??=VA(),DA}function bt(){return jn().venues}function WA(){return jn().oracles}function GA(){return jn().nyseHolidays}function KA(){return jn().dstTransitions}function Yc(){return jn().rhPoolState}function YA(){return jn().solanaXstocks}function XA(){return jn().tonXstocks}function QA(){return jn().hip3L2Books}var nf=1e3,eI=60*nf,rf=60*eI,JA=24*rf,Iq=-5*rf,_q=-4*rf,tI=240,nI=570,rI=960,oI=1200,rV=Object.freeze([tI,nI,rI,oI]),oV=Object.freeze(["core","extended","dark"]),ZA,tf;function Tq(){let e=KA().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*nf,endMs:r.endUtc*nf}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function iI(){return ZA??=Tq(),ZA}function Nq(){return tf===void 0&&(tf=new Set(GA().holidayDayIndex)),tf}function aI(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function Pq(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=iI();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function Cq(e){for(let t of iI().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function Oq(e){return Cq(e)?_q:Iq}function Rq(e){let t=e+Oq(e),n=Math.floor(t/JA),r=t-n*JA,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/eI),msIntoDay:r,weekday:o.getUTCDay()}}function $q({dayIndex:e,weekday:t}){return t===0||t===6?!1:!Nq().has(e)}function Lq(e){return e<tI?"dark":e<nI?"extended":e<rI?"core":e<oI?"extended":"dark"}function xa(e){aI(e,"sessionState"),Pq(e,"sessionState");let t=Rq(e);return $q(t)?Lq(t.minuteOfDay):"dark"}function of(e){return aI(e,"isDark"),xa(e)==="dark"}var Xc=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),Bq=12e4,Mq=6e5;function Qc(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function Fq(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function Uq(e){return!e.bid||!e.ask?!1:Dn(e.bid,e.ask)>0}function sI(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Jc(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??Bq,o=t.oracleFreshnessMs??Mq,i=t.includeDormant===!0,a=[],s=[];for(let c of e){if(Fq(c)){i?a.push(Object.freeze({...c,staleData:!0})):Qc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Xc.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(Uq(c)){Qc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Xc.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(sI(c,n,r)){Qc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Xc.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let l=xa(n),u=l==="core"?o:o*2;if(sI(c,n,u)){Qc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Xc.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}a.push(c)}return{survivors:a,excluded:s}}function qq(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),a=i?n.slice(1):n,[s,c=""]=a.split("."),l=`${s}${c}`,u=s.length+o,d;return u<=0?d=`0.${"0".repeat(-u)}${l}`:u>=l.length?d=`${l}${"0".repeat(u-l.length)}`:d=`${l.slice(0,u)}.${l.slice(u)}`,`${i?"-":""}${d}`}function Re(e){return e==null?null:typeof e=="string"?Q(e):typeof e!="number"||!Number.isFinite(e)?null:Q(qq(e))}function $t(e,t){let n=Re(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var Dq=new Set(["spot","perp"]),Hq=new Set(["read-only","quote-only","prepare","intent"]),jq=new Set(["buy","sell"]),zq=new Set(["net-of-cost","gross"]),Vq=new Set(["homogeneous","heterogeneous"]),Wq=["bid","ask","mid","mark"],cI=["fees","gasEstimate","priceImpact","fundingHourly"],Gq=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function fe(e,t){throw new TypeError(`${e} ${t}`)}function uI(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function kr(e,t){uI(e)||fe(t,"must be an object")}function dI(e,t,n){Object.hasOwn(e,t)||fe(`${n}.${t}`,"is required")}function Eo(e,t){(typeof e!="string"||e.length===0)&&fe(t,"must be a nonempty string")}function Sa(e,t,n){t.has(e)||fe(n,`must be one of ${[...t].join(", ")}`)}function sf(e,t){(!Number.isSafeInteger(e)||e<0)&&fe(t,"must be a nonnegative safe integer")}function af(e,t,n=!1){e===null&&n||(uI(e)||fe(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&fe(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&fe(`${t}.scale`,"must be a nonnegative safe integer"))}function Zc(e,t,n=!1){e===null&&n||kr(e,t)}function lI(e,t){kr(e,t),Eo(e.venue,`${t}.venue`),Eo(e.reason,`${t}.reason`),Gq.test(e.reason)||fe(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&Eo(e.symbol,`${t}.symbol`)}function st(e){kr(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...cI,"costAccounted","capturedAt","blockOrSeq","raw"])dI(e,n,"quote");Eo(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&fe("quote.chain","must be a nonempty string or nonnegative chain id"),Sa(e.instrument,Dq,"quote.instrument"),Sa(e.tier,Hq,"quote.tier"),Eo(e.symbolRaw,"quote.symbolRaw"),Eo(e.symbol,"quote.symbol"),Sa(e.side,jq,"quote.side"),af(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&fe("quote.requestedSize","must not be negative");let t=0;for(let n of Wq)Object.hasOwn(e,n)&&(af(e[n],`quote.${n}`),t+=1);t===0&&fe("quote","must contain at least one of bid, ask, mid, mark");for(let n of cI)af(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&fe("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&fe(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&fe("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&fe("quote.fundingHourly","must be null for a spot quote"),sf(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&fe("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),kr(e.raw,"quote.raw"),e}function cf(e){kr(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])dI(e,t,"rankResult");return Sa(e.rankedOn,zq,"rankResult.rankedOn"),Array.isArray(e.ranked)||fe("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>Zc(t,`rankResult.ranked[${n}]`)),Zc(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&fe("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&fe("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||fe("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>Zc(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&fe("rankResult.improvementBps","must be a finite number or null"),sf(e.sourcesAnswered,"rankResult.sourcesAnswered"),sf(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&fe("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||fe("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>lI(t,`failed[${n}]`)),Array.isArray(e.excluded)||fe("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>lI(t,`excluded[${n}]`)),e.darkWindow!==null&&kr(e.darkWindow,"rankResult.darkWindow"),Sa(e.instrumentMix,Vq,"rankResult.instrumentMix"),Zc(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&kr(e.carry,"rankResult.carry"),e}var Kq="arcus_perp",Yq="robinhood-4663",Xq="quote-only",el="0.00000480324074074";function pI(){return bt().venues.arcus}function Qq(){return Object.keys(pI().markets).sort()}function Jq({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=pI().markets[r];if(!o)return null;let i=$t(o.mark,`${r}.mark`),a=Re(o.oracle),s=Re(o.fundingHourly),c=n===null?Q("0"):n,l={venue:Kq,chain:Yq,instrument:"perp",tier:Xq,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:s,costAccounted:!1,capturedAt:bt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:el,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return a!==null&&(l.raw.oracleFixed=a),st(l)}function tl({side:e="buy",sizeUsd:t=null}={}){return Qq().map(n=>Jq({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var mI=36e5,SV=24*365;function lf(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return Q("0");let r=Q(String(t)),o=Ye(10000n,0);return at(at(e,r),o)}function fI(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:Q("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let s=Zq(r,t),c=t-s,l=Q(el),u=lf(i,c),d=lf(l,s),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Ot(m),confidence:"estimate",darkHours:s,litHours:c,darkWindowRate:el,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let a=lf(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:a,carryBpsDisplay:Ot(a),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function Zq(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)of(e+o*mI)&&(n+=1);return t>r&&of(e+r*mI)&&(n+=t-r),n}function e6(e){return e.mid??e.mark??e.ask??e.bid??null}function t6(e){let t=e6(e);if(t===null)return null;let n=e.costAccounted===!0,r=Q("0");e.fees!==null?r=qn(r,e.fees):n=!1,e.priceImpact!==null?r=qn(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=qn(r,e.gasEstimate);let o;if(e.fees!==null&&Dn(e.fees,Q("1"))<0&&Dn(e.fees,Q("0"))>=0){let i=qn(Q("1"),e.fees);o=at(t,i),e.priceImpact!==null&&(o=qn(o,at(t,e.priceImpact)))}else o=qn(t,r);return{net:o,costAccounted:n,px:t}}function n6(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function r6(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=wa(t.net,e.net);return Rt(at(n,Ye(10000n,0)),t.net,4)}function uf(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let T=Jc(e,{nowMs:n});o=T.survivors,i=T.excluded}let a=e.length,s=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let T of o){let E=t6(T);if(E===null)continue;let A=null;if(l&&T.instrument==="perp"&&(A=fI(T,c,{nowMs:n}),A.carryBps!==null)){let v=qn(Q("1"),Rt(A.carryBps,Ye(10000n,0),12));E.net=at(E.net,v),E.costAccounted=!1}u.push(n6(T,E,A))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let T=u.filter(A=>A.instrument==="spot"),E=u.filter(A=>A.instrument==="perp");T.length>0&&E.length>0?(d=T.length>=E.length?T:E,p="homogeneous"):(d=u,p="homogeneous")}d.sort((T,E)=>{let A=Dn(T.net,E.net);return A!==0?A:T.venue<E.venue?-1:T.venue>E.venue?1:0});let m=d[0]??null,f=d.slice(1),h=d,g="gross";m&&m.costAccounted&&(f.length===0||f[0].costAccounted)&&(g="net-of-cost");let w=f.length===0?null:r6(m,f[0]),x=u.find(T=>T.tier==="prepare")??null,y=xa(n),b=y==="core"?null:{session:y,warning:y==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},S=null;l&&(S=o6(u));let _={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:w===null?null:Number(Ot(w)),sourcesAnswered:a,sourcesTried:r,failed:s,excluded:i,darkWindow:b,instrumentMix:p,bestPreparable:x,carry:m?.carry??null,breakEvenHorizonHours:S};return cf(_)}function o6(e){let t=e.filter(i=>i.instrument==="spot").sort((i,a)=>Dn(i.net,a.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,a)=>Dn(i.net,a.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=wa(t.net,n.net);if(r.mantissa===0n)return 0;let o=at(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=Rt(r,o,4),a=Number(Ot(i));return!Number.isFinite(a)||a<0?null:a}catch{return null}}var i6="rh_uniswap",a6=4663,s6="prepare",c6=1n<<192n,Ao=18,l6=Object.freeze({v3:180000n,v4:240000n});function df(){return Yc()}function u6(e){return{mantissa:e*e*10n**BigInt(Ao)/c6,scale:Ao}}function d6(e){let t=u6(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=Rt(at(t,Ye(10n**BigInt(n),0)),Ye(10n**BigInt(r),0),Ao);return o.mantissa===0n?null:Rt(Q("1"),o,Ao)}return Rt(at(t,Ye(10n**BigInt(r),0)),Ye(10n**BigInt(n),0),Ao)}function p6(e){let t=WA(),n=t.assets[e];return n?Ye(n.rawPrice,t.oracleScaleExp):null}function m6(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return Rt(t,f6(n,t),Ao)}function f6(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:ba(e,n).mantissa+ba(t,n).mantissa,scale:n}}function h6(e){let t=df(),n=l6[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function pf(){return Object.keys(df().pools).sort()}function Io({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=df(),o=r.pools[e];if(!o)return null;let i=d6(o);if(i===null)return null;let a=Re(o.liqUsd),s=n===null?Q("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:Rt(Ye(BigInt(o.feePpm),0),Ye(1000000n,0),8),l=s.mantissa===0n?Q("0"):m6(a,s),u=h6(o.version),m={venue:i6,chain:a6,instrument:"spot",tier:s6,symbolRaw:e,symbol:e,side:t,requestedSize:s,mid:i,fees:c,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:u===null?null:u.wei.toString(),gasUnits:u===null?null:u.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},f=p6(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Ot(Rt(at(wa(i,f),Ye(10000n,0)),f,4))),st(m)}function hI({side:e="buy",sizeUsd:t=null}={}){return pf().map(n=>Io({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var gI=12e4,g6="0x0000000000000000000000000000000000000000",y6="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function mf(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let a=Io({symbol:t,side:n,sizeUsd:r});if(a===null)throw new Error(`no RH Uniswap pool for ${t}`);if(a.tier!=="prepare")throw new Error(`route tier is ${a.tier}, only prepare tier can be prepared`);let s=i-a.capturedAt;if(s>gI)throw new Error(`quote is stale (${s}ms old, bound ${gI}ms); re-quote before preparing`);let l=Yc().pools[t],u=l.version==="v4"?y6:g6,d=u,p=n==="buy"?l.quoteAddr:l.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:u,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:a.venue,symbol:a.symbol,symbolRaw:a.symbolRaw,capturedAt:a.capturedAt,blockOrSeq:a.blockOrSeq,mid:a.mid,version:l.version,pair:l.pair},quoteAgeMs:s,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",l.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var b6="hyperliquid_hip3",w6="hyperliquid",x6="quote-only";function ka(){return bt().venues.hyperliquid_hip3}function yI(){return Object.keys(ka().dexs).sort()}function S6(){let e=[];for(let[t,n]of Object.entries(ka().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function k6(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=ka().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(ka().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function v6(e,t){try{return QA().books[`${e}:${t}`]??null}catch{return null}}function E6(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Ot(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,a=0,s=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,a+=m,o-=p,s+=1,o<=1e-9)break}return a<=0?null:{vwap:i/a,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:s}}function A6(e,t,n,r){let o=E6(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Ot(r));if(!(i>0))return{impact:null,depth:o};let a=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,s=Math.max(0,a);return{impact:Re(Number(s.toPrecision(12))),depth:{...o,impactFraction:s,fullyFilled:o.unfilledUsd<=1e-6}}}function bI({dex:e,ticker:t,market:n,side:r,size:o}){let i=$t(n.mark,`${e}:${t}.mark`),a=Re(n.fundingHourly),s=Re(n.vol24h),c=Re(n.oi),l=o===null?Q("0"):o,u=v6(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=A6(u,r,l,i);d=g.impact,p=g.depth,p?.fullyFilled?m="impact measured from l2Book; fees and gas still not captured":m="book walked but size exceeds visible depth; fees and gas not captured"}else m="no order book depth wired for this coin; fees and gas not captured";else u?m="zero size; fees and gas not captured":m="no order book depth wired for this coin; fees and gas not captured";let h={venue:b6,chain:w6,instrument:"perp",tier:x6,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:a,costAccounted:!1,capturedAt:bt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:m,hasL2Book:u!==null,l2BookFixture:u?"fixtures/hip3_l2books.json":null,depth:p}};return s!==null&&(h.raw.vol24hFixed=s),c!==null&&(h.raw.oiFixed=c),u?.bids?.[0]&&u?.asks?.[0]&&(h.bid=Q(String(u.bids[0].px)),h.ask=Q(String(u.asks[0].px))),st(h)}function wI({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=k6(e);return r.length===0||r.length>1?null:bI({...r[0],side:t,size:n})}function nl({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of S6()){let[i,a]=o.split(":");if(n!==null&&a!==n)continue;let s=ka().dexs[i][a];r.push(bI({dex:i,ticker:a,market:s,side:e,size:t}))}return r}var I6="arcus_spot",_6="robinhood-4663",T6="quote-only";function xI(){return bt().venues.arcus_spot}function N6(){return Object.keys(xI().pairs).sort()}function P6({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=xI().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:$t(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:$t(r.ask,`${e}.ask`),a=Re(r.last),s=null;if(o!==null&&i!==null){s={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);s={mantissa:p+m,scale:d+1},s={mantissa:(p+m)/2n,scale:d}}else a!==null&&(s=a);if(o===null&&i===null&&s===null)return null;let c=n===null?Q("0"):n,l=Q("0"),u={venue:I6,chain:_6,instrument:"spot",tier:T6,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:bt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(u.bid=o),i!==null&&(u.ask=i),s!==null&&(u.mid=s),st(u)}function rl({side:e="buy",sizeUsd:t=null}={}){return N6().map(n=>P6({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var C6="solana_xstocks",O6="solana",R6="quote-only",SI=25e3;function ol(){return YA()}function ff(){return Object.keys(ol().tokens).sort()}function $6(e){let t=ol().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function L6(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Q("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,a=r+o;return{mantissa:i/a,scale:6}}function hf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=ol().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else return null;let a=i[r],s=$6(r);if(!a||!s)return null;let c=$t(s.priceUsd,`${r}.priceUsd`),l=Re(s.liquidityUsd),u=n===null?Q("0"):n,d=u.mantissa===0n?Q("0"):L6(l,u),p=!1;u.mantissa===0n&&(s.liquidityUsd??0)>=SI&&(p=!1);let m={venue:C6,chain:O6,instrument:"spot",tier:R6,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:ol().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:a.mint,pairAddress:s.pairAddress,dexId:s.dexId,quote:s.quote,liquidityUsd:s.liquidityUsd,volume24h:s.volume24h,priceUsd:s.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(s.liquidityUsd??0)<SI}};return st(m)}function kI({side:e="buy",sizeUsd:t=null}={}){return ff().map(n=>hf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var B6="ton_stonfi",M6="ton",F6="quote-only",U6=25e3,q6=.01;function il(){return XA()}function gf(){return Object.keys(il().tokens).sort()}function D6(e){let t=il().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function H6(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Q("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,a=r+o;return{mantissa:i/a,scale:6}}function yf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=il().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else{let f=e.toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}let a=i[r],s=D6(r);if(!a||!s)return null;let c=$t(s.priceUsd,`${r}.priceUsd`),l=Re(s.liquidityUsd),u=n===null?Q("0"):n,d=u.mantissa===0n?Q("0"):H6(l,u),m={venue:B6,chain:M6,instrument:"spot",tier:F6,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:il().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:a.mint,pairAddress:s.pairAddress,dexId:s.dexId,quote:s.quote,liquidityUsd:s.liquidityUsd,volume24h:s.volume24h,priceUsd:s.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(s.liquidityUsd??0)<U6,impactSizeFractionHint:q6}};return st(m)}function vI({side:e="buy",sizeUsd:t=null}={}){return gf().map(n=>yf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var EI=3600*1e3;function bf(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:Q(String(e))}function AI(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=bf(t),o=[],i=wI({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of nl({ticker:n,sizeUsd:r}))o.push(l);for(let l of tl({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of rl({sizeUsd:r}))l.symbol===n&&o.push(l);let a=Io({symbol:n,sizeUsd:r});a&&o.push(a);let s=hf({symbol:n,sizeUsd:r});s&&o.push(s);let c=yf({symbol:n,sizeUsd:r});return c&&o.push(c),o}function j6(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=bf(e.sizeUsd??e.size??null),r=AI(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,a=e.nowMs==null,s=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),l=uf(r,{nowMs:s,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...l,dataSource:a?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>EI}}function z6(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:nl().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:tl().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:rl().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:pf().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:ff().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:gf().length}],t=[...nl(),...tl(),...rl(),...hI(),...kI(),...vI()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Jc(t,{nowMs:n});return{inventory:e,hip3Dexs:yI(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,a)=>(i[a.reason]=(i[a.reason]??0)+1,i),{})},capturedAt:bt().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function V6(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=bf(e.sizeUsd??e.size??null),o=Io({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,a=e.nowMs!=null,s=a?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),l=mf({symbol:t,sizeUsd:r,recipient:n,nowMs:s});return{ok:!0,ticker:t,artifact:l,bestPreparableVenue:"rh_uniswap",dataSource:a?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>EI}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function W6(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var $e=Object.freeze({SAFE:"SAFE",CAUTION:"CAUTION",HONEYPOT:"HONEYPOT",UNKNOWN:"UNKNOWN"}),G6=5e3,K6=1500;function Y6(e,t){return t===0n?null:Number((t-e)*10000n/t)}function X6(e,t){if(e==null||e==="")throw new Error(`sell-sim: ${t} required`);if(typeof e=="bigint")return e;let n=String(e).trim();if(!/^\d+$/.test(n))throw new Error(`sell-sim: ${t} must be an integer base-unit amount`);return BigInt(n)}async function _I(e={},t={}){let{token:n,base:r,chainId:o=null}=e;if(!n)throw new Error("sell-sim: token required");if(!r)throw new Error("sell-sim: base asset required");if(typeof t.quote!="function")throw new Error("sell-sim: opts.quote function required");let i=X6(e.amountIn,"amountIn"),a;try{a=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(m){return Kt($e.UNKNOWN,`buy leg could not be quoted: ${wf(m)}`,{chainId:o,token:n,base:r})}let s=II(a?.outAmount);if(s==null||s===0n)return Kt($e.UNKNOWN,"buy leg returned no output \u2014 no route or no liquidity",{chainId:o,token:n,base:r});let c;try{c=await t.quote({chainId:o,inputMint:n,outputMint:r,amount:s.toString(),side:"sell"})}catch(m){return Kt($e.HONEYPOT,`buy routes but the SELL leg fails to quote (${wf(m)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:s.toString()})}let l=II(c?.outAmount);if(l==null||l===0n)return Kt($e.HONEYPOT,"sell leg returns zero \u2014 the position cannot be exited for value",{chainId:o,token:n,base:r,tokensOut:s.toString()});let u=Y6(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:s.toString(),roundTripOut:l.toString(),roundTripLossBps:u,evidence:"quote-only"},p=t.executionProven===!0?!0:null;if(typeof t.executionCheck=="function")try{let m=await t.executionCheck({chainId:o,token:n,base:r,tokensOut:s.toString(),amountIn:i.toString()});if(m?.executable===!1)return Kt($e.HONEYPOT,`the sell reverts or returns false at execution (${m?.reason||"transfer-level block"}) even though it quotes cleanly \u2014 a honeypot a pool-math quote cannot see`,{...d,evidence:"execution",executable:!1});p=m?.executable===!0?!0:p}catch(m){d.executionCheckError=wf(m)}return p===!0&&(d.evidence="execution"),u==null?Kt($e.UNKNOWN,"could not compute round-trip loss",d):u>=G6?Kt($e.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=K6?Kt($e.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):p===!0?Kt($e.SAFE,`round trip loses ${(u/100).toFixed(1)}% and the sell executes \u2014 exit path verified`,d):Kt($e.CAUTION,`round trip quotes clean (${(u/100).toFixed(1)}% loss) but is unverified at execution \u2014 a pool-math quote cannot see a transfer-hook blacklist or transfer-only sell tax; run an execution-level sell simulation to clear SAFE`,d)}function Kt(e,t,n){return{status:e,safe:e===$e.SAFE,tradable:e===$e.SAFE||e===$e.CAUTION,reason:t,...n}}function II(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function wf(e){return String(e?.message||e).slice(0,120)}async function Q6(e={},t={}){let n=await _I(e,t);if(!(n.status===$e.SAFE||n.status===$e.CAUTION&&t.allowCaution!==!1||n.status===$e.UNKNOWN&&t.allowUnknown===!0)){let o=new Error(`sell-sim ${n.status}: ${n.reason}`);throw o.sellSim=n,o}return n}import{createHash as J6}from"node:crypto";var xf=1,TI=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Z6=Object.freeze(["read","simulate"]),NI=1e4,PI=1440*60,CI=128,OI=256,RI=64,$I=256,LI=/^0x[0-9a-fA-F]{40}$/,e5=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,t5=/^[a-z][a-z0-9_-]*:\*$/,n5=/^[A-Za-z0-9._:-]+$/,r5=/^[A-Za-z0-9._:-]+$/,BI=/^(0|[1-9][0-9]*)$/,va=class extends Error{constructor(t){let n=t.map(r=>`${r.field}: ${r.message}`);super(`invalid grant (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="GrantValidationError",this.errors=t}};function o5(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function i5(e){if(typeof e=="bigint")return e>=0n?e.toString(10):null;if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:String(e);if(typeof e=="string"){let t=e.trim();return BI.test(t)?t:null}return null}function _o(e){if(typeof e=="bigint")return e<0n||e>BigInt(Number.MAX_SAFE_INTEGER)?null:Number(e);if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:e;if(typeof e=="string"){let t=e.trim();if(!BI.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function MI(e){let t=String(e).split(":")[0];return Z6.includes(t)}function FI(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!o5(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))TI.includes(d)||r(d,"unknown field is not allowed");for(let d of TI)(!(d in e)||e[d]==null)&&r(d,"required field is missing");if(n.length)return{ok:!1,errors:n,grant:null};let o={},i=_o(e.chainId);i==null||i<=0?r("chainId","must be a positive integer chain id"):o.chainId=i;for(let d of["agentAddress","accountAddress"]){let p=e[d];typeof p!="string"||!LI.test(p.trim())?r(d,"must be a 0x-prefixed 20-byte hex address"):o[d]=p.trim().toLowerCase()}if(!Array.isArray(e.actions)||e.actions.length===0)r("actions","must be a non-empty array of action scopes");else if(e.actions.length>RI)r("actions",`too many actions (max ${RI})`);else{let d=[];for(let p of e.actions){let m=typeof p=="string"?p.trim():null;if(!m){r("actions","action entries must be non-empty strings");continue}if(m.includes("*")){t.allowWildcardActions===!0&&t5.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!e5.test(m)){r("actions",`malformed action "${m}" (expected verb:resource)`);continue}d.push(m)}o.actions=[...new Set(d)].sort()}if(!Array.isArray(e.targets))r("targets","must be an array of contract addresses");else if(e.targets.length>$I)r("targets",`too many targets (max ${$I})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!LI.test(m)){r("targets",`target "${p}" must be a 0x-prefixed 20-byte hex address (wildcards not allowed)`);continue}d.push(m.toLowerCase())}if(o.targets=[...new Set(d)].sort(),o.targets.length===0&&Array.isArray(o.actions)){let p=o.actions.filter(m=>!MI(m));(p.length>0||o.actions.length===0)&&r("targets",`empty targets are only allowed for read/simulate scopes (blocked by: ${p.join(", ")||"no valid actions"})`)}}for(let d of["maxValueWei","maxGasWei"]){let p=i5(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let a=_o(e.maxSlippageBps);a==null||a>NI?r("maxSlippageBps",`must be an integer between 0 and ${NI}`):o.maxSlippageBps=a;let s=864e10,c=_o(e.expiresAt);if(c==null||c<=0)r("expiresAt","must be a positive unix-seconds timestamp");else if(c>s)r("expiresAt","exceeds the max unix-seconds timestamp (pass seconds, not milliseconds)");else if(o.expiresAt=c,t.now!=null){let d=_o(t.now);d==null?r("expiresAt","opts.now must be a unix-seconds integer"):c<=d?r("expiresAt",`grant is expired (expiresAt ${c} <= now ${d})`):c-d>PI&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${PI} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():_o(e.nonce)!=null?String(_o(e.nonce)):null;!l||l.length>CI||!n5.test(l)?r("nonce",`must be a non-empty string (max ${CI} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>OI||!r5.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${OI} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function Sf(e,t={}){let{ok:n,errors:r,grant:o}=FI(e,t);if(!n)throw new va(r);return o}function kf(e,t={}){let n=Sf(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${xf},${o.join(",")}}`}function UI(e,t={}){return J6("sha256").update(kf(e,t),"utf8").digest("hex")}var qI=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),a5="agent:execute",s5="build:factory",DI=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function c5(e){let t=Array.isArray(e)&&e.length?e:DI,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!qI.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var HI=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function jI(){return HI.filter(e=>e.website)}var l5="@oracle-agent/oracle",u5="npx",d5=["-y","--package",l5,"oracle-data-mcp"],VI=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Ef(e,t){if(typeof e!="string"||!e.trim())throw new TypeError(`${t} must be a non-empty string`);if(/\r|\n|\0/.test(e))throw new TypeError(`${t} must be a single-line string`);return e.trim()}function p5(e){let t=Ef(e,"url"),n;try{n=new URL(t)}catch{throw new TypeError("url must be a valid http(s) URL")}if(!/^https?:$/.test(n.protocol)||n.username||n.password)throw new TypeError("url must be a credential-free http(s) URL");for(let r of n.searchParams.keys())if(VI.test(r)||/^(?:key|api[_-]?key|auth)$/i.test(r))throw new TypeError(`url must not contain secret-shaped query parameter: ${r}`);return n.href}function m5(e){let t=Ef(e,"key");if(/^[A-Z][A-Z0-9_]*\s*=/.test(t)||/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t))throw new TypeError("key must be an Oracle agent key, not an environment assignment or private key");if(/^(?:0x)?[0-9a-f]{64}$/i.test(t)||t.trim().split(/\s+/).length>=12)throw new TypeError("key looks like private signing material");return t}function f5(e){let t=Ef(e,"label");if(!/^[a-z0-9][a-z0-9_-]{0,62}$/i.test(t))throw new TypeError("label must contain only letters, digits, underscores, and hyphens");if(VI.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function wt(e){return`${JSON.stringify(e,null,2)}
190
- `}function vf(e){return JSON.stringify(e)}function Ea(e){return JSON.stringify(e)}function zI(e,t){return["mcp_servers:",` ${e}:`,` command: ${vf(t.command)}`," args:",...t.args.map(n=>` - ${vf(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${vf(r)}`),""].join(`
191
- `)}function h5(e,t){return[`[mcp_servers.${Ea(e)}]`,`command = ${Ea(t.command)}`,`args = [${t.args.map(Ea).join(", ")}]`,"",`[mcp_servers.${Ea(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${Ea(r)}`),""].join(`
192
- `)}function g5(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
193
- `)}function WI({url:e,key:t,label:n="oracle-data"}={}){let r=p5(e),o=m5(t),i=f5(n),a={command:u5,args:[...d5],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},s={mcpServers:{[i]:a}},c={hermes:zI(i,a),claudeCode:wt(s),codex:h5(i,a),cursor:wt(s),genericMcp:wt(s),oracleNative:g5(),chatgpt:wt(s),claudeDesktop:wt(s),windsurf:wt(s),vscode:wt(s),openclaw:wt(s),perplexity:wt(s),manus:wt(s),prime:zI(i,a),opencode:wt(s)};for(let l of jI()){if(l.kind==="oracle")continue;let u=l.configKey||l.id;c[u]||(c[u]=wt(s))}return c}var y5=WI;var GI=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),b5=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"]);function KI(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Aa(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function If(e,t){return t>0?Aa(e/t*100):null}function _f(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function w5(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function vr(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=KI(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||b5.has(r.toUpperCase())})}function x5(e){let t=[],n=_f(e);for(let r of e.assets||e.holdings||[])vr(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&vr(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let s of r.assets||r.fungibleTokens?.assets||[])vr(t,s,i);for(let s of r.collectibles?.assets||r.nfts||[])vr(t,{...s,kind:"nft"},i);for(let s of r.spot?.balances||[])vr(t,s,{...i,venue:"Hyperliquid spot"});let a=KI(r.perps?.accountValueUsd);a!=null&&vr(t,{symbol:"perps account",usdValue:a},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])vr(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function S5(e,t){let n=_f(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Af(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:Aa(i),percentOfKnown:If(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function al(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=w5(t.labels??t.addressBook??e.labels??e.addressBook),o={...GI,...e.thresholds||{},...t.thresholds||{}},i=[],a=new Set,s=0;n.forEach((v,N)=>{if(!v||typeof v!="object")return;let B=S5(v,N);a.has(B)?s+=1:(a.add(B),i.push(v))});let c=i.flatMap(x5),l=c.filter(v=>v.usdValue!=null),u=c.filter(v=>v.usdValue==null),d=i.reduce((v,N)=>v+Number(N.valuation?.unpricedNonzeroItems||N.unpricedNonzeroItems||0),0),p=Aa(l.reduce((v,N)=>v+N.usdValue,0)),m=u.length+d,f=Af(l,"chain",p),h=Af(l,"venue",p),g=Af(l,"symbol",p);for(let v of f)v.chain=v.name;for(let v of h)v.venue=v.name;for(let v of g)v.asset=v.name,v.symbol=v.name;let w=Aa(l.filter(v=>v.stablecoin).reduce((v,N)=>v+N.usdValue,0)),x=c.filter(v=>v.kind==="nft"),y=i.reduce((v,N)=>v+Number(N.valuation?.nftUnvaluedItems||0),0),b=x.filter(v=>v.usdValue==null).length+y,S=x.filter(v=>v.usdValue!=null).length,_=g[0]||null,T=_?_.percentOfKnown>=o.assetHighPct?"high":_.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",E=[];m&&E.push(`${m} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),b&&E.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),s&&E.push(`${s} duplicate address/chain snapshot(s) were ignored.`),_&&T!=="low"&&E.push(`Asset concentration is ${T}: ${_.name} is ${_.percentOfKnown}% of known value.`),f[0]?.percentOfKnown>=o.chainHighPct&&E.push(`Chain concentration is high: ${f[0].name} is ${f[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&E.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let A=i.map(_f).filter(Boolean).map(v=>{let N=r.get(String(v).toLowerCase());return{address:v,label:N?.label??null,who:N?.who??null,role:N?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&m===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:m===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:m?null:0,pricedItemCount:l.length,unknownItemCount:m,snapshotCount:i.length,duplicatesIgnored:s},chainExposures:f,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:T,topAsset:_?.name??null,topAssetPercent:_?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:If(w,p),high:p>0&&If(w,p)>=o.stablecoinHighPct},nftCoverage:{status:x.length||y?b?"partial":"valued":"not-observed",valuedItems:S,unvaluedItems:b,knownUsd:Aa(x.filter(v=>v.usdValue!=null).reduce((v,N)=>v+N.usdValue,0))},addresses:A,warnings:[...new Set(E)]}}var k5=al;var Fe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Lt=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,Ne=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Bt=e=>e.asset??e.symbol??e.coin,QI=e=>e.address??e.owner??e.account,cl=e=>[Ne(e.chain??e.chainId),Ne(QI(e)),Ne(Bt(e)),Ne(e.source)].join("|");function YI(e){return Fe(e.asOf??e.updatedAt??e.timestamp,0)}function JI(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function v5(e){return Number.isFinite(Number(JI(e)))}function XI(e){return Fe(JI(e),0)}function E5(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Bt(o))return;let a=ZI(o);t.has(a)||(t.add(a),n.push({row:o,seq:i}))}),n.every(({row:o})=>v5(o))?n.sort((o,i)=>XI(o.row)-XI(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function ZI(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[cl(e),Ne(t),Ne(e.side),Fe(e.quantity??e.amount??e.size),Fe(e.price??e.priceUsd)].join("|")}function sl(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!Bt(o))continue;let i=t==="fill"?ZI(o):cl(o);n.has(i)?(r+=1,t!=="fill"&&YI(o)>YI(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function A5(e){let t=new Map;for(let n of e){let r=[cl(n),`${Ne(n.chain??n.chainId)}|${Ne(Bt(n))}`,`*|${Ne(Bt(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function I5(e,t){return t.get(cl(e))??t.get(`${Ne(e.chain??e.chainId)}|${Ne(Bt(e))}`)??t.get(`*|${Ne(Bt(e))}`)??null}function _5(e){let t=new Map,n=0;for(let r of e){let o=[Ne(r.chain??r.chainId),Ne(QI(r)),Ne(Bt(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},a=Math.abs(Fe(r.quantity??r.amount??r.size)),s=Fe(r.price??r.priceUsd),c=Fe(r.feeUsd);if(Ne(r.side)==="sell"){let l=Math.min(a,i.quantity),u=i.quantity?i.cost/i.quantity:Fe(r.costBasisUsd)/(a||1);n+=l*(s-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=a,i.cost+=a*s+c;t.set(o,i)}return{realizedPnlUsd:Lt(n),lots:t}}function Tf(e={},t={}){let n=Fe(t.asOf??e.asOf,0),r=Math.max(0,Fe(t.priceTtlMs??e.priceTtlMs,6e4)),o=sl(e.balances||[],"balance"),i=sl(e.positions||[],"position"),a=sl(e.fills||[],"fill"),s=sl(e.prices||[],"price"),c=A5(s.rows),l=[],u=0,d=0;for(let A of[...o.rows,...i.rows]){let v=I5(A,c),N=Fe(A.quantity??A.amount??A.size),B=v?Fe(v.priceUsd??v.price,NaN):Fe(A.priceUsd,NaN);if(!Number.isFinite(B)){d+=1;continue}let te=N*B,Z=Fe(v?.asOf??A.priceAsOf,0),$=n-Z>r;$&&(u+=Math.abs(te)),l.push({...A,quantity:N,priceUsd:B,valueUsd:te,stale:$,kind:i.rows.includes(A)?"position":"balance"})}let p=l.filter(A=>A.kind==="balance").reduce((A,v)=>A+v.valueUsd,0),m=l.filter(A=>A.kind==="position"),f=m.reduce((A,v)=>A+v.valueUsd,0),h=m.reduce((A,v)=>A+Math.abs(v.valueUsd),0),g=p+f,w=Fe(e.equityUsd,g),x=_5(E5(e.fills||[])).realizedPnlUsd,y=m.reduce((A,v)=>{let N=Fe(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return A+v.quantity*(v.priceUsd-N)},0),b=new Map;for(let A of l)b.set(Ne(Bt(A)),(b.get(Ne(Bt(A)))||0)+Math.abs(A.valueUsd));let S=[...b.values()].reduce((A,v)=>A+v,0),_=[...b].map(([A,v])=>({asset:A,exposureUsd:Lt(v),percent:S?Lt(v/S*100):null})).sort((A,v)=>v.exposureUsd-A.exposureUsd||A.asset.localeCompare(v.asset)),T=l.reduce((A,v)=>A+Math.abs(v.valueUsd),0),E=al({snapshots:[{assets:l.map(A=>({symbol:Bt(A),usdValue:Math.abs(A.valueUsd),chain:A.chain,venue:A.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:a.rows,prices:s.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+a.duplicatesIgnored+s.duplicatesIgnored,pnl:{realizedUsd:x,unrealizedUsd:Lt(y),totalUsd:Lt(x+y)},exposure:{grossUsd:Lt(h),netUsd:Lt(g),leverage:w>0?Lt(h/w):null,equityUsd:Lt(w)},concentration:_,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(A=>A.stale).length,staleValueUsd:Lt(u),stalePercent:T?Lt(u/T*100):null,ttlMs:r},risk:E})}var T5=Tf,N5=Tf;import{createHash as $5}from"node:crypto";var Ia=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},P5=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,C5=Object.freeze(["privkey","wif","xprv","seed"]);function e1(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return P5.test(t)||C5.includes(n)}var O5=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),R5=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Er(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=R5.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:a}of O5)if(!(o&&i.startsWith("raw-32-byte-hex"))&&a.test(e))throw new Ia(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&e1(o))throw new Ia(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Er(o,`${t}[key]`,n),Er(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Er(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Er(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(e1(o))throw new Ia(`${t}.${o}`,"forbidden-key-name");Er(i,`${t}.${o}`,n,o)}return e}var ll=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Pf=Object.freeze(Object.fromEntries(ll.map((e,t)=>[e,Object.freeze(t+1<ll.length?[ll[t+1]]:[])]))),t1=new Set(["signed","broadcast"]);function Nf(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Nf).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Nf(e[t])}`).join(",")}}`}function L5(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function ul(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))ul(t)}return e}function Cf(e,t="fact"){try{Er(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function n1(e){return $5("sha256").update(Nf(e)).digest("hex")}function r1({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let a={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:L5(n)};return ul({...a,hash:n1(a)})}function B5({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Cf(t,"intent");let r=r1({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return ul({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function o1(e,t,n,r={}){if(Of(e),!(Pf[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Cf(n,t);let i=r.external===!0||r.externallySupplied===!0;if(t1.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let a=e.events.at(-1),s=r.asOf??a.asOf;if(!Number.isFinite(Number(s))||Number(s)<Number(a.asOf))throw new Error("asOf must be finite and monotonic");let c=r1({tradeId:e.tradeId,state:t,fact:n,asOf:s,previousHash:a.hash,external:i});return ul({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Of(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(n1(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Cf(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Pf[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(t1.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var M5=o1,F5=Of;function U5(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function q5(e,t){let n;try{let r=new Promise((i,a)=>{n=setTimeout(()=>a(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function dl(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let a=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${a}`)}return i}async function Rf(e,t={}){let n=U5(e),r=dl(t.concurrency,4,"concurrency",1,!0),o=dl(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=dl(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),a=dl(t.ttlMs,6e4,"ttlMs",0),s=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){s[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:a,error:"health function is required"};continue}let m=await q5(p,o),f=Number(m.detail?.asOf??m.detail?.updatedAt??i),h=m.transportOk&&i-f>a,g=!(m.detail&&typeof m.detail=="object"&&m.detail.ok===!1),w=m.transportOk&&g&&!h;s[d]={id:String(p.id),ok:w,state:m.timedOut?"timeout":!m.transportOk||!g?"error":h?"stale":"fresh",stale:h,asOf:f,checkedAsOf:i,ttlMs:a,...m.detail===void 0?{}:{detail:m.detail},...m.error?{error:m.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of s)u[d.state]+=1;return{ok:s.every(d=>d.ok),asOf:i,ttlMs:a,timeoutMs:o,counts:u,providers:s}}var D5=Rf,H5=Rf;et();import{createHash as j5}from"node:crypto";var $f=1,f1=/^[a-z0-9][a-z0-9._-]{0,63}$/,h1=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,z5=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),V5=new Set(["sma","ema","rsi","macd","bollinger","atr"]),W5=new Set(["gt","gte","lt","lte","eq"]),G5=new Set(["and","or","not"]),K5=new Set(["above","below"]),Y5=new Set(["line","signal","histogram"]),X5=new Set(["upper","middle","lower"]),Lf=new Set(["compare","logic","cross"]),i1=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),a1=new Set(["value","min","max","step"]),Bf=new Set(["entryLong","entryShort","exitLong","exitShort"]),s1=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),Q5=new Set(["id","type"]),c1={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},l1=16,u1=128,d1=100,To=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function xt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Se(e){return typeof e=="number"&&Number.isFinite(e)}function p1(e){return Number.isInteger(e)&&e>0}function Ff(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ff(t);return Object.freeze(e)}for(let t of Object.keys(e))Ff(e[t]);return Object.freeze(e)}function Uf(e){if(Array.isArray(e))return e.map(Uf);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Uf(e[n]);return t}return e}function C(e,t,n){e.push({path:t,message:n})}function zn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||C(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function g1(e,t,n,r){if(!Se(e)||!Se(t)||!Se(n)||!Se(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Mf(e,t,n,r){if(xt(e)){if(zn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return C(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return C(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!xt(o)||![o.value,o.min,o.max,o.step].every(p1)?(C(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return p1(e)?e:(C(r,t,"must be a positive integer or {param}"),null)}function m1(e,t,n,r){return xt(e)?(zn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(C(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(C(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Se(e)?e:(C(r,t,"must be a finite number or {param}"),null)}function pl(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function J5(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let a of pl(i))if(e.has(a)&&n(a))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function Z5(e,t){if(!xt(e))return C(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>l1)return C(t,"parameters",`too many parameters (max ${l1})`),null;let r={};for(let o of n){if(!f1.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!xt(i)){C(t,a,"must be a plain object");continue}zn(i,a1,a,t);for(let d of a1)d in i||C(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Se(c)||C(t,`${a}.min`,"must be a finite number"),Se(l)||C(t,`${a}.max`,"must be a finite number"),(!Se(u)||u<=0)&&C(t,`${a}.step`,"must be a positive finite number"),Se(s)||C(t,`${a}.value`,"must be a finite number"),Se(c)&&Se(l)&&c>l&&C(t,`${a}.min`,"min must be <= max"),Se(s)&&Se(c)&&Se(l)&&Se(u)&&u>0&&(g1(s,c,l,u)||C(t,`${a}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:s,min:c,max:l,step:u}}return r}function e4(e,t,n,r){let o=`nodes.${t}`;if(!xt(e))return C(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!c1[e.type])return C(r,`${o}.type`,"unknown or missing node type"),zn(e,Q5,o,r),null;switch(zn(e,c1[e.type],o,r),(typeof e.id!="string"||!h1.test(e.id))&&C(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!z5.has(e.field))&&C(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=m1(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!V5.has(e.indicator))&&C(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,a={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?C(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=Mf(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?C(r,`${o}.input`,"must be a node id string"):a.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))C(r,`${o}.period`,"required field is missing");else{let s=Mf(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}if(i==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))C(r,`${o}.${s}`,"required field is missing");else{let c=Mf(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?Y5.has(e.output)?a.output=e.output:C(r,`${o}.output`,"must be line|signal|histogram"):C(r,`${o}.output`,"required field is missing"),"period"in e&&C(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(r,`${o}.stdDev`,"required field is missing");else{let s=m1(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?C(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?X5.has(e.output)?a.output=e.output:C(r,`${o}.output`,"must be upper|middle|lower"):C(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&C(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&C(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&C(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!W5.has(e.op))&&C(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!G5.has(e.op))&&C(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let a=0;a<e.inputs.length;a++){let s=e.inputs[a];typeof s!="string"||!s?C(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&C(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!K5.has(e.direction))&&C(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function t4(e,t,n){if(!xt(e))return C(t,"risk","must be a plain object"),null;zn(e,s1,"risk",t);for(let p of s1)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Se(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Se(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Se(a)||a<=0||a>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Se(s)||s<=0||s>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Se(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Se(u)||u<=0||u>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function n4(e,t={}){let n=[];if(!xt(e))return C(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};zn(e,i1,"",n);for(let d of i1)(!(d in e)||e[d]==null)&&C(n,d,"required field is missing");e.version!==$f&&C(n,"version",`must be ${$f}`),(typeof e.id!="string"||!f1.test(e.id))&&C(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>d1)&&C(n,"name",`must be a non-empty string max ${d1}`);let r=ml(e.venue);r||C(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)xt(e.market)||C(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))C(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)C(n,p.path,p.message)}let i=Z5(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))C(n,"nodes","must be an array");else if(e.nodes.length>u1)C(n,"nodes",`too many nodes (max ${u1})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=e4(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&h1.test(p.id)&&(s.has(p.id)?C(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):s.set(p.id,p)),a.push(p))}for(let d=0;d<a.length;d++){let p=a[d],m=`nodes.${d}`;for(let f of pl(p))s.has(f)||C(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of pl(p)){let h=s.get(f);h&&Lf.has(h.type)&&C(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of pl(p)){let h=s.get(f);h&&!Lf.has(h.type)&&C(n,m,`node ref "${f}" must be boolean`)}}J5(s)&&C(n,"nodes","graph contains a cycle")}let c=null;if(!xt(e.rules))C(n,"rules","must be a plain object");else{zn(e.rules,Bf,"rules",n);for(let d of Bf)d in e.rules||C(n,`rules.${d}`,"required field is missing");c={};for(let d of Bf){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){C(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){C(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);Lf.has(m.type)||C(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=t4(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=Ff({version:$f,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:a,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function ln(e,t={}){let n=n4(e,t);if(!n.ok)throw new To(n.errors);return n.strategy}function r4(e){let t=ln(e);return JSON.stringify(Uf(t))}function qf(e){let t=r4(e);return j5("sha256").update(t,"utf8").digest("hex")}function y1(e,t){if(!xt(e))throw new To([{path:"",message:"strategy must be a plain object"}]);if(!xt(t))throw new To([{path:"overrides",message:"must be a plain object"}]);let n=ln(e),r={};for(let[i,a]of Object.entries(n.parameters))r[i]={value:a.value,min:a.min,max:a.max,step:a.step};let o=[];for(let[i,a]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){C(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Se(a)){C(o,i,"override must be a finite number");continue}if(!g1(a,s.min,s.max,s.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new To(o);return ln({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let a={...i};return Array.isArray(i.inputs)&&(a.inputs=[...i.inputs]),a}),rules:{...n.rules},risk:{...n.risk}})}function _a(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Vn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function o4(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function w1(e,t){_a(e),Vn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function fl(e,t){_a(e),Vn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let a=0;a<t;a++)r+=e[a];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let a=t;a<e.length;a++)o=i*e[a]+(1-i)*o,n[a]=o;return n}function x1(e,t){_a(e),Vn(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let s=1;s<=t;s++){let c=e[s]-e[s-1];c>=0?r+=c:o-=c}let i=r/t,a=o/t;n[t]=b1(i,a);for(let s=t+1;s<e.length;s++){let c=e[s]-e[s-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,a=(a*(t-1)+u)/t,n[s]=b1(i,a)}return n}function b1(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function S1(e,t={}){_a(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Vn(n),Vn(r),Vn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=fl(e,n),a=fl(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function k1(e,t={}){_a(e);let n=t.period,r=t.stdDev;if(Vn(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),a=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:a};let s=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(s+=u,c+=u*u,l>=n){let d=e[l-n];s-=d,c-=d*d}if(l>=n-1){let d=s/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,a[l]=d-r*m}}return{upper:i,middle:o,lower:a}}function v1(e,t){o4(e),Vn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let a=0;a<e.length;a++){let s=e[a];if(a===0)r[a]=s.h-s.l;else{let c=e[a-1].c;r[a]=Math.max(s.h-s.l,Math.abs(s.h-c),Math.abs(s.l-c))}}let o=0;for(let a=0;a<t;a++)o+=r[a];let i=o/t;n[t-1]=i;for(let a=t;a<e.length;a++)i=(i*(t-1)+r[a])/t,n[a]=i;return n}import{createHash as i4}from"node:crypto";var Df=2,a4="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",s4="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",c4="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",E1=i4("sha256").update(JSON.stringify({version:Df,compilerSourceHash:a4,indicatorsSourceHash:s4,schemaSourceHash:c4})).digest("hex");var hl=Df,Hf=E1,l4=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),u4=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function Mt(e){return typeof e=="number"&&Number.isFinite(e)}function d4(e){let t=new Map(e.map(s=>[s.id,s])),n=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},r=new Map,o=new Map;for(let s of e)r.set(s.id,0),o.set(s.id,[]);for(let s of e)for(let c of n(s))t.has(c)&&(o.get(c).push(s.id),r.set(s.id,r.get(s.id)+1));let i=[];for(let[s,c]of r)c===0&&i.push(s);let a=[];for(;i.length;){let s=i.shift();a.push(s);for(let c of o.get(s))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(a.length!==e.length)throw new Error("strategy graph is cyclic");return a}function No(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function p4(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:a,o:s,h:c,l,c:u,v:d}=i;if(!Mt(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Mt(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==u4[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Mt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Mt(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Ar(e,t,n,r,o,i){if(i.has(e))return i.get(e);let a=t.get(e),s;switch(a.type){case"input":{let c=l4[a.field];s=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];s[l]=u===void 0?null:u}break}case"constant":{let c=No(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?No(a.period,n):void 0;if(a.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}s=v1(d,c);break}let u=Ar(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Mt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=w1(u,c);else if(a.indicator==="ema")s=fl(u,c);else if(a.indicator==="rsi")s=x1(u,c);else if(a.indicator==="macd")s=S1(u,{fastPeriod:No(a.fastPeriod,n),slowPeriod:No(a.slowPeriod,n),signalPeriod:No(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=k1(u,{period:c,stdDev:No(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=Ar(a.left,t,n,r,o,i),l=Ar(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Mt(d)||!Mt(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>Ar(l,t,n,r,o,i));s=new Array(o+1);for(let l=0;l<=o;l++)if(a.op==="not"){let u=c[0][l];s[l]=u===!0?!1:u===!1}else if(a.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}s[l]=u}else if(a.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}s[l]=u}else s[l]=!1;break}case"cross":{let c=Ar(a.left,t,n,r,o,i),l=Ar(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Mt(d)||!Mt(p)||!Mt(m)||!Mt(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function jf(e,t={}){let n=ln(e);t&&Object.keys(t).length&&(n=y1(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(d4(n.nodes)),i=n.parameters,a=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])a.add(m);let s=Object.freeze([...a].sort()),c=qf(n);function l(m,f){let h={};for(let w of o){let x=m.get(w);h[w]=x[f]}let g=w=>w!=null&&h[w]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){p4(m,f,n.market.interval);let h=new Map;for(let g of o)Ar(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,w)=>Object.freeze(l(h,w))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:hl,compilerHash:Hf,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as m4}from"node:crypto";var ZW=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var f4=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function Wn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ta(e){return typeof e=="number"&&Number.isFinite(e)}function Po(e){if(Array.isArray(e))return e.map(Po);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Po(e[n]);return t}return e}function A1(e){if(!Wn(e))throw new TypeError("evidence artifact must be a plain object");if(!f4.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Wn(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Wn(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Wn(e.train)||!Wn(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Po({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Po(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function h4(e){return m4("sha256").update(JSON.stringify(A1(e)),"utf8").digest("hex")}function Ft(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function zf(e,t){if(!Wn(e)||!Wn(e.metrics))throw new Error(`${t} metrics required`);let n=Ft(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Ta(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function g4(e,{maxDailyLossPct:t}={}){let n=e.split,r=Ft(n.trainStartIndex,"split.trainStartIndex"),o=Ft(n.trainEndIndex,"split.trainEndIndex"),i=Ft(n.trainBarCount,"split.trainBarCount",1),a=Ft(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Ft(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Ft(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||a!==o+1||s-a+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Ta(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");zf(e.train,"train");let l=zf(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Ta(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Wn(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Ft(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=Ft(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),y=Ft(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),b=Ft(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(w!==0||x>=y||y>b||y<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=b,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let S=zf({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(S.tradeCount<1||S.netPnlUsd<=0||S.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Ta(t)&&S.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Ta(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function I1(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=A1(e),r=Po({id:e.id,...n});if(JSON.stringify(Po(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=h4(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&g4(e,t),e}X();var y4=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function Na(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function b4(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Wf(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Wf(n,`${t}[${r}]`));return}if(Na(e))for(let[n,r]of Object.entries(e)){let o=b4(n);if(y4.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Wf(r,`${t}.${n}`)}}function Vf(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function _1({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Wf({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Na(e))throw new Error("handoff: strategy required");if(!Na(t))throw new Error("handoff: evidence required");if(!Na(n))throw new Error("handoff: shadow required");if(!Na(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=ln(e,{nowMs:o}),s=jf(a);if(I1(t,{maxDailyLossPct:a.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!Vf(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!Vf(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!Vf(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:hl,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return O(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}et();var w4=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function Co(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Oo(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Pa(e){if(Array.isArray(e))for(let t of e)Pa(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Pa(t);return Object.freeze(e)}function x4(e){let t=w4[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function S4(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Oo(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Oo(Number(o.t),`candles[${r}].t`);if(Oo(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:Co(o.o,`candles[${r}].o`),h:Co(o.h,`candles[${r}].h`),l:Co(o.l,`candles[${r}].l`),c:Co(o.c,`candles[${r}].c`),v:Co(o.v,`candles[${r}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${r}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${r}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,s)}return Pa([...n.values()].sort((r,o)=>r.t-o.t))}function k4(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Oo(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Co(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function v4({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),a=!1;for(let s=0;s<16&&i<=n;s++){let c=await as({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){a=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!a)throw new Error("strategy history exceeds the bounded funding history limit");return k4(o,n)}function E4(e,t,n){let r=0,o=null;return e.map(i=>{let a=i.t+n,s=0;for(;r<t.length&&t[r].time<a;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(s+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:s}:{...i,fundingRate:o,fundingPaymentRate:s}})}async function T1(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=x4(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Oo(e.endTime,"endTime"),a=e.count==null?1500:e.count;if(!Number.isInteger(a)||a<20||a>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,i-a*o):Oo(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Cr({coin:n,interval:r,startTime:s,endTime:i},t),v4({coin:n,startTime:s,endTime:i},t)]),u=S4(c,{endTime:i}),d=Pa(E4(u,l,o));return Pa({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var A4=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),I4=new Set(["coin","interval"]);function _4(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))I4.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!A4.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function T4(e={}){let t=await is(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var N1=Object.freeze({id:"hyperliquid",validateMarket:_4,fetchBars:T1,listMarkets:T4,prepareIntent(e){return _1(e)}});var N4=Object.freeze(["id","validateMarket","prepareIntent"]);function P4(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of N4.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var P1=[N1].map(P4),C4=new Map(P1.map(e=>[e.id,e])),O4=Object.freeze([...P1]);function ml(e){return typeof e!="string"?null:C4.get(e)??null}function R4(e){let t=ml(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var C1=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),$4=new Set(C1);function gl(e){if(!$4.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function Gf(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function O1(){return{subscribedCategories:[]}}function L4(e,t){gl(t);let n=Gf(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function B4(e,t){gl(t);let n=Gf(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function M4({category:e,notify:t=!1,...n}={}){if(gl(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function F4(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function R1(e,t=O1(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return gl(e.category),Gf(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:F4(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function U4(e,t,n){return R1(e,t,n).deliver}var $1=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),q4=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),Ue=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),Xe=e=>Number.isFinite(Number(e))?Number(e):null,yl=e=>Math.round(e*1e4)/1e4;function L1(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return q4[t]??t}function D4(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${L1(e)}:${t}`)}function St(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:yl(n)})}function H4(e,t){let n=Xe(e.repeatBuys??e.repeat_buys??e.buyCount),r=Xe(e.walletWinRate??e.winRate);St(t,"repeat_buys",n===null?null:Ue((n-1)/4)*.38),St(t,"wallet_win_rate",r===null?null:(Ue(r)-.5)*.5)}function j4(e,t){let n=Xe(e.ageHours??e.poolAgeHours),r=Xe(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;St(t,"pool_age",n===null?null:n<24?-.42:Ue(n/720)*.12),St(t,"liquidity",r===null?null:(Ue(Math.log10(Math.max(1,r))/7)-.5)*.28),St(t,"liquidity_lock",o==null?null:o?.12:-.28)}function z4(e,t){let n=Xe(e.floorChange??e.floorChangePct),r=Xe(e.sales??e.saleCount);St(t,"floor_change",n===null?null:Ue(n,-1,1)*.35),St(t,"sales_depth",r===null?null:Ue(r/50)*.18)}function V4(e,t){let n=Xe(e.flowImbalance??e.imbalance),r=Xe(e.fundingRate??e.funding);St(t,"flow_imbalance",n===null?null:Ue(n,-1,1)*.42),St(t,"funding",r===null?null:-Ue(r*100,-1,1)*.12)}function W4(e,t){let n=Xe(e.marketProbability??e.marketPrice??e.probability),r=Xe(e.fairProbability??e.referenceProbability??e.fairValue);St(t,"probability_mispricing",n===null||r===null?null:Ue(r-n,-1,1)*.65);let o=Xe(e.liquidityUsd??e.liquidity);St(t,"market_liquidity",o===null?null:Ue(Math.log10(Math.max(1,o))/6)*.12)}var G4=Object.freeze({wallet:H4,pool:j4,nft_floor:z4,hl_flow:V4,prediction_market:W4});function K4(e,t,n){let r=n.filter(i=>{let a=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return a!=null&&String(a)===t});if(r.length===0)return null;let o=r.map(i=>Xe(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,a)=>i+a,0)/o.length}function Kf(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=Ue(Xe(n.minimumCoverage)??.5);return e.map((o,i)=>{let a=L1(o),s=D4(o,i),c=G4[a],l=[];c&&c(o,l);let u=a==="wallet"?2:a==="pool"?3:2,d=yl(Ue(l.length/u)),p=l.reduce((y,b)=>y+b.value,0),m=K4(o,s,t),f=m===null?0:Ue(m,-1,1)*.35;m!==null&&St(l,"shadow_markout",f);let h=yl(Ue(.5+p+f)),g=m===null?.8:Ue(.85+m*.3,.35,1),w=yl(Ue(d*g)),x=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||x.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&x.push("LOW_COVERAGE","NO_TRADE"),w<.5&&x.push("LOW_CONFIDENCE","NO_TRADE"),a==="pool"&&(Xe(o.ageHours??o.poolAgeHours)??1/0)<24&&x.push("NEW_POOL_RISK","NO_TRADE"),m!==null&&m<0&&x.push("NEGATIVE_MARKOUT"),{id:s,type:a,score:h,confidence:w,coverage:d,contributions:l,flags:[...new Set(x)],noTrade:x.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function B1(e={}){return Object.freeze({score(t,n=[],r={}){return Kf(t,n,{...e,...r})}})}import{mkdir as Y4,chmod as bl,readFile as X4,rename as Q4,writeFile as J4}from"node:fs/promises";import{homedir as Z4}from"node:os";import{dirname as M1,join as Yf}from"node:path";import e3 from"sql.js";var Sl=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),t3=new Set(Sl),n3=new Set(Sl.slice(0,-1).map((e,t)=>`${e}:${Sl[t+1]}`)),U1=Yf(process.env.ORACLE_CONFIG_DIR||Yf(Z4(),".config","oracle"),"workspace"),q1=Yf(U1,"artifacts.sqlite");function kl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(kl).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${kl(e[t])}`).join(",")}}`}function F1(e){if(!t3.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function wl(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function xl(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function D1(e={}){let t=e.path||q1;await Y4(M1(t),{recursive:!0,mode:448}),await bl(M1(t),448);let n;try{n=await X4(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await e3(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
189
+ }`;function bF(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 Rv(e={},t={}){let n={chainIds:bF(e)};return e.user&&(n.user=String(e.user)),{markets:(await Uc(hF,{request:n},t))?.data?.markets??[]}}async function $v(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 a=(await Uc(gF,{request:o},t))?.data?.market??null;if(!a)throw new Error(`aave-v3: no market at ${n} on chain ${r}`);return{market:a}}async function Lv(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 Uc(yF,{filter:r},t))?.data?.chains??[]}}async function Bv(e={}){return{ok:(await Uc("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var xF="https://staking-api.babylonlabs.io";function km(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||xF).replace(/\/$/,"")}function qc(e,t={}){return k(`${km(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function Mv(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 Fv(e={}){try{let n=(await qc("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:km(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:km(e),error:String(t?.message||t),exec:!1}}}async function Uv(e={},t={}){let r=(await qc("/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 qv(e={},t={}){let n=await qc("/v2/finality-providers",t),r=Array.isArray(n?.data)?n.data:[];if(e.state){let i=String(e.state).trim().toUpperCase();r=r.filter(a=>String(a.state||"").toUpperCase().includes(i))}if(e.btcPk){let i=Mv(e.btcPk,"btcPk");r=r.filter(a=>String(a.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 Dv(e={},t={}){let n=Mv(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 qc(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var kF="https://markets.bisq.network";function vm(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||kF).replace(/\/$/,"")}function Hv(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 Dc(e,t={}){return k(`${vm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function jv(e={}){try{let t=await Dc("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:vm(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:vm(e),error:String(t?.message||t),exec:!1}}}async function zv(e={},t={}){let n=await Dc("/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 Vv(e={},t={}){let n=Hv(e.market||e.pair||"btc_usd","market"),r=await Dc(`/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 Wv(e={},t={}){let n=Hv(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 Dc(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.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}))}}L();var ln=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"}}),EF=new Map([["bob",60808],["rootstock",30],["rsk",30]]),AF=60808;function ma(e){if(e==null||e==="")return AF;let t=EF.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!ln[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(ln).join(", ")} / bob, rootstock)`);return n}function Em(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=ma(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||ln[n].url).replace(/\/$/,"")}function Gv(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 Hc(e,t,n={}){return k(`${Em(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Kv(e={},t={}){let n;try{n=ma(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=ln[n];try{let o=await Hc(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Em(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:Em(n,e),error:String(o?.message||o),exec:!1}}}async function Am(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(ln).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Am({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:ln[c].name,error:String(l?.message||l)}}}))}}let r=ma(n),o=ln[r],i=await Hc(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 Yv(e={},t={}){let n=ma(e.chainId??e.chain),r=Gv(e.address||e.addr,"address"),o=ln[n],i=await Hc(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 Xv(e={},t={}){let n=ma(e.chainId??e.chain),r=Gv(e.address||e.addr,"address"),o=await Hc(n,`/api/v2/addresses/${encodeURIComponent(r)}/token-balances`,t),i=Array.isArray(o)?o:[],a=Math.min(500,Math.max(1,Number(e.limit||i.length||1)));return{provider:"bob-rootstock",chainId:n,chain:ln[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var _F="https://insights.braiins.com/api/v1.0";function Im(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||_F).replace(/\/$/,"")}function _m(e,t={}){return k(`${Im(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Qv(e={}){try{let t=await _m("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Im(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Im(e),error:String(t?.message||t),exec:!1}}}async function Jv(e={},t={}){let n=await _m("/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 Zv(e={},t={}){let n=await _m("/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,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.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:a.length,pools:a.slice(0,s).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:a.slice(0,s)}}L();var PF="https://api.cow.fi",eE=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function tE(e={}){return(e.baseUrl||process.env.COW_API_URL||PF).replace(/\/$/,"")}function NF(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=eE[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(eE).join(", ")})`);return n}function Tm(e,t,n){return`${tE(n)}/${NF(e)}/api/v1${t}`}function nE(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 rE(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function oE(e={},t={}){return k(Tm(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function iE(e={},t={}){let n=nE(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(rE(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await k(`${Tm(e,`/account/${n}/orders`,t)}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),i=Array.isArray(o)?o:[],a=e.openOnly===!1?i:i.filter(s=>String(s?.status||"").toLowerCase()==="open");return{owner:n,count:a.length,total:i.length,orders:a}}async function aE(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",nE(e.owner||e.address||e.user,"owner"));let r=await k(`${Tm(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,rE(e))}}async function sE(e={}){let t=await k(`${tE(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}}L();var OF="https://api.hiro.so",RF=20;function Pm(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||OF).replace(/\/$/,"")}function $F(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function fa(e,t={}){return k(`${Pm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:$F(t)})}async function cE(e={}){try{let t=await fa("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Pm(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:RF,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Pm(e),error:String(t?.message||t),exec:!1}}}async function lE(e={},t={}){let n=await fa("/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 uE(e={},t={}){let n=await fa("/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 dE(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await fa(`/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(a=>({cycleNumber:a.cycle_number??null,blockHeight:a.block_height??null,totalStackedAmount:a.total_stacked_amount==null?null:String(a.total_stacked_amount),totalWeight:a.total_weight??null,totalSigners:a.total_signers??null}))}}async function pE(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await fa(`/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}))}}L();var BF="https://bundles.jito.wtf",fE=1e9;function Nm(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||BF).replace(/\/$/,"")}function MF(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function mE(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*fE):null}function FF(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/fE:null,raw:e}}async function hE(e={}){try{let t=await k(`${Nm(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 gE(e={},t={}){let n=MF(e.limit,5,100),r=new URL(`${Nm(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 k(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(FF),s=a.map(c=>c.landedTipLamports).filter(c=>Number.isFinite(c));return{provider:"jito-mev",chain:"solana-mainnet-beta",count:a.length,totalTipLamports:s.reduce((c,l)=>c+l,0),maxTipLamports:s.length?Math.max(...s):null,bundles:a}}async function yE(e={}){let t=await k(`${Nm(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,mE(i)])),suggestedTipLamports:mE(r.p75||r.p50),raw:n}}L();var qF="https://api.kamino.finance";function DF(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||qF).replace(/\/$/,"")}function it(e){let t=Number(e);return Number.isFinite(t)?t:null}function bE(e={}){let t=it(e.totalValueLocked)??0,n=it(e.apy?.totalApy)??0,r=it(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:it(e.sharePrice),sharesIssued:it(e.sharesIssued),profitAndLoss:it(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:it(e.apy?.vault?.totalApr),apy24h:it(e.kaminoApy?.vault?.apy24h),apy7d:it(e.kaminoApy?.vault?.apy7d),apy30d:it(e.kaminoApy?.vault?.apy30d),poolPrice:it(e.apy?.vault?.poolPrice),priceLower:it(e.apy?.vault?.priceLower),priceUpper:it(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Cm(e={},t={}){let n=new URL(`${DF(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function wE(e={}){try{let t=await Cm({},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 xE(e={},t={}){let r=(await Cm(e,t)).map(bE),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 a=String(e.sortBy||"apy");r.sort((l,u)=>a==="tvl"?u.tvlUsd-l.tvlUsd:u.totalApy-l.totalApy);let s=Number.isFinite(Number(e.limit))&&Number(e.limit)>0?Number(e.limit):25,c=r.slice(0,s);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 SE(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Cm({...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",...bE(o),raw:o}}L();var jF="https://blockstream.info/liquid/api",kE="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function jc(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||jF).replace(/\/$/,"")}function zF(e,t="address"){let n=String(e||"").trim(),r=/^(ex1|lq1|el1|tex1|tlq1)[a-z0-9]{20,200}$/i.test(n),o=/^[QVGH][a-km-zA-HJ-NP-Z1-9]{25,110}$/.test(n);if(!r&&!o)throw new Error(`liquid-esplora: ${t} must look like a Liquid address (Q\u2026, VJL\u2026, ex1\u2026, lq1\u2026)`);return n}function VF(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 vE(e,t={}){let n=`${jc(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}function EE(e,t={}){return k(`${jc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function AE(e={}){try{let t=await vE("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:jc(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:jc(e),error:String(t?.message||t),exec:!1}}}async function IE(e={},t={}){let n=await vE("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function _E(e={},t={}){let n=zF(e.address||e.addr,"address"),r=await EE(`/address/${n}`,t),o=r.chain_stats||{},i=r.mempool_stats||{},a=o.funded_txo_sum!=null,s=Number(o.funded_txo_sum||0)+Number(i.funded_txo_sum||0),c=Number(o.spent_txo_sum||0)+Number(i.spent_txo_sum||0);return{provider:"liquid-esplora",address:n,txCount:Number(o.tx_count||0)+Number(i.tx_count||0),balanceSats:a?String(s-c):null,confidential:!a,note:a?void 0:"Liquid amounts are blinded \u2014 Esplora returns TXO counts only for confidential outputs. Unblind with the wallet's blinding key for values.",chainStats:o,mempoolStats:i,raw:r}}async function TE(e={},t={}){let n=VF(e.assetId||e.asset||kE,"assetId"),r=await EE(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===kE,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}}L();var GF="https://api-mainnet.magiceden.dev/v2/ord/btc",KF=600;function Om(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||GF).replace(/\/$/,"")}function YF(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function PE(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 NE(e,t={}){return k(`${Om(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:YF(t),retries:t.retries??1})}async function CE(e={}){let t=PE(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await NE(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Om(e),probeCollection:t,rateLimitRpm:KF,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Om(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 OE(e={},t={}){let n=PE(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await NE(`/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."}}}L();var QF="https://mempool.space/api",JF=7;function Rm(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||QF).replace(/\/$/,"")}function zc(e,t={}){return k(`${Rm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function RE(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>JF}}async function $E(e={}){try{let n=(await zc("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=RE(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Rm(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:Rm(e),error:String(t?.message||t),exec:!1}}}async function LE(e={},t={}){let r=(await zc("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=RE(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 BE(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 zc(`/v1/lightning/nodes/rankings/${n}`,t),i=Array.isArray(o)?o:[],a=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,a).map(s=>({publicKey:s.publicKey??null,alias:s.alias??null,channels:s.channels??null,capacitySats:s.capacity==null?null:String(s.capacity),firstSeen:s.firstSeen??null,updatedAt:s.updatedAt??null,city:s.city?.en??s.city??null,country:s.country?.en??s.country??null,iso:s.iso_code??null}))}}async function ME(e={},t={}){let n=await zc("/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((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var eU="https://mempool.space/api",FE=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function $m(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||eU).replace(/\/$/,"")}function UE(e,t){let n=String(e||t).trim().toLowerCase();if(!FE.has(n))throw new Error(`mempool-mining: window must be one of ${[...FE].join(", ")}`);return n}function ha(e,t={}){return k(`${$m(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function qE(e={}){try{let t=await ha("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:$m(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:$m(e),error:String(t?.message||t),exec:!1}}}async function DE(e={},t={}){let n=await ha("/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 HE(e={},t={}){let n=UE(e.window||e.timeframe,"1w"),r=await ha(`/v1/mining/pools/${n}`,t),o=Array.isArray(r?.pools)?r.pools:[],i=o.reduce((l,u)=>l+Number(u.blockCount||0),0),a=l=>i>0?Number(l.blockCount||0)/i*100:null,s=[...o].sort((l,u)=>Number(u.blockCount||0)-Number(l.blockCount||0)),c=Math.min(200,Math.max(1,Number(e.limit||s.length||1)));return{provider:"mempool-mining",window:n,totalBlocks:i,blockCount:r?.blockCount??null,lastEstimatedHashrate:r?.lastEstimatedHashrate??null,topPoolSharePct:s[0]?a(s[0]):null,top3SharePct:s.slice(0,3).reduce((l,u)=>l+(a(u)||0),0)||null,pools:s.slice(0,c).map(l=>({name:l.name??null,slug:l.slug??null,blockCount:l.blockCount??null,rank:l.rank??null,sharePct:a(l),emptyBlocks:l.emptyBlocks??null,avgMatchRate:l.avgMatchRate??null}))}}async function jE(e={},t={}){let n=UE(e.window||e.timeframe,"3d"),r=await ha(`/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 zE(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await ha(`/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}}L();var nU="https://amm-v2.meteora.ag",VE=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),WE=new Set(["dynamic","multitoken","lst","farms"]),rU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function oU(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||nU).replace(/\/$/,"")}function ze(e){let t=Number(e);return Number.isFinite(t)?t:null}function iU(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:ze(e.pool_lp_price_in_usd),tvlUsd:ze(e.pool_tvl),farmTvlUsd:ze(e.farm_tvl),volume24hUsd:ze(e.trading_volume),volume7dUsd:ze(e.weekly_trading_volume),fee24hUsd:ze(e.fee_volume),fee7dUsd:ze(e.weekly_fee_volume),tradeApyPct:ze(e.trade_apy),weeklyTradeApyPct:ze(e.weekly_trade_apy),baseApyPct:ze(e.daily_base_apy),farmingApyPct:ze(e.farming_apy),totalApyPct:(ze(e.trade_apy)??0)+(ze(e.farming_apy)??0),aprPct:ze(e.apr),feePct:ze(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 aU(e={},t={}){let n=new URL(`${oU(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 s=String(e.sortKey);if(!VE.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...VE].join(", ")}`);n.searchParams.set("sort_key",s),n.searchParams.set("order_by",e.orderBy==="asc"?"asc":"desc")}if(e.poolType!=null){let s=String(e.poolType);if(!WE.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...WE].join(", ")}`);n.searchParams.set("pool_type",s)}let i=e.filter??e.query??e.search;i!=null&&String(i).trim()&&n.searchParams.set("filter",String(i).trim());let a=e.mints||e.includeTokenMints;if(a){let s=(Array.isArray(a)?a:[a]).map(c=>String(c).trim());for(let c of s)if(!rU.test(c))throw new Error(`meteora-dlmm: mint ${c} is not a base58 public key`);n.searchParams.set("include_token_mints",s.join(","))}return{url:n,page:r,size:o}}async function Lm(e={},t={}){let{url:n,page:r,size:o}=aU(e,t),i=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(iU),totalCount:i?.total_count??null,page:r,size:o}}async function GE(e={}){try{let{pools:t,totalCount:n}=await Lm({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 KE(e={},t={}){let n=await Lm({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,a)=>i+(a.tvlUsd??0),0),pools:r}}async function YE(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 Lm({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}}L();var cU="https://ordinals.com";function Vc(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||cU).replace(/\/$/,"")}function lU(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 XE(e,t={}){let n=`${Vc(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 Bm(e,t={}){return k(`${Vc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function QE(e={}){try{let t=await XE("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Vc(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Vc(e),error:String(t?.message||t),exec:!1}}}async function JE(e={},t={}){let n=await XE("/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 ZE(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 Bm(`/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 eA(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}`,a=await Bm(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function tA(e={},t={}){let n=lU(e.name||e.rune||e.runeName,"name"),r=await Bm(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=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:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var dU="https://hermes.pyth.network",Fm={"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"},pU=/^[0-9a-fA-F]{64}$/;function nA(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||dU).replace(/\/$/,"")}function rA(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Fm[n.toUpperCase()]||Fm[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!pU.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 Mm(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Um(e={}){let t=Mm({price:Number(e.price?.conf),expo:e.price?.expo}),n=Mm(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Mm(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 qm(e,t={}){let n=new URL(`${nA(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"),k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function oA(e={}){try{let t=await qm([Fm["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Um):[])[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 iA(e={},t={}){let n=rA(e.feedId||e.id||e.symbol,"feedId"),r=await qm([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Um):[],i=o.find(a=>String(a.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 aA(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>rA(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=[];for(let l of i)a.push(await qm(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Um):[]),c=Object.fromEntries(s.map(l=>[String(l.id).toLowerCase(),l]));return{provider:"pyth-price-feeds",chain:"solana-mainnet-beta",requested:r.length,returned:s.length,missing:r.filter(l=>!c[l]),prices:s,byId:c}}async function sA(e={},t={}){let n=new URL(`${nA(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 k(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}))}}L();var fU="https://relayscan.io",cA=new Set(["1h","12h","24h","7d"]);function Dm(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||fU).replace(/\/$/,"")}function lA(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!cA.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...cA].join(", ")}`);return t}function hU(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 Hm(e={},t={}){return k(`${Dm(t)}/overview/json?t=${lA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function uA(e={},t={}){return k(`${Dm(t)}/builder-profit/json?t=${lA(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function dA(e={},t={}){let n=hU(e);return k(`${Dm(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function pA(e={}){let t=await Hm({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}}L();var yU="https://extra-api.sanctum.so",bU=30,wU=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function jm(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||yU).replace(/\/$/,"")}function mA(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 xU(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function xr(e,t,n={}){let r={},o={};for(let i of xU(t,bU)){let a=new URL(`${jm(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await k(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function fA(e={}){try{let[t,n]=await Promise.all([k(`${jm(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),xr("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 zm(e={},t={}){let n=await k(`${jm(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(a=>String(a.symbol||"").toLowerCase()===i||a.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 hA(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await zm({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=wU);let r=[...new Set(n.map(s=>mA(s,"lsts[]")))],[o,i]=await Promise.all([xr("apy/latest",r,t),xr("apy/inception",r,t)]),a=r.map(s=>{let c=Number(o.values[s]),l=Number(i.values[s]);return{lst:s,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[s]||i.errs[s]||null}});return a.sort((s,c)=>(c.apyInception??-1)-(s.apyInception??-1)),{provider:"sanctum-lst",chain:"solana-mainnet-beta",count:a.length,apys:a,byLst:Object.fromEntries(a.map(s=>[s.lst,s]))}}async function gA(e={},t={}){let n=mA(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([xr("apy/latest",[n],t),xr("apy/inception",[n],t),xr("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),xr("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*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}}L();var kU="https://api.save.finance",vU="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",yA="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",EU=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Vm(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||kU).replace(/\/$/,"")}function bA(e,t="address"){let n=String(e??"").trim();if(!EU.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function wA(e){let t=Number(e);return Number.isFinite(t)?t:null}function AU(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 IU(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:wA(e.rates?.supplyInterest),borrowApyPct:wA(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 xA(e={}){try{let t=await k(`${Vm(e)}/v1/reserves?ids=${yA}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:yA,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function Wm(e={},t={}){let n=new URL(`${Vm(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 k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(AU);if(e.includeHidden!==!0&&(o=o.filter(a=>!a.hidden)),e.name){let a=String(e.name).toLowerCase();o=o.filter(s=>String(s.name||"").toLowerCase()===a)}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 SA(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(s=>bA(String(s).trim(),"reserve"));else{let a=bA(e.market||e.marketAddress||vU,"market"),c=(await Wm({scope:"all",includeHidden:!0},t)).markets.find(l=>l.address===a);if(!c)throw new Error(`solend-lending: market ${a} 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 k(`${Vm(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...IU(a),address:a.address||a.reserve?.address||n[s]||null}));return{provider:"solend-lending",chain:"solana-mainnet-beta",requested:n.length,count:i.length,reserves:i}}function Gm(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 Sr(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 ga(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:Gm(e.amount,"amount")}}function Km(e,t){let n=t.map(a=>BigInt(a)),r=n.reduce((a,s)=>a+s,0n);if(r<=0n)throw new Error("weights must total above zero");let o=n.map(a=>e*a/r),i=e-o.reduce((a,s)=>a+s,0n);for(let a=0;i>0n;a=(a+1)%o.length)o[a]+=1n,i-=1n;return o}function ya(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 Ym(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 TU(e={},t={}){let n=ga(e),r=Sr(e.slices??10,"slices",2,100),o=Sr(e.durationSec??3600,"durationSec",r,604800),i=Km(n.total,Array(r).fill(1));return ya(n,"TWAP",Ym(i,o,t.nowMs),{durationSec:o})}function PU(e={},t={}){let n=ga(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=Sr(e.durationSec??3600,"durationSec",r.length,604800),i=Km(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Ym(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return ya(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function NU(e={}){let t=ga(e),n=Sr(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,a]of e.observedMarketVolumes.entries()){let s=Gm(a,"observedMarketVolumes"),c=s*BigInt(n)/10000n,l=c>r?r:c;if(l>0n&&o.push({index:i+1,amount:String(l),observedMarketVolume:String(s)}),r-=l,r===0n)break}return ya(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function CU(e={}){let t=ga(e),n=Gm(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 ya(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function OU(e={},t={}){let n=ga(e),r=Sr(e.slices??10,"slices",2,100),o=Sr(e.durationSec??3600,"durationSec",r,604800),i=Sr(e.urgencyBps??5e3,"urgencyBps",1,1e4),a=Array.from({length:r},(c,l)=>{let u=Math.floor(i*l/Math.max(1,r-1));return BigInt(Math.max(1,1e4-u))}),s=Km(n.total,a);return ya(n,"IS",Ym(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function kA(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return TU(e,t);if(n==="VWAP")return PU(e,t);if(n==="POV")return NU(e,t);if(n==="ICEBERG")return CU(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return OU(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function vA(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}var TA=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"})})});function Xm(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Oc,adapters:Object.freeze(Rc.adapters.map(e=>{let t=TA[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function PA(e,t={}){let n=xk(e,t),r=TA[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new ce(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var YU={"hl-info":{health:e=>m0(e),allMids:e=>Jt(e),l2Book:(e,t={})=>Cr(t.coin,e),outcomeMeta:e=>ii(e),clearinghouse:(e,t={})=>is(t.user,e),userFills:(e,t={})=>f0(t.user,e),meta:e=>as(e),metaAndAssetCtxs:e=>dt(e),candleSnapshot:(e,t={})=>Or(t,e),openOrders:(e,t={})=>h0(t.user,e),frontendOpenOrders:(e,t={})=>g0(t.user,e),userState:(e,t={})=>Rr(t.user,e),spotMeta:e=>cs(e)},"hl-vaults":{health:e=>w0(e),summaries:(e,t={})=>ku(t,e),details:(e,t={})=>ls(t,e),userEquities:(e,t={})=>vu(t,e),tracker:(e,t={})=>Eu(t,e)},"hl-precompiles":{health:e=>S0(e),read:(e,t={})=>x0(t,e),l1BlockNumber:e=>us(e),markPx:(e,t={})=>_u(t,e),oraclePx:(e,t={})=>Tu(t,e),spotPx:(e,t={})=>Pu(t,e),position:(e,t={})=>Nu(t,e),spotBalance:(e,t={})=>Cu(t,e),vaultEquity:(e,t={})=>Ou(t,e),withdrawable:(e,t={})=>Ru(t,e)},"hl-delta-neutral":{health:()=>z0(),scan:(e,t={})=>Zu(t,e),quote:(e,t={})=>ed(t,e),prepare:(e,t={})=>td(t,e),loop:(e,t={})=>Q0(t,e)},"lighter-delta-neutral":{health:()=>og(),scan:(e,t={})=>rd(t,e),quote:(e,t={})=>od(t,e),prepare:(e,t={})=>id(t,e),loop:(e,t={})=>pg(t,e)},"poly-public":{health:e=>fg(e),time:e=>ad(e),markets:(e,t={})=>hg(t,e),book:(e,t={})=>gg(t.tokenId,e),midpoint:(e,t={})=>yg(t.tokenId,e),spread:(e,t={})=>bg(t.tokenId,e),price:(e,t={})=>wg(t.tokenId,{side:t.side},e),events:(e,t={})=>xg(t,e)},"evm-rpc":{health:(e,t={})=>_r(t.chainId??1,e),healthAll:(e,t={})=>Kl({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Uo(t.chainId??1,e),chainId:(e,t={})=>Vl(t.chainId??1,e),getBalance:(e,t={})=>Qn(t.chainId??1,t.address,e),call:(e,t={})=>q(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>Gl(t,e),erc20Balance:(e,t={})=>qo(t,e),transactionReceipt:(e,t={})=>Do(t,e)},portfolio:{health:e=>yS(e),balances:(e,t={})=>Sc(t,e),snapshot:(e,t={})=>BS(t,e),history:(e,t={})=>Up(t,e),valueGraph:(e,t={})=>MS(t,e)},"nft-portfolio":{health:e=>ES(e),inventory:(e,t={})=>fo(t,e),gallery:(e,t={})=>TS(t,e),pnl:(e,t={})=>_S(t,e),prepareList:(e,t={})=>AS(t,e),traitSnipe:(e,t={})=>IS(t,e)},"contract-risk":{health:e=>FS(e),scan:(e,t={})=>hr(t,e)},"evm-token-sniper":{health:e=>DS(e),scan:(e,t={})=>qS(t,e)},"evm-simulate":{health:e=>jS(e),simulate:(e,t={})=>Ji(t,e)},"nft-mint":{health:e=>VS(e),discover:(e,t={})=>_c(t,e),prepare:(e,t={})=>Hp(t,e),priceGas:(e,t={})=>Ic(t,e),createTrigger:(e,t={})=>Lk(t,e),checkOpen:(e,t={})=>Bk(t,e),evaluateMancerOs:(e,t={})=>Uk(t,e)},"universal-mint-router":{health:()=>Nc(),capabilities:()=>ta(),prepare:(e,t={})=>na(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:Xm()}),capabilities:()=>Xm(),route:(e,t={})=>PA(t,e)},"erc8004-identity":{health:()=>Dd(),prepareIdentityRegistration:(e,t={})=>jd(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>zd(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Vd(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:ia,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>aa(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:sa,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>ca(t,e)},"universal-ordinals-transfer":{health:()=>({provider:la,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>ua(t,e)},"solana-rpc":{health:e=>kg(e),latestBlockhash:(e,t={})=>cd(t,e),getBalance:(e,t={})=>xs(t,e),tokenAccounts:(e,t={})=>wi(t,e),simulate:(e,t={})=>vg(t,e)},"bitcoin-esplora":{health:e=>Eg(e),tipHeight:e=>Ag(e),fees:e=>Ig(e),address:(e,t={})=>ks(t,e),utxos:(e,t={})=>_g(t,e),tx:(e,t={})=>Tg(t,e),decode:(e,t={})=>Pg(t,e)},"bitcoin-meta":{health:e=>Cg(e),runeBalances:(e,t={})=>Es(t,e),inscriptions:(e,t={})=>Dr(t,e),inscriptionInfo:(e,t={})=>Og(t,e),inscriptionChildren:(e,t={})=>Rg(t,e),ordBlockInfo:(e,t={})=>$g(t,e)},satflow:{health:e=>Bg(e),collectionFloors:(e,t={})=>Mg(t,e),collectionStats:(e,t={})=>Fg(t,e),item:(e,t={})=>Ug(t,e),walletContents:(e,t={})=>Is(t,e),floorListings:(e,t={})=>qg(t,e),preparePurchase:(e,t={})=>Hg(t,e),prepareList:(e,t={})=>_s(t,e)},jupiter:{health:e=>Xg(e),venues:(e,t={})=>Yg(t,e),quote:(e,t={})=>Ns(t,e),prepare:(e,t={})=>Qg(t,e)},defillama:{health:e=>Zg(e),prices:(e,t={})=>It(t.coins||[],e),pricesBySymbol:(e,t={})=>ny(t.symbols,e),protocols:e=>Cs(e),yields:(e,t={})=>ey(t,e),stablecoins:(e,t={})=>Os(t,e),dexVolumes:(e,t={})=>ty(t,e)},lifi:{health:e=>oy(e),quote:(e,t={})=>En(t,e),prepare:(e,t={})=>iy(t,e),chains:e=>ay(e)},dexscreener:{health:e=>ch(e),token:(e,t={})=>Jn(t.address||t.tokenAddress,e),search:(e,t={})=>Ho(t.q||t.query,e),pair:(e,t={})=>lh(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>vh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>mn(t,e),prepare:(e,t={})=>kh(t,e),quotePath:(e,t={})=>Sh(t,e),ethUsdc:(e,t={})=>tu(t,e),chains:()=>Eh()},"uniswap-v4":{health:(e,t={})=>Oh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Tr(t,e),chains:()=>Ch()},aerodrome:{health:(e,t={})=>fy({...e,chainId:t.chainId??8453}),quote:(e,t={})=>$s(t,e),prepare:(e,t={})=>my(t,e),chains:()=>hy()},zerox:{health:e=>wy(e),price:(e,t={})=>kd(t,e),quote:(e,t={})=>ar(t,e),prepare:(e,t={})=>xy(t,e)},across:{health:e=>vd(e),suggestedFees:(e,t={})=>Bs(t,e)},hop:{health:e=>Ed(e),quote:(e,t={})=>Ms(t,e)},relay:{health:e=>Ad(e),quote:(e,t={})=>ki(t,e),prepare:(e,t={})=>Id(t,e)},cowswap:{health:e=>Py(e),quote:(e,t={})=>In(t,e),prepareOrder:(e,t={})=>Ny(t,e),order:(e,t={})=>Oy(t,e),status:(e,t={})=>Cy(t,e),chains:()=>Ry()},oneinch:{health:e=>Ly(e),quote:(e,t={})=>Ai(t,e),prepare:(e,t={})=>By(t,e),approveSpender:(e,t={})=>Od(t,e)},"hl-ws":{health:e=>My(e),allMids:e=>Fy(e),l2Book:(e,t={})=>Uy(t.coin,e),snapshot:(e,t={})=>Ii(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>qy({...e,assetId:t.assetId}),book:(e,t={})=>Dy(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Ds(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>zh(e),collection:(e,t={})=>Go(t.slug,e),floor:(e,t={})=>Vh(t.slug,e),bestListings:(e,t={})=>Ja(t,e),bestListing:(e,t={})=>Za(t,e),bestOffer:(e,t={})=>es(t,e),accountNfts:(e,t={})=>Ko(t,e),accountPnl:(e,t={})=>Qa(t,e),prepareBuy:(e,t={})=>su(t,e),prepareSweep:(e,t={})=>cu(t,e),prepareMint:(e,t={})=>Qo(t,e),prepareList:(e,t={})=>Jo(t,e),prepareCancel:(e,t={})=>lu(t,e)},"anvil-nft":{health:(e,t={})=>Ab(t,e),markets:(e,t={})=>Vr(t,e),quoteSpecificBuy:(e,t={})=>Ti(t,e),quoteSell:(e,t={})=>zs(t,e),scanCollection:(e,t={})=>Vs(t,e),scanAllMarkets:(e,t={})=>yb(t,e),scanCrossVenueArb:(e,t={})=>Ud(t,e),scanAllMarketsArb:(e,t={})=>bb(t,e),prepareSpecificBuy:(e,t={})=>ub(t,e),prepareSell:(e,t={})=>db(t,e)},stonkbrokers:{health:(e,t={})=>Ib(t,e),quoteBrokerBuy:(e,t={})=>Ws(t,e),scanBrokerLoot:(e,t={})=>Sb(t,e),prepareBrokerBuy:(e,t={})=>kb(t,e),brokerDesk:(e,t={})=>Eb(t,e),clockInStatus:(e,t={})=>Pi(t,e),prepareClockIn:(e,t={})=>vb(t,e)},"hl-outcome":{list:e=>Cw(e),prepareOrder:(e,t={})=>Ow(t,e),prepareCancel:(e,t={})=>Rw(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:uc().map(e=>e.id),nativeTemplates:zi().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>uc(),listNative:()=>zi(),gate:(e,t={})=>Hi(t.templateId||t.id,e),prepareDeploy:(e,t={})=>mx(t,e),buildNative:(e,t={})=>Vi(t),eval:async()=>(await Promise.resolve().then(()=>(IA(),AA))).runContractsEval()},"poly-clob":{health:()=>Gw(),prepareOrder:(e,t={})=>Kw(t||{},e)},"hl-perps":{health:e=>tp(e),assetInfo:(e,t={})=>xn(t,e),prepareOrder:(e,t={})=>Mr(t,e),prepareCancel:(e,t={})=>hi(t,e),prepareLeverage:(e,t={})=>Yu(t,e),prepareIsolatedMargin:(e,t={})=>Xu(t,e),prepareBracket:(e,t={})=>Qu(t,e),prepareBuilderApproval:(e,t={})=>Ku(t,e)},"hl-markets":{health:e=>tp(e),markets:(e,t={})=>Js(t,e),leaderboards:(e,t={})=>ow(t,e),coin:(e,t={})=>iw(t,e),spot:(e,t={})=>aw(t,e)},"hl-entry-state":{health:e=>_w(e),see:(e,t={})=>Mi(t,e),qualify:(e,t={})=>Tw(t,e),lock:(e,t={})=>Pw(t,e),list:e=>op(e),watch:(e,t={})=>Nw(t,e)},"magiceden-sol":{health:e=>zb(e),stats:(e,t={})=>Gd(t,e),listings:(e,t={})=>Wb(t,e),tokenListings:(e,t={})=>Gb(t,e),prepareBuy:(e,t={})=>Kb(t,e),prepareList:(e,t={})=>Xs(t,e),prepareMint:(e,t={})=>Yb(t,e)},"hl-staking":{health:e=>Qb(e),validators:e=>Xd(e),delegatorSummary:(e,t={})=>Qd(t,e),delegations:(e,t={})=>Jd(t,e),rewards:(e,t={})=>Jb(t,e),history:(e,t={})=>Zb(t,e),preflight:(e,t={})=>rw(t,e),prepareStakeDeposit:(e,t={})=>ew(t,e),prepareStakeWithdraw:(e,t={})=>tw(t,e),prepareDelegate:(e,t={})=>nw(t,e)},"hyperevm-dex":{health:e=>qb(e),search:(e,t={})=>Db(t.q||t.query||"HYPE",e),token:(e,t={})=>Hb(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Ex(e),networks:(e,t={})=>hp(t,e),pool:(e,t={})=>Sx(t,e),token:(e,t={})=>kx(t,e),ohlcv:(e,t={})=>vx(t,e)},curve:{health:e=>Mx(e),openapi:e=>Bx(e),pools:(e,t={})=>yp(t,e),quote:(e,t={})=>bp(t,e),prepare:(e,t={})=>Fx(t,e)},gmx:{health:e=>bw(e),tickers:(e,t={})=>no(t,e),markets:(e,t={})=>gw(t,e),marketsInfo:(e,t={})=>rp(t,e),tokens:(e,t={})=>yw(t,e),prepareOrder:(e,t={})=>kw(t,e),positions:(e,t={})=>ww(t,e),orderStatus:(e,t={})=>xw(t,e),verifyOrder:(e,t={})=>Sw(t,e)},morpho:{health:e=>Hx(e),markets:(e,t={})=>Dx(t,e),vaults:(e,t={})=>Sp(t,e),prepareVault:(e,t={})=>jx(t,e)},balancer:{health:e=>Qx(e),pools:(e,t={})=>Xx(t,e),quote:(e,t={})=>Ep(t,e),prepare:(e,t={})=>Jx(t,e)},pendle:{health:e=>eS(e),markets:(e,t={})=>Ip(t,e),quote:(e,t={})=>tS(t,e),prepare:(e,t={})=>_p(t,e)},odos:{health:e=>iS(e),chains:e=>Pp(e),quote:(e,t={})=>rS(t,e),prepare:(e,t={})=>oS(t,e)},blockscout:{health:e=>mS(e),stats:(e,t={})=>Op(t,e),address:(e,t={})=>lS(t,e),token:(e,t={})=>uS(t,e)},paraswap:{health:e=>Dk(e),tokens:(e,t={})=>lm(t,e),price:(e,t={})=>Mn(t,e),quote:(e,t={})=>Mn(t,e),prepare:(e,t={})=>qk(t,e)},rfq:{health:e=>ov(e),intent:(e,t={})=>nv(t,e),quote:(e,t={})=>rv(t,e)},"polygon-staking":{health:e=>Ov(e),validators:(e,t={})=>Nv(t,e),validatorDetail:(e,t={})=>Cv(t,e)},"aave-v3":{health:e=>Bv(e),markets:(e,t={})=>Rv(t,e),marketReserves:(e,t={})=>$v(t,e),chains:e=>Lv(e)},"babylon-staking":{health:e=>Fv(e),stats:e=>Uv(e),finalityProviders:e=>qv(e),delegations:(e,t={})=>Dv(t,e)},"bisq-markets":{health:e=>jv(e),markets:e=>zv(e),ticker:(e,t={})=>Vv(t,e),trades:(e,t={})=>Wv(t,e)},"bob-rootstock":{health:(e,t={})=>Kv(t.chainId,e),stats:(e,t={})=>Am(t,e),addressInfo:(e,t={})=>Yv(t,e),tokenBalances:(e,t={})=>Xv(t,e)},"braiins-insights":{health:e=>Qv(e),priceStats:e=>Jv(e),poolStats:e=>Zv(e)},"cow-protocol":{health:e=>sE(e),auction:e=>oE(e),openOrders:(e,t={})=>iE(t,e),recentTrades:(e,t={})=>aE(t,e)},"hiro-stacks":{health:e=>cE(e),networkInfo:e=>lE(e),stackingInfo:e=>uE(e),poxCycles:e=>dE(e),blocks:(e,t={})=>pE(t,e)},"jito-mev":{health:e=>hE(e),recentBundles:(e,t={})=>gE(t,e),tipFloor:e=>yE(e)},"kamino-strategies":{health:e=>wE(e),strategies:(e,t={})=>xE(t,e),strategyMetrics:(e,t={})=>SE(t,e)},"liquid-esplora":{health:e=>AE(e),tipHeight:e=>IE(e),addressInfo:(e,t={})=>_E(t,e),assetInfo:(e,t={})=>TE(t,e)},"magiceden-ordinals":{health:e=>CE(e),collectionStat:(e,t={})=>OE(t,e)},"mempool-lightning":{health:e=>$E(e),statistics:e=>LE(e),nodeRankings:(e,t={})=>BE(t,e),nodeCountries:e=>ME(e)},"mempool-mining":{health:e=>qE(e),difficulty:e=>DE(e),poolShare:(e,t={})=>HE(t,e),hashrate:(e,t={})=>jE(t,e),rewardStats:(e,t={})=>zE(t,e)},"meteora-dlmm":{health:e=>GE(e),pools:(e,t={})=>KE(t,e),poolSearch:(e,t={})=>YE(t,e)},"ordinals-runes":{health:e=>QE(e),blockHeight:e=>JE(e),blockInfo:(e,t={})=>ZE(t,e),satInfo:(e,t={})=>eA(t,e),runeInfo:(e,t={})=>tA(t,e)},"pyth-price-feeds":{health:e=>oA(e),latestPrice:(e,t={})=>iA(t,e),latestPrices:(e,t={})=>aA(t,e),feedDirectory:e=>sA(e)},"relayscan-mev":{health:e=>pA(e),overview:(e,t={})=>Hm(t,e),builderProfit:(e,t={})=>uA(t,e),dailyStats:(e,t={})=>dA(t,e)},"sanctum-lst":{health:e=>fA(e),lstList:e=>zm(e),apyAll:e=>hA(e),apyIndividual:(e,t={})=>gA(t,e)},"solend-lending":{health:e=>xA(e),markets:e=>Wm(e),reserves:(e,t={})=>SA(t,e)},"execution-strategies":{health:()=>vA(),plan:(e,t={})=>kA(t)},"across-bridge":{health:e=>iv(e),pools:(e,t={})=>av(t,e),suggestedFees:(e,t={})=>sv(t,e)},"beefy-yields":{health:e=>cv(e),apy:(e,t={})=>lv(t,e),apyBreakdown:e=>uv(e)},"birdeye-tokens":{health:e=>pv(e),tokenList:(e,t={})=>mv(t,e)},"celestia-da":{health:e=>fv(e),stats:e=>hv(e),blockStats:(e,t={})=>gv(t,e)},"das-assets":{health:e=>yv(e),assetsByOwner:(e,t={})=>bv(t,e),searchAssets:(e,t={})=>wv(t,e),assetProof:(e,t={})=>xv(t,e)},"l2beat-tvl":{health:e=>Sv(e),tvl:(e,t={})=>kv(t,e),activity:(e,t={})=>vv(t,e)},"spark-lend":{health:e=>Ev(e),markets:(e,t={})=>Av(t,e)},"symbiotic-restaking":{health:e=>Iv(e),vaults:(e,t={})=>_v(t,e),vaultDetail:(e,t={})=>Tv(t,e)}},_A=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),NA=new Set(["hl-exec"]);function XU(e){return NA.has(String(e||""))}function QU(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(NA.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=oi().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!_A.has(r))throw new Error(`data plane forbidden op: ${o}`);if(i&&Array.isArray(i.ops)&&i.ops.length>0&&!i.ops.includes(r))throw new Error(`data plane: provider ${e} does not support op ${r}`);if(_A.has(r)&&n&&typeof n=="object"&&Object.defineProperty(n,"__oracleStateCreating",{value:!0,enumerable:!1,configurable:!0}),e==="evm-rpc"&&r==="call"){let a=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(a))throw new Error(`data plane allows only read-only JSON-RPC methods through evm-rpc.call: ${a||"<missing>"}`)}}async function _(e,t,n={},r={}){if(XU(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.`);QU(e,t,n);let o=os(e);if(!o)throw new Error(`Unknown data provider: ${e}`);if(!o.ops.includes(t))throw new Error(`Provider ${e} does not support op '${t}' (has: ${o.ops.join(", ")})`);let i=YU[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function CA({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||oi().map(d=>d.id);!o&&!e&&(s=s.filter(d=>d!=="hl-ws"&&d!=="poly-ws"));let c={fetchImpl:t,timeoutMs:n??8e3},l=typeof a=="function"?a:(d,p,m)=>_(d,"health",p,m),u={};return await Ve(s,i??8,async d=>{if(!os(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await Ie(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function OA(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function JU(e){return e.execution==="prepare"&&OA(e).length?"armed-local":e.execution||"read-only"}function RA(){return oi().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:JU(e),localSignerSurfaces:OA(e),description:e.description}))}var ZU={catalog:RA,health:CA,call:_,hl:{health:e=>_("hl-info","health",{},e),allMids:e=>_("hl-info","allMids",{},e),l2Book:(e,t)=>_("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>_("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>_("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>_("hl-info","userFills",{user:e},t),meta:e=>_("hl-info","meta",{},e),metaAndAssetCtxs:e=>_("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>_("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>_("hl-info","openOrders",{user:e},t),userState:(e,t)=>_("hl-info","userState",{user:e},t),spotMeta:e=>_("hl-info","spotMeta",{},e),vaults:{health:e=>_("hl-vaults","health",{},e),summaries:(e,t)=>_("hl-vaults","summaries",e||{},t),details:(e,t)=>_("hl-vaults","details",e||{},t),mine:(e,t)=>_("hl-vaults","userEquities",{user:e},t),track:(e,t)=>_("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>_("hl-entry-state","see",e||{},t),qualify:(e,t)=>_("hl-entry-state","qualify",e||{},t),lock:(e,t)=>_("hl-entry-state","lock",e||{},t),list:e=>_("hl-entry-state","list",{},e),watch:(e,t)=>_("hl-entry-state","watch",e||{},t)},staking:{health:e=>_("hl-staking","health",{},e),validators:e=>_("hl-staking","validators",{},e),summary:(e,t)=>_("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>_("hl-staking","delegations",{user:e},t),rewards:(e,t)=>_("hl-staking","rewards",{user:e},t),history:(e,t)=>_("hl-staking","history",{user:e},t),preflight:(e,t)=>_("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>_("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>_("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>_("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>_("poly-public","health",{},e),time:e=>_("poly-public","time",{},e),markets:(e,t)=>_("poly-public","markets",e||{},t),book:(e,t)=>_("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>_("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>_("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>_("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>_("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>_("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>_("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>_("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>_("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>_("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>_("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>_("evm-token-sniper","health",{},e),scan:(e,t)=>_("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>_("portfolio","balances",e||{},t),snapshot:(e,t)=>_("portfolio","snapshot",e||{},t),history:(e,t)=>_("portfolio","history",e||{},t),valueGraph:(e,t)=>_("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>_("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>_("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>_("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>_("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>_("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>_("opensea-nft","floor",{slug:e},t),collection:(e,t)=>_("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>_("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>_("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>_("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>_("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>_("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>_("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>_("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>_("universal-mint-router","health",{},e),capabilities:e=>_("universal-mint-router","capabilities",{},e),prepare:(e,t)=>_("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>_("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>_("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>_("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>_("solana-rpc","health",{},e),latestBlockhash:(e,t)=>_("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>_("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>_("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>_("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>_("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>_("jupiter","prepare",e||{},t),nftStats:(e,t)=>_("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>_("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>_("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>_("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>_("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>_("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>_("bitcoin-esplora","health",{},e),tipHeight:e=>_("bitcoin-esplora","tipHeight",{},e),fees:e=>_("bitcoin-esplora","fees",{},e),address:(e,t)=>_("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>_("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>_("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>_("bitcoin-esplora","decode",e||{},t),metaHealth:e=>_("bitcoin-meta","health",{},e),runeBalances:(e,t)=>_("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>_("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>_("satflow","health",{},e),satflowFloors:(e,t)=>_("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>_("satflow","walletContents",{address:e},t)},prices:{health:e=>_("defillama","health",{},e),current:(e,t)=>_("defillama","prices",{coins:e},t),bySymbol:(e,t)=>_("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>_("defillama","protocols",{},e)},lifi:{health:e=>_("lifi","health",{},e),quote:(e,t)=>_("lifi","quote",e||{},t),chains:e=>_("lifi","chains",{},e)},dex:{health:e=>_("dexscreener","health",{},e),token:(e,t)=>_("dexscreener","token",{address:e},t),search:(e,t)=>_("dexscreener","search",{q:e},t),pair:(e,t,n)=>_("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>_("uniswap-v3","health",e||{},t),quote:(e,t)=>_("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>_("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>_("uniswap-v3","ethUsdc",e||{},t),chains:e=>_("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>_("uniswap-v4","health",e||{},t),quote:(e,t)=>_("uniswap-v4","quote",e||{},t),chains:e=>_("uniswap-v4","chains",{},e)},bridges:{across:(e,t)=>_("across","suggestedFees",e||{},t),hop:(e,t)=>_("hop","quote",e||{},t),relay:(e,t)=>_("relay","quote",e||{},t)},cow:{quote:(e,t)=>_("cowswap","quote",e||{},t)},hlWs:{allMids:e=>_("hl-ws","allMids",{},e),l2Book:(e,t)=>_("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>_("poly-ws","book",{assetId:e},t)}};Dl();var Ot=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),LA={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"},ba=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function $A(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:a=0,estimatedGas:s=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:Ot.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=ba(n);if(p==null||p<=0n)return{source:t,quality:Ot.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?Ot.NO_GAS:Ot.FULL,amountOut:p.toString(),minOut:ba(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:s==null?null:String(s),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function BA(e,t,{divisor:n=1000n}={}){let r=ba(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,a;try{[i,a]=await Promise.all([e(o),e(r)])}catch{return null}let s=ba(i),c=ba(a);if(s==null||c==null||s<=0n)return null;let l=Number(s)/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:s.toString(),fullAmountOut:c.toString()}}function MA(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(s=>{let c=t?.[s.source];return c?c.impactPct>n?(r.push({source:s.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(s.source),!0)}),a=[...e.warnings??[]];return r.length&&a.push(`dropped ${r.length} route(s) on price impact: `+r.map(s=>`${s.source} (${s.impactPct}%)`).join(", ")),o.length&&a.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:a}}function Qm(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:a=null}={}){let s=e.filter(E=>E.quality!==Ot.FAILED),c=e.filter(E=>E.quality===Ot.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(a),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=s.map(E=>{let A=BigInt(E.amountOut),v=0n,P=!1,B=!1,te=BigInt(E.oracleFeeBps??0),Z=te>0n?A*te/10000n:0n;if(l){let U=E.gasUsd,J=Number(E.meta?.gasUnits??E.estimatedGas);if(U==null&&p&&Number.isFinite(J)&&J>0){let pe=J*u/1e18*d;Number.isFinite(pe)&&pe>=0&&(U=pe,B=!0)}let ke=(U??0)+(E.feeUsd??0);if(ke>0){let pe=ke/t*10**n;Number.isFinite(pe)&&pe>=0&&(v=BigInt(Math.floor(pe)),P=!0)}else U===0&&(P=!0)}let $=v+Z,H=A>$?A-$:0n;return{...E,grossOut:A.toString(),netOut:H.toString(),costInDest:v.toString(),oracleFeeInDest:Z.toString(),costAccounted:P,gasEstimated:B}}),f=Number(o)>0?Number(o):0,h=m.reduce((E,A)=>BigInt(A.netOut)>E?BigInt(A.netOut):E,0n),g=E=>h>0n?Number((h-BigInt(E))*10000n/h):0,w=[],x=m.slice().sort((E,A)=>BigInt(A.netOut)>BigInt(E.netOut)?1:-1)[0]??null;m.sort((E,A)=>{let v=g(E.netOut)<=f?0:1,P=g(A.netOut)<=f?0:1;if(r&&f>0&&v!==P)return v-P;if(r&&f>0){let B=E.liquidityUsd??-1,te=A.liquidityUsd??-1;if(B!==te)return te-B}return BigInt(A.netOut)>BigInt(E.netOut)?1:-1}),r&&f>0&&x&&m[0]&&m[0].source!==x.source&&w.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${x.source} within ${f} bps`);let y=m.filter(E=>!E.costAccounted).map(E=>E.source);l?y.length&&w.push(`gas not reported by: ${y.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):w.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let b=m[0];if(l&&b&&b.costAccounted===!1){let E=m.find(A=>A.costAccounted&&g(A.netOut)<=f);E&&w.push(`winner ${b.source} has UNMEASURED gas; gas-measured ${E.source} is within ${f} bps and may net more once ${b.source}'s real gas is paid \u2014 prefer it if unsure.`)}let S=m.filter(E=>E.gasEstimated).map(E=>E.source);S.length&&w.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${S.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let I=null,T=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let E=BigInt(m[0].netOut),A=BigInt(m[1].netOut);A>0n&&(I=Number((E-A)*10000n/A),T=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:I,spreadBasis:T,rankedOn:l?"net-of-cost":"gross",warnings:w}}async function Gc(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((a,s)=>setTimeout(()=>s(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let a=e[i].source;return o.status==="rejected"?$A({source:a,error:String(o.reason?.message||o.reason)}):$A({source:a,...o.value})})}var Wt=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function Kc(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=Wt(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function UA(e,t={}){let n=LA[Number(e)];if(!n)return null;try{let r=await It([n],t);return Wt(r?.coins?.[n]?.price)}catch{return null}}var Un=e=>String(e??"").toLowerCase().replace(/[^a-z0-9]/g,""),FA=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"]});async function eq(e={}){try{let t=await Cs({...e,baseUrl:e.defillamaApiBaseUrl,timeoutMs:e.defillamaTimeoutMs??Math.min(Number(e.timeoutMs??5e3),5e3)});return Array.isArray(t)?t:[]}catch{return[]}}function tq(e,t={}){let n=Un(t.tool||t.provider||t.bridge||t.protocol),r=[];return e==="lifi"&&n&&n!=="lifi"&&r.push(...FA[n]||[n]),r.push(...FA[Un(e)]||[e]),r}function nq(e,t,n={}){let r=Array.isArray(e)?e:[],o=tq(t,n).map(Un).filter(Boolean);for(let i of o){let a=r.find(c=>Un(c?.slug)===i||Un(c?.name)===i),s=Wt(a?.tvl);if(s!=null)return{liquidityUsd:s,protocol:a?.name??a?.slug??i}}for(let i of o){let a=r.find(c=>{let l=Un(c?.category);return!l.includes("bridge")&&!l.includes("crosschain")?!1:Un(c?.slug).includes(i)||Un(c?.name).includes(i)}),s=Wt(a?.tvl);if(s!=null)return{liquidityUsd:s,protocol:a?.name??a?.slug??i}}return null}function Jm({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:a,decimalsOut:s,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await En({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:Kc(m?.gasCosts),feeUsd:Kc(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),a!=null&&d.push({source:"paraswap",run:async()=>{let p=s??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await Mn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:Wt(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await ar({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Ai({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await In({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),De[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await mn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),ct[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await Tr({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}function qA({fromChainId:e,toChainId:t,tokenIn:n,tokenOut:r,amountIn:o,taker:i,opts:a={}}){let s=[],c=null,l=async(u,d={})=>(c||=eq(a),nq(await c,u,d));return s.push({source:"lifi",run:async()=>{let u=await En({fromChain:e,toChain:t,fromToken:n,toToken:r,fromAmount:o},a),d=u?.estimate??u?.[0]?.estimate,p={tool:u?.tool??u?.toolDetails?.name,durationSeconds:Wt(d?.executionDuration)},m=await l("lifi",p);return{amountOut:d?.toAmount,minOut:d?.toAmountMin,gasUsd:Kc(d?.gasCosts),feeUsd:Kc(d?.feeCosts),oracleFeeBps:u?.oracleFee?.applies?u.oracleFee.bps:0,liquidityUsd:m?.liquidityUsd??null,meta:{...p,liquidityProtocol:m?.protocol,oracleFee:u?.oracleFee??null}}}}),s.push({source:"relay",run:async()=>{let{relayQuote:u}=await Promise.resolve().then(()=>(Us(),Fs)),p=(await u({user:i,originChainId:e,destinationChainId:t,originCurrency:n,destinationCurrency:r,amount:String(o)},a))?.details,m={durationSeconds:Wt(p?.timeEstimate),rate:p?.rate},f=await l("relay",m);return{amountOut:p?.currencyOut?.amount,minOut:p?.currencyOut?.minimumAmount,gasUsd:Wt(p?.totalImpact?.usd)!=null?Math.abs(Wt(p.totalImpact.usd)):null,liquidityUsd:f?.liquidityUsd??null,meta:{...m,liquidityProtocol:f?.protocol}}}}),s.push({source:"across",run:async()=>{let{acrossSuggestedFees:u}=await Promise.resolve().then(()=>(Us(),Fs)),d=await u({token:n,destinationToken:r,originChainId:e,destinationChainId:t,amount:String(o)},a),p=d?.totalRelayFee?.total,m=null;if(p!=null)try{let h=BigInt(String(o))-BigInt(String(p));h>0n&&(m=h.toString())}catch{}let f=await l("across");return{amountOut:m,gasUsd:null,liquidityUsd:f?.liquidityUsd??null,meta:{derivedFromFees:!0,durationSeconds:Wt(d?.estimatedFillTimeSec),limits:d?.limits?{min:d.limits.minDeposit,max:d.limits.maxDeposit}:void 0,liquidityProtocol:f?.protocol}}}}),s}di();ge();var rq={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function DA(e,t,n){let r=rq[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await It([o],n))?.coins?.[o],s=Number(a?.price),c=Number(a?.decimals);return{priceUsd:Number.isFinite(s)?s:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function oq(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 a=UA(n,t),s=DA(n,o,t),c=Wl(n,t).catch(()=>null),l=Jm({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([Gc(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=Qm(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,x=await BA(async y=>{let b=Jm({...e,amountIn:y.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(I=>I.source===g);return b.length?(await Gc(b,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(x){let y=MA(f,{[g]:x},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...y,sourcesTried:l.length,sourcesAnswered:u.filter(b=>b.quality!==Ot.FAILED).length,note:Zm(y,l.length),priceImpact:{[g]:Number(x.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!==Ot.FAILED).length,note:Zm(f,l.length)}}async function iq(e,t={}){let{fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:a}=e;if(n==null||r==null||!o||!i||a==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 s=DA(r,i,t),c=qA({...e,opts:t}),[l,u]=await Promise.all([Gc(c,{timeoutMs:t.timeoutMs??15e3}),s]),d=Qm(l,{destPriceUsd:u.priceUsd,destDecimals:e.decimalsOut??u.decimals,liquidityBandBps:t.liquidityBandBps??50}),p=d.routes.map(m=>({source:m.source,seconds:m.meta?.durationSeconds??null})).filter(m=>m.seconds!=null);return{kind:"bridge",fromChainId:n,toChainId:r,tokenIn:o,tokenOut:i,amountIn:String(a),...d,durations:p,sourcesTried:c.length,sourcesAnswered:l.filter(m=>m.quality!==Ot.FAILED).length,note:Zm(d,c.length)}}function aq(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${L0(t)}`:""}function Zm(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=aq(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 a=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${a} 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 Xz=Object.freeze({mantissa:10000n,scale:0});function kr(e){if(!Number.isSafeInteger(e)||e<0||e>1e3)throw new RangeError("scale must be a safe integer from 0 through 1000")}function Gt(e,t){if(typeof e!="bigint")throw new TypeError("mantissa must be a bigint");return kr(t),Object.freeze({mantissa:e,scale:t})}function qn(e,t="value"){if(e===null||typeof e!="object")throw new TypeError(`${t} must be a fixed point value`);if(typeof e.mantissa!="bigint")throw new TypeError(`${t}.mantissa must be a bigint`);kr(e.scale)}function Yc(e){return kr(e),10n**BigInt(e)}function Q(e){if(typeof e!="string"||!/^[+-]?\d+(?:\.\d+)?$/.test(e))throw new TypeError("value must be a plain decimal string");let t=e.startsWith("-"),n=e[0]==="-"||e[0]==="+"?e.slice(1):e,[r,o=""]=n.split("."),i=`${r}${o}`,a=BigInt(i)*(t?-1n:1n);return Gt(a,o.length)}function Ye(e,t){if(kr(t),typeof e=="bigint")return Gt(e,t);if(typeof e!="string"||!/^[+-]?\d+$/.test(e))throw new TypeError("value must be an integer string or bigint");return Gt(BigInt(e),t)}function Rt(e){qn(e);let t=e.mantissa<0n,n=(t?-e.mantissa:e.mantissa).toString();if(e.scale===0)return`${t?"-":""}${n}`;let r=n.padStart(e.scale+1,"0"),o=r.length-e.scale;return`${t?"-":""}${r.slice(0,o)}.${r.slice(o)}`}function wa(e,t){return qn(e),kr(t),t===e.scale?Gt(e.mantissa,e.scale):t>e.scale?Gt(e.mantissa*Yc(t-e.scale),t):Gt(e.mantissa/Yc(e.scale-t),t)}function ef(e,t){qn(e,"left"),qn(t,"right");let n=Math.max(e.scale,t.scale);return[wa(e,n),wa(t,n),n]}function Dn(e,t){let[n,r,o]=ef(e,t);return Gt(n.mantissa+r.mantissa,o)}function xa(e,t){let[n,r,o]=ef(e,t);return Gt(n.mantissa-r.mantissa,o)}function at(e,t){qn(e,"left"),qn(t,"right");let n=e.scale+t.scale;return kr(n),Gt(e.mantissa*t.mantissa,n)}function $t(e,t,n=Math.max(e?.scale??0,t?.scale??0)){if(qn(e,"left"),qn(t,"right"),kr(n),t.mantissa===0n)throw new RangeError("division by zero");let r=e.mantissa*Yc(t.scale+n),o=t.mantissa*Yc(e.scale);return Gt(r/o,n)}function Hn(e,t){let[n,r]=ef(e,t);return n.mantissa<r.mantissa?-1:n.mantissa>r.mantissa?1:0}ic();import{readFileSync as sq,existsSync as cq}from"node:fs";import{fileURLToPath as lq}from"node:url";import{dirname as uq,join as jA}from"node:path";var dq=jA(uq(lq(import.meta.url)),"fixtures");function pq(){try{let e=co("equities-fixtures",import.meta.url);if(e&&cq(e))return e}catch{}return dq}var mq=pq();var zA=Object.freeze({venues:"venues.json",universe:"universe.json",oracles:"oracles.json",nyseHolidays:"nyse_holidays.json",dstTransitions:"dst_transitions.json",equityDexPools:"equity_dex_pools.json",rhPoolState:"rh_pool_state.json",solanaXstocks:"solana_xstocks.json",tonXstocks:"ton_xstocks.json",hip3L2Books:"hip3_l2books.json"});function fq(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function oe(e,t){throw new TypeError(`Fixture fixtures/${e}: ${t}`)}function Ae(e,t,n){fq(e)||oe(t,`${n} must be an object`)}function se(e,t,n){(typeof e!="string"||e.length===0)&&oe(t,`${n} must be a nonempty string`)}function Kt(e,t,n){Number.isSafeInteger(e)||oe(t,`${n} must be a safe integer`)}function jn(e,t,n){Ae(e,t,n);for(let[r,o]of Object.entries(e))se(r,t,`${n} key`),Ae(o,t,`${n}.${r}`)}function hq(e,t){Ae(e,t,"root"),Kt(e.capturedAt,t,"capturedAt"),Ae(e.venues,t,"venues");let n=[["hyperliquid_hip3","dexs"],["arcus","markets"],["arcus_spot","pairs"],["rh_uniswap","pools"],["rh_chainlink_oracles","assets"]];for(let[r,o]of n){let i=e.venues[r];Ae(i,t,`venues.${r}`),se(i.type,t,`venues.${r}.type`),se(i.chain,t,`venues.${r}.chain`),se(i.tier,t,`venues.${r}.tier`),jn(i[o],t,`venues.${r}.${o}`)}for(let[r,o]of Object.entries(e.venues.hyperliquid_hip3.dexs))jn(o,t,`venues.hyperliquid_hip3.dexs.${r}`)}function gq(e,t){jn(e,t,"root"),Object.keys(e).length===0&&oe(t,"root must not be empty");for(let[n,r]of Object.entries(e))Array.isArray(r.venues)||oe(t,`${n}.venues must be an array`),r.venues.forEach((o,i)=>se(o,t,`${n}.venues[${i}]`))}function yq(e,t){Ae(e,t,"root");for(let n of["chainId","block","oracleScaleExp","usdgDecimals","equityDecimals"])Kt(e[n],t,n);se(e.usdg,t,"usdg"),jn(e.assets,t,"assets");for(let[n,r]of Object.entries(e.assets))se(r.oracle,t,`assets.${n}.oracle`),se(r.token,t,`assets.${n}.token`),(typeof r.rawPrice!="string"||!/^\d+$/.test(r.rawPrice))&&oe(t,`assets.${n}.rawPrice must be an integer string`),(typeof r.usd!="number"||!Number.isFinite(r.usd)||r.usd<0)&&oe(t,`assets.${n}.usd must be a nonnegative finite source number`)}function bq(e,t){Ae(e,t,"root");for(let r of["holidayDayIndex","names","dates"])Array.isArray(e[r])||oe(t,`${r} must be an array`);let n=e.holidayDayIndex.length;(e.names.length!==n||e.dates.length!==n)&&oe(t,"holidayDayIndex, names, and dates must have equal lengths"),e.holidayDayIndex.forEach((r,o)=>Kt(r,t,`holidayDayIndex[${o}]`)),e.names.forEach((r,o)=>se(r,t,`names[${o}]`)),e.dates.forEach((r,o)=>{(typeof r!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(r))&&oe(t,`dates[${o}] must use YYYY-MM-DD`)})}function wq(e,t){Ae(e,t,"root"),(!Array.isArray(e.dstTransitions)||e.dstTransitions.length===0)&&oe(t,"dstTransitions must be a nonempty array");let n=new Set;e.dstTransitions.forEach((r,o)=>{Ae(r,t,`dstTransitions[${o}]`);for(let i of["year","startUtc","endUtc"])Kt(r[i],t,`dstTransitions[${o}].${i}`);r.startUtc>=r.endUtc&&oe(t,`dstTransitions[${o}] startUtc must be before endUtc`),n.has(r.year)&&oe(t,`dstTransitions contains duplicate year ${r.year}`),n.add(r.year)})}function xq(e,t){jn(e,t,"root"),Object.keys(e).length===0&&oe(t,"root must not be empty");for(let[n,r]of Object.entries(e)){for(let o of["addr","quote","quoteAddr","dex","pair"])se(r[o],t,`${n}.${o}`);(typeof r.liq!="number"||!Number.isFinite(r.liq)||r.liq<0)&&oe(t,`${n}.liq must be a nonnegative finite source number`)}}function Sq(e,t){Ae(e,t,"root"),Kt(e.capturedAt,t,"capturedAt"),Kt(e.block,t,"block"),Kt(e.chainId,t,"chainId"),se(e.gasPriceWei,t,"gasPriceWei"),se(e.stateView,t,"stateView"),jn(e.pools,t,"pools"),Object.keys(e.pools).length===0&&oe(t,"pools must not be empty");for(let[n,r]of Object.entries(e.pools)){for(let o of["pair","version","quote","token","sqrtPriceX96"])se(r[o],t,`pools.${n}.${o}`);r.version!=="v3"&&r.version!=="v4"&&oe(t,`pools.${n}.version must be v3 or v4`),typeof r.quoteIsToken0!="boolean"&&oe(t,`pools.${n}.quoteIsToken0 must be a boolean`),(!/^[0-9]+$/.test(r.sqrtPriceX96)||BigInt(r.sqrtPriceX96)<=0n)&&oe(t,`pools.${n}.sqrtPriceX96 must be a positive integer string`)}}function kq(e,t){Ae(e,t,"root"),Kt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),Ae(e.books,t,"books"),Object.keys(e.books).length===0&&oe(t,"books must not be empty");for(let[n,r]of Object.entries(e.books)){Ae(r,t,`books.${n}`),(!Array.isArray(r.bids)||!Array.isArray(r.asks))&&oe(t,`books.${n} must have bids and asks arrays`);for(let[o,i]of r.bids.entries())Ae(i,t,`books.${n}.bids[${o}]`),se(i.px,t,`books.${n}.bids[${o}].px`),se(i.sz,t,`books.${n}.bids[${o}].sz`);for(let[o,i]of r.asks.entries())Ae(i,t,`books.${n}.asks[${o}]`),se(i.px,t,`books.${n}.asks[${o}].px`),se(i.sz,t,`books.${n}.asks[${o}].sz`)}}function vq(e,t){Ae(e,t,"root"),Kt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),se(e.chain,t,"chain"),jn(e.tokens,t,"tokens"),Ae(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&oe(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){se(r.symbolRaw,t,`tokens.${n}.symbolRaw`),se(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||oe(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&oe(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ae(i,t,`pairs.${n}[${o}]`),se(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),se(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&oe(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&oe(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}function Eq(e,t){Ae(e,t,"root"),Kt(e.capturedAt,t,"capturedAt"),se(e.source,t,"source"),se(e.chain,t,"chain"),e.chain!=="ton"&&oe(t,'chain must be "ton"'),jn(e.tokens,t,"tokens"),Ae(e.pairs,t,"pairs"),Object.keys(e.tokens).length===0&&oe(t,"tokens must not be empty");for(let[n,r]of Object.entries(e.tokens)){se(r.symbolRaw,t,`tokens.${n}.symbolRaw`),se(r.mint,t,`tokens.${n}.mint`),Object.hasOwn(e.pairs,n)||oe(t,`pairs.${n} is required for token ${n}`),(!Array.isArray(e.pairs[n])||e.pairs[n].length===0)&&oe(t,`pairs.${n} must be a nonempty array`);for(let[o,i]of e.pairs[n].entries())Ae(i,t,`pairs.${n}[${o}]`),se(i.pairAddress,t,`pairs.${n}[${o}].pairAddress`),se(i.dexId,t,`pairs.${n}[${o}].dexId`),(typeof i.priceUsd!="number"||!Number.isFinite(i.priceUsd)||i.priceUsd<=0)&&oe(t,`pairs.${n}[${o}].priceUsd must be a positive finite number`),(typeof i.liquidityUsd!="number"||!Number.isFinite(i.liquidityUsd)||i.liquidityUsd<0)&&oe(t,`pairs.${n}[${o}].liquidityUsd must be a nonnegative finite number`)}}var Aq=Object.freeze({venues:hq,universe:gq,oracles:yq,nyseHolidays:bq,dstTransitions:wq,equityDexPools:xq,rhPoolState:Sq,solanaXstocks:vq,tonXstocks:Eq,hip3L2Books:kq});function Iq(e,t){let n=zA[t],r=jA(e,n),o;try{o=sq(r,"utf8")}catch(a){throw a?.code==="ENOENT"?new Error(`Fixture fixtures/${n} is missing at ${r}`):new Error(`Fixture fixtures/${n} could not be read: ${a.message}`)}let i;try{i=JSON.parse(o)}catch(a){throw new SyntaxError(`Fixture fixtures/${n} contains invalid JSON: ${a.message}`)}return Aq[t](i,n),i}function VA(e){if(e!==null&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))VA(t)}return e}function WA({fixtureDir:e=mq}={}){if(typeof e!="string"||e.length===0)throw new TypeError("fixtureDir must be a nonempty path string");let t={};for(let n of Object.keys(zA))t[n]=Iq(e,n);return VA(t)}var HA;function zn(){return HA??=WA(),HA}function wt(){return zn().venues}function GA(){return zn().oracles}function KA(){return zn().nyseHolidays}function YA(){return zn().dstTransitions}function Xc(){return zn().rhPoolState}function XA(){return zn().solanaXstocks}function QA(){return zn().tonXstocks}function JA(){return zn().hip3L2Books}var nf=1e3,tI=60*nf,rf=60*tI,ZA=24*rf,_q=-5*rf,Tq=-4*rf,nI=240,rI=570,oI=960,iI=1200,oV=Object.freeze([nI,rI,oI,iI]),iV=Object.freeze(["core","extended","dark"]),eI,tf;function Pq(){let e=YA().dstTransitions.map(r=>({year:r.year,startMs:r.startUtc*nf,endMs:r.endUtc*nf}));e.sort((r,o)=>r.startMs-o.startMs);let t=e[0].year,n=e[e.length-1].year;return Object.freeze({rows:Object.freeze(e),firstYear:t,lastYear:n,coverageStartMs:Date.UTC(t,0,1),coverageEndMs:Date.UTC(n+1,0,1)})}function aI(){return eI??=Pq(),eI}function Nq(){return tf===void 0&&(tf=new Set(KA().holidayDayIndex)),tf}function sI(e,t){if(!Number.isSafeInteger(e))throw new TypeError(`${t}: epochMs must be a safe integer number of milliseconds`)}function Cq(e,t){let{coverageStartMs:n,coverageEndMs:r,firstYear:o,lastYear:i}=aI();if(e<n||e>=r)throw new RangeError(`${t}: ${new Date(e).toISOString()} is outside DST fixture coverage (${o} through ${i}). Refusing to assume a UTC offset.`)}function Oq(e){for(let t of aI().rows)if(e>=t.startMs&&e<t.endMs)return!0;return!1}function Rq(e){return Oq(e)?Tq:_q}function $q(e){let t=e+Rq(e),n=Math.floor(t/ZA),r=t-n*ZA,o=new Date(t);return{dayIndex:n,minuteOfDay:Math.floor(r/tI),msIntoDay:r,weekday:o.getUTCDay()}}function Lq({dayIndex:e,weekday:t}){return t===0||t===6?!1:!Nq().has(e)}function Bq(e){return e<nI?"dark":e<rI?"extended":e<oI?"core":e<iI?"extended":"dark"}function Sa(e){sI(e,"sessionState"),Cq(e,"sessionState");let t=$q(e);return Lq(t)?Bq(t.minuteOfDay):"dark"}function of(e){return sI(e,"isDark"),Sa(e)==="dark"}var Qc=Object.freeze({DORMANT_VENUE:"dormant-venue",CROSSED_BOOK:"crossed-book",STALE_QUOTE:"stale-quote",STALE_ORACLE:"stale-oracle"}),Mq=12e4,Fq=6e5;function Jc(e,t){e.push(Object.freeze({venue:t.venue,symbol:t.symbol??null,reason:t.reason,evidence:t.evidence??null}))}function Uq(e){let t=e.raw?.vol24h;return!!(t===0||t===0||typeof t=="number"&&Number.isFinite(t)&&t<=0)}function qq(e){return!e.bid||!e.ask?!1:Hn(e.bid,e.ask)>0}function cI(e,t,n){return Number.isSafeInteger(e.capturedAt)?t-e.capturedAt>n:!1}function Zc(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??Date.now(),r=t.quoteFreshnessMs??Mq,o=t.oracleFreshnessMs??Fq,i=t.includeDormant===!0,a=[],s=[];for(let c of e){if(Uq(c)){i?a.push(Object.freeze({...c,staleData:!0})):Jc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qc.DORMANT_VENUE,evidence:{vol24h:c.raw?.vol24h??null}});continue}if(qq(c)){Jc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qc.CROSSED_BOOK,evidence:{bid:c.bid?String(c.bid.mantissa)+"e-"+c.bid.scale:null,ask:c.ask?String(c.ask.mantissa)+"e-"+c.ask.scale:null}});continue}if(cI(c,n,r)){Jc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qc.STALE_QUOTE,evidence:{capturedAt:c.capturedAt,nowMs:n,ageMs:n-c.capturedAt,freshnessMs:r}});continue}if(c.tier==="read-only"&&c.raw?.oracleRaw!==void 0){let l=Sa(n),u=l==="core"?o:o*2;if(cI(c,n,u)){Jc(s,{venue:c.venue,symbol:c.symbolRaw??c.symbol,reason:Qc.STALE_ORACLE,evidence:{capturedAt:c.capturedAt,nowMs:n,session:l}});continue}}a.push(c)}return{survivors:a,excluded:s}}function Dq(e){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError("value must be a finite number");let t=String(e);if(!t.includes("e")&&!t.includes("E"))return t;let[n,r]=t.split(/[eE]/),o=Number(r),i=n.startsWith("-"),a=i?n.slice(1):n,[s,c=""]=a.split("."),l=`${s}${c}`,u=s.length+o,d;return u<=0?d=`0.${"0".repeat(-u)}${l}`:u>=l.length?d=`${l}${"0".repeat(u-l.length)}`:d=`${l.slice(0,u)}.${l.slice(u)}`,`${i?"-":""}${d}`}function Re(e){return e==null?null:typeof e=="string"?Q(e):typeof e!="number"||!Number.isFinite(e)?null:Q(Dq(e))}function Lt(e,t){let n=Re(e);if(n===null)throw new TypeError(`${t} must be a finite source number`);return n}var Hq=new Set(["spot","perp"]),jq=new Set(["read-only","quote-only","prepare","intent"]),zq=new Set(["buy","sell"]),Vq=new Set(["net-of-cost","gross"]),Wq=new Set(["homogeneous","heterogeneous"]),Gq=["bid","ask","mid","mark"],lI=["fees","gasEstimate","priceImpact","fundingHourly"],Kq=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function fe(e,t){throw new TypeError(`${e} ${t}`)}function dI(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function vr(e,t){dI(e)||fe(t,"must be an object")}function pI(e,t,n){Object.hasOwn(e,t)||fe(`${n}.${t}`,"is required")}function Ao(e,t){(typeof e!="string"||e.length===0)&&fe(t,"must be a nonempty string")}function ka(e,t,n){t.has(e)||fe(n,`must be one of ${[...t].join(", ")}`)}function sf(e,t){(!Number.isSafeInteger(e)||e<0)&&fe(t,"must be a nonnegative safe integer")}function af(e,t,n=!1){e===null&&n||(dI(e)||fe(t,"must be a fixed point value"),typeof e.mantissa!="bigint"&&fe(`${t}.mantissa`,"must be a bigint"),(!Number.isSafeInteger(e.scale)||e.scale<0)&&fe(`${t}.scale`,"must be a nonnegative safe integer"))}function el(e,t,n=!1){e===null&&n||vr(e,t)}function uI(e,t){vr(e,t),Ao(e.venue,`${t}.venue`),Ao(e.reason,`${t}.reason`),Kq.test(e.reason)||fe(`${t}.reason`,"must be a machine readable lower case code"),Object.hasOwn(e,"symbol")&&e.symbol!==null&&Ao(e.symbol,`${t}.symbol`)}function st(e){vr(e,"quote");for(let n of["venue","chain","instrument","tier","symbolRaw","symbol","side","requestedSize",...lI,"costAccounted","capturedAt","blockOrSeq","raw"])pI(e,n,"quote");Ao(e.venue,"quote.venue"),!(typeof e.chain=="string"&&e.chain.length>0)&&!(Number.isSafeInteger(e.chain)&&e.chain>=0)&&fe("quote.chain","must be a nonempty string or nonnegative chain id"),ka(e.instrument,Hq,"quote.instrument"),ka(e.tier,jq,"quote.tier"),Ao(e.symbolRaw,"quote.symbolRaw"),Ao(e.symbol,"quote.symbol"),ka(e.side,zq,"quote.side"),af(e.requestedSize,"quote.requestedSize"),e.requestedSize.mantissa<0n&&fe("quote.requestedSize","must not be negative");let t=0;for(let n of Gq)Object.hasOwn(e,n)&&(af(e[n],`quote.${n}`),t+=1);t===0&&fe("quote","must contain at least one of bid, ask, mid, mark");for(let n of lI)af(e[n],`quote.${n}`,!0);if(typeof e.costAccounted!="boolean"&&fe("quote.costAccounted","must be a boolean"),e.costAccounted){for(let n of["fees","gasEstimate","priceImpact"])e[n]===null&&fe(`quote.${n}`,"cannot be unknown when costAccounted is true");e.instrument==="perp"&&e.fundingHourly===null&&fe("quote.fundingHourly","cannot be unknown when costAccounted is true for a perp")}return e.instrument==="spot"&&e.fundingHourly!==null&&fe("quote.fundingHourly","must be null for a spot quote"),sf(e.capturedAt,"quote.capturedAt"),e.blockOrSeq!==null&&!(typeof e.blockOrSeq=="string"&&e.blockOrSeq.length>0)&&!(Number.isSafeInteger(e.blockOrSeq)&&e.blockOrSeq>=0)&&fe("quote.blockOrSeq","must be null, a nonempty string, or a nonnegative safe integer"),vr(e.raw,"quote.raw"),e}function cf(e){vr(e,"rankResult");for(let t of["rankedOn","ranked","winner","runnersUp","improvementBps","sourcesAnswered","sourcesTried","failed","excluded","darkWindow","instrumentMix","bestPreparable"])pI(e,t,"rankResult");return ka(e.rankedOn,Vq,"rankResult.rankedOn"),Array.isArray(e.ranked)||fe("rankResult.ranked","must be an array"),e.ranked.forEach((t,n)=>el(t,`rankResult.ranked[${n}]`)),el(e.winner,"rankResult.winner",!0),e.ranked.length===0&&e.winner!==null&&fe("rankResult.winner","must be null when ranked is empty"),e.ranked.length>0&&e.winner===null&&fe("rankResult.winner","must be present when ranked is not empty"),Array.isArray(e.runnersUp)||fe("rankResult.runnersUp","must be an array"),e.runnersUp.forEach((t,n)=>el(t,`rankResult.runnersUp[${n}]`)),e.improvementBps!==null&&!(typeof e.improvementBps=="number"&&Number.isFinite(e.improvementBps))&&fe("rankResult.improvementBps","must be a finite number or null"),sf(e.sourcesAnswered,"rankResult.sourcesAnswered"),sf(e.sourcesTried,"rankResult.sourcesTried"),e.sourcesAnswered>e.sourcesTried&&fe("rankResult.sourcesAnswered","must not exceed sourcesTried"),Array.isArray(e.failed)||fe("rankResult.failed","must be an array"),e.failed.forEach((t,n)=>uI(t,`failed[${n}]`)),Array.isArray(e.excluded)||fe("rankResult.excluded","must be an array"),e.excluded.forEach((t,n)=>uI(t,`excluded[${n}]`)),e.darkWindow!==null&&vr(e.darkWindow,"rankResult.darkWindow"),ka(e.instrumentMix,Wq,"rankResult.instrumentMix"),el(e.bestPreparable,"rankResult.bestPreparable",!0),Object.hasOwn(e,"carry")&&e.carry!==null&&vr(e.carry,"rankResult.carry"),e}var Yq="arcus_perp",Xq="robinhood-4663",Qq="quote-only",tl="0.00000480324074074";function mI(){return wt().venues.arcus}function Jq(){return Object.keys(mI().markets).sort()}function Zq({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e.endsWith("-USD")?e.slice(0,-4):e,o=mI().markets[r];if(!o)return null;let i=Lt(o.mark,`${r}.mark`),a=Re(o.oracle),s=Re(o.fundingHourly),c=n===null?Q("0"):n,l={venue:Yq,chain:Xq,instrument:"perp",tier:Qq,symbolRaw:e,symbol:r,side:t,requestedSize:c,mark:i,fees:null,gasEstimate:null,priceImpact:null,fundingHourly:s,costAccounted:!1,capturedAt:wt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus",oraclePrice:o.oracle,vol24h:o.vol24h,oi:o.oi,fundingAnnPct:o.fundingAnnPct,category:o.category,isOutsideRth:o.isOutsideRth===!0,rth:o.rth,darkWindowFundingHourly:tl,initialMarginFraction:o.initialMarginFraction??null,offHoursInitialMarginFraction:o.offHoursInitialMarginFraction??null,reasonCostUnknown:"fees, gas, and impact at size not captured for Arcus perps"}};return a!==null&&(l.raw.oracleFixed=a),st(l)}function nl({side:e="buy",sizeUsd:t=null}={}){return Jq().map(n=>Zq({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var fI=36e5,kV=24*365;function lf(e,t,n=8){if(e==null)throw new TypeError("hourlyFundingRate is required");if(!Number.isFinite(t)||t<0)throw new RangeError("horizonHours must be a nonnegative finite number");if(t===0)return Q("0");let r=Q(String(t)),o=Ye(10000n,0);return at(at(e,r),o)}function hI(e,t,n={}){if(e.instrument!=="perp")return{model:"current-funding-held-constant",horizonHours:t,carryBps:Q("0"),carryBpsDisplay:"0",confidence:"estimate",note:"spot has no funding carry"};let r=n.nowMs??Date.now(),o=n.applyDarkWindowLock===!0,i=e.fundingHourly;if(o&&i!==null){let s=e6(r,t),c=t-s,l=Q(tl),u=lf(i,c),d=lf(l,s),p=Math.max(u.scale,d.scale),m={mantissa:u.mantissa*10n**BigInt(p-u.scale)+d.mantissa*10n**BigInt(p-d.scale),scale:p};return{model:"current-funding-held-constant",horizonHours:t,carryBps:m,carryBpsDisplay:Rt(m),confidence:"estimate",darkHours:s,litHours:c,darkWindowRate:tl,compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}if(i===null)return{model:"current-funding-held-constant",horizonHours:t,carryBps:null,carryBpsDisplay:null,confidence:"estimate",note:"funding rate unknown"};let a=lf(i,t);return{model:"current-funding-held-constant",horizonHours:t,carryBps:a,carryBpsDisplay:Rt(a),confidence:"estimate",compounding:"ignored",compoundingErrorBoundNote:"simple sum; at 30d and 1e-5/h the ignored compound is under 0.5bp"}}function e6(e,t){if(t<=0)return 0;let n=0,r=Math.floor(t);for(let o=0;o<r;o+=1)of(e+o*fI)&&(n+=1);return t>r&&of(e+r*fI)&&(n+=t-r),n}function t6(e){return e.mid??e.mark??e.ask??e.bid??null}function n6(e){let t=t6(e);if(t===null)return null;let n=e.costAccounted===!0,r=Q("0");e.fees!==null?r=Dn(r,e.fees):n=!1,e.priceImpact!==null?r=Dn(r,e.priceImpact):e.requestedSize&&e.requestedSize.mantissa>0n&&(n=!1),e.gasEstimate===null?n=!1:r=Dn(r,e.gasEstimate);let o;if(e.fees!==null&&Hn(e.fees,Q("1"))<0&&Hn(e.fees,Q("0"))>=0){let i=Dn(Q("1"),e.fees);o=at(t,i),e.priceImpact!==null&&(o=Dn(o,at(t,e.priceImpact)))}else o=Dn(t,r);return{net:o,costAccounted:n,px:t}}function r6(e,t,n=null){return{venue:e.venue,chain:e.chain,instrument:e.instrument,tier:e.tier,symbol:e.symbol,symbolRaw:e.symbolRaw,side:e.side,price:t.px,net:t.net,costAccounted:t.costAccounted,fundingHourly:e.fundingHourly,carry:n,quote:e}}function o6(e,t){if(!e||!t||!e.costAccounted||!t.costAccounted||e.instrument!==t.instrument||e.net.mantissa===0n)return null;let n=xa(t.net,e.net);return $t(at(n,Ye(10000n,0)),t.net,4)}function uf(e,t={}){if(!Array.isArray(e))throw new TypeError("quotes must be an array");let n=t.nowMs??e[0]?.capturedAt??Date.now(),r=e.length,o=e,i=[];if(!t.skipLiveness){let T=Zc(e,{nowMs:n});o=T.survivors,i=T.excluded}let a=e.length,s=[],c=t.horizonHours,l=Number.isFinite(c)&&c>0,u=[];for(let T of o){let E=n6(T);if(E===null)continue;let A=null;if(l&&T.instrument==="perp"&&(A=hI(T,c,{nowMs:n}),A.carryBps!==null)){let v=Dn(Q("1"),$t(A.carryBps,Ye(10000n,0),12));E.net=at(E.net,v),E.costAccounted=!1}u.push(r6(T,E,A))}let d=u,p="homogeneous";if(l)p="heterogeneous",d=u;else{let T=u.filter(A=>A.instrument==="spot"),E=u.filter(A=>A.instrument==="perp");T.length>0&&E.length>0?(d=T.length>=E.length?T:E,p="homogeneous"):(d=u,p="homogeneous")}d.sort((T,E)=>{let A=Hn(T.net,E.net);return A!==0?A:T.venue<E.venue?-1:T.venue>E.venue?1:0});let m=d[0]??null,f=d.slice(1),h=d,g="gross";m&&m.costAccounted&&(f.length===0||f[0].costAccounted)&&(g="net-of-cost");let w=f.length===0?null:o6(m,f[0]),x=u.find(T=>T.tier==="prepare")??null,y=Sa(n),b=y==="core"?null:{session:y,warning:y==="dark"?"market is dark; marks are not real price discovery":"extended session; thinner books and higher staleness risk"},S=null;l&&(S=i6(u));let I={rankedOn:g,ranked:h,winner:m,runnersUp:f,improvementBps:w===null?null:Number(Rt(w)),sourcesAnswered:a,sourcesTried:r,failed:s,excluded:i,darkWindow:b,instrumentMix:p,bestPreparable:x,carry:m?.carry??null,breakEvenHorizonHours:S};return cf(I)}function i6(e){let t=e.filter(i=>i.instrument==="spot").sort((i,a)=>Hn(i.net,a.net))[0],n=e.filter(i=>i.instrument==="perp").sort((i,a)=>Hn(i.net,a.net))[0];if(!t||!n||n.fundingHourly===null)return null;let r=xa(t.net,n.net);if(r.mantissa===0n)return 0;let o=at(n.fundingHourly,n.price);if(o.mantissa===0n)return null;try{let i=$t(r,o,4),a=Number(Rt(i));return!Number.isFinite(a)||a<0?null:a}catch{return null}}var a6="rh_uniswap",s6=4663,c6="prepare",l6=1n<<192n,Io=18,u6=Object.freeze({v3:180000n,v4:240000n});function df(){return Xc()}function d6(e){return{mantissa:e*e*10n**BigInt(Io)/l6,scale:Io}}function p6(e){let t=d6(BigInt(e.sqrtPriceX96)),n=e.quote==="USDG"?6:18,r=18;if(e.quoteIsToken0){let o=$t(at(t,Ye(10n**BigInt(n),0)),Ye(10n**BigInt(r),0),Io);return o.mantissa===0n?null:$t(Q("1"),o,Io)}return $t(at(t,Ye(10n**BigInt(r),0)),Ye(10n**BigInt(n),0),Io)}function m6(e){let t=GA(),n=t.assets[e];return n?Ye(n.rawPrice,t.oracleScaleExp):null}function f6(e,t){if(e===null||t===null||e.mantissa<=0n||t.mantissa<=0n)return null;let n={...e};return $t(t,h6(n,t),Io)}function h6(e,t){let n=Math.max(e.scale,t.scale);return{mantissa:wa(e,n).mantissa+wa(t,n).mantissa,scale:n}}function g6(e){let t=df(),n=u6[e];return n?{wei:BigInt(t.gasPriceWei)*n,units:n,native:"ETH"}:null}function pf(){return Object.keys(df().pools).sort()}function _o({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)throw new TypeError("symbol must be a nonempty string");let r=df(),o=r.pools[e];if(!o)return null;let i=p6(o);if(i===null)return null;let a=Re(o.liqUsd),s=n===null?Q("0"):n,c=o.feePpm===null||o.feePpm===void 0?null:$t(Ye(BigInt(o.feePpm),0),Ye(1000000n,0),8),l=s.mantissa===0n?Q("0"):f6(a,s),u=g6(o.version),m={venue:a6,chain:s6,instrument:"spot",tier:c6,symbolRaw:e,symbol:e,side:t,requestedSize:s,mid:i,fees:c,gasEstimate:null,priceImpact:l,fundingHourly:null,costAccounted:!1,capturedAt:r.capturedAt*1e3,blockOrSeq:r.block,raw:{fixture:"fixtures/rh_pool_state.json",pair:o.pair,version:o.version,sqrtPriceX96:o.sqrtPriceX96,quote:o.quote,quoteIsToken0:o.quoteIsToken0,liqUsd:o.liqUsd,gasNativeWei:u===null?null:u.wei.toString(),gasUnits:u===null?null:u.units.toString(),impactModel:"constant-product-estimate",notes:["price read live from chain 4663",o.version==="v4"?"v4 fee may be dynamic via hook and was not captured":"v3 fee tier is the pool static fee","gas known in native wei only, no ETH price captured to denominate it"]}},f=m6(e);return f!==null&&(m.referencePrice=f,m.referenceBasisBps=Rt($t(at(xa(i,f),Ye(10000n,0)),f,4))),st(m)}function gI({side:e="buy",sizeUsd:t=null}={}){return pf().map(n=>_o({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var yI=12e4,y6="0x0000000000000000000000000000000000000000",b6="0x84b75b19A3cdf8E2F56d0507d22D442847B2053C";function mf(e={}){let{symbol:t,side:n="buy",sizeUsd:r=null,recipient:o,nowMs:i=Date.now()}=e;if(typeof t!="string"||!t)throw new TypeError("symbol is required");if(typeof o!="string"||!/^0x[0-9a-fA-F]{40}$/.test(o))throw new TypeError("recipient must be a 0x-prefixed 20 byte address");let a=_o({symbol:t,side:n,sizeUsd:r});if(a===null)throw new Error(`no RH Uniswap pool for ${t}`);if(a.tier!=="prepare")throw new Error(`route tier is ${a.tier}, only prepare tier can be prepared`);let s=i-a.capturedAt;if(s>yI)throw new Error(`quote is stale (${s}ms old, bound ${yI}ms); re-quote before preparing`);let l=Xc().pools[t],u=l.version==="v4"?b6:y6,d=u,p=n==="buy"?l.quoteAddr:l.token;return Object.freeze({artifactKind:"unsigned-tx",chainId:4663,to:u,data:"0x",value:"0",requiresApproval:{spender:d,token:p,amount:null},requiresWalletSignature:!0,backendSigner:!1,unsigned:!0,houseSigned:!1,quoteRef:{venue:a.venue,symbol:a.symbol,symbolRaw:a.symbolRaw,capturedAt:a.capturedAt,blockOrSeq:a.blockOrSeq,mid:a.mid,version:l.version,pair:l.pair},quoteAgeMs:s,recipient:o,side:n,notes:["prepare-only: user wallet must sign","calldata encoding is deferred; this artifact is the bound intent",l.version==="v4"?"V4 route via PoolManager":"V3 route via SwapRouter (address not yet pinned)"]})}var w6="hyperliquid_hip3",x6="hyperliquid",S6="quote-only";function va(){return wt().venues.hyperliquid_hip3}function bI(){return Object.keys(va().dexs).sort()}function k6(){let e=[];for(let[t,n]of Object.entries(va().dexs))for(let r of Object.keys(n))e.push(`${t}:${r}`);return e.sort()}function v6(e){if(typeof e!="string"||e.length===0)return[];let t=e.indexOf(":");if(t>0){let r=e.slice(0,t),o=e.slice(t+1),i=va().dexs[r]?.[o];return i?[{dex:r,ticker:o,market:i}]:[]}let n=[];for(let[r,o]of Object.entries(va().dexs))Object.hasOwn(o,e)&&n.push({dex:r,ticker:e,market:o[e]});return n}function E6(e,t){try{return JA().books[`${e}:${t}`]??null}catch{return null}}function A6(e,t,n){if(!e||n===null||n.mantissa<=0n)return null;let r=t==="buy"?e.asks:e.bids;if(!r||r.length===0)return null;let o=Number(Rt(n));if(!Number.isFinite(o)||o<=0)return null;let i=0,a=0,s=0;for(let c of r){let l=Number(c.px),u=Number(c.sz);if(!(l>0)||!(u>0))continue;let d=l*u,p=Math.min(o,d),m=p/l;if(i+=p,a+=m,o-=p,s+=1,o<=1e-9)break}return a<=0?null:{vwap:i/a,filledUsd:i,unfilledUsd:Math.max(0,o),levelsUsed:s}}function I6(e,t,n,r){let o=A6(e,t,n);if(!o)return{impact:null,depth:null};let i=Number(Rt(r));if(!(i>0))return{impact:null,depth:o};let a=t==="buy"?(o.vwap-i)/i:(i-o.vwap)/i,s=Math.max(0,a);return{impact:Re(Number(s.toPrecision(12))),depth:{...o,impactFraction:s,fullyFilled:o.unfilledUsd<=1e-6}}}function wI({dex:e,ticker:t,market:n,side:r,size:o}){let i=Lt(n.mark,`${e}:${t}.mark`),a=Re(n.fundingHourly),s=Re(n.vol24h),c=Re(n.oi),l=o===null?Q("0"):o,u=E6(e,t),d=null,p=null,m="fees and gas not captured";if(l.mantissa>0n)if(u){let g=I6(u,r,l,i);d=g.impact,p=g.depth,p?.fullyFilled?m="impact measured from l2Book; fees and gas still not captured":m="book walked but size exceeds visible depth; fees and gas not captured"}else m="no order book depth wired for this coin; fees and gas not captured";else u?m="zero size; fees and gas not captured":m="no order book depth wired for this coin; fees and gas not captured";let h={venue:w6,chain:x6,instrument:"perp",tier:S6,symbolRaw:`${e}:${t}`,symbol:t,side:r,requestedSize:l,mark:i,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:a,costAccounted:!1,capturedAt:wt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.hyperliquid_hip3",dex:e,ticker:t,vol24h:n.vol24h,oi:n.oi,fundingAnnPct:n.fundingAnnPct,maxLev:n.maxLev,reasonCostUnknown:m,hasL2Book:u!==null,l2BookFixture:u?"fixtures/hip3_l2books.json":null,depth:p}};return s!==null&&(h.raw.vol24hFixed=s),c!==null&&(h.raw.oiFixed=c),u?.bids?.[0]&&u?.asks?.[0]&&(h.bid=Q(String(u.bids[0].px)),h.ask=Q(String(u.asks[0].px))),st(h)}function xI({symbol:e,side:t="buy",sizeUsd:n=null}={}){let r=v6(e);return r.length===0||r.length>1?null:wI({...r[0],side:t,size:n})}function rl({side:e="buy",sizeUsd:t=null,ticker:n=null}={}){let r=[];for(let o of k6()){let[i,a]=o.split(":");if(n!==null&&a!==n)continue;let s=va().dexs[i][a];r.push(wI({dex:i,ticker:a,market:s,side:e,size:t}))}return r}var _6="arcus_spot",T6="robinhood-4663",P6="quote-only";function SI(){return wt().venues.arcus_spot}function N6(){return Object.keys(SI().pairs).sort()}function C6({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=SI().pairs[e];if(!r)return null;let o=r.bid===void 0||r.bid===null?null:Lt(r.bid,`${e}.bid`),i=r.ask===void 0||r.ask===null?null:Lt(r.ask,`${e}.ask`),a=Re(r.last),s=null;if(o!==null&&i!==null){s={mantissa:o.mantissa+i.mantissa,scale:o.scale===i.scale?o.scale+1:Math.max(o.scale,i.scale)+1};let d=Math.max(o.scale,i.scale),p=o.scale===d?o.mantissa:o.mantissa*10n**BigInt(d-o.scale),m=i.scale===d?i.mantissa:i.mantissa*10n**BigInt(d-i.scale);s={mantissa:p+m,scale:d+1},s={mantissa:(p+m)/2n,scale:d}}else a!==null&&(s=a);if(o===null&&i===null&&s===null)return null;let c=n===null?Q("0"):n,l=Q("0"),u={venue:_6,chain:T6,instrument:"spot",tier:P6,symbolRaw:e,symbol:e,side:t,requestedSize:c,fees:l,gasEstimate:null,priceImpact:null,fundingHourly:null,costAccounted:!1,capturedAt:wt().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/venues.json#venues.arcus_spot",last:r.last,bid:r.bid,ask:r.ask,vol24h:r.vol24h,feeKnownZero:!0,reasonCostUnknown:"gas and impact at size not captured; fee is a known zero"}};return o!==null&&(u.bid=o),i!==null&&(u.ask=i),s!==null&&(u.mid=s),st(u)}function ol({side:e="buy",sizeUsd:t=null}={}){return N6().map(n=>C6({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var O6="solana_xstocks",R6="solana",$6="quote-only",kI=25e3;function il(){return XA()}function ff(){return Object.keys(il().tokens).sort()}function L6(e){let t=il().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function B6(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Q("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,a=r+o;return{mantissa:i/a,scale:6}}function hf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=il().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else return null;let a=i[r],s=L6(r);if(!a||!s)return null;let c=Lt(s.priceUsd,`${r}.priceUsd`),l=Re(s.liquidityUsd),u=n===null?Q("0"):n,d=u.mantissa===0n?Q("0"):B6(l,u),p=!1;u.mantissa===0n&&(s.liquidityUsd??0)>=kI&&(p=!1);let m={venue:O6,chain:R6,instrument:"spot",tier:$6,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:p,capturedAt:il().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/solana_xstocks.json",mint:a.mint,pairAddress:s.pairAddress,dexId:s.dexId,quote:s.quote,liquidityUsd:s.liquidityUsd,volume24h:s.volume24h,priceUsd:s.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and SOL gas not captured; impact is modeled",thin:(s.liquidityUsd??0)<kI}};return st(m)}function vI({side:e="buy",sizeUsd:t=null}={}){return ff().map(n=>hf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var M6="ton_stonfi",F6="ton",U6="quote-only",q6=25e3,D6=.01;function al(){return QA()}function gf(){return Object.keys(al().tokens).sort()}function H6(e){let t=al().pairs[e];return!t||t.length===0?null:[...t].sort((n,r)=>(r.liquidityUsd??0)-(n.liquidityUsd??0))[0]}function j6(e,t){if(e===null||t===null)return null;if(e.mantissa<=0n||t.mantissa<=0n)return Q("0");let n=Math.max(e.scale,t.scale),r=e.scale===n?e.mantissa:e.mantissa*10n**BigInt(n-e.scale),o=t.scale===n?t.mantissa:t.mantissa*10n**BigInt(n-t.scale),i=o*10n**6n,a=r+o;return{mantissa:i/a,scale:6}}function yf({symbol:e,side:t="buy",sizeUsd:n=null}={}){if(typeof e!="string"||e.length===0)return null;let r=e,o=e,i=al().tokens;if(Object.hasOwn(i,e))r=e,o=i[e].symbolRaw;else if(e.endsWith("x")||e.endsWith("X")){let f=e.slice(0,-1).toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}else{let f=e.toUpperCase();if(Object.hasOwn(i,f))r=f,o=i[f].symbolRaw;else return null}let a=i[r],s=H6(r);if(!a||!s)return null;let c=Lt(s.priceUsd,`${r}.priceUsd`),l=Re(s.liquidityUsd),u=n===null?Q("0"):n,d=u.mantissa===0n?Q("0"):j6(l,u),m={venue:M6,chain:F6,instrument:"spot",tier:U6,symbolRaw:o,symbol:r,side:t,requestedSize:u,mid:c,fees:null,gasEstimate:null,priceImpact:d,fundingHourly:null,costAccounted:!1,capturedAt:al().capturedAt*1e3,blockOrSeq:null,raw:{fixture:"fixtures/ton_xstocks.json",mint:a.mint,pairAddress:s.pairAddress,dexId:s.dexId,quote:s.quote,liquidityUsd:s.liquidityUsd,volume24h:s.volume24h,priceUsd:s.priceUsd,source:"dexscreener",approximate:!0,reasonCostUnknown:"DexScreener liquidity.usd is a third-party float; fees and TON gas not captured; impact is modeled; TON books are thin",thin:(s.liquidityUsd??0)<q6,impactSizeFractionHint:D6}};return st(m)}function EI({side:e="buy",sizeUsd:t=null}={}){return gf().map(n=>yf({symbol:n,side:e,sizeUsd:t})).filter(n=>n!==null)}var AI=3600*1e3;function bf(e){return e==null||e===""?null:typeof e=="object"&&e&&typeof e.mantissa=="bigint"?e:Q(String(e))}function II(e,{sizeUsd:t=null}={}){if(typeof e!="string"||!e.trim())throw new TypeError("ticker is required");let n=e.trim().toUpperCase(),r=bf(t),o=[],i=xI({symbol:`xyz:${n}`,sizeUsd:r});if(i)o.push(i);else for(let l of rl({ticker:n,sizeUsd:r}))o.push(l);for(let l of nl({sizeUsd:r}))l.symbol===n&&o.push(l);for(let l of ol({sizeUsd:r}))l.symbol===n&&o.push(l);let a=_o({symbol:n,sizeUsd:r});a&&o.push(a);let s=hf({symbol:n,sizeUsd:r});s&&o.push(s);let c=yf({symbol:n,sizeUsd:r});return c&&o.push(c),o}function z6(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase();if(!t)throw new Error("bestEquityRoute requires ticker");let n=bf(e.sizeUsd??e.size??null),r=II(t,{sizeUsd:n});if(r.length===0)return{ticker:t,rankedOn:"gross",ranked:[],winner:null,runnersUp:[],improvementBps:null,sourcesAnswered:0,sourcesTried:0,failed:[],excluded:[],bestPreparable:null,instrumentMix:"homogeneous",note:"no venue answered for this ticker in the pinned fixture capture"};let o=r[0].capturedAt,i=String(o).length<=10?o*1e3:o,a=e.nowMs==null,s=e.nowMs??o+1e3,c=Math.max(0,Date.now()-i),l=uf(r,{nowMs:s,horizonHours:e.horizonHours!=null?Number(e.horizonHours):void 0,skipLiveness:e.skipLiveness===!0});return{ticker:t,...l,dataSource:a?"fixture":"caller-clock",capturedAt:i,ageMs:c,stale:c>AI}}function V6(){let e=[{venue:"hyperliquid_hip3",tier:"quote-only",chain:"hyperliquid",n:rl().length},{venue:"arcus_perp",tier:"quote-only",chain:"robinhood-4663",n:nl().length},{venue:"arcus_spot",tier:"quote-only",chain:"robinhood-4663",n:ol().length},{venue:"rh_uniswap",tier:"prepare",chain:4663,n:pf().length},{venue:"solana_xstocks",tier:"quote-only",chain:"solana",n:ff().length},{venue:"ton_stonfi",tier:"quote-only",chain:"ton",n:gf().length}],t=[...rl(),...nl(),...ol(),...gI(),...vI(),...EI()],n=(t[0]?.capturedAt??Date.now())+1e3,{survivors:r,excluded:o}=Zc(t,{nowMs:n});return{inventory:e,hip3Dexs:bI(),liveness:{survivors:r.length,excluded:o.length,byReason:o.reduce((i,a)=>(i[a.reason]=(i[a.reason]??0)+1,i),{})},capturedAt:wt().capturedAt,custody:"prepare-only",note:"quote-only venues are ranked for discovery; only rh_uniswap is preparable in v1"}}function W6(e={}){let t=String(e.ticker||e.symbol||"").trim().toUpperCase(),n=e.recipient||e.taker;if(!t)throw new Error("prepareEquityRoute requires ticker");if(!n)throw new Error("prepareEquityRoute requires recipient (signing wallet)");let r=bf(e.sizeUsd??e.size??null),o=_o({symbol:t,sizeUsd:r});if(!o)return{ok:!1,failureKind:"no-prepare-path",ticker:t,note:"no RH Uniswap prepare-tier route for this ticker in fixtures"};try{let i=String(o.capturedAt).length<=10?o.capturedAt*1e3:o.capturedAt,a=e.nowMs!=null,s=a?Number(e.nowMs):Date.now(),c=Math.max(0,Date.now()-i),l=mf({symbol:t,sizeUsd:r,recipient:n,nowMs:s});return{ok:!0,ticker:t,artifact:l,bestPreparableVenue:"rh_uniswap",dataSource:a?"caller-clock":"live-clock",capturedAt:i,ageMs:c,stale:c>AI}}catch(i){return{ok:!1,failureKind:"prepare-refused",ticker:t,error:String(i.message||i)}}}function G6(e){return JSON.parse(JSON.stringify(e,(t,n)=>typeof n=="bigint"?n.toString():n))}var $e=Object.freeze({SAFE:"SAFE",CAUTION:"CAUTION",HONEYPOT:"HONEYPOT",UNKNOWN:"UNKNOWN"}),K6=5e3,Y6=1500;function X6(e,t){return t===0n?null:Number((t-e)*10000n/t)}function Q6(e,t){if(e==null||e==="")throw new Error(`sell-sim: ${t} required`);if(typeof e=="bigint")return e;let n=String(e).trim();if(!/^\d+$/.test(n))throw new Error(`sell-sim: ${t} must be an integer base-unit amount`);return BigInt(n)}async function TI(e={},t={}){let{token:n,base:r,chainId:o=null}=e;if(!n)throw new Error("sell-sim: token required");if(!r)throw new Error("sell-sim: base asset required");if(typeof t.quote!="function")throw new Error("sell-sim: opts.quote function required");let i=Q6(e.amountIn,"amountIn"),a;try{a=await t.quote({chainId:o,inputMint:r,outputMint:n,amount:i.toString(),side:"buy"})}catch(m){return Yt($e.UNKNOWN,`buy leg could not be quoted: ${wf(m)}`,{chainId:o,token:n,base:r})}let s=_I(a?.outAmount);if(s==null||s===0n)return Yt($e.UNKNOWN,"buy leg returned no output \u2014 no route or no liquidity",{chainId:o,token:n,base:r});let c;try{c=await t.quote({chainId:o,inputMint:n,outputMint:r,amount:s.toString(),side:"sell"})}catch(m){return Yt($e.HONEYPOT,`buy routes but the SELL leg fails to quote (${wf(m)}) \u2014 you would not be able to exit`,{chainId:o,token:n,base:r,tokensOut:s.toString()})}let l=_I(c?.outAmount);if(l==null||l===0n)return Yt($e.HONEYPOT,"sell leg returns zero \u2014 the position cannot be exited for value",{chainId:o,token:n,base:r,tokensOut:s.toString()});let u=X6(l,i),d={chainId:o,token:n,base:r,amountIn:i.toString(),tokensOut:s.toString(),roundTripOut:l.toString(),roundTripLossBps:u,evidence:"quote-only"},p=t.executionProven===!0?!0:null;if(typeof t.executionCheck=="function")try{let m=await t.executionCheck({chainId:o,token:n,base:r,tokensOut:s.toString(),amountIn:i.toString()});if(m?.executable===!1)return Yt($e.HONEYPOT,`the sell reverts or returns false at execution (${m?.reason||"transfer-level block"}) even though it quotes cleanly \u2014 a honeypot a pool-math quote cannot see`,{...d,evidence:"execution",executable:!1});p=m?.executable===!0?!0:p}catch(m){d.executionCheckError=wf(m)}return p===!0&&(d.evidence="execution"),u==null?Yt($e.UNKNOWN,"could not compute round-trip loss",d):u>=K6?Yt($e.HONEYPOT,`round trip loses ${(u/100).toFixed(1)}% \u2014 a sell tax or rigged curve, not normal slippage`,d):u>=Y6?Yt($e.CAUTION,`round trip loses ${(u/100).toFixed(1)}% \u2014 high tax or thin liquidity`,d):p===!0?Yt($e.SAFE,`round trip loses ${(u/100).toFixed(1)}% and the sell executes \u2014 exit path verified`,d):Yt($e.CAUTION,`round trip quotes clean (${(u/100).toFixed(1)}% loss) but is unverified at execution \u2014 a pool-math quote cannot see a transfer-hook blacklist or transfer-only sell tax; run an execution-level sell simulation to clear SAFE`,d)}function Yt(e,t,n){return{status:e,safe:e===$e.SAFE,tradable:e===$e.SAFE||e===$e.CAUTION,reason:t,...n}}function _I(e){if(e==null)return null;try{let t=String(e).trim();return/^\d+$/.test(t)?BigInt(t):null}catch{return null}}function wf(e){return String(e?.message||e).slice(0,120)}async function J6(e={},t={}){let n=await TI(e,t);if(!(n.status===$e.SAFE||n.status===$e.CAUTION&&t.allowCaution!==!1||n.status===$e.UNKNOWN&&t.allowUnknown===!0)){let o=new Error(`sell-sim ${n.status}: ${n.reason}`);throw o.sellSim=n,o}return n}import{createHash as Z6}from"node:crypto";var xf=1,PI=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),e5=Object.freeze(["read","simulate"]),NI=1e4,CI=1440*60,OI=128,RI=256,$I=64,LI=256,BI=/^0x[0-9a-fA-F]{40}$/,t5=/^[a-z][a-z0-9_-]*:[a-z0-9._-]+$/,n5=/^[a-z][a-z0-9_-]*:\*$/,r5=/^[A-Za-z0-9._:-]+$/,o5=/^[A-Za-z0-9._:-]+$/,MI=/^(0|[1-9][0-9]*)$/,Ea=class extends Error{constructor(t){let n=t.map(r=>`${r.field}: ${r.message}`);super(`invalid grant (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="GrantValidationError",this.errors=t}};function i5(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function a5(e){if(typeof e=="bigint")return e>=0n?e.toString(10):null;if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:String(e);if(typeof e=="string"){let t=e.trim();return MI.test(t)?t:null}return null}function To(e){if(typeof e=="bigint")return e<0n||e>BigInt(Number.MAX_SAFE_INTEGER)?null:Number(e);if(typeof e=="number")return!Number.isSafeInteger(e)||e<0?null:e;if(typeof e=="string"){let t=e.trim();if(!MI.test(t))return null;let n=Number(t);return Number.isSafeInteger(n)?n:null}return null}function FI(e){let t=String(e).split(":")[0];return e5.includes(t)}function UI(e,t={}){let n=[],r=(d,p)=>n.push({field:d,message:p});if(!i5(e))return r("grant","grant must be a plain object"),{ok:!1,errors:n,grant:null};for(let d of Object.keys(e))PI.includes(d)||r(d,"unknown field is not allowed");for(let d of PI)(!(d in e)||e[d]==null)&&r(d,"required field is missing");if(n.length)return{ok:!1,errors:n,grant:null};let o={},i=To(e.chainId);i==null||i<=0?r("chainId","must be a positive integer chain id"):o.chainId=i;for(let d of["agentAddress","accountAddress"]){let p=e[d];typeof p!="string"||!BI.test(p.trim())?r(d,"must be a 0x-prefixed 20-byte hex address"):o[d]=p.trim().toLowerCase()}if(!Array.isArray(e.actions)||e.actions.length===0)r("actions","must be a non-empty array of action scopes");else if(e.actions.length>$I)r("actions",`too many actions (max ${$I})`);else{let d=[];for(let p of e.actions){let m=typeof p=="string"?p.trim():null;if(!m){r("actions","action entries must be non-empty strings");continue}if(m.includes("*")){t.allowWildcardActions===!0&&n5.test(m)?d.push(m):r("actions",`broad wildcard action "${m}" is rejected (fail closed)`);continue}if(!t5.test(m)){r("actions",`malformed action "${m}" (expected verb:resource)`);continue}d.push(m)}o.actions=[...new Set(d)].sort()}if(!Array.isArray(e.targets))r("targets","must be an array of contract addresses");else if(e.targets.length>LI)r("targets",`too many targets (max ${LI})`);else{let d=[];for(let p of e.targets){let m=typeof p=="string"?p.trim():null;if(!m||!BI.test(m)){r("targets",`target "${p}" must be a 0x-prefixed 20-byte hex address (wildcards not allowed)`);continue}d.push(m.toLowerCase())}if(o.targets=[...new Set(d)].sort(),o.targets.length===0&&Array.isArray(o.actions)){let p=o.actions.filter(m=>!FI(m));(p.length>0||o.actions.length===0)&&r("targets",`empty targets are only allowed for read/simulate scopes (blocked by: ${p.join(", ")||"no valid actions"})`)}}for(let d of["maxValueWei","maxGasWei"]){let p=a5(e[d]);p==null?r(d,"must be a non-negative integer wei amount"):o[d]=p}let a=To(e.maxSlippageBps);a==null||a>NI?r("maxSlippageBps",`must be an integer between 0 and ${NI}`):o.maxSlippageBps=a;let s=864e10,c=To(e.expiresAt);if(c==null||c<=0)r("expiresAt","must be a positive unix-seconds timestamp");else if(c>s)r("expiresAt","exceeds the max unix-seconds timestamp (pass seconds, not milliseconds)");else if(o.expiresAt=c,t.now!=null){let d=To(t.now);d==null?r("expiresAt","opts.now must be a unix-seconds integer"):c<=d?r("expiresAt",`grant is expired (expiresAt ${c} <= now ${d})`):c-d>CI&&r("expiresAt",`grant exceeds the hard 24-hour TTL (${CI} seconds)`)}let l=typeof e.nonce=="string"?e.nonce.trim():To(e.nonce)!=null?String(To(e.nonce)):null;!l||l.length>OI||!r5.test(l)?r("nonce",`must be a non-empty string (max ${OI} chars, [A-Za-z0-9._:-])`):o.nonce=l;let u=typeof e.revocationKey=="string"?e.revocationKey.trim():null;return!u||u.length>RI||!o5.test(u)?r("revocationKey",`must be a non-empty public identifier (max ${RI} chars, [A-Za-z0-9._:-])`):o.revocationKey=u,n.length?{ok:!1,errors:n,grant:null}:{ok:!0,errors:[],grant:o}}function Sf(e,t={}){let{ok:n,errors:r,grant:o}=UI(e,t);if(!n)throw new Ea(r);return o}function kf(e,t={}){let n=Sf(e,t),o=Object.keys(n).sort().map(i=>`${JSON.stringify(i)}:${JSON.stringify(n[i])}`);return`{"version":${xf},${o.join(",")}}`}function qI(e,t={}){return Z6("sha256").update(kf(e,t),"utf8").digest("hex")}var DI=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),s5="agent:execute",c5="build:factory",HI=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function l5(e){let t=Array.isArray(e)&&e.length?e:HI,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!DI.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}var jI=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function zI(){return jI.filter(e=>e.website)}var u5="@oracle-agent/oracle",d5="npx",p5=["-y","--package",u5,"oracle-data-mcp"],WI=/(?:^|_)(?:PRIVATE_KEY|SECRET|TOKEN|PASSWORD|PASSPHRASE|MNEMONIC|SEED)(?:_|$)/i;function Ef(e,t){if(typeof e!="string"||!e.trim())throw new TypeError(`${t} must be a non-empty string`);if(/\r|\n|\0/.test(e))throw new TypeError(`${t} must be a single-line string`);return e.trim()}function m5(e){let t=Ef(e,"url"),n;try{n=new URL(t)}catch{throw new TypeError("url must be a valid http(s) URL")}if(!/^https?:$/.test(n.protocol)||n.username||n.password)throw new TypeError("url must be a credential-free http(s) URL");for(let r of n.searchParams.keys())if(WI.test(r)||/^(?:key|api[_-]?key|auth)$/i.test(r))throw new TypeError(`url must not contain secret-shaped query parameter: ${r}`);return n.href}function f5(e){let t=Ef(e,"key");if(/^[A-Z][A-Z0-9_]*\s*=/.test(t)||/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t))throw new TypeError("key must be an Oracle agent key, not an environment assignment or private key");if(/^(?:0x)?[0-9a-f]{64}$/i.test(t)||t.trim().split(/\s+/).length>=12)throw new TypeError("key looks like private signing material");return t}function h5(e){let t=Ef(e,"label");if(!/^[a-z0-9][a-z0-9_-]{0,62}$/i.test(t))throw new TypeError("label must contain only letters, digits, underscores, and hyphens");if(WI.test(t))throw new TypeError("label must not be a secret-shaped environment name");return t}function xt(e){return`${JSON.stringify(e,null,2)}
190
+ `}function vf(e){return JSON.stringify(e)}function Aa(e){return JSON.stringify(e)}function VI(e,t){return["mcp_servers:",` ${e}:`,` command: ${vf(t.command)}`," args:",...t.args.map(n=>` - ${vf(n)}`)," env:",...Object.entries(t.env).map(([n,r])=>` ${n}: ${vf(r)}`),""].join(`
191
+ `)}function g5(e,t){return[`[mcp_servers.${Aa(e)}]`,`command = ${Aa(t.command)}`,`args = [${t.args.map(Aa).join(", ")}]`,"",`[mcp_servers.${Aa(e)}.env]`,...Object.entries(t.env).map(([n,r])=>`${n} = ${Aa(r)}`),""].join(`
192
+ `)}function y5(){return["# Oracle native harness (default)","npm i -g @oracle-agent/oracle","oracle setup model","oracle chat",""].join(`
193
+ `)}function GI({url:e,key:t,label:n="oracle-data"}={}){let r=m5(e),o=f5(t),i=h5(n),a={command:d5,args:[...p5],env:{ORACLE_DATA_URL:r,ORACLE_AGENT_KEY:o}},s={mcpServers:{[i]:a}},c={hermes:VI(i,a),claudeCode:xt(s),codex:g5(i,a),cursor:xt(s),genericMcp:xt(s),oracleNative:y5(),chatgpt:xt(s),claudeDesktop:xt(s),windsurf:xt(s),vscode:xt(s),openclaw:xt(s),perplexity:xt(s),manus:xt(s),prime:VI(i,a),opencode:xt(s)};for(let l of zI()){if(l.kind==="oracle")continue;let u=l.configKey||l.id;c[u]||(c[u]=xt(s))}return c}var b5=GI;var KI=Object.freeze({assetHighPct:50,assetMediumPct:25,chainHighPct:75,venueHighPct:60,stablecoinHighPct:70}),w5=new Set(["USDC","USDT","USDT0","DAI","FRAX","LUSD","TUSD","USDP","GUSD","PYUSD","USDE"]);function YI(e){if(e===null||e===""||e===void 0)return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function Ia(e){return Math.round((e+Number.EPSILON)*1e8)/1e8}function If(e,t){return t>0?Ia(e/t*100):null}function _f(e){return e.address||e.owner||e.walletAddress||e.wallet?.address||null}function x5(e){let t=Array.isArray(e)?e:Array.isArray(e?.entries)?e.entries:[],n=new Map;for(let r of t){if(!r?.address)continue;let o=String(r.address).toLowerCase();n.has(o)||n.set(o,r)}return n}function Er(e,t,n={}){if(!t||typeof t!="object")return;let r=String(t.symbol??t.coin??t.name??t.collection??t.tokenId??"unknown"),o=YI(t.usdValue??t.valueUsd??t.knownUsd??t.estimatedValueUsd??t.floorValueUsd),i=t.kind==="nft"||t.type==="nft"||t.collection||t.tokenId!=null?"nft":"fungible";e.push({symbol:r,usdValue:o,chain:String(t.chain??t.chainName??n.chain??"unknown"),venue:String(t.venue??t.protocol??t.platform??n.venue??"wallet"),address:t.address??n.address??null,kind:i,stablecoin:t.stablecoin===!0||w5.has(r.toUpperCase())})}function S5(e){let t=[],n=_f(e);for(let r of e.assets||e.holdings||[])Er(t,r,{address:n,chain:e.chain,venue:e.venue});for(let r of e.chains||[]){let o=r.chain??r.name??r.slug??(r.chainId!=null?String(r.chainId):r.family)??"unknown",i={address:r.address??n,chain:o,venue:r.venue};r.native&&(r.native.amount==null||Number(r.native.amount)!==0)&&Er(t,{...r.native,symbol:r.native.symbol??r.symbol??o},i);for(let s of r.assets||r.fungibleTokens?.assets||[])Er(t,s,i);for(let s of r.collectibles?.assets||r.nfts||[])Er(t,{...s,kind:"nft"},i);for(let s of r.spot?.balances||[])Er(t,s,{...i,venue:"Hyperliquid spot"});let a=YI(r.perps?.accountValueUsd);a!=null&&Er(t,{symbol:"perps account",usdValue:a},{...i,venue:"Hyperliquid perps"})}for(let r of e.inventory?.items||e.nfts?.items||[])Er(t,{...r,kind:"nft"},{address:n,chain:r.chain??e.chain,venue:r.marketplace??e.venue});return t}function k5(e,t){let n=_f(e),r=e.chain??e.chainId??e.family??"*";return n?`${String(n).toLowerCase()}|${String(r).toLowerCase()}`:`snapshot:${t}`}function Af(e,t,n){let r=new Map;for(let o of e){if(o.usdValue==null)continue;let i=o[t];r.set(i,(r.get(i)||0)+o.usdValue)}return[...r].map(([o,i])=>({name:o,knownUsd:Ia(i),percentOfKnown:If(i,n)})).sort((o,i)=>i.knownUsd-o.knownUsd||o.name.localeCompare(i.name))}function sl(e={},t={}){let n=Array.isArray(e)?e:Array.isArray(e.snapshots)?e.snapshots:e.snapshot?[e.snapshot]:[],r=x5(t.labels??t.addressBook??e.labels??e.addressBook),o={...KI,...e.thresholds||{},...t.thresholds||{}},i=[],a=new Set,s=0;n.forEach((v,P)=>{if(!v||typeof v!="object")return;let B=k5(v,P);a.has(B)?s+=1:(a.add(B),i.push(v))});let c=i.flatMap(S5),l=c.filter(v=>v.usdValue!=null),u=c.filter(v=>v.usdValue==null),d=i.reduce((v,P)=>v+Number(P.valuation?.unpricedNonzeroItems||P.unpricedNonzeroItems||0),0),p=Ia(l.reduce((v,P)=>v+P.usdValue,0)),m=u.length+d,f=Af(l,"chain",p),h=Af(l,"venue",p),g=Af(l,"symbol",p);for(let v of f)v.chain=v.name;for(let v of h)v.venue=v.name;for(let v of g)v.asset=v.name,v.symbol=v.name;let w=Ia(l.filter(v=>v.stablecoin).reduce((v,P)=>v+P.usdValue,0)),x=c.filter(v=>v.kind==="nft"),y=i.reduce((v,P)=>v+Number(P.valuation?.nftUnvaluedItems||0),0),b=x.filter(v=>v.usdValue==null).length+y,S=x.filter(v=>v.usdValue!=null).length,I=g[0]||null,T=I?I.percentOfKnown>=o.assetHighPct?"high":I.percentOfKnown>=o.assetMediumPct?"medium":"low":"unknown",E=[];m&&E.push(`${m} nonzero holding(s) have unknown USD value; they are excluded from totals and percentages.`),b&&E.push("NFT valuation coverage is partial; estimates are not executable bids and unvalued NFTs are not treated as zero."),s&&E.push(`${s} duplicate address/chain snapshot(s) were ignored.`),I&&T!=="low"&&E.push(`Asset concentration is ${T}: ${I.name} is ${I.percentOfKnown}% of known value.`),f[0]?.percentOfKnown>=o.chainHighPct&&E.push(`Chain concentration is high: ${f[0].name} is ${f[0].percentOfKnown}% of known value.`),h[0]?.percentOfKnown>=o.venueHighPct&&E.push(`Venue concentration is high: ${h[0].name} is ${h[0].percentOfKnown}% of known value.`);let A=i.map(_f).filter(Boolean).map(v=>{let P=r.get(String(v).toLowerCase());return{address:v,label:P?.label??null,who:P?.who??null,role:P?.role??null}});return{totalKnownUsd:p,coverage:{complete:i.length>0&&m===0&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1),label:m===0&&i.length&&i.every(v=>v.valuation?.complete!==!1&&v.coverage?.complete!==!1)?"complete for the supplied snapshots":"known priced value only; portfolio coverage is partial or unverified",unknownUsd:m?null:0,pricedItemCount:l.length,unknownItemCount:m,snapshotCount:i.length,duplicatesIgnored:s},chainExposures:f,venueExposures:h,topAssets:g.slice(0,Math.max(1,Number(t.topAssets??e.topAssets??10))),concentrationRisk:{level:T,topAsset:I?.name??null,topAssetPercent:I?.percentOfKnown??null,thresholds:{mediumPct:o.assetMediumPct,highPct:o.assetHighPct}},stablecoinExposure:{knownUsd:w,percentOfKnown:If(w,p),high:p>0&&If(w,p)>=o.stablecoinHighPct},nftCoverage:{status:x.length||y?b?"partial":"valued":"not-observed",valuedItems:S,unvaluedItems:b,knownUsd:Ia(x.filter(v=>v.usdValue!=null).reduce((v,P)=>v+P.usdValue,0))},addresses:A,warnings:[...new Set(E)]}}var v5=sl;var Fe=(e,t=0)=>Number.isFinite(Number(e))?Number(e):t,Bt=e=>Math.round((e+Number.EPSILON)*1e8)/1e8,Ne=(e,t="unknown")=>String(e??t).trim().toLowerCase(),Mt=e=>e.asset??e.symbol??e.coin,JI=e=>e.address??e.owner??e.account,ll=e=>[Ne(e.chain??e.chainId),Ne(JI(e)),Ne(Mt(e)),Ne(e.source)].join("|");function XI(e){return Fe(e.asOf??e.updatedAt??e.timestamp,0)}function ZI(e){return e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf??e.updatedAt??e.createdAt}function E5(e){return Number.isFinite(Number(ZI(e)))}function QI(e){return Fe(ZI(e),0)}function A5(e){let t=new Set,n=[];return(e||[]).forEach((o,i)=>{if(!o||typeof o!="object"||!Mt(o))return;let a=e1(o);t.has(a)||(t.add(a),n.push({row:o,seq:i}))}),n.every(({row:o})=>E5(o))?n.sort((o,i)=>QI(o.row)-QI(i.row)||o.seq-i.seq).map(({row:o})=>o):n.map(({row:o})=>o)}function e1(e){let t=e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash??e.timestamp??e.asOf;return[ll(e),Ne(t),Ne(e.side),Fe(e.quantity??e.amount??e.size),Fe(e.price??e.priceUsd)].join("|")}function cl(e,t){let n=new Map,r=0;for(let o of e||[]){if(!o||typeof o!="object"||!Mt(o))continue;let i=t==="fill"?e1(o):ll(o);n.has(i)?(r+=1,t!=="fill"&&XI(o)>XI(n.get(i))&&n.set(i,{...o,identity:i})):n.set(i,{...o,identity:i})}return{rows:[...n.values()].sort((o,i)=>o.identity.localeCompare(i.identity)),duplicatesIgnored:r}}function I5(e){let t=new Map;for(let n of e){let r=[ll(n),`${Ne(n.chain??n.chainId)}|${Ne(Mt(n))}`,`*|${Ne(Mt(n))}`];for(let o of r)t.has(o)||t.set(o,n)}return t}function _5(e,t){return t.get(ll(e))??t.get(`${Ne(e.chain??e.chainId)}|${Ne(Mt(e))}`)??t.get(`*|${Ne(Mt(e))}`)??null}function T5(e){let t=new Map,n=0;for(let r of e){let o=[Ne(r.chain??r.chainId),Ne(JI(r)),Ne(Mt(r))].join("|"),i=t.get(o)??{quantity:0,cost:0},a=Math.abs(Fe(r.quantity??r.amount??r.size)),s=Fe(r.price??r.priceUsd),c=Fe(r.feeUsd);if(Ne(r.side)==="sell"){let l=Math.min(a,i.quantity),u=i.quantity?i.cost/i.quantity:Fe(r.costBasisUsd)/(a||1);n+=l*(s-u)-c,i.quantity-=l,i.cost-=l*u}else i.quantity+=a,i.cost+=a*s+c;t.set(o,i)}return{realizedPnlUsd:Bt(n),lots:t}}function Tf(e={},t={}){let n=Fe(t.asOf??e.asOf,0),r=Math.max(0,Fe(t.priceTtlMs??e.priceTtlMs,6e4)),o=cl(e.balances||[],"balance"),i=cl(e.positions||[],"position"),a=cl(e.fills||[],"fill"),s=cl(e.prices||[],"price"),c=I5(s.rows),l=[],u=0,d=0;for(let A of[...o.rows,...i.rows]){let v=_5(A,c),P=Fe(A.quantity??A.amount??A.size),B=v?Fe(v.priceUsd??v.price,NaN):Fe(A.priceUsd,NaN);if(!Number.isFinite(B)){d+=1;continue}let te=P*B,Z=Fe(v?.asOf??A.priceAsOf,0),$=n-Z>r;$&&(u+=Math.abs(te)),l.push({...A,quantity:P,priceUsd:B,valueUsd:te,stale:$,kind:i.rows.includes(A)?"position":"balance"})}let p=l.filter(A=>A.kind==="balance").reduce((A,v)=>A+v.valueUsd,0),m=l.filter(A=>A.kind==="position"),f=m.reduce((A,v)=>A+v.valueUsd,0),h=m.reduce((A,v)=>A+Math.abs(v.valueUsd),0),g=p+f,w=Fe(e.equityUsd,g),x=T5(A5(e.fills||[])).realizedPnlUsd,y=m.reduce((A,v)=>{let P=Fe(v.entryPriceUsd??v.averageEntryPrice??v.costBasisPrice,v.priceUsd);return A+v.quantity*(v.priceUsd-P)},0),b=new Map;for(let A of l)b.set(Ne(Mt(A)),(b.get(Ne(Mt(A)))||0)+Math.abs(A.valueUsd));let S=[...b.values()].reduce((A,v)=>A+v,0),I=[...b].map(([A,v])=>({asset:A,exposureUsd:Bt(v),percent:S?Bt(v/S*100):null})).sort((A,v)=>v.exposureUsd-A.exposureUsd||A.asset.localeCompare(v.asset)),T=l.reduce((A,v)=>A+Math.abs(v.valueUsd),0),E=sl({snapshots:[{assets:l.map(A=>({symbol:Mt(A),usdValue:Math.abs(A.valueUsd),chain:A.chain,venue:A.source}))}],thresholds:e.thresholds});return Object.freeze({asOf:n,balances:o.rows,positions:i.rows,fills:a.rows,prices:s.rows,duplicatesIgnored:o.duplicatesIgnored+i.duplicatesIgnored+a.duplicatesIgnored+s.duplicatesIgnored,pnl:{realizedUsd:x,unrealizedUsd:Bt(y),totalUsd:Bt(x+y)},exposure:{grossUsd:Bt(h),netUsd:Bt(g),leverage:w>0?Bt(h/w):null,equityUsd:Bt(w)},concentration:I,priceCoverage:{pricedItems:l.length,unpricedItems:d,staleItems:l.filter(A=>A.stale).length,staleValueUsd:Bt(u),stalePercent:T?Bt(u/T*100):null,ttlMs:r},risk:E})}var P5=Tf,N5=Tf;import{createHash as L5}from"node:crypto";var _a=class extends Error{constructor(t,n){super(`secret material must never appear in a public API object (at ${t}, rule: ${n})`),this.name="SecretLeakError",this.path=t,this.rule=n}},C5=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,O5=Object.freeze(["privkey","wif","xprv","seed"]);function t1(e){let t=String(e),n=t.toLowerCase().replace(/[\s._-]+/g,"");return C5.test(t)||O5.includes(n)}var R5=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),$5=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Ar(e,t="$",n=new Set,r=""){if(e==null)return e;if(typeof e=="string"){let o=$5.includes(String(r).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:a}of R5)if(!(o&&i.startsWith("raw-32-byte-hex"))&&a.test(e))throw new _a(t,i);return e}if(typeof e!="object"||n.has(e)||(n.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&t1(o))throw new _a(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");Ar(o,`${t}[key]`,n),Ar(i,`${t}[${String(o)}]`,n)}return e}if(e instanceof Set){let o=0;for(let i of e.values())Ar(i,`${t}[${o++}]`,n);return e}if(Array.isArray(e))return e.forEach((o,i)=>Ar(o,`${t}[${i}]`,n)),e;for(let[o,i]of Object.entries(e)){if(t1(o))throw new _a(`${t}.${o}`,"forbidden-key-name");Ar(i,`${t}.${o}`,n,o)}return e}var ul=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),Nf=Object.freeze(Object.fromEntries(ul.map((e,t)=>[e,Object.freeze(t+1<ul.length?[ul[t+1]]:[])]))),n1=new Set(["signed","broadcast"]);function Pf(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Pf).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Pf(e[t])}`).join(",")}}`}function B5(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function dl(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))dl(t)}return e}function Cf(e,t="fact"){try{Ar(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function r1(e){return L5("sha256").update(Pf(e)).digest("hex")}function o1({tradeId:e,state:t,fact:n,asOf:r,previousHash:o,external:i}){let a={tradeId:e,state:t,asOf:r,previousHash:o??null,external:i===!0,fact:B5(n)};return dl({...a,hash:r1(a)})}function M5({tradeId:e,intent:t,asOf:n=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Cf(t,"intent");let r=o1({tradeId:e,state:"intent",fact:t,asOf:n,previousHash:null,external:!1});return dl({tradeId:e,state:"intent",events:[r],headHash:r.hash,custody:"none",execution:"prepare-only"})}function i1(e,t,n,r={}){if(Of(e),!(Nf[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${t} fact is required`);Cf(n,t);let i=r.external===!0||r.externallySupplied===!0;if(n1.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let a=e.events.at(-1),s=r.asOf??a.asOf;if(!Number.isFinite(Number(s))||Number(s)<Number(a.asOf))throw new Error("asOf must be finite and monotonic");let c=o1({tradeId:e.tradeId,state:t,fact:n,asOf:s,previousHash:a.hash,external:i});return dl({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Of(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let n=0;n<e.events.length;n+=1){let r=e.events[n],{hash:o,...i}=r;if(r1(i)!==o)throw new Error(`trade event ${n} hash mismatch`);if(Cf(r.fact,`trade event ${n} fact`),!Number.isFinite(Number(r.asOf))||t&&Number(r.asOf)<Number(t.asOf))throw new Error(`trade event ${n} asOf must be finite and monotonic`);if(r.tradeId!==e.tradeId||r.previousHash!==t?.hash&&n>0)throw new Error(`trade event ${n} chain mismatch`);if(n===0&&(r.state!=="intent"||r.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!Nf[t.state]?.includes(r.state))throw new Error(`invalid recorded transition ${t.state} -> ${r.state}`);if(n1.has(r.state)&&r.external!==!0)throw new Error(`${r.state} is not externally supplied`);t=r}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var F5=i1,U5=Of;function q5(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function D5(e,t){let n;try{let r=new Promise((i,a)=>{n=setTimeout(()=>a(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function pl(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let a=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${a}`)}return i}async function Rf(e,t={}){let n=q5(e),r=pl(t.concurrency,4,"concurrency",1,!0),o=pl(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=pl(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),a=pl(t.ttlMs,6e4,"ttlMs",0),s=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){s[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:a,error:"health function is required"};continue}let m=await D5(p,o),f=Number(m.detail?.asOf??m.detail?.updatedAt??i),h=m.transportOk&&i-f>a,g=!(m.detail&&typeof m.detail=="object"&&m.detail.ok===!1),w=m.transportOk&&g&&!h;s[d]={id:String(p.id),ok:w,state:m.timedOut?"timeout":!m.transportOk||!g?"error":h?"stale":"fresh",stale:h,asOf:f,checkedAsOf:i,ttlMs:a,...m.detail===void 0?{}:{detail:m.detail},...m.error?{error:m.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of s)u[d.state]+=1;return{ok:s.every(d=>d.ok),asOf:i,ttlMs:a,timeoutMs:o,counts:u,providers:s}}var H5=Rf,j5=Rf;et();import{createHash as z5}from"node:crypto";var $f=1,h1=/^[a-z0-9][a-z0-9._-]{0,63}$/,g1=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,V5=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),W5=new Set(["sma","ema","rsi","macd","bollinger","atr"]),G5=new Set(["gt","gte","lt","lte","eq"]),K5=new Set(["and","or","not"]),Y5=new Set(["above","below"]),X5=new Set(["line","signal","histogram"]),Q5=new Set(["upper","middle","lower"]),Lf=new Set(["compare","logic","cross"]),a1=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),s1=new Set(["value","min","max","step"]),Bf=new Set(["entryLong","entryShort","exitLong","exitShort"]),c1=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),J5=new Set(["id","type"]),l1={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},u1=16,d1=128,p1=100,Po=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function St(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Se(e){return typeof e=="number"&&Number.isFinite(e)}function m1(e){return Number.isInteger(e)&&e>0}function Ff(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Ff(t);return Object.freeze(e)}for(let t of Object.keys(e))Ff(e[t]);return Object.freeze(e)}function Uf(e){if(Array.isArray(e))return e.map(Uf);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Uf(e[n]);return t}return e}function C(e,t,n){e.push({path:t,message:n})}function Vn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||C(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function y1(e,t,n,r){if(!Se(e)||!Se(t)||!Se(n)||!Se(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function Mf(e,t,n,r){if(St(e)){if(Vn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return C(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return C(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!St(o)||![o.value,o.min,o.max,o.step].every(m1)?(C(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return m1(e)?e:(C(r,t,"must be a positive integer or {param}"),null)}function f1(e,t,n,r){return St(e)?(Vn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(C(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(C(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Se(e)?e:(C(r,t,"must be a finite number or {param}"),null)}function ml(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function Z5(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let a of ml(i))if(e.has(a)&&n(a))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function e4(e,t){if(!St(e))return C(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>u1)return C(t,"parameters",`too many parameters (max ${u1})`),null;let r={};for(let o of n){if(!h1.test(o)){C(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!St(i)){C(t,a,"must be a plain object");continue}Vn(i,s1,a,t);for(let d of s1)d in i||C(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Se(c)||C(t,`${a}.min`,"must be a finite number"),Se(l)||C(t,`${a}.max`,"must be a finite number"),(!Se(u)||u<=0)&&C(t,`${a}.step`,"must be a positive finite number"),Se(s)||C(t,`${a}.value`,"must be a finite number"),Se(c)&&Se(l)&&c>l&&C(t,`${a}.min`,"min must be <= max"),Se(s)&&Se(c)&&Se(l)&&Se(u)&&u>0&&(y1(s,c,l,u)||C(t,`${a}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:s,min:c,max:l,step:u}}return r}function t4(e,t,n,r){let o=`nodes.${t}`;if(!St(e))return C(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!l1[e.type])return C(r,`${o}.type`,"unknown or missing node type"),Vn(e,J5,o,r),null;switch(Vn(e,l1[e.type],o,r),(typeof e.id!="string"||!g1.test(e.id))&&C(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!V5.has(e.field))&&C(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=f1(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!W5.has(e.indicator))&&C(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,a={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?C(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=Mf(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?C(r,`${o}.input`,"must be a node id string"):a.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))C(r,`${o}.period`,"required field is missing");else{let s=Mf(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}if(i==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))C(r,`${o}.${s}`,"required field is missing");else{let c=Mf(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?X5.has(e.output)?a.output=e.output:C(r,`${o}.output`,"must be line|signal|histogram"):C(r,`${o}.output`,"required field is missing"),"period"in e&&C(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&C(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))C(r,`${o}.stdDev`,"required field is missing");else{let s=f1(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?C(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?Q5.has(e.output)?a.output=e.output:C(r,`${o}.output`,"must be upper|middle|lower"):C(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&C(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&C(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&C(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&C(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!G5.has(e.op))&&C(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&C(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!K5.has(e.op))&&C(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return C(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let a=0;a<e.inputs.length;a++){let s=e.inputs[a];typeof s!="string"||!s?C(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&C(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&C(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!Y5.has(e.direction))&&C(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&C(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&C(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function n4(e,t,n){if(!St(e))return C(t,"risk","must be a plain object"),null;Vn(e,c1,"risk",t);for(let p of c1)(!(p in e)||e[p]==null)&&C(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Se(o)||o<=0||o>50?C(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Se(i)||i<=0?C(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Se(a)||a<=0||a>100?C(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Se(s)||s<=0||s>100?C(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Se(c)||c<=0||c>1e3?C(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?C(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Se(u)||u<=0||u>100?C(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?C(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&C(t,"risk.expiresAt","must be strictly greater than nowMs"):C(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function r4(e,t={}){let n=[];if(!St(e))return C(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Vn(e,a1,"",n);for(let d of a1)(!(d in e)||e[d]==null)&&C(n,d,"required field is missing");e.version!==$f&&C(n,"version",`must be ${$f}`),(typeof e.id!="string"||!h1.test(e.id))&&C(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>p1)&&C(n,"name",`must be a non-empty string max ${p1}`);let r=fl(e.venue);r||C(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)St(e.market)||C(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))C(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)C(n,p.path,p.message)}let i=e4(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))C(n,"nodes","must be an array");else if(e.nodes.length>d1)C(n,"nodes",`too many nodes (max ${d1})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=t4(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&g1.test(p.id)&&(s.has(p.id)?C(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):s.set(p.id,p)),a.push(p))}for(let d=0;d<a.length;d++){let p=a[d],m=`nodes.${d}`;for(let f of ml(p))s.has(f)||C(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of ml(p)){let h=s.get(f);h&&Lf.has(h.type)&&C(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of ml(p)){let h=s.get(f);h&&!Lf.has(h.type)&&C(n,m,`node ref "${f}" must be boolean`)}}Z5(s)&&C(n,"nodes","graph contains a cycle")}let c=null;if(!St(e.rules))C(n,"rules","must be a plain object");else{Vn(e.rules,Bf,"rules",n);for(let d of Bf)d in e.rules||C(n,`rules.${d}`,"required field is missing");c={};for(let d of Bf){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){C(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){C(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);Lf.has(m.type)||C(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=n4(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=Ff({version:$f,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:a,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function un(e,t={}){let n=r4(e,t);if(!n.ok)throw new Po(n.errors);return n.strategy}function o4(e){let t=un(e);return JSON.stringify(Uf(t))}function qf(e){let t=o4(e);return z5("sha256").update(t,"utf8").digest("hex")}function b1(e,t){if(!St(e))throw new Po([{path:"",message:"strategy must be a plain object"}]);if(!St(t))throw new Po([{path:"overrides",message:"must be a plain object"}]);let n=un(e),r={};for(let[i,a]of Object.entries(n.parameters))r[i]={value:a.value,min:a.min,max:a.max,step:a.step};let o=[];for(let[i,a]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){C(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Se(a)){C(o,i,"override must be a finite number");continue}if(!y1(a,s.min,s.max,s.step)){C(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new Po(o);return un({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let a={...i};return Array.isArray(i.inputs)&&(a.inputs=[...i.inputs]),a}),rules:{...n.rules},risk:{...n.risk}})}function Ta(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Wn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function i4(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function x1(e,t){Ta(e),Wn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function hl(e,t){Ta(e),Wn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let a=0;a<t;a++)r+=e[a];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let a=t;a<e.length;a++)o=i*e[a]+(1-i)*o,n[a]=o;return n}function S1(e,t){Ta(e),Wn(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let s=1;s<=t;s++){let c=e[s]-e[s-1];c>=0?r+=c:o-=c}let i=r/t,a=o/t;n[t]=w1(i,a);for(let s=t+1;s<e.length;s++){let c=e[s]-e[s-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,a=(a*(t-1)+u)/t,n[s]=w1(i,a)}return n}function w1(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function k1(e,t={}){Ta(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Wn(n),Wn(r),Wn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=hl(e,n),a=hl(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function v1(e,t={}){Ta(e);let n=t.period,r=t.stdDev;if(Wn(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),a=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:a};let s=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(s+=u,c+=u*u,l>=n){let d=e[l-n];s-=d,c-=d*d}if(l>=n-1){let d=s/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,a[l]=d-r*m}}return{upper:i,middle:o,lower:a}}function E1(e,t){i4(e),Wn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let a=0;a<e.length;a++){let s=e[a];if(a===0)r[a]=s.h-s.l;else{let c=e[a-1].c;r[a]=Math.max(s.h-s.l,Math.abs(s.h-c),Math.abs(s.l-c))}}let o=0;for(let a=0;a<t;a++)o+=r[a];let i=o/t;n[t-1]=i;for(let a=t;a<e.length;a++)i=(i*(t-1)+r[a])/t,n[a]=i;return n}import{createHash as a4}from"node:crypto";var Df=2,s4="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",c4="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",l4="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",A1=a4("sha256").update(JSON.stringify({version:Df,compilerSourceHash:s4,indicatorsSourceHash:c4,schemaSourceHash:l4})).digest("hex");var gl=Df,Hf=A1,u4=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),d4=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function Ft(e){return typeof e=="number"&&Number.isFinite(e)}function p4(e){let t=new Map(e.map(s=>[s.id,s])),n=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},r=new Map,o=new Map;for(let s of e)r.set(s.id,0),o.set(s.id,[]);for(let s of e)for(let c of n(s))t.has(c)&&(o.get(c).push(s.id),r.set(s.id,r.get(s.id)+1));let i=[];for(let[s,c]of r)c===0&&i.push(s);let a=[];for(;i.length;){let s=i.shift();a.push(s);for(let c of o.get(s))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(a.length!==e.length)throw new Error("strategy graph is cyclic");return a}function No(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function m4(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:a,o:s,h:c,l,c:u,v:d}=i;if(!Ft(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Ft(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==d4[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Ft(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Ft(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function Ir(e,t,n,r,o,i){if(i.has(e))return i.get(e);let a=t.get(e),s;switch(a.type){case"input":{let c=u4[a.field];s=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];s[l]=u===void 0?null:u}break}case"constant":{let c=No(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?No(a.period,n):void 0;if(a.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}s=E1(d,c);break}let u=Ir(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Ft(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=x1(u,c);else if(a.indicator==="ema")s=hl(u,c);else if(a.indicator==="rsi")s=S1(u,c);else if(a.indicator==="macd")s=k1(u,{fastPeriod:No(a.fastPeriod,n),slowPeriod:No(a.slowPeriod,n),signalPeriod:No(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=v1(u,{period:c,stdDev:No(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=Ir(a.left,t,n,r,o,i),l=Ir(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Ft(d)||!Ft(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>Ir(l,t,n,r,o,i));s=new Array(o+1);for(let l=0;l<=o;l++)if(a.op==="not"){let u=c[0][l];s[l]=u===!0?!1:u===!1}else if(a.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}s[l]=u}else if(a.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}s[l]=u}else s[l]=!1;break}case"cross":{let c=Ir(a.left,t,n,r,o,i),l=Ir(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Ft(d)||!Ft(p)||!Ft(m)||!Ft(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function jf(e,t={}){let n=un(e);t&&Object.keys(t).length&&(n=b1(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(p4(n.nodes)),i=n.parameters,a=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])a.add(m);let s=Object.freeze([...a].sort()),c=qf(n);function l(m,f){let h={};for(let w of o){let x=m.get(w);h[w]=x[f]}let g=w=>w!=null&&h[w]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){m4(m,f,n.market.interval);let h=new Map;for(let g of o)Ir(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,w)=>Object.freeze(l(h,w))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:gl,compilerHash:Hf,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as f4}from"node:crypto";var eG=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var h4=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function Gn(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Pa(e){return typeof e=="number"&&Number.isFinite(e)}function Co(e){if(Array.isArray(e))return e.map(Co);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Co(e[n]);return t}return e}function I1(e){if(!Gn(e))throw new TypeError("evidence artifact must be a plain object");if(!h4.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Gn(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Gn(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Gn(e.train)||!Gn(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Co({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Co(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function g4(e){return f4("sha256").update(JSON.stringify(I1(e)),"utf8").digest("hex")}function Ut(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function zf(e,t){if(!Gn(e)||!Gn(e.metrics))throw new Error(`${t} metrics required`);let n=Ut(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Pa(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function y4(e,{maxDailyLossPct:t}={}){let n=e.split,r=Ut(n.trainStartIndex,"split.trainStartIndex"),o=Ut(n.trainEndIndex,"split.trainEndIndex"),i=Ut(n.trainBarCount,"split.trainBarCount",1),a=Ut(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Ut(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Ut(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||a!==o+1||s-a+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Pa(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");zf(e.train,"train");let l=zf(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Pa(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Gn(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let w=Ut(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),x=Ut(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),y=Ut(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),b=Ut(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(w!==0||x>=y||y>b||y<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=b,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let S=zf({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(S.tradeCount<1||S.netPnlUsd<=0||S.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Pa(t)&&S.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Pa(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function _1(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=I1(e),r=Co({id:e.id,...n});if(JSON.stringify(Co(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=g4(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&y4(e,t),e}X();var b4=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function Na(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function w4(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Wf(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Wf(n,`${t}[${r}]`));return}if(Na(e))for(let[n,r]of Object.entries(e)){let o=w4(n);if(b4.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Wf(r,`${t}.${n}`)}}function Vf(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function T1({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Wf({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Na(e))throw new Error("handoff: strategy required");if(!Na(t))throw new Error("handoff: evidence required");if(!Na(n))throw new Error("handoff: shadow required");if(!Na(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=un(e,{nowMs:o}),s=jf(a);if(_1(t,{maxDailyLossPct:a.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!Vf(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!Vf(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!Vf(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:gl,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return O(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}et();var x4=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function Oo(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Ro(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function Ca(e){if(Array.isArray(e))for(let t of e)Ca(t);else if(e&&typeof e=="object")for(let t of Object.values(e))Ca(t);return Object.freeze(e)}function S4(e){let t=x4[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function k4(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Ro(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Ro(Number(o.t),`candles[${r}].t`);if(Ro(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:Oo(o.o,`candles[${r}].o`),h:Oo(o.h,`candles[${r}].h`),l:Oo(o.l,`candles[${r}].l`),c:Oo(o.c,`candles[${r}].c`),v:Oo(o.v,`candles[${r}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${r}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${r}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,s)}return Ca([...n.values()].sort((r,o)=>r.t-o.t))}function v4(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Ro(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Oo(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function E4({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),a=!1;for(let s=0;s<16&&i<=n;s++){let c=await ss({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){a=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!a)throw new Error("strategy history exceeds the bounded funding history limit");return v4(o,n)}function A4(e,t,n){let r=0,o=null;return e.map(i=>{let a=i.t+n,s=0;for(;r<t.length&&t[r].time<a;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(s+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:s}:{...i,fundingRate:o,fundingPaymentRate:s}})}async function P1(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=S4(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Ro(e.endTime,"endTime"),a=e.count==null?1500:e.count;if(!Number.isInteger(a)||a<20||a>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,i-a*o):Ro(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Or({coin:n,interval:r,startTime:s,endTime:i},t),E4({coin:n,startTime:s,endTime:i},t)]),u=k4(c,{endTime:i}),d=Ca(A4(u,l,o));return Ca({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var I4=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),_4=new Set(["coin","interval"]);function T4(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))_4.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!I4.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function P4(e={}){let t=await as(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var N1=Object.freeze({id:"hyperliquid",validateMarket:T4,fetchBars:P1,listMarkets:P4,prepareIntent(e){return T1(e)}});var N4=Object.freeze(["id","validateMarket","prepareIntent"]);function C4(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of N4.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var C1=[N1].map(C4),O4=new Map(C1.map(e=>[e.id,e])),R4=Object.freeze([...C1]);function fl(e){return typeof e!="string"?null:O4.get(e)??null}function $4(e){let t=fl(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var O1=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),L4=new Set(O1);function yl(e){if(!L4.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function Gf(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function R1(){return{subscribedCategories:[]}}function B4(e,t){yl(t);let n=Gf(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function M4(e,t){yl(t);let n=Gf(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function F4({category:e,notify:t=!1,...n}={}){if(yl(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function U4(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function $1(e,t=R1(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return yl(e.category),Gf(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:U4(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function q4(e,t,n){return $1(e,t,n).deliver}var L1=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),D4=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),Ue=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),Xe=e=>Number.isFinite(Number(e))?Number(e):null,bl=e=>Math.round(e*1e4)/1e4;function B1(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return D4[t]??t}function H4(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${B1(e)}:${t}`)}function kt(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:bl(n)})}function j4(e,t){let n=Xe(e.repeatBuys??e.repeat_buys??e.buyCount),r=Xe(e.walletWinRate??e.winRate);kt(t,"repeat_buys",n===null?null:Ue((n-1)/4)*.38),kt(t,"wallet_win_rate",r===null?null:(Ue(r)-.5)*.5)}function z4(e,t){let n=Xe(e.ageHours??e.poolAgeHours),r=Xe(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;kt(t,"pool_age",n===null?null:n<24?-.42:Ue(n/720)*.12),kt(t,"liquidity",r===null?null:(Ue(Math.log10(Math.max(1,r))/7)-.5)*.28),kt(t,"liquidity_lock",o==null?null:o?.12:-.28)}function V4(e,t){let n=Xe(e.floorChange??e.floorChangePct),r=Xe(e.sales??e.saleCount);kt(t,"floor_change",n===null?null:Ue(n,-1,1)*.35),kt(t,"sales_depth",r===null?null:Ue(r/50)*.18)}function W4(e,t){let n=Xe(e.flowImbalance??e.imbalance),r=Xe(e.fundingRate??e.funding);kt(t,"flow_imbalance",n===null?null:Ue(n,-1,1)*.42),kt(t,"funding",r===null?null:-Ue(r*100,-1,1)*.12)}function G4(e,t){let n=Xe(e.marketProbability??e.marketPrice??e.probability),r=Xe(e.fairProbability??e.referenceProbability??e.fairValue);kt(t,"probability_mispricing",n===null||r===null?null:Ue(r-n,-1,1)*.65);let o=Xe(e.liquidityUsd??e.liquidity);kt(t,"market_liquidity",o===null?null:Ue(Math.log10(Math.max(1,o))/6)*.12)}var K4=Object.freeze({wallet:j4,pool:z4,nft_floor:V4,hl_flow:W4,prediction_market:G4});function Y4(e,t,n){let r=n.filter(i=>{let a=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return a!=null&&String(a)===t});if(r.length===0)return null;let o=r.map(i=>Xe(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,a)=>i+a,0)/o.length}function Kf(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=Ue(Xe(n.minimumCoverage)??.5);return e.map((o,i)=>{let a=B1(o),s=H4(o,i),c=K4[a],l=[];c&&c(o,l);let u=a==="wallet"?2:a==="pool"?3:2,d=bl(Ue(l.length/u)),p=l.reduce((y,b)=>y+b.value,0),m=Y4(o,s,t),f=m===null?0:Ue(m,-1,1)*.35;m!==null&&kt(l,"shadow_markout",f);let h=bl(Ue(.5+p+f)),g=m===null?.8:Ue(.85+m*.3,.35,1),w=bl(Ue(d*g)),x=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||x.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&x.push("LOW_COVERAGE","NO_TRADE"),w<.5&&x.push("LOW_CONFIDENCE","NO_TRADE"),a==="pool"&&(Xe(o.ageHours??o.poolAgeHours)??1/0)<24&&x.push("NEW_POOL_RISK","NO_TRADE"),m!==null&&m<0&&x.push("NEGATIVE_MARKOUT"),{id:s,type:a,score:h,confidence:w,coverage:d,contributions:l,flags:[...new Set(x)],noTrade:x.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function M1(e={}){return Object.freeze({score(t,n=[],r={}){return Kf(t,n,{...e,...r})}})}import{mkdir as X4,chmod as wl,readFile as Q4,rename as J4,writeFile as Z4}from"node:fs/promises";import{homedir as e3}from"node:os";import{dirname as F1,join as Yf}from"node:path";import t3 from"sql.js";var kl=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),n3=new Set(kl),r3=new Set(kl.slice(0,-1).map((e,t)=>`${e}:${kl[t+1]}`)),q1=Yf(process.env.ORACLE_CONFIG_DIR||Yf(e3(),".config","oracle"),"workspace"),D1=Yf(q1,"artifacts.sqlite");function vl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vl).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vl(e[t])}`).join(",")}}`}function U1(e){if(!n3.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function xl(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function Sl(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function H1(e={}){let t=e.path||D1;await X4(F1(t),{recursive:!0,mode:448}),await wl(F1(t),448);let n;try{n=await Q4(t)}catch(l){if(l.code!=="ENOENT")throw l}let r=await t3(e.sqlJs||{}),o=n?new r.Database(n):new r.Database;o.run(`
194
194
  PRAGMA foreign_keys=ON;
195
195
  CREATE TABLE IF NOT EXISTS artifacts (
196
196
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
@@ -202,4 +202,4 @@ anchor-lang = "0.31.1"
202
202
  CREATE TABLE IF NOT EXISTS action_receipts (
203
203
  artifact_id TEXT PRIMARY KEY REFERENCES artifacts(id), receipt_json TEXT NOT NULL
204
204
  );
205
- `);let i=!1,a=Promise.resolve();function s(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await J4(u,Buffer.from(o.export()),{mode:384}),await bl(u,384),await Q4(u,t),await bl(t,384)};return a=a.then(l,l),a}n?await bl(t,384):await s();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(l){if(c(),!l||typeof l!="object")throw new TypeError("artifact object required");let u=F1(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=_t(l.data??{}),m=String(l.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,u,m,kl(p)]),await s(),{id:d,type:u,createdAt:m,data:p}},getArtifact(l){c();let u=o.prepare("SELECT * FROM artifacts WHERE id=?");u.bind([String(l)]);let d=u.step()?xl(u.getAsObject()):null;return u.free(),d},listArtifacts(l){c();let u=l===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(F1(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),wl(u).map(xl)},async link(l,u){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(l),String(u)]);let p=wl(d),m=p.find(h=>h.id===String(l)),f=p.find(h=>h.id===String(u));if(!m||!f)throw new TypeError("edge endpoints must exist");if(!n3.has(`${m.type}:${f.type}`))throw new TypeError(`invalid artifact edge: ${m.type} -> ${f.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[m.id,f.id]),await s(),{parentId:m.id,childId:f.id}},children(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),wl(u).map(xl)},parents(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),wl(u).map(xl)},async putReceipt(l,u){c();let d=this.getArtifact(l);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=_t(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),kl(p)]),await s(),p},getReceipt(l){c();let u=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");u.bind([String(l)]);let d=u.step()?JSON.parse(u.getAsObject().receipt_json):null;return u.free(),d},async close(){i||(await s(),o.close(),i=!0)}}}var r3=D1;import{createHash as H1}from"node:crypto";var o3=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"]);function i3(e){return o3.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function vl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(vl).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vl(e[t])}`).join(",")}}`}function j1(e){return H1("sha256").update(String(e)).digest("hex")}function z1(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(i3(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function V1(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function El(e={}){let t=z1(e.url??e.sourceUrl),n=V1(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(_t({url:t,fetchedAt:n,contentHash:r}))}function a3(e={}){let t=z1(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=V1(e.fetchedAt),a=j1(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let s=(e.citations||[{url:t,fetchedAt:i,contentHash:a}]).map(El),c=_t({sourceUrl:t,fetchedAt:i,contentHash:a,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:s});return Object.freeze({id:`research:${H1("sha256").update(vl(c)).digest("hex")}`,...c})}var s3=vl;function Xf(e={}){let t=String(e.origin||e.kind||"");if(t!=="agent_recommendation"&&t!=="direct_user")throw new TypeError("prepared action origin must be agent_recommendation or direct_user");let n=Array.isArray(e.citations)?e.citations.map(El):[];if(t==="agent_recommendation"&&n.length===0)throw new TypeError("agent_recommendation prepared actions require evidence citations");return Object.freeze(_t({...e,origin:t,citations:Object.freeze(n)}))}var c3=Xf,l3=Xf;export{rt as ACTION_MODES,Xw as ACTION_RECEIPT_VERSION,qI as ALLOWED_SCOPES,Sl as ARTIFACT_TYPES,io as ActionReceiptSecretError,s5 as BUILD_SCOPE,Mo as CHAINS,mn as CHAIN_CONFIGS,GI as DEFAULT_RISK_THRESHOLDS,DI as DEFAULT_SCOPES,U1 as DEFAULT_WORKSPACE_DIR,q1 as DEFAULT_WORKSPACE_PATH,Pb as ERC8004_IDENTITY_ABI,K as EVIDENCE,a5 as EXECUTE_SCOPE,xf as GRANT_VERSION,va as GrantValidationError,Cc as NFT_LIFECYCLE_ACTIONS,Pc as NFT_LIFECYCLE_TIER,Wa as NftGasWarLimitError,Ko as OPENSEA_EVM_CHAIN_IDS,Oa as PREPARE_HARD_MAX_AGE_MS,Kn as PREPARE_MAX_AGE_MS,Il as PREPARE_VERSION,Ct as QUALITY,Ni as REGISTRATION_TYPE,z as RISK,Nr as SCANNER_CAPABILITIES,$e as SELL_SIM,$1 as SIGNAL_TYPES,ll as TRADE_STATES,Pf as TRADE_TRANSITIONS,Zp as UNIVERSAL_MINT_ADAPTERS,SB as UNIVERSAL_MINT_ROUTER_REGISTRY,Oc as UNIVERSAL_NFT_LIFECYCLE_REGISTRY,Zi as UniversalMintRouterError,ce as UniversalNftLifecycleError,C1 as WATCH_CATEGORIES,sw as actionModeForVerb,o1 as advanceTradeLifecycle,NO as assertActionRecord,uC as assertCapability,XB as assertEvmNftTransfer,nu as assertNftMintGasWar,_t as assertNoReceiptSecrets,uM as assertOrdinalsTransferPlan,Ra as assertPreparedChecksum,J1 as assertPreparedEnvelope,aO as assertPreparedIdentity,l3 as assertRecommendationEvidence,Q6 as assertSellable,iM as assertSolanaNftTransfer,Of as assertTradeLifecycle,Dr as autonomousTradingEnabled,oq as bestBridgeRoute,j6 as bestEquityRoute,rq as bestSwapRoute,Cb as buildRegistrationFile,Jw as canonicalReceiptJson,s3 as canonicalResearchJson,kf as canonicalizeGrant,em as canonicalizeNftLifecycleIntent,Ay as capabilityStatus,La as chainById,AI as collectEquityQuotes,Je as computePrepareHash,Tl as computePrepareMac,Zw as computeReceiptId,j1 as contentHash,zR as createActionReceipt,TO as createActionRecord,r3 as createArtifactStore,y5 as createHarnessConfigs,T5 as createPortfolioLedger,c3 as createPreparedAction,a3 as createResearchArtifact,o0 as createScanner,B1 as createSignalsEngine,B5 as createTradeLifecycle,bk as createUniversalNftLifecycleRegistry,M4 as createWatch,JU as data,I as dataCall,OA as dataCatalog,PA as dataHealth,O1 as defaultPreferences,WI as emitHarnessConfigs,W6 as equityToJsonSafe,z6 as equityVenues,Dd as erc8004IdentityHealth,R1 as evaluateAlert,Zk as executeRfqCandidates,VR as formatActionReceipt,rs as getProvider,lu as getScanner,$B as getUniversalMintCapabilities,LB as getUniversalMintHealth,UI as grantId,Xk as hashFirmQuote,Yk as hashRfqIntent,H5 as healthRollup,Vd as inspectIdentity,PO as isActiveAlert,CO as isActiveExecution,Ul as isSupportedChain,ri as listProviders,uu as listScanners,OO as migrateLegacyWatchRecord,ex as normalizeActionReceipt,El as normalizeCitation,dm as normalizeFirmQuote,Sf as normalizeGrant,Bc as normalizeRfqIntent,c5 as normalizeScopes,D1 as openArtifactStore,Qa as openseaBestListings,au as openseaPrepareBuy,cu as openseaPrepareCancel,Qo as openseaPrepareList,Xo as openseaPrepareMint,su as openseaPrepareSweep,N5 as portfolioLedger,k5 as portfolioRiskSummary,dC as posture,Xf as prepareAction,zd as prepareAgentURIUpdate,V6 as prepareEquityRoute,jd as prepareIdentityRegistration,la as prepareOrdinalsTransfer,pM as prepareOrdinalsTransferAdmin,dM as prepareOrdinalsTransferPublic,ia as prepareUniversalEvmNftTransfer,JB as prepareUniversalEvmNftTransferAdmin,QB as prepareUniversalEvmNftTransferPublic,ta as prepareUniversalMint,RB as prepareUniversalMintAdmin,OB as prepareUniversalMintPublic,sa as prepareUniversalSolanaNftTransfer,sM as prepareUniversalSolanaNftTransferAdmin,aM as prepareUniversalSolanaNftTransferPublic,D5 as providerHealthRollup,ev as rankRfqQuotes,ti as registerBuiltinScanners,y_ as registerChain,d0 as registerCustomChain,P as registerProvider,ts as registerScanner,Ob as registrationDataUri,pm as requestRfqQuotes,R4 as requireStrategyVenue,Zf as resolvePrepareMaxAgeMs,ml as resolveStrategyVenue,Rf as rollupProviderHealth,TA as routeUniversalNftLifecycle,Fl as rpcUrlFor,RT as scannerCoverage,Kf as scoreSignals,U4 as shouldDeliverAlert,_I as simulateSell,Jk as sourceCandidates,O as stampPrepared,O4 as strategyVenues,L4 as subscribe,tx as summarizeActionReceipt,Tf as summarizePortfolioLedger,al as summarizePortfolioRisk,M5 as transitionTradeLifecycle,ea as universalMintCapabilities,Nc as universalMintHealth,Xm as universalNftLifecycleCapabilities,B4 as unsubscribe,FI as validateGrant,Ga as validateNftMintGasWar,Ci as validateRegistrationFile,r0 as validateScanner,F5 as verifyTradeLifecycle};
205
+ `);let i=!1,a=Promise.resolve();function s(){let l=async()=>{let u=`${t}.tmp-${process.pid}`;await Z4(u,Buffer.from(o.export()),{mode:384}),await wl(u,384),await J4(u,t),await wl(t,384)};return a=a.then(l,l),a}n?await wl(t,384):await s();function c(){if(i)throw new Error("artifact store is closed")}return{path:t,async putArtifact(l){if(c(),!l||typeof l!="object")throw new TypeError("artifact object required");let u=U1(String(l.type)),d=String(l.id||"").trim();if(!d)throw new TypeError("artifact id required");let p=Tt(l.data??{}),m=String(l.createdAt||new Date().toISOString());return o.run("INSERT INTO artifacts(id,type,created_at,data_json) VALUES(?,?,?,?)",[d,u,m,vl(p)]),await s(),{id:d,type:u,createdAt:m,data:p}},getArtifact(l){c();let u=o.prepare("SELECT * FROM artifacts WHERE id=?");u.bind([String(l)]);let d=u.step()?Sl(u.getAsObject()):null;return u.free(),d},listArtifacts(l){c();let u=l===void 0?o.prepare("SELECT * FROM artifacts ORDER BY created_at,id"):(U1(String(l)),o.prepare("SELECT * FROM artifacts WHERE type=? ORDER BY created_at,id"));return l!==void 0&&u.bind([String(l)]),xl(u).map(Sl)},async link(l,u){c();let d=o.prepare("SELECT id,type FROM artifacts WHERE id IN (?,?)");d.bind([String(l),String(u)]);let p=xl(d),m=p.find(h=>h.id===String(l)),f=p.find(h=>h.id===String(u));if(!m||!f)throw new TypeError("edge endpoints must exist");if(!r3.has(`${m.type}:${f.type}`))throw new TypeError(`invalid artifact edge: ${m.type} -> ${f.type}`);return o.run("INSERT INTO artifact_edges(parent_id,child_id) VALUES(?,?)",[m.id,f.id]),await s(),{parentId:m.id,childId:f.id}},children(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.child_id=a.id WHERE e.parent_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),xl(u).map(Sl)},parents(l){c();let u=o.prepare("SELECT a.* FROM artifacts a JOIN artifact_edges e ON e.parent_id=a.id WHERE e.child_id=? ORDER BY a.created_at,a.id");return u.bind([String(l)]),xl(u).map(Sl)},async putReceipt(l,u){c();let d=this.getArtifact(l);if(!d||d.type!=="receipt")throw new TypeError("receipt boundary requires a receipt artifact");let p=Tt(u);return o.run("INSERT INTO action_receipts(artifact_id,receipt_json) VALUES(?,?)",[String(l),vl(p)]),await s(),p},getReceipt(l){c();let u=o.prepare("SELECT receipt_json FROM action_receipts WHERE artifact_id=?");u.bind([String(l)]);let d=u.step()?JSON.parse(u.getAsObject().receipt_json):null;return u.free(),d},async close(){i||(await s(),o.close(),i=!0)}}}var o3=H1;import{createHash as j1}from"node:crypto";var i3=new Set(["accesstoken","refreshtoken","idtoken","token","apikey","clientsecret","password","auth","jwt","session","secret","key","code","signature","xamzsignature","privatekey","authorization","bearer","credential"]);function a3(e){return i3.has(String(e).replace(/[^a-z0-9]/gi,"").toLowerCase())}function El(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(El).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${El(e[t])}`).join(",")}}`}function z1(e){return j1("sha256").update(String(e)).digest("hex")}function V1(e){let t;try{t=new URL(String(e))}catch{throw new TypeError("research source URL must be valid")}if(!/^https?:$/.test(t.protocol))throw new TypeError("research source URL must be http(s)");if(t.username||t.password)throw new TypeError("research source URL must not contain credentials");for(let n of t.searchParams.keys())if(a3(n))throw new TypeError("research source URL must not contain sensitive query parameters");return t.toString()}function W1(e){if(e==null||e==="")throw new TypeError("research fetchedAt required");let t=new Date(e);if(!Number.isFinite(t.getTime()))throw new TypeError("research fetchedAt must be a valid timestamp");return t.toISOString()}function Al(e={}){let t=V1(e.url??e.sourceUrl),n=W1(e.fetchedAt),r=String(e.contentHash||"").toLowerCase();if(!/^[0-9a-f]{64}$/.test(r))throw new TypeError("research citation contentHash must be 64 lowercase hex characters");return Object.freeze(Tt({url:t,fetchedAt:n,contentHash:r}))}function s3(e={}){let t=V1(e.sourceUrl??e.url),n=String(e.snapshot??e.content??"");if(!n)throw new TypeError("research snapshot required");let r=String(e.claim||"").trim();if(!r)throw new TypeError("research claim required");let o=Number(e.confidence);if(!Number.isFinite(o)||o<0||o>1)throw new TypeError("research confidence must be between 0 and 1");let i=W1(e.fetchedAt),a=z1(n);if(!Array.isArray(e.contradictions??[]))throw new TypeError("research contradictions must be an array");let s=(e.citations||[{url:t,fetchedAt:i,contentHash:a}]).map(Al),c=Tt({sourceUrl:t,fetchedAt:i,contentHash:a,snapshot:n,claim:r,confidence:o,contradictions:(e.contradictions||[]).map(String),citations:s});return Object.freeze({id:`research:${j1("sha256").update(El(c)).digest("hex")}`,...c})}var c3=El;function Xf(e={}){let t=String(e.origin||e.kind||"");if(t!=="agent_recommendation"&&t!=="direct_user")throw new TypeError("prepared action origin must be agent_recommendation or direct_user");let n=Array.isArray(e.citations)?e.citations.map(Al):[];if(t==="agent_recommendation"&&n.length===0)throw new TypeError("agent_recommendation prepared actions require evidence citations");return Object.freeze(Tt({...e,origin:t,citations:Object.freeze(n)}))}var l3=Xf,u3=Xf;export{rt as ACTION_MODES,Qw as ACTION_RECEIPT_VERSION,DI as ALLOWED_SCOPES,kl as ARTIFACT_TYPES,ao as ActionReceiptSecretError,c5 as BUILD_SCOPE,Fo as CHAINS,fn as CHAIN_CONFIGS,KI as DEFAULT_RISK_THRESHOLDS,HI as DEFAULT_SCOPES,q1 as DEFAULT_WORKSPACE_DIR,D1 as DEFAULT_WORKSPACE_PATH,Nb as ERC8004_IDENTITY_ABI,K as EVIDENCE,s5 as EXECUTE_SCOPE,xf as GRANT_VERSION,Ea as GrantValidationError,Oc as NFT_LIFECYCLE_ACTIONS,Cc as NFT_LIFECYCLE_TIER,Ga as NftGasWarLimitError,Yo as OPENSEA_EVM_CHAIN_IDS,Ra as PREPARE_HARD_MAX_AGE_MS,Yn as PREPARE_MAX_AGE_MS,_l as PREPARE_VERSION,Ot as QUALITY,Ni as REGISTRATION_TYPE,z as RISK,Nr as SCANNER_CAPABILITIES,$e as SELL_SIM,L1 as SIGNAL_TYPES,ul as TRADE_STATES,Nf as TRADE_TRANSITIONS,Zp as UNIVERSAL_MINT_ADAPTERS,kB as UNIVERSAL_MINT_ROUTER_REGISTRY,Rc as UNIVERSAL_NFT_LIFECYCLE_REGISTRY,ea as UniversalMintRouterError,ce as UniversalNftLifecycleError,O1 as WATCH_CATEGORIES,sw as actionModeForVerb,i1 as advanceTradeLifecycle,NO as assertActionRecord,dC as assertCapability,QB as assertEvmNftTransfer,ru as assertNftMintGasWar,Tt as assertNoReceiptSecrets,dM as assertOrdinalsTransferPlan,$a as assertPreparedChecksum,Z1 as assertPreparedEnvelope,sO as assertPreparedIdentity,u3 as assertRecommendationEvidence,J6 as assertSellable,aM as assertSolanaNftTransfer,Of as assertTradeLifecycle,Hr as autonomousTradingEnabled,iq as bestBridgeRoute,z6 as bestEquityRoute,oq as bestSwapRoute,Cb as buildRegistrationFile,Zw as canonicalReceiptJson,c3 as canonicalResearchJson,kf as canonicalizeGrant,em as canonicalizeNftLifecycleIntent,Ay as capabilityStatus,Ba as chainById,II as collectEquityQuotes,Je as computePrepareHash,Pl as computePrepareMac,ex as computeReceiptId,z1 as contentHash,VR as createActionReceipt,PO as createActionRecord,o3 as createArtifactStore,b5 as createHarnessConfigs,P5 as createPortfolioLedger,l3 as createPreparedAction,s3 as createResearchArtifact,o0 as createScanner,M1 as createSignalsEngine,M5 as createTradeLifecycle,wk as createUniversalNftLifecycleRegistry,F4 as createWatch,ZU as data,_ as dataCall,RA as dataCatalog,CA as dataHealth,R1 as defaultPreferences,GI as emitHarnessConfigs,G6 as equityToJsonSafe,V6 as equityVenues,Dd as erc8004IdentityHealth,$1 as evaluateAlert,ev as executeRfqCandidates,WR as formatActionReceipt,os as getProvider,uu as getScanner,LB as getUniversalMintCapabilities,BB as getUniversalMintHealth,qI as grantId,Qk as hashFirmQuote,Xk as hashRfqIntent,j5 as healthRollup,Vd as inspectIdentity,CO as isActiveAlert,OO as isActiveExecution,ql as isSupportedChain,oi as listProviders,du as listScanners,RO as migrateLegacyWatchRecord,tx as normalizeActionReceipt,Al as normalizeCitation,dm as normalizeFirmQuote,Sf as normalizeGrant,Mc as normalizeRfqIntent,l5 as normalizeScopes,H1 as openArtifactStore,Ja as openseaBestListings,su as openseaPrepareBuy,lu as openseaPrepareCancel,Jo as openseaPrepareList,Qo as openseaPrepareMint,cu as openseaPrepareSweep,N5 as portfolioLedger,v5 as portfolioRiskSummary,pC as posture,Xf as prepareAction,zd as prepareAgentURIUpdate,W6 as prepareEquityRoute,jd as prepareIdentityRegistration,ua as prepareOrdinalsTransfer,mM as prepareOrdinalsTransferAdmin,pM as prepareOrdinalsTransferPublic,aa as prepareUniversalEvmNftTransfer,ZB as prepareUniversalEvmNftTransferAdmin,JB as prepareUniversalEvmNftTransferPublic,na as prepareUniversalMint,$B as prepareUniversalMintAdmin,RB as prepareUniversalMintPublic,ca as prepareUniversalSolanaNftTransfer,cM as prepareUniversalSolanaNftTransferAdmin,sM as prepareUniversalSolanaNftTransferPublic,H5 as providerHealthRollup,tv as rankRfqQuotes,ni as registerBuiltinScanners,b_ as registerChain,d0 as registerCustomChain,N as registerProvider,ns as registerScanner,Ob as registrationDataUri,pm as requestRfqQuotes,$4 as requireStrategyVenue,Zf as resolvePrepareMaxAgeMs,fl as resolveStrategyVenue,Rf as rollupProviderHealth,PA as routeUniversalNftLifecycle,Ul as rpcUrlFor,$T as scannerCoverage,Kf as scoreSignals,q4 as shouldDeliverAlert,TI as simulateSell,Zk as sourceCandidates,O as stampPrepared,R4 as strategyVenues,B4 as subscribe,nx as summarizeActionReceipt,Tf as summarizePortfolioLedger,sl as summarizePortfolioRisk,F5 as transitionTradeLifecycle,ta as universalMintCapabilities,Nc as universalMintHealth,Xm as universalNftLifecycleCapabilities,M4 as unsubscribe,UI as validateGrant,Ka as validateNftMintGasWar,Oi as validateRegistrationFile,r0 as validateScanner,U5 as verifyTradeLifecycle};