@oracle-agent/oracle 0.35.17 → 0.35.19
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/README.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +69 -29
- package/dist/bin/oracle-data-mcp.mjs +17 -16
- package/dist/cli/commands/chat.mjs +177 -177
- package/dist/cli/commands/doctor.mjs +7 -7
- package/dist/cli/commands/eval.mjs +110 -110
- package/dist/cli/commands/model.mjs +183 -183
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +23 -17
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +67 -27
- package/dist/index.mjs +81 -41
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +20 -14
- package/package.json +1 -1
- package/public/eval-report.json +4 -4
- package/public/oracle-splash/index.html +2 -2
- package/server.json +2 -2
package/dist/data/desk-data.mjs
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),l
|
|
1
|
+
var __=Object.defineProperty;var xe=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var ua=(e,t)=>{for(var n in t)__(e,n,{get:t[n],enumerable:!0})};import En from"node:net";import P_ from"node:dns";function da(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 el(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 tl(e){if(En.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(En.isIPv6(e)){let t=da(e);if(!t)return!1;let n=da("::ffff:0:0");return el(t,n,96)?tl([...t.slice(12)].join(".")):el(t,da("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>el(t,da(o),i)):!1}return!1}function C_(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=En.isIP(n);return r!==0&&!tl(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function nl(e,{lookupFn:t=P_.promises.lookup}={}){let n=C_(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:En.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=>!tl(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||(En.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(En.isIP(p))return[{address:p,family:En.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[ol]=Object.freeze({pin:t}),e}function il(e){return typeof e=="function"&&typeof e[ol]?.pin=="function"}function Rf(e,t,n){if(!il(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[ol].pin(t,n)}var T_,ol,Lf=xe(()=>{T_=new Set(["localhost","metadata.google.internal","metadata.goog"]);ol=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as $f}from"node:crypto";function B_(e){let t=String(e||"").toLowerCase();return Hf.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function M_(e){let t={};for(let[n,r]of Object.entries(e||{}))B_(n)||(t[n]=r);return t}function F_(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 U_(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function Uf(e){let t=String(e?.method||"");return t?!D_.test(t):!1}function H_(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let n=t;if(typeof t=="string")try{n=JSON.parse(t)}catch{return!1}return Array.isArray(n)?n.length>0&&n.every(Uf):!n||typeof n!="object"?!1:n.jsonrpc&&n.method?Uf(n):typeof n.type=="string"&&q_.has(n.type)&&n.action==null&&n.signature==null&&n.nonce==null}function j_(e,t,n,r={},o=null){let i={};for(let[p,m]of Object.entries(n||{}))i[p.toLowerCase()]=m;let a=Object.keys(i).filter(p=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(p)),c=[...new Set([...Hf,...a])].sort().map(p=>`${p}=${i[p]??""}`).join(`
|
|
2
|
+
`),l=$f("sha256").update(c).digest("hex").slice(0,32),u=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`,d=o==null?"-":$f("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${u} ${l} ${d}`}function z_(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Mf):Math.min(250*2**e,Mf)+Math.floor(Math.random()*100)}function ao(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function sl(e,t,n){return ao(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function so(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function W_(e){return e?e.byteLength??e.length??0:0}async function Df(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&&(so(e),!r))throw sl(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 sl(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+=W_(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 sl(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function qf(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,signal:p}){let m=new AbortController,f=setTimeout(()=>m.abort(),i),h=p?typeof AbortSignal.any=="function"?AbortSignal.any([p,m.signal]):p:m.signal,y=null,w=t,x=a?{lookupFn:a}:{};if(c&&!s&&!il(w))throw ao(`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 g=async(b,{status:S=null}={})=>{let I=await nl(b,x);if(!I.ok)throw ao(S==null?`HTTP refused ${b}: ${I.error}`:`HTTP redirect to ${b} ${I.error}`,S==null?{}:{status:S});let k=new URL(b).hostname;if(s){if(y&&(await y.close(),y=null),!y)try{y=await rl({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw ao(S==null?`HTTP refused ${b}: ${E?.message||E}`:`HTTP redirect to ${b} refused: ${E?.message||E}`,S==null?{}:{status:S})}y.pin(k,I.addresses),w=y.fetch}else Rf(w,k,I.addresses);return I};try{let b=String(e),S={...r||{}};c&&await g(b);for(let I=0;I<=Ff;I+=1){let k=await w(b,{method:n,headers:S,body:o,signal:h,redirect:"manual"});if(L_.has(k.status)){if(n!=="GET"&&n!=="HEAD"){let D=await Df(k,l??$_,{url:b,truncate:!0}),H=new Error(`HTTP ${k.status} ${n} ${b} redirected non-idempotent request`);throw H.status=k.status,H.body=qf(D)??D.slice(0,300),H}if(I===Ff)throw so(k),new Error(`HTTP redirect loop for ${e}`);let _=k.headers?.get?.("location"),C;try{C=F_(_,b)}catch(D){throw so(k),D}let $=!U_(C,b);if(so(k),$&&(S=M_(S)),c)await g(C,{status:k.status});else if($){let D=await nl(C,x);if(!D.ok){let H=new Error(`HTTP redirect from ${b} ${D.error}`);throw H.status=k.status,H.retryable=!1,H}s&&D.addresses?.length&&(y||(y=await rl(u?{importUndici:u}:{})),y&&(y.pin(new URL(C).hostname,D.addresses),w=y.fetch))}b=C;continue}if(typeof d=="function")try{await d(k,{url:b})}catch(_){throw so(k),ao(_?.message||String(_))}let E=await Df(k,l,{url:b,onOversize:()=>m.abort()}),P=qf(E);if(!k.ok){let _=new Error(`HTTP ${k.status} ${n} ${b}`);throw _.status=k.status,_.retryAfter=k.headers?.get?.("retry-after")??null,_.body=P??E.slice(0,300),_}return P??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),y&&await y.close()}}async function v(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):R_,c=t.lookupFn,l=!t.fetchImpl,u=t.untrustedUrl===!0,d=t.importUndici,p=t.validateResponse,m=t.signal,f=Number(t.maxResponseBytes),h=Number.isFinite(f)&&f>0?Math.floor(f):null,y=async()=>{let S;for(let I=0;I<=s;I++){m?.throwIfAborted?.();try{return await G_(e,{fetchImpl:n,method:o,headers:i,body:a,timeoutMs:r,lookupFn:c,realFetch:l,untrustedUrl:u,maxResponseBytes:h,importUndici:d,validateResponse:p,signal:m})}catch(k){S=k;let E=k?.status,P=k?.name==="AbortError"||k?.name==="TimeoutError"||m?.aborted,_=new Set([408,425,429]),C=k?.retryable===!1?!1:E!=null?_.has(E)||O_.has(E)&&Bf.has(o):!P&&Bf.has(o);if(I===s||!C)throw k;let $=z_(I,k?.retryAfter);m?await new Promise((D,H)=>{let R=setTimeout(D,$);m.addEventListener("abort",()=>{clearTimeout(R),H(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await V_($)}}throw S};if(!(t.dedupe!==!1&&!m&&H_(o,a)))return y();let x=j_(o,e,i,{untrustedUrl:u,maxResponseBytes:h},a),g=al.get(x);if(g)return g;let b=y().finally(()=>al.delete(x));return al.set(x,b),b}async function Se(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 be(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_,Bf,R_,Mf,Hf,L_,Ff,$_,al,D_,q_,V_,O=xe(()=>{Lf();O_=new Set([408,425,429,500,502,503,504]),Bf=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),R_=2,Mf=4e3,Hf=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],L_=new Set([301,302,303,307,308]),Ff=3,$_=64*1024;al=new Map,D_=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,q_=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);V_=e=>new Promise(t=>setTimeout(t,e))});function ll(e){return jf.get(Number(e))||null}function zf(e,t=process.env){let n=ll(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Vf(e){return jf.has(Number(e))}var cl,jf,Wf=xe(()=>{cl={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}},jf=new Map(Object.values(cl).map(e=>[e.chainId,e]))});var fa={};ua(fa,{PUBLIC_RPC_FALLBACKS:()=>dl,erc20Allowance:()=>ml,erc20BalanceOf:()=>uo,resolveRpcUrl:()=>ma,rpcBatch:()=>Qf,rpcBlockNumber:()=>lo,rpcCall:()=>U,rpcChainId:()=>pl,rpcGasPrice:()=>eP,rpcGetBalance:()=>An,rpcHealth:()=>tr,rpcHealthAll:()=>fl,transactionReceipt:()=>po});import{Interface as K_,getAddress as Y_}from"ethers";function Kt(e,t){try{return Y_(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function J_(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 ul(e){return e==null?null:Number.parseInt(String(e),16)}function ma(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=zf(e,n);return r||dl[Number(e)]||null}function Yf(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!X_.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}function Q_(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Jf(e){if(e?.error)throw Q_(e.error);return e?.result}function Z_(e,t,n){return`${e}
|
|
3
3
|
${t}
|
|
4
|
-
${JSON.stringify(n??[])}`}async function Am(e,t,n){return k(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function _m(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>Sm)throw new Error(`rpcBatch: at most ${Sm} calls`);for(let i of t)Em(i?.method);let r=Di(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await Am(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(s=>[Number(s?.id),s]));return t.map((s,c)=>Im(a.get(c+1)??i[c]))}}catch{}return Promise.all(t.map(i=>D(e,i.method,i.params||[],n)))}async function D(e,t,n=[],r={}){let o=String(t||""),i=Em(o),a=Di(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=km.get(a);if(u!=null)return u}let c=r.dedupe!==!1&&!r.signal?mA(a,o,n):null;if(c&&Gr.has(c))return Gr.get(c);let l=(async()=>{let u=await Am(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=Im(u);return i==="eth_chainid"&&typeof d=="string"&&km.set(a,d),d})();return c&&(Gr.set(c,l),l.finally(()=>{Gr.get(c)===l&&Gr.delete(c)}).catch(()=>{})),l}async function Wn(e,t={}){let[n,r]=await _m(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:mc(e)?.name||null}}async function Kr(e,t={}){let n=await D(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function gc(e,t={}){let n=await D(e,"eth_chainId",[],t);return parseInt(n,16)}async function fA(e,t={}){let n=await D(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function gn(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await D(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function yc(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Dt(e.token||e.tokenAddress,"token"),o=Dt(e.owner,"owner"),i=Dt(e.spender,"spender"),a=Fi.encodeFunctionData("allowance",[o,i]),s=await D(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Fi.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 Yr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Dt(e.token||e.tokenAddress,"token"),o=Dt(e.account||e.owner||e.address,"account"),i=Fi.encodeFunctionData("balanceOf",[o]),a=await D(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Fi.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 Jr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=uA(e.txHash||e.hash||e.transactionHash),o=await D(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=fc(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?Dt(e.expectedTo,"expectedTo"):null,u=o.to?Dt(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?Dt(o.from,"receipt.from"):null,blockNumber:fc(o.blockNumber),transactionIndex:fc(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function bc(e={}){let t=e.chainIds||Object.values(pc).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!xm(r)&&!hc[r]&&!Di(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Wn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Fi,hc,dA,Sm,Gr,km,he=ve(()=>{$();vm();Fi=new cA(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);hc={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"};dA=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Sm=32,Gr=new Map,km=new Map});import{createHash as NA,createHmac as OA,timingSafeEqual as g5}from"node:crypto";function kc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(kc).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${kc(e[n])}`).join(",")}}`}function Fm(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Dm(e=process.env){return Fm(process.env)||Fm(e)}function $A(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function bn(e){let t=$A(e);return NA("sha256").update(kc(t)).digest("hex")}function BA(e,t=Dm()){return t?OA("sha256",t).update(String(e)).digest("hex"):""}function N(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+Ec:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>LA)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:RA},m=bn(p),f=Dm(r),h=f?BA(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var RA,Ec,LA,X=ve(()=>{RA=2,Ec=300*1e3,LA=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Q1({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"?X1:J1}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=Q1(t);return k(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function zf(e={}){let t=await ce({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function It(e={}){return ce({type:"allMids"},e)}async function Xn(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function fo(e={}){return ce({type:"outcomeMeta"},e)}async function aa(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function Vf(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function Wf(e={}){return ce({type:"meta"},e)}async function Qe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}async function sa({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 ce(i,o)}async function Gf({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return ce({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Kf(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function Yf(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function Qn(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function ca(e={}){return ce({type:"spotMeta"},e)}var J1,X1,st=ve(()=>{$();J1="https://api.hyperliquid.xyz/info",X1="https://api.hyperliquid-testnet.xyz/info"});async function rh(e={}){let t=Date.now();if(wo.dexs&&t-wo.at<6e4&&!e.fetchImpl)return wo.dexs;let n=await ce({type:"perpDexs"},e);return wo={at:t,dexs:Array.isArray(n)?n:[]},wo.dexs}async function oh(e="",t={}){let n=e||"",r=Date.now(),o=nh.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ce({type:"metaAndAssetCtxs",dex:e},t):await Qe(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return nh.set(n,c),c}function jt(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=ih+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Ht(e,t){let n=dl(e),r=dl(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=ih+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 dl(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 pl(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:jt(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Ht(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:c_(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=Ht(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 rh(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 oh(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=s_+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 oh("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await rh(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 pl({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 c_(e,t){let n=dl(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var ih,s_,wo,nh,fa=ve(()=>{st();ih=1e8,s_=1e5,wo={at:0,dexs:null},nh=new Map});function Ae(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 Ze(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function En(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=Ae(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 et(e,t="amount"){let n=En(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Ee(e,t,n="amount"){let r=Ae(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 Zn=ve(()=>{});function m_(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 ah(e,t){let n=Ae(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 bt(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=>bt(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)}:${bt(e[r],t)}`).join(",")}}`}function f_(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)||bt(n,"declared order type")!==bt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(bt(n,"declared order type")!==bt({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||bt(n,"declared order type")!==bt({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 h_(e,t,n){let r=ah(e.s,"signed size"),o=ah(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Ee(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Ee(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function g_(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=zt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(Ze(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=En(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Ee(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function sh(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(Ae(e.s,"hl: signed size")!==Ae(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ae(e.p,"hl: signed price")!==Ae(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(bt(e.t,"signed order type")!==bt(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 ch(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(Ae(e.s,"hl: bracket protection size")!==Ae(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ae(e.p,"hl: bracket protection price")!==Ae(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(Ae(i.triggerPx,"hl: triggerPx")!==Ae(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function y_(e){let t=String(e||"").replace(/\/$/,"");if(!l_.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function ml(e){return jt(e)!=null}function b_(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(ml(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 w_(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(ml(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 lh(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=zt(n.kind,"kind",48),o=d_[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=y_(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!==p_[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(u_.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=zt(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=jt(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(b_(c,t),w_(c,l,t),r==="hip4-order"&&!ml(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");f_(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");sh(u[0],n,l);let f=1;d!=null&&ch(u[f++],n,l,d,"tp"),p!=null&&ch(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");sh(u[0],n,l)}h_(u[0],n,t),g_(n,t),s=Ae(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=zt(n.usd,"margin usd",64),d=Ee(u,6,"hl: margin usd");if(En(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=Ee(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=m_(f,6)}}if(r==="builder-fee-approval"){let c=zt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(zt(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=zt(n.maxFeeRate,"maxFeeRate",32);if(zt(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=Ee(u.slice(0,-1),12,"hl: builder fee percent"),p=Ee(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 l_,u_,d_,p_,zt,uh=ve(()=>{Zn();fa();l_=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),u_=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),d_=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"}),p_=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"}),zt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function v_(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 ha(e,t={},n={}){let r=String(e?.kind||""),o=x_[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:v_(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 lh(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 x_,fl=ve(()=>{uh();x_=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 S_,JsonRpcProvider as k_}from"ethers";function C_(e){return P_.test(String(e||""))}async function ga(e,{contract:t=E_,rpc:n=A_,chainId:r=I_,balanceOf:o}={}){if(!C_(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new k_(n,r,{staticNetwork:!0}),a=new S_(t,__,i);return BigInt(await a.balanceOf(e))}var E_,I_,A_,__,P_,hl=ve(()=>{E_="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",I_=999,A_="https://rpc.hyperliquid.xyz/evm",__=["function balanceOf(address owner) view returns (uint256)"],P_=/^0x[a-fA-F0-9]{40}$/});import{existsSync as T_,readFileSync as N_,lstatSync as O_}from"node:fs";import{homedir as dh}from"node:os";import{join as gl}from"node:path";function $_(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(ph,t)?ph[t]:L_}function U_(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[mh])return String(e[mh]);let t=e.ORACLE_CONFIG_DIR||gl(dh(),".config","oracle");return gl(t,"fee-recipient")}return gl(dh(),".config","oracle","fee-recipient")}function yl(e=process.env){try{let t=U_(e);if(!T_(t)||O_(t).isSymbolicLink())return"";let n=N_(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function q_(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),R_)}function H_({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[M_]||"").trim(),o=String(e[F_]||D_).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=$_(t),a=q_(e[B_],{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=yl(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 ya({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=H_({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 ga(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function fh(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function hh(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var R_,L_,ph,B_,M_,F_,mh,D_,ba=ve(()=>{hl();R_=100,L_=5,ph=Object.freeze({swap:5,bridge:5,perps:0,nft:0});B_="ORACLE_INTEGRATOR_FEE_BPS",M_="ORACLE_INTEGRATOR_FEE_RECIPIENT",F_="ORACLE_INTEGRATOR_ID",mh="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",D_="oracle"});var _l={};Bi(_l,{HL_BUILDER_ADDRESS_ENV:()=>wa,HL_BUILDER_DEFAULT_FEE_BPS:()=>j_,HL_BUILDER_FEE_ENV:()=>wl,HL_BUILDER_FEE_TIERS:()=>xo,HL_BUILDER_MAX_FEE_BPS:()=>bl,HL_PERP_MAX_SIG_FIGS:()=>gh,HL_PERP_PRICE_DECIMALS:()=>yh,HL_SIGNATURE_CHAIN_ID:()=>xa,MARGIN_MODE:()=>vo,ORDER_TYPES:()=>He,TIF:()=>So,formatPerpPrice:()=>_t,formatPerpSize:()=>vh,hlBuilderFeeBpsForKind:()=>xh,hlPerpAssetInfo:()=>Vt,hlPrepareApproveAgent:()=>J_,hlPrepareBracketOrder:()=>Al,hlPrepareBuilderApproval:()=>kl,hlPrepareCancelOrder:()=>ko,hlPreparePerpOrder:()=>Wt,hlPrepareUpdateIsolatedMargin:()=>Il,hlPrepareUpdateLeverage:()=>El,resolveBuilderFee:()=>vl});function bh(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 z_(e,t){let n=bh(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function V_(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 wh(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 xh(e="perp"){if(e==="perp"||e==="main")return xo.perp;if(e==="spot")return xo.spot;if(e==="hip3")return xo.hip3;if(e==="outcome"||e==="hip4")return xo.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function vl({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[wa]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${wa} must be an EVM address`);let o=yl(e);if(!o||o!==r)return null;let i=e?.[wl],a=xh(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: ${wl} must be a positive number in 0.1 bps increments`);if(s>bl)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${bl} 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 W_(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 ce({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 G_(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||ga;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Sl(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 K_(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 Sl(r,a,n)}function _t(e,t,n={}){let r=yh-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Sl(K_(e,gh,n),r,n)}function vh(e,t){let n=Sl(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 Y_(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 Vt(e={},t={}){let n=await pl(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 xl(e,{tif:t=So.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case He.LIMIT:return{limit:{tif:t}};case He.MARKET:return{limit:{tif:So.IOC}};case He.STOP_MARKET:case He.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:_t(n,o),tpsl:e===He.STOP_MARKET?"sl":"tp"}};case He.STOP_LIMIT:case He.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:_t(n,o),tpsl:e===He.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function In(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:xa,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 er(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=ha(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,N(r,{provider:e.provider||"hl-perps",kind:e.kind})}function kl(e={},t={}){let n=vl({env:t.env});if(!n)throw new Error(`hl-perps: ${wa} 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:xa,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return er({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...In(o,r,t)},e,t)}function J_(e={},t={}){let n=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("hl-perps: agentAddress required");let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:xa,agentAddress:n.toLowerCase(),agentName:o,nonce:r};return N({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:n.toLowerCase(),agentName:o,...In(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function Wt(e={},t={}){let n=await Vt(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??He.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=wh(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=vh(e.size??e.sz,n.szDecimals),s;if(r===He.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let E=await It(t);x=Number(E?.[n.coin]??E?.[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=_t(b,n.szDecimals,{roundDown:o});let v=Math.abs(Number(s)/x-1)*1e4;if(v>y+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.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=_t(e.price??e.limitPx,n.szDecimals)}let c=xl(r,{tif:e.tif??(r===He.MARKET?So.IOC:So.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=vl({env:t.env,kind:n.kind}),p=await G_(d,e,t),m=p.exempt?null:d,f=await W_(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=Y_(a,s);return er({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,...In(u,g,t)},e,t)}async function ko(e={},t={}){let n=await Vt(V_(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=bh(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return er({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...In(i,Number(e.nonce??Date.now()),t)},e,t)}async function El(e={},t={}){let n=await Vt(e,t),r=z_(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||vo.CROSS).toLowerCase();if(o!==vo.CROSS&&o!==vo.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===vo.CROSS,leverage:r};return er({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,...In(i,Number(e.nonce??Date.now()),t)},e,t)}async function Il(e={},t={}){let n=await Vt(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=Ee(o,6,"hl-perps: usd"),a=wh(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return er({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...In(s,Number(e.nonce??Date.now()),t)},e,t)}async function Al(e={},t={}){let n=await Wt(e,t),r=await Vt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:_t(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:xl(He.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:_t(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:xl(He.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 er({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:_t(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:_t(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...In(a,Number(e.nonce??Date.now()),t)},e,t)}var gh,yh,xa,j_,bl,wa,wl,xo,He,So,vo,Eo=ve(()=>{st();fa();Zn();X();fl();hl();ba();gh=5,yh=6,xa="0x66eee",j_=2,bl=10,wa="ORACLE_HL_BUILDER_ADDRESS",wl="ORACLE_HL_BUILDER_FEE_BPS",xo=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),He=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),So=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),vo=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as ew,readFileSync as zO}from"node:fs";import{dirname as Zb,join as ed}from"node:path";import{fileURLToPath as VO}from"node:url";function WO(e){let t=Zb(VO(e));for(let n=0;n<8;n+=1){let r=ed(t,"package.json");if(ew(r))try{let i=JSON.parse(zO(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Zb(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function ss(e,t){let n=WO(t),r=ed(n,e);return ew(r)?r:ed(n,"dist","assets",e)}var td=ve(()=>{});import{isAddress as GO}from"ethers";function YO(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:tw,tag:`v${tw}`}),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 cs(e){let t=$n[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function ri(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function oi(e,t){let n=String(e||"");if(!GO(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function nw(e,t){let n=cs(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");ri(i,"safe-erc20: supply"),oi(a,"safe-erc20: initialHolder"),oi(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(ri(i,"safe-erc721-drop: cap"),oi(a,"safe-erc721-drop: treasury"),ri(s,"safe-erc721-drop: mintPrice"),ri(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");oi(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;oi(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`)}ri(i,"safe-vesting: durationSeconds")}return n}function rw(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var tw,KO,$n,ls=ve(()=>{tw="5.0.2",KO={"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"]}};$n=Object.freeze(Object.fromEntries(Object.entries(KO).map(([e,t])=>[e,YO(e,t)])))});import{spawnSync as nd}from"node:child_process";import{existsSync as Bn,readFileSync as us,readdirSync as ow,statSync as iw}from"node:fs";import{join as vt}from"node:path";import{createHash as JO}from"node:crypto";function ps(){return Bn(ii)?ow(ii).filter(e=>$n[e]&&iw(vt(ii,e)).isDirectory()).map(e=>{let t=vt(ii,e),n=vt(t,"SECURITY.md");return{id:e,path:t,metadata:cs(e),securityNotice:Bn(n)?us(n,"utf8").slice(0,500):null,disclaimer:ds}}):[]}function aw(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",vt(e,".foundry/bin/forge")];for(let n of t)if(nd(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function XO(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:nd("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function vr(e,t,n){let r=nd(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 QO(e){let t=JO("sha256");function n(r){let o=iw(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of ow(r).sort())n(vt(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(us(r)))}return n(e),t.digest("hex")}function ai(e,t={}){let n=cs(e),r=t.allowSkipStatic!==!1,o=vt(ii,e);if(!Bn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=aw();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(!Bn(vt(o,"lib","forge-std"))){let m=vr(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
5
|
-
${m.stderr}`)}if(!
|
|
6
|
-
${m.stderr}`)}let a=
|
|
7
|
-
${c.stderr}`.slice(0,2e3));let l=
|
|
4
|
+
${JSON.stringify(n??[])}`}async function Xf(e,t,n){return v(e,{method:"POST",body:t,fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal})}async function Qf(e,t,n={}){if(!Array.isArray(t)||t.length===0)throw new Error("rpcBatch requires a non-empty calls array");if(t.length>Gf)throw new Error(`rpcBatch: at most ${Gf} calls`);for(let i of t)Yf(i?.method);let r=ma(e,n);if(!r)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let o=t.map((i,a)=>({jsonrpc:"2.0",id:a+1,method:i.method,params:i.params||[]}));try{let i=await Xf(r,o,n);if(Array.isArray(i)&&i.length===t.length){let a=new Map(i.map(s=>[Number(s?.id),s]));return t.map((s,c)=>Jf(a.get(c+1)??i[c]))}}catch{}return Promise.all(t.map(i=>U(e,i.method,i.params||[],n)))}async function U(e,t,n=[],r={}){let o=String(t||""),i=Yf(o),a=ma(e,r);if(!a)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&r.cacheChainId!==!1){let u=Kf.get(a);if(u!=null)return u}let c=r.dedupe!==!1&&!r.signal?Z_(a,o,n):null;if(c&&co.has(c))return co.get(c);let l=(async()=>{let u=await Xf(a,{jsonrpc:"2.0",id:1,method:t,params:n},r),d=Jf(u);return i==="eth_chainid"&&typeof d=="string"&&Kf.set(a,d),d})();return c&&(co.set(c,l),l.finally(()=>{co.get(c)===l&&co.delete(c)}).catch(()=>{})),l}async function tr(e,t={}){let[n,r]=await Qf(e,[{method:"eth_blockNumber",params:[]},{method:"eth_chainId",params:[]}],t),o=parseInt(n,16),i=parseInt(r,16);return{ok:Number.isFinite(o)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:o,name:ll(e)?.name||null}}async function lo(e,t={}){let n=await U(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function pl(e,t={}){let n=await U(e,"eth_chainId",[],t);return parseInt(n,16)}async function eP(e,t={}){let n=await U(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function An(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await U(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function ml(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Kt(e.token||e.tokenAddress,"token"),o=Kt(e.owner,"owner"),i=Kt(e.spender,"spender"),a=pa.encodeFunctionData("allowance",[o,i]),s=await U(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=pa.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=Kt(e.token||e.tokenAddress,"token"),o=Kt(e.account||e.owner||e.address,"account"),i=pa.encodeFunctionData("balanceOf",[o]),a=await U(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=pa.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 po(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=J_(e.txHash||e.hash||e.transactionHash),o=await U(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=ul(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?Kt(e.expectedTo,"expectedTo"):null,u=o.to?Kt(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?Kt(o.from,"receipt.from"):null,blockNumber:ul(o.blockNumber),transactionIndex:ul(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function fl(e={}){let t=e.chainIds||Object.values(cl).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Vf(r)&&!dl[r]&&!ma(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await tr(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var pa,dl,X_,Gf,co,Kf,fe=xe(()=>{O();Wf();pa=new K_(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);dl={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"};X_=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;Gf=32,co=new Map,Kf=new Map});import{createHash as gP,createHmac as bP,timingSafeEqual as o3}from"node:crypto";function wl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(wl).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${wl(e[n])}`).join(",")}}`}function lh(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function uh(e=process.env){return lh(process.env)||lh(e)}function xP(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function _n(e){let t=xP(e);return gP("sha256").update(wl(t)).digest("hex")}function SP(e,t=uh()){return t?bP("sha256",t).update(String(e)).digest("hex"):""}function N(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+vl:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>vP)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:wP},m=_n(p),f=uh(r),h=f?SP(m,f):void 0,y={...p,prepareHash:m};return h&&(y.prepareMac=h),y}var wP,vl,vP,X=xe(()=>{wP=2,vl=300*1e3,vP=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function FT({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"?MT:BT}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=FT(t);return v(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function f0(e={}){let t=await ce({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function ht(e={}){return ce({type:"allMids"},e)}async function ar(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function To(e={}){return ce({type:"outcomeMeta"},e)}async function La(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function h0(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function y0(e={}){return ce({type:"meta"},e)}async function Ve(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}async function $a({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 ce(i,o)}async function g0({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return ce({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function b0(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function w0(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function sr(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function Ba(e={}){return ce({type:"spotMeta"},e)}var BT,MT,at=xe(()=>{O();BT="https://api.hyperliquid.xyz/info",MT="https://api.hyperliquid-testnet.xyz/info"});async function _0(e={}){let t=Date.now();if(Lo.dexs&&t-Lo.at<6e4&&!e.fetchImpl)return Lo.dexs;let n=await ce({type:"perpDexs"},e);return Lo={at:t,dexs:Array.isArray(n)?n:[]},Lo.dexs}async function P0(e="",t={}){let n=e||"",r=Date.now(),o=A0.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await ce({type:"metaAndAssetCtxs",dex:e},t):await Ve(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return A0.set(n,c),c}function Qt(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=T0+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function Xt(e,t){let n=su(e),r=su(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=T0+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 su(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 cu(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Qt(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:Xt(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:KT(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=Xt(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 _0(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 P0(l,t),y=f.findIndex(b=>b.name===n||b.name===`${l}:${d}`||b.name.endsWith(`:${d}`));if(y<0)throw new Error(`hl-assets: ${n} not in dex ${l} meta`);let w=f[y];if(w.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let x=GT+m*1e4+y,g=h[y]||{};return{kind:"hip3",coin:w.name||n,assetId:x,szDecimals:w.szDecimals??0,maxLeverage:w.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:y,markPx:g.markPx??null}}let{universe:r,ctxs:o}=await P0("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await _0(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 cu({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 KT(e,t){let n=su(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var T0,GT,Lo,A0,Ha=xe(()=>{at();T0=1e8,GT=1e5,Lo={at:0,dexs:null},A0=new Map});function Pe(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 st(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Rn(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=Pe(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 ct(e,t="amount"){let n=Rn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Ae(e,t,n="amount"){let r=Pe(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 cr=xe(()=>{});function ZT(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 C0(e,t){let n=Pe(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 At(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=>At(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)}:${At(e[r],t)}`).join(",")}}`}function eC(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)||At(n,"declared order type")!==At({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(At(n,"declared order type")!==At({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||At(n,"declared order type")!==At({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 tC(e,t,n){let r=C0(e.s,"signed size"),o=C0(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Ae(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Ae(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function nC(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=Zt(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(st(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=Rn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Ae(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function N0(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(Pe(e.s,"hl: signed size")!==Pe(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Pe(e.p,"hl: signed price")!==Pe(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(At(e.t,"signed order type")!==At(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 O0(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(Pe(e.s,"hl: bracket protection size")!==Pe(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Pe(e.p,"hl: bracket protection price")!==Pe(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(Pe(i.triggerPx,"hl: triggerPx")!==Pe(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function rC(e){let t=String(e||"").replace(/\/$/,"");if(!YT.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function lu(e){return Qt(e)!=null}function oC(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(lu(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 iC(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(lu(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 R0(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=Zt(n.kind,"kind",48),o=XT[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=rC(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!==QT[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(JT.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=Zt(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=Qt(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(oC(c,t),iC(c,l,t),r==="hip4-order"&&!lu(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");eC(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");N0(u[0],n,l);let f=1;d!=null&&O0(u[f++],n,l,d,"tp"),p!=null&&O0(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");N0(u[0],n,l)}tC(u[0],n,t),nC(n,t),s=Pe(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=Zt(n.usd,"margin usd",64),d=Ae(u,6,"hl: margin usd");if(Rn(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=Ae(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=ZT(f,6)}}if(r==="builder-fee-approval"){let c=Zt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Zt(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=Zt(n.maxFeeRate,"maxFeeRate",32);if(Zt(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=Ae(u.slice(0,-1),12,"hl: builder fee percent"),p=Ae(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 YT,JT,XT,QT,Zt,L0=xe(()=>{cr();Ha();YT=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),JT=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),XT=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"}),QT=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"}),Zt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function sC(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 ja(e,t={},n={}){let r=String(e?.kind||""),o=aC[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:sC(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 R0(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 aC,uu=xe(()=>{L0();aC=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 cC,JsonRpcProvider as lC}from"ethers";function hC(e){return fC.test(String(e||""))}async function za(e,{contract:t=uC,rpc:n=pC,chainId:r=dC,balanceOf:o}={}){if(!hC(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new lC(n,r,{staticNetwork:!0}),a=new cC(t,mC,i);return BigInt(await a.balanceOf(e))}var uC,dC,pC,mC,fC,du=xe(()=>{uC="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",dC=999,pC="https://rpc.hyperliquid.xyz/evm",mC=["function balanceOf(address owner) view returns (uint256)"],fC=/^0x[a-fA-F0-9]{40}$/});import{existsSync as yC,readFileSync as gC,lstatSync as bC}from"node:fs";import{homedir as $0}from"node:os";import{join as pu}from"node:path";function xC(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(B0,t)?B0[t]:vC}function AC(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[M0])return String(e[M0]);let t=e.ORACLE_CONFIG_DIR||pu($0(),".config","oracle");return pu(t,"fee-recipient")}return pu($0(),".config","oracle","fee-recipient")}function mu(e=process.env){try{let t=AC(e);if(!yC(t)||bC(t).isSymbolicLink())return"";let n=gC(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function _C(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),wC)}function PC({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[kC]||"").trim(),o=String(e[IC]||EC).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=xC(t),a=_C(e[SC],{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=mu(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 Va({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=PC({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 za(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function F0(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function U0(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var wC,vC,B0,SC,kC,IC,M0,EC,Wa=xe(()=>{du();wC=100,vC=5,B0=Object.freeze({swap:5,bridge:5,perps:0,nft:0});SC="ORACLE_INTEGRATOR_FEE_BPS",kC="ORACLE_INTEGRATOR_FEE_RECIPIENT",IC="ORACLE_INTEGRATOR_ID",M0="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",EC="oracle"});var ku={};ua(ku,{HL_BUILDER_ADDRESS_ENV:()=>Ga,HL_BUILDER_DEFAULT_FEE_BPS:()=>TC,HL_BUILDER_FEE_ENV:()=>hu,HL_BUILDER_FEE_TIERS:()=>$o,HL_BUILDER_MAX_FEE_BPS:()=>fu,HL_PERP_MAX_SIG_FIGS:()=>D0,HL_PERP_PRICE_DECIMALS:()=>q0,HL_SIGNATURE_CHAIN_ID:()=>Ka,MARGIN_MODE:()=>Bo,ORDER_TYPES:()=>We,TIF:()=>Mo,formatPerpPrice:()=>$t,formatPerpSize:()=>V0,hlBuilderFeeBpsForKind:()=>z0,hlPerpAssetInfo:()=>en,hlPrepareApproveAgent:()=>BC,hlPrepareBracketOrder:()=>Su,hlPrepareBuilderApproval:()=>wu,hlPrepareCancelOrder:()=>Fo,hlPreparePerpOrder:()=>tn,hlPrepareUpdateIsolatedMargin:()=>xu,hlPrepareUpdateLeverage:()=>vu,resolveBuilderFee:()=>gu});function H0(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 CC(e,t){let n=H0(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function NC(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 j0(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 z0(e="perp"){if(e==="perp"||e==="main")return $o.perp;if(e==="spot")return $o.spot;if(e==="hip3")return $o.hip3;if(e==="outcome"||e==="hip4")return $o.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function gu({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Ga]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Ga} must be an EVM address`);let o=mu(e);if(!o||o!==r)return null;let i=e?.[hu],a=z0(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: ${hu} must be a positive number in 0.1 bps increments`);if(s>fu)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${fu} 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 OC(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 ce({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 RC(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||za;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function bu(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 LC(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 bu(r,a,n)}function $t(e,t,n={}){let r=q0-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return bu(LC(e,D0,n),r,n)}function V0(e,t){let n=bu(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 $C(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 en(e={},t={}){let n=await cu(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 yu(e,{tif:t=Mo.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case We.LIMIT:return{limit:{tif:t}};case We.MARKET:return{limit:{tif:Mo.IOC}};case We.STOP_MARKET:case We.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:$t(n,o),tpsl:e===We.STOP_MARKET?"sl":"tp"}};case We.STOP_LIMIT:case We.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:$t(n,o),tpsl:e===We.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Ln(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:Ka,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=ja(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,N(r,{provider:e.provider||"hl-perps",kind:e.kind})}function wu(e={},t={}){let n=gu({env:t.env});if(!n)throw new Error(`hl-perps: ${Ga} 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:Ka,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return lr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Ln(o,r,t)},e,t)}function BC(e={},t={}){let n=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("hl-perps: agentAddress required");let r=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(r)||r<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:Ka,agentAddress:n.toLowerCase(),agentName:o,nonce:r};return N({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:n.toLowerCase(),agentName:o,...Ln(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function tn(e={},t={}){let n=await en(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??We.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=j0(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=V0(e.size??e.sz,n.szDecimals),s;if(r===We.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let I=await ht(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 g=Number(e.maxSlippageBps??50);if(!Number.isInteger(g)||g<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(g>100)throw new Error(`hl-perps: maxSlippageBps ${g} exceeds the hard 100 bps cap`);let b=o?x*(1+g/1e4):x*(1-g/1e4);s=$t(b,n.szDecimals,{roundDown:o});let S=Math.abs(Number(s)/x-1)*1e4;if(S>g+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${S.toFixed(2)} bps from mark, above the ${g} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=$t(e.price??e.limitPx,n.szDecimals)}let c=yu(r,{tif:e.tif??(r===We.MARKET?Mo.IOC:Mo.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=gu({env:t.env,kind:n.kind}),p=await RC(d,e,t),m=p.exempt?null:d,f=await OC(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let y=Number(e.nonce??Date.now()),w=$C(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,...Ln(u,y,t)},e,t)}async function Fo(e={},t={}){let n=await en(NC(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=H0(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,...Ln(i,Number(e.nonce??Date.now()),t)},e,t)}async function vu(e={},t={}){let n=await en(e,t),r=CC(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||Bo.CROSS).toLowerCase();if(o!==Bo.CROSS&&o!==Bo.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===Bo.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,...Ln(i,Number(e.nonce??Date.now()),t)},e,t)}async function xu(e={},t={}){let n=await en(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=Ae(o,6,"hl-perps: usd"),a=j0(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,...Ln(s,Number(e.nonce??Date.now()),t)},e,t)}async function Su(e={},t={}){let n=await tn(e,t),r=await en(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:$t(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:yu(We.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:$t(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:yu(We.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:$t(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:$t(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Ln(a,Number(e.nonce??Date.now()),t)},e,t)}var D0,q0,Ka,TC,fu,Ga,hu,$o,We,Mo,Bo,Uo=xe(()=>{at();Ha();cr();X();uu();du();Wa();D0=5,q0=6,Ka="0x66eee",TC=2,fu=10,Ga="ORACLE_HL_BUILDER_ADDRESS",hu="ORACLE_HL_BUILDER_FEE_BPS",$o=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),We=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Mo=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),Bo=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as Hv,readFileSync as VL}from"node:fs";import{dirname as qv,join as np}from"node:path";import{fileURLToPath as WL}from"node:url";function GL(e){let t=qv(WL(e));for(let n=0;n<8;n+=1){let r=np(t,"package.json");if(Hv(r))try{let i=JSON.parse(VL(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=qv(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Vs(e,t){let n=GL(t),r=np(n,e);return Hv(r)?r:np(n,"dist","assets",e)}var rp=xe(()=>{});import{isAddress as KL}from"ethers";function JL(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:jv,tag:`v${jv}`}),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 Ws(e){let t=jn[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Ti(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Ci(e,t){let n=String(e||"");if(!KL(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function zv(e,t){let n=Ws(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");Ti(i,"safe-erc20: supply"),Ci(a,"safe-erc20: initialHolder"),Ci(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(Ti(i,"safe-erc721-drop: cap"),Ci(a,"safe-erc721-drop: treasury"),Ti(s,"safe-erc721-drop: mintPrice"),Ti(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Ci(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Ci(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`)}Ti(i,"safe-vesting: durationSeconds")}return n}function Vv(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var jv,YL,jn,Gs=xe(()=>{jv="5.0.2",YL={"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"]}};jn=Object.freeze(Object.fromEntries(Object.entries(YL).map(([e,t])=>[e,JL(e,t)])))});import{spawnSync as op}from"node:child_process";import{existsSync as zn,readFileSync as Ks,readdirSync as Wv,statSync as Gv}from"node:fs";import{join as Tt}from"node:path";import{createHash as XL}from"node:crypto";function Js(){return zn(Ni)?Wv(Ni).filter(e=>jn[e]&&Gv(Tt(Ni,e)).isDirectory()).map(e=>{let t=Tt(Ni,e),n=Tt(t,"SECURITY.md");return{id:e,path:t,metadata:Ws(e),securityNotice:zn(n)?Ks(n,"utf8").slice(0,500):null,disclaimer:Ys}}):[]}function Kv(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Tt(e,".foundry/bin/forge")];for(let n of t)if(op(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function QL(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:op("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function Or(e,t,n){let r=op(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 ZL(e){let t=XL("sha256");function n(r){let o=Gv(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Wv(r).sort())n(Tt(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(Ks(r)))}return n(e),t.digest("hex")}function Oi(e,t={}){let n=Ws(e),r=t.allowSkipStatic!==!1,o=Tt(Ni,e);if(!zn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=Kv();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(!zn(Tt(o,"lib","forge-std"))){let m=Or(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
5
|
+
${m.stderr}`)}if(!zn(Tt(o,"lib","openzeppelin-contracts"))){let m=Or(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
6
|
+
${m.stderr}`)}let a=Tt(o,"lib","openzeppelin-contracts","package.json"),s=zn(a)?JSON.parse(Ks(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=Or(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
7
|
+
${c.stderr}`.slice(0,2e3));let l=Or(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
8
8
|
${l.stdout}
|
|
9
|
-
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=
|
|
9
|
+
${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=QL();if(d){let m=Or(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}
|
|
10
10
|
${m.stdout}
|
|
11
|
-
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=
|
|
12
|
-
${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=
|
|
11
|
+
${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=ZL(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:Ys,firmAudit:!1}}function Yv(e,t={}){let n=Oi(e,t),r=Kv(),o=n.path,i=Or(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
|
|
12
|
+
${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=Tt(o,"out",`${a}.sol`,`${a}.json`);if(!zn(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(Ks(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 Ni,Ys,Xs=xe(()=>{rp();Gs();Ni=Vs("protocols/templates",import.meta.url),Ys="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 ip}from"node:crypto";import{secp256k1 as Ri}from"@noble/curves/secp256k1.js";import{bech32m as Qv}from"@scure/base";function pt(e,t){throw new Error(`${e}: ${t}`)}function rx(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||pt("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function ap(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{pt(t,`must be an integer from ${n} to ${r}`)}}function o$(e){let t=String(e||"");if(!t||[...t].some(o=>!Zv.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(Zv.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 ex(e,t){let n=String(e||"").trim(),r=o$(n);return(!r||r.length!==32)&&pt(t,"must be a 32-byte base58 Solana public key"),n}function tx(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||pt(t,"must be a compressed secp256k1 public key");try{Ri.Point.fromHex(n)}catch{pt(t,"must encode a valid secp256k1 curve point")}return n}function i$(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}pt("bitcoin-tapscript-vault","script too large")}function cp(e,t){let n=ip("sha256").update(e).digest();return ip("sha256").update(n).update(n).update(t).digest()}function nx(e){return cp("TapLeaf",Buffer.concat([Buffer.from([192]),i$(e.length),e]))}function a$(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return cp("TapBranch",Buffer.concat([n,r]))}function Qs(e){return Ri.Point.fromHex(e).x.toString(16).padStart(64,"0")}function ox(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function s$(e,t){let n=[];return e.forEach((r,o)=>n.push(ox(Qs(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function c$(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 l$(e,t){return Buffer.concat([c$(t),Buffer.from([178,117]),ox(Qs(e)),Buffer.from([172])])}function u$(e,t,n){let r=Ri.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${cp("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Ri.Point.Fn.ORDER,s=o.add(Ri.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:Qv.encode(l,[1,...Qv.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function wt(e,t){return Object.freeze({path:e,content:t.endsWith(`
|
|
13
13
|
`)?t:`${t}
|
|
14
|
-
`})}function
|
|
14
|
+
`})}function d$(e){let t=ip("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 p$(e){let t=rx(e.projectName),n=ex(e.authority,"solana-safe-vault authority"),r=ap(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||pt("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=ex(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&pt("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
|
|
15
15
|
use anchor_lang::system_program::{transfer, Transfer};
|
|
16
16
|
|
|
17
17
|
declare_id!("${i}");
|
|
@@ -99,16 +99,16 @@ pub enum VaultError {
|
|
|
99
99
|
#[msg("Vault has insufficient funds")] InsufficientFunds,
|
|
100
100
|
#[msg("Arithmetic overflow")] ArithmeticOverflow,
|
|
101
101
|
}
|
|
102
|
-
`,s=[
|
|
102
|
+
`,s=[wt("Anchor.toml",`[provider]
|
|
103
103
|
cluster = "${o}"
|
|
104
104
|
wallet = "~/.config/solana/id.json"
|
|
105
105
|
|
|
106
106
|
[programs.${o}]
|
|
107
107
|
${t} = "${i}"
|
|
108
|
-
`),
|
|
108
|
+
`),wt("Cargo.toml",`[workspace]
|
|
109
109
|
members = ["programs/${t}"]
|
|
110
110
|
resolver = "2"
|
|
111
|
-
`),
|
|
111
|
+
`),wt(`programs/${t}/Cargo.toml`,`[package]
|
|
112
112
|
name = "${t}"
|
|
113
113
|
version = "0.1.0"
|
|
114
114
|
edition = "2021"
|
|
@@ -124,30 +124,30 @@ default = []
|
|
|
124
124
|
|
|
125
125
|
[dependencies]
|
|
126
126
|
anchor-lang = "0.31.1"
|
|
127
|
-
`),
|
|
127
|
+
`),wt(`programs/${t}/src/lib.rs`,a),wt(`tests/${t}.ts`,`// Generated lifecycle test plan. Run with Anchor on ${o}.
|
|
128
128
|
// 1. initialize with ${r} slots; 2. deposit; 3. reject early withdrawal;
|
|
129
129
|
// 4. advance slots; 5. withdraw as authority; 6. reject non-authority.
|
|
130
|
-
`),
|
|
130
|
+
`),wt("SECURITY.md",`# Security model
|
|
131
131
|
|
|
132
132
|
- Initial and permanent withdrawal authority: \`${n}\`
|
|
133
133
|
- Unlock delay: ${r} slots after the most recent deposit
|
|
134
134
|
- No upgrade authority is created by this source; deployment authority handling is external
|
|
135
135
|
- Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
|
|
136
|
-
`)];return{family:"solana",network:o,projectName:t,protocolModel:
|
|
136
|
+
`)];return{family:"solana",network:o,projectName:t,protocolModel:Zs["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:sp},deploymentPrepared:!1}}function m$(e){let t=rx(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||pt("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>tx(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&pt("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(ap(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=tx(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&pt("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=ap(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(Qs).join(",")})`,c=`and_v(v:older(${a}),pk(${Qs(i)}))`,l=`taproot_tree(${s},${c})`,u=s$(r,o),d=l$(i,Number(a)),p=a$(nx(u),nx(d)),m=u$(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},y=[wt("policy/miniscript.txt",l),wt("policy/descriptor.txt",f),wt("policy/manifest.json",JSON.stringify(h,null,2)),wt("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)),wt("SECURITY.md",`# Security model
|
|
137
137
|
|
|
138
138
|
- Cooperative path: ${o}-of-${r.length}
|
|
139
139
|
- Recovery path: ${i} after ${a} blocks (BIP68 relative locktime)
|
|
140
140
|
- This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
|
|
141
141
|
- Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
|
|
142
|
-
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:hs["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:id},psbtPrepared:!1,fundingPrepared:!1}}function ci(){return Object.values(hs).map(e=>({...e,disclaimer:id}))}async function li(e={}){let t=String(e.templateId||"").trim(),n=hs[t];n||ot("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?d2(e):p2(e),o=u2(r.files);return N({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 id,dw,hs,sd=ve(()=>{X();id="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",dw="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",hs=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})})});import Gs from"node:fs";import RF from"node:os";import qr from"node:path";import{fileURLToPath as LF}from"node:url";function LE(){return process.env.ORACLE_FAKE_HOME||RF.homedir()}function BF(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Ks(){return BF()?process.env.ORACLE_CONFIG_DIR||qr.join(LE(),".config","oracle"):qr.join(LE(),".config","oracle")}function MF(){return qr.join(Ks(),"desk.json")}function FF(){return qr.join(Ks(),"env")}function Ur({force:e=!1}={}){if(Ur._done&&!e)return Ur._result||null;Ur._done=!0;let t={},n=(o,i)=>{if(i==null)return;let a=String(i).trim();a&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=a,t[o]=a))};try{let o=FF();if(Gs.existsSync(o))for(let i of Gs.readFileSync(o,"utf8").split(/\r?\n/)){let a=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),n(a[1],s)}}catch{}try{let o=MF();if(Gs.existsSync(o)){let i=JSON.parse(Gs.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),Ur._result=Object.keys(t).length?t:null,Ur._result}var $F,F9,$E=ve(()=>{$F=qr.dirname(LF(import.meta.url)),F9=qr.resolve($F,"../..");try{Ur()}catch{}});var jp={};Bi(jp,{armPreparedAction:()=>WF,callSigner:()=>BE,queueOwnerAction:()=>ME});import{existsSync as DF,readFileSync as UF}from"node:fs";import{request as qF}from"node:http";import HF from"node:path";function zF(e=process.env){let t=String(e.ORACLE_SIGNER_URL||jF).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function VF(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=HF.join(Ks(),"signer","signer-token");return DF(t)?UF(t,"utf8").trim():null}function BE(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=zF(r),a=VF(r);return!i||!a?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(s=>{let c=new URL(e,i),l=n?Buffer.from(JSON.stringify(n)):null,u=qF({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${a}`,origin:i,...l?{"content-type":"application/json","content-length":l.length}:{}}},d=>{let p=[];d.on("data",m=>p.push(m)),d.on("end",()=>{let m=Buffer.concat(p).toString("utf8"),f={};try{f=m?JSON.parse(m):{}}catch{f={error:"signer refused"}}s({httpStatus:d.statusCode,...f})})});u.on("timeout",()=>{u.destroy(),s({ok:!1,error:"local signer timed out"})}),u.on("error",()=>s({ok:!1,error:"local signer is not running"})),l&&u.write(l),u.end()})}async function ME(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return BE("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function WF(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return ME(n,t)}var jF,zp=ve(()=>{$E();jF="http://127.0.0.1:9462"});var LI={};Bi(LI,{CONTRACTS_EVAL_HERE:()=>M6,runContractsEval:()=>B6});import nc from"node:fs";import mn from"node:path";import{spawnSync as k6}from"node:child_process";import{fileURLToPath as E6}from"node:url";function O6(){let e=process.env.HOME||"";for(let t of["forge",mn.join(e,".foundry/bin/forge")])if(k6(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function RI(e,t=[]){if(!nc.existsSync(e))return t;for(let n of nc.readdirSync(e)){let r=mn.join(e,n);if(nc.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;RI(r,t)}else n.endsWith(".sol")&&!r.includes(`${mn.sep}lib${mn.sep}`)&&t.push(r)}return t}function R6(){let e=[];for(let t of Object.keys($n)){let n=mn.join(I6,t),r=RI(mn.join(n,"src")),o=[];for(let i of r){let a=nc.readFileSync(i,"utf8");for(let s of A6)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 L6(){return O6()?Object.keys($n).map(e=>{try{let t=ai(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($n).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function $6(){let e=[],t=ci();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 li({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:_6,programId:P6,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 li({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[C6,T6],recoveryPubkey:N6,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 B6(){let e=R6(),t=L6(),n=await $6(),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 I6,A6,_6,P6,C6,T6,N6,M6,$I=ve(()=>{ls();ms();sd();td();I6=ss("protocols/templates",import.meta.url),A6=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],_6="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",P6="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",C6="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",T6="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",N6="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";M6=mn.dirname(E6(import.meta.url))});he();import{Interface as qm,getAddress as Zr,isAddress as Hm}from"ethers";$();var hA=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function Pm(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function wc(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),a=String(r||"").toLowerCase(),s=(t||[]).map((c,l)=>{let u=Pm(o,c),d=String(u.address||"").toLowerCase(),p=String(u.symbol||"").toLowerCase(),m=Number(c.liquidityUsd??c.liquidity?.usd),f=Number.isFinite(m)?m:0,h=String(c.dex||c.dexId||"").toLowerCase(),g=0;return i.has(d)||hA.has(p)?g=300:a&&d===a&&(g=100),h.includes("v4")?g+=20:h.includes("v3")?g+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(g+=8),{pool:c,score:g*1e12+f,index:l,otherAddr:d,liquidityUsd:f}});return s.sort((c,l)=>l.score-c.score||c.index-l.index),s.map(c=>c.pool)}function Cm(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Pm(e,n[0]).address||null}var gA="https://api.dexscreener.com",yA=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),at=e=>String(e??"").toLowerCase(),bA=e=>Array.isArray(e)?e:e==null?[]:[e];function wA(e,t,n){let r=at(t),o=at(n),i=at(e?.baseToken?.address),a=at(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function xA(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function qi(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||gA).replace(/\/$/,"")}async function Tm(e={}){let n=(await k(`${qi(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function yn(e,t={}){if(!e)throw new Error("tokenAddress required");return k(`${qi(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Xr(e,t={}){if(!e)throw new Error("query required");return k(`${qi(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Nm(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return k(`${qi(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function Om({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Qr({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Qr({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=at(yA[Number(e)]||e),a=new Set(bA(r).filter(Boolean).map(at)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>yn(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=`${at(m?.chainId)}:${at(m?.dexId)}:${at(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>at(p?.chainId)===i).filter(p=>wA(p,t,n)).filter(p=>!a.size||a.has(at(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:xA(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}import{createHash as IA,createHmac as $m,timingSafeEqual as AA}from"node:crypto";import{readFileSync as SA}from"node:fs";import{homedir as kA}from"node:os";import{join as Hi}from"node:path";function EA(){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=kA();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Hi(t,".config","oracle")).trim();return[e,Hi(n,"exec.env")].filter(Boolean)}return[e,Hi(t,".config","oracle","exec.env"),Hi(t,".config","mad-desk","exec.env")].filter(Boolean)}function Rm(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of EA())try{let i=SA(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 ji=100,Lm=2e4;function zi(e){return Array.isArray(e)?`[${e.map(zi).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${zi(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Bm(e,{required:t=!1}={}){try{return Rm(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function vc(e){let{signature:t,...n}=e;return n}function Mm(e,{secret:t}={}){let n=Bm(t);return n?{...e,signature:$m("sha256",n).update(zi(vc(e))).digest("hex")}:e}function _A(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 IA("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function fe(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=Bm(o);if(i){let m=$m("sha256",i).update(zi(vc(e))).digest("hex");if(!PA(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>ji||!Number.isInteger(s)||s<0||s>ji||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=TA(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 Mm({...vc(e),calldataHash:_A(r)},{secret:o})}function PA(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:AA(n,r)}function xc(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function CA(e){let t=e==null?ji: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,ji)}function De({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=xc(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(xc(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,xc(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=CA(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function Sc({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=Lm,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=De({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)||Lm)),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 Mm({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 TA(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 re(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=Sc({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}}X();var ze={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"}},MA=[100,500,3e3,1e4],FA="0xddca3f43",Vi=new qm(["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)"]),Um=new qm(["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)"]),jm="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",zm="0x0000000000000000000000000000000000000000",Ic=[100,500,2500,1e4],DA={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ic}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ic}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:Ic}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function _c(e,t){let n=Number(e),r=ze[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(ze).join(", ")})`);let o=DA[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 Ac(e,t){let n=ze[Number(t)];if(!e||e===jm||e===zm||/^eth$/i.test(String(e)))return Zr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Zr(n.weth);if(/^usdc$/i.test(r))return Zr(n.usdc);if(!Hm(r))throw new Error(`invalid token address: ${e}`);return Zr(r)}function UA(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 qA(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 Gn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=_c(e.chainId??8453,e.venue),a=Ac(e.tokenIn||"WETH",n),s=Ac(e.tokenOut||ze[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:MA,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],p=await Promise.all(u.map(async S=>{let I=Vi.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:S,sqrtPriceLimitX96:0n}]);try{let P=await D(n,"eth_call",[{to:r,data:I},"latest"],t);if(!P||P==="0x")return{fee:S,ok:!1,error:"empty result"};let _=Vi.decodeFunctionResult("quoteExactInputSingle",P);return{fee:S,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()}}catch(P){return{fee:S,ok:!1,error:String(P.message||P).slice(0,160)}}})),m=null;for(let S of p)S.ok&&(!m||BigInt(S.amountOut)>BigInt(m.amountOut))&&(m=S);if(!m){let S=p.map(I=>`${I.fee}:${I.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${S}`)}let f=e.liquidityUsd==null?await Qr({chainId:n,tokenA:a,tokenB:s,dexIds:UA(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(f.slice(0,8).map(async S=>{if(!(!S.pairAddress||!Hm(S.pairAddress)))try{let I=await D(n,"eth_call",[{to:S.pairAddress,data:FA},"latest"],t),P=I&&I!=="0x"&&I.length<=66?Number.parseInt(I,16):NaN;if(!Number.isFinite(P)||P<=0||P>1e6)return;let _=h[P];(_==null||S.liquidityUsd>_.liquidityUsd)&&(h[P]=S)}catch{}}));let g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(e.fee==null&&g>0&&BigInt(m.amountOut)>0n){let S=BigInt(m.amountOut),P=p.filter(_=>_.ok&&Number((S-BigInt(_.amountOut))*10000n/S)<=g).filter(_=>h[_.fee]?.liquidityUsd!=null).sort((_,T)=>h[T.fee].liquidityUsd-h[_.fee].liquidityUsd)[0];P&&P.fee!==m.fee&&(w={priceBestFee:m.fee,chosenFee:P.fee,chosenPoolUsd:h[P.fee].liquidityUsd,bandBps:g},m=P)}let x=h[m.fee]??null,y=f[0]??null,b=x??y,v=e.liquidityUsd??x?.liquidityUsd??y?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":x?"pool":y?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:ze[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:m.fee,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:v,liquiditySource:b,liquidityAttribution:E,liquidityPick:w,sqrtPriceX96After:m.sqrtPriceX96After,initializedTicksCrossed:m.initializedTicksCrossed,triedFees:p,best:!0},{chainId:n,venue:o,amountOut:m.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Vm(e={},t={}){let{chainId:n,quoter:r,router:o}=_c(e.chainId??8453),i=(e.tokens||[]).map(p=>Ac(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=qA(i,a),l=Vi.encodeFunctionData("quoteExactInput",[c,s]),u=await D(n,"eth_call",[{to:r,data:l},"latest"],t),d=Vi.decodeFunctionResult("quoteExactInput",u);return re({venue:"uniswap-v3",chainId:n,chain:ze[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 Pc(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Gn({chainId:n,tokenIn:ze[n].weth,tokenOut:ze[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function Wm(e={},t={}){let n=Number(e.chainId??8453),r=_c(n,e.venue),o=Zr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===jm||i===zm||/^eth$/i.test(i),s=await Gn(e,t),c=Um.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=Um.encodeFunctionData("multicall",[d,[c]]);return N({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:fe(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function Gm(e={}){let t=Number(e.chainId??8453);try{let n=await Pc({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 Km(){return Object.entries(ze).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}he();import{AbiCoder as jA,Interface as Cc,getAddress as gt,isAddress as Tc,keccak256 as zA}from"ethers";X();var eo=jA.defaultAbiCoder(),Re="0x0000000000000000000000000000000000000000",yt={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"}},Jm=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Gi=new Cc(["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)"]),VA=new Cc(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Wi=new Cc(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Ym=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),WA=(1n<<14n)-1n,Nc=8388608;function Xm(e){let t=ro(e),n=Number(BigInt(t)&WA),r=Object.fromEntries(Ym.map(([a,s])=>[s,!!(n&1<<a)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([a,s])=>r[a]&&!r[s]).map(([a,s])=>`${a} requires ${s}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(Ym.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var GA="0x10",KA="0x060c0f",YA="0x000000000022D473030F116dDEE9F6B43aC78BA3",JA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function no(e){let t=Number(e),n=yt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(yt).join(", ")})`);return{chainId:t,...n}}function ro(e){if(e==null||e==="")return Re;let t=String(e);if(!Tc(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return gt(t)}function Kn(e,t){let n=yt[Number(t)];if(to(e))return gt(n.weth);let r=String(e);if(/^weth$/i.test(r))return gt(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return gt(n.usdc);if(!Tc(r))throw new Error(`invalid token address: ${e}`);return gt(r)}function to(e){let t=String(e||"").trim().toLowerCase();return!t||t===JA.toLowerCase()||t===Re.toLowerCase()||t==="eth"}function Oc({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Re}){let i=gt(e),a=gt(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=ro(o);return zA(eo.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Rc({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Re}){let i=gt(e),a=gt(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:ro(o)},zeroForOne:l}}function XA({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Xm(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),a=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,s=[],c="none";return e!==Re&&(c="low",s.push("nonzero hook requires independent contract review")),r&&(c="medium",s.push("pool uses a dynamic LP fee")),a&&(c="medium",s.push("hook runs during swap or donate flow")),i&&(c="high",s.push("hook can return custom accounting deltas")),o.valid||(c="critical",s.push(...o.violations)),r&&e===Re&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Re&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Re&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Re,returnsDelta:i,reasons:Object.freeze(s)})}async function Qm(e={},t={}){let n=no(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Kn(e.tokenIn||"WETH",n.chainId),o=Kn(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),a=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(a)||a<-8388608||a>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let s=ro(e.hooks),{poolKey:c}=Rc({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=Oc(c),u=t.rpcCall||D,d=Wi.encodeFunctionData("getSlot0",[l]),p=Wi.encodeFunctionData("getLiquidity",[l]),[m,f,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),s===Re?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=Wi.decodeFunctionResult("getSlot0",m),w=Wi.decodeFunctionResult("getLiquidity",f)[0],x=g[0],y=x>0n,b=s===Re?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&Nc),E=XA({hook:s,codePresent:b,initialized:y,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:y,sqrtPriceX96:x.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:w.toString(),dynamicFee:v}),hook:Object.freeze({address:s,codePresent:b,codeBytes:b?(h.length-2)/2:0,permissions:Xm(s)}),risk:E})}var Zm=["uniswap-v4","uniswapv4"];async function oo(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=no(e.chainId??8453),a=Kn(e.tokenIn||"WETH",n),s=Kn(e.tokenOut||yt[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}]:[...Jm],u=e.hooks||Re,p=await Promise.all(l.map(async I=>{let{poolKey:P,zeroForOne:_}=Rc({tokenIn:a,tokenOut:s,fee:I.fee,tickSpacing:I.tickSpacing,hooks:u}),T=Gi.encodeFunctionData("quoteExactInputSingle",[{poolKey:P,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let L=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:T},"latest"],t);if(!L||L==="0x")return{...I,ok:!1,error:"empty result"};let U=Gi.decodeFunctionResult("quoteExactInputSingle",L);return{fee:I.fee,tickSpacing:I.tickSpacing,ok:!0,amountOut:U[0].toString(),gasEstimate:U[1].toString(),poolKey:P,zeroForOne:_,poolId:Oc({...P})}}catch(L){return{...I,ok:!1,error:String(L.message||L).slice(0,160)}}})),m=null;for(let I of p)I.ok&&(!m||BigInt(I.amountOut)>BigInt(m.amountOut))&&(m=I);if(!m){let I=p.map(P=>`${P.fee}/${P.tickSpacing}:${P.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${I}`)}let f=e.liquidityUsd==null?await Qr({chainId:n,tokenA:a,tokenB:s,dexIds:Zm},t).catch(()=>[]):[],h=new Map;for(let I of f){let P=String(I.pairAddress||"").toLowerCase();P&&h.set(P,I)}let g=I=>h.get(String(I.poolId||"").toLowerCase())??null,w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&w>0&&BigInt(m.amountOut)>0n){let I=BigInt(m.amountOut),_=p.filter(T=>T.ok&&Number((I-BigInt(T.amountOut))*10000n/I)<=w).filter(T=>g(T)?.liquidityUsd!=null).sort((T,L)=>g(L).liquidityUsd-g(T).liquidityUsd)[0];_&&_.poolId!==m.poolId&&(x={priceBestFee:m.fee,chosenFee:_.fee,chosenPoolUsd:g(_).liquidityUsd,bandBps:w},m=_)}let y=g(m),b=f[0]??null,v=y??b,E=e.liquidityUsd??y?.liquidityUsd??b?.liquidityUsd??null,S=e.liquidityUsd!=null?"caller":y?"pool":b?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:yt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:E,liquiditySource:v,liquidityAttribution:S,liquidityPick:x,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Tc(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!to(e.tokenIn)&&!to(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&m.poolKey.hooks===Re&&!(m.fee&Nc)},{chainId:n,venue:i||r,amountOut:m.amountOut,liquidityUsd:E,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function ef(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=no(e.chainId??8453),a=Kn(e.tokenIn||"WETH",n),s=Kn(e.tokenOut||yt[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}]:[...Jm],u=e.hooks||Re,p=await Promise.all(l.map(async h=>{let{poolKey:g,zeroForOne:w}=Rc({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),x=Gi.encodeFunctionData("quoteExactOutputSingle",[{poolKey:g,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let y=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:x},"latest"],t);if(!y||y==="0x")return{...h,ok:!1,error:"empty result"};let b=Gi.decodeFunctionResult("quoteExactOutputSingle",y);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:b[0].toString(),gasEstimate:b[1].toString(),poolKey:g,zeroForOne:w,poolId:Oc({...g})}}catch(y){return{...h,ok:!1,error:String(y.message||y).slice(0,160)}}})),m=null;for(let h of p)h.ok&&(!m||BigInt(h.amountIn)<BigInt(m.amountIn))&&(m=h);if(!m){let h=p.map(g=>`${g.fee}/${g.tickSpacing}:${g.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await Om({chainId:n,tokenA:a,tokenB:s,dexIds:Zm},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:yt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:m.amountIn,amountOut:c.toString(),gasEstimate:m.gasEstimate,fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function tf(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(b=>Object.hasOwn(e,b)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=no(r);if(ro(e.hooks)!==Re)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Nc)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let a=gt(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(to(e.tokenIn)||to(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await oo(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let u=BigInt(l.amountOut)*BigInt(1e4-s)/10000n,d={currency0:l.zeroForOne?l.tokenIn:l.tokenOut,currency1:l.zeroForOne?l.tokenOut:l.tokenIn,fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks},m=eo.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,l.zeroForOne,BigInt(l.amountIn),u,0n,"0x"]]),f=eo.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=eo.encode(["address","uint256"],[l.tokenOut,u]),g=eo.encode(["bytes","bytes[]"],[KA,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,y=VA.encodeFunctionData("execute",[GA,[g],x]);return N({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:x,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:YA,amount:l.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:y,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function nf(){return Object.entries(yt).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 rf(e={}){let t=no(e.chainId??8453),n=await D(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}}$();import{readFileSync as n1,existsSync as r1}from"node:fs";import{getAddress as o1,Interface as Yi,TypedDataEncoder as Mc,parseUnits as i1}from"ethers";var of="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ve({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:af(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([af(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[of]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${of}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function af(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function Ue(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}X();var ZA=/^(0|[1-9][0-9]*)$/,Lc=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function wn(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(!ZA.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 e1(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function t1(e={}){return e.maxFeePerGas!=null?wn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?wn(e.gasPrice,"gasPrice"):null}function $c(e={}){try{let t=e1(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=wn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=wn(n.gasLimit??n.gas,"gasLimit"),s=t1(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=wn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=wn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:wn(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 sf(e={}){let t=$c(e);if(!t.ok)throw new Lc(t);return t}var a1="https://api.opensea.io/api/v2",s1="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)",c1=new Yi([`function ${s1}`]),Ki=new Yi(["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"]),l1=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"]),u1=new Set(l1),mf=new Set(["solana","flow"]),io="0x0000000000000000000000000000000000000000";function d1(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!r1(e))return"";try{for(let t of n1(e,"utf8").split(`
|
|
143
|
-
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Et(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||d1()}function ff(e={}){return Ve({provider:"opensea",defaultUrl:a1,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function xn(e={}){return ff(e).baseUrl}function vn(e={}){return Ue({accept:"application/json"},{"x-api-key":Et(e)},ff(e).trusted)}function hf(e){let t=String(e||"ethereum").trim().toLowerCase();if(!u1.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Q(e,t="address"){try{return o1(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function gf(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!mf.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return Q(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 p1(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 m1(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 cf(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 f1(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 yf(e={}){if(!Et(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await so("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 so(e,t={}){if(!e)throw new Error("collection slug required");if(!Et(t))throw new Error("OPENSEA_API_KEY required");return k(`${xn(t)}/collections/${encodeURIComponent(e)}`,{headers:vn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function bf(e,t={}){let n=await so(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 co(e={},t={}){if(!Et(t))throw new Error("OPENSEA_API_KEY required");let n=hf(e.chain),r=gf(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(`${xn(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:vn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(f1(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 Ji(e={},t={}){if(!Et(t))throw new Error("OPENSEA_API_KEY required");let n=gf(e.address||e.owner),r=await k(`${xn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:vn(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 Xi=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 lo(e){let t=String(e||"").trim().toLowerCase(),n=Xi[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function qe(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 h1(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 ao(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function wf(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 xf(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 g1(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function y1(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=Q(e?.token,t);if(n===0&&r!==io)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===io)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function b1(e,t){let n=qe(e?.startAmount,`${t} startAmount`),r=qe(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 Bc(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(g1);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=y1(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+=b1(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var w1=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 We(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function lf(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 vf(e,t){return{itemType:Number(We(e?.itemType,`${t} itemType`)),token:Q(e?.token,`${t} token`),identifierOrCriteria:We(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:We(e?.startAmount,`${t} startAmount`),endAmount:We(e?.endAmount,`${t} endAmount`)}}function x1(e,t){return{...vf(e,t),recipient:Q(e?.recipient,`${t} recipient`)}}function v1(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:Q(e.offerer,`${t} offerer`),zone:Q(e.zone,`${t} zone`),offer:n.map((o,i)=>vf(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>x1(o,`${t} consideration[${i}]`)),orderType:Number(We(e.orderType,`${t} orderType`)),startTime:We(e.startTime,`${t} startTime`),endTime:We(e.endTime,`${t} endTime`),zoneHash:lf(e.zoneHash,`${t} zoneHash`),salt:We(e.salt,`${t} salt`),conduitKey:lf(e.conduitKey,`${t} conduitKey`),counter:We(e.counter,`${t} counter`)}}function Sf(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=v1(t,n);if(Mc.hashStruct("OrderComponents",w1,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function kf(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=Q(e?.token,`${t} contract`),o=ao(e?.identifierOrCriteria),i=qe(e?.startAmount,`${t} startAmount`,{positive:!0}),a=qe(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 S1(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 kf(r[0],`${t} offer NFT`)}function k1(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=kf(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 E1(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&Q(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 I1(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 Ef(e,t,n,r){let o=We(t?.startTime,`${r} startTime`),i=We(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=xf(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&I1(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function A1(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(Xi[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=S1(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;E1(e.asset,s,c,"listing");let l=qe(e.price?.current?.value,"listing price",{positive:!0}),u=Sf(e,i,"listing"),d=Bc(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:Q(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:Ef(e,i,n,"listing"),counter:We(i?.counter,"listing counter")}}async function Fc(e={},t={}){if(!Et(t))throw new Error("OPENSEA_API_KEY required");let n=lo(e.chain);n.contract=e.contract?Q(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(`${xn(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:vn(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=>A1(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Qi(e={},t={}){let n=ao(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 Fc({...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 _1(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=k1(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=qe(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Bc(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=Bc(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:Sf(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:Q(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:Ef(e,i,r,"offer"),counter:We(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Zi(e={},t={}){if(!Et(t))throw new Error("OPENSEA_API_KEY required");let n=lo(e.chain);n.contract=e.contract?Q(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=ao(e.tokenId),i=await k(`${xn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:vn(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 _1(a,n,o,s)}function P1(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 If(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"&&If(n))}function Af(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function _f(e){return!e||typeof e!="object"?!1:Af(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&_f(t))}function Pf(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"&&Pf(o,t,n);return t}function uf(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Cf(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Af(e))throw new Error("opensea: signed transaction material refused");if((e.from?Q(uf(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=Q(uf(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=c1.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=h1(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function ea(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 Dc(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await be(e,4,async c=>{let{chainId:l,...u}=ea(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(he(),Ui)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),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(()=>(he(),Ui)),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 C1(e,t){if(If(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(_f(e))throw new Error("opensea: signed transaction material refused");let n=Pf(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=>Cf(r,t))}function T1(e,t,n={}){return N({...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 Tf(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function Nf(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function N1(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=Q(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function ta(e={},t={}){if(!Et(t))throw new Error("OPENSEA_API_KEY required");P1(e);let{chain:n,chainId:r}=lo(e.chain),o=Q(e.buyer||e.minter||e.address,"buyer"),i=Q(e.contract,"NFT contract"),a=wf(e.quantity),s=qe(e.priceWei,"priceWei"),c=qe(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=xf(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 so(d,t),m=N1(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await k(`${xn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:vn(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(O=>Q(O,"SeaDrop mint target"))),y=C1(h,{buyer:o,chainId:r,targets:x});if(y.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,v,E=null,S;try{b=Ki.decodeFunctionData("mintPublic",y[0].data),v="public",S=Ki.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Ki.decodeFunctionData("mintAllowList",y[0].data),v="allowlist";let O=b[4],j=[...b[5]].map(String);if(j.length<1||j.length>64||j.some(ke=>!/^0x[0-9a-fA-F]{64}$/.test(ke)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let B=BigInt(O.startTime),W=BigInt(O.endTime),pe=BigInt(Math.floor(l/1e3));if(B>pe||W<=pe)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(O.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(O.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");S=Ki.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],O,j]),E={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:B.toString(),endTime:W.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:j}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let I=Q(b[0],"mint NFT contract"),P=Q(b[1],"mint fee recipient"),_=Q(b[2],"mint recipient");if(I!==m)throw new Error("opensea: mint calldata collection mismatch");if(_!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(S.toLowerCase()!==y[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=y.reduce((O,j)=>O+j.valueWei,0n);if(T!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(T>c)throw new Error("opensea: mint total exceeds total cap");let L=await Dc(y,r,{...t,provider:e.provider||t.provider});if(L.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let U=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=sf({chainId:r,tx:y[0],policy:U});return T1({action:"mint",mintType:v,...E?{stage:E}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:y[0].to,feeRecipient:P,expiry:u,transactions:y.map(ea),gasWar:H,...L},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+Ec,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function O1(e={}){let t=hf(e.chain);if(mf.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?cf(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=cf(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:Q(e.contract,"NFT contract"),token_id:o,quantity:m1(e.quantity??1,"quantity"),price:{amount:p1(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:Q(e.price?.currency??e.currency??io,"price currency")},start_time:n.text,end_time:r.text}}var Yn={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"}]},df=new Yi(["function setApprovalForAll(address operator,bool approved)"]),R1=new Yi(["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 pf(e,t){return e?.[t]||(e?.action===t?e:null)}function L1(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(y=>pf(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=Q(c.verifyingContract,"listing protocol"),u=s.message;if(Q(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(Q(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||Q(y.token,"listing payment token")!==io)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(y.startAmount),v=BigInt(y.endAmount);if(b<=0n||b!==v)throw new Error("opensea: listing consideration must be fixed and positive");Q(y.recipient,"listing consideration recipient"),p+=b}let m=i1(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=Mc.hashStruct("OrderComponents",Yn,u),w=o.map(y=>pf(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=Cf(y,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=df.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=Q(v[0],"listing approval operator");if(v[1]!==!0||b.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(df.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==b.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...b,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:Yn,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function na(e={},t={}){if(!Et(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=Q(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(O1);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=Q(e.taker,"taker"));let c=await k(`${xn(t)}/listings/actions`,{method:"POST",headers:vn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=lo(o[0].chain),u=L1(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await Dc(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return N({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(ea),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 Of(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=lo(e.chain),o=Q(e.seller||e.address||e.owner,"seller"),i=Q(e.protocolAddress,"reviewed Seaport protocol address"),a=Q(e.contract,"NFT contract"),s=ao(e.tokenId),c=wf(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[I,P]of Object.entries(Yn)){let _=l.types?.[I];if(!Array.isArray(_)||_.length!==P.length||_.some((T,L)=>T?.name!==P[L].name||T?.type!==P[L].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(I=>I!=="EIP712Domain").sort().join(",")!==Object.keys(Yn).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=Q(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(Q(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(Q(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(ao(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=qe(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=qe(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let I of m.consideration){if(Number(I.itemType)!==0||Q(I.token,"cancellation payment token")!==io)throw new Error("opensea: cancellation requires native fixed-price consideration");let P=qe(I.startAmount,"cancellation consideration startAmount",{positive:!0}),_=qe(I.endAmount,"cancellation consideration endAmount",{positive:!0});if(P!==_)throw new Error("opensea: cancellation consideration must be fixed and positive");Q(I.recipient,"cancellation consideration recipient")}let w=qe(m.startTime,"cancellation startTime");if(qe(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let y=Mc.hashStruct("OrderComponents",Yn,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 v=R1.encodeFunctionData("cancel",[[m]]),E=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],S=await Dc(E,r,{...t,provider:e.provider||t.provider});if(S.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return N({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:Yn,primaryType:"OrderComponents",message:m},transactions:E.map(ea),...S,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}he();$();var ra=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),Y=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),B1=/^0x[0-9a-fA-F]{40}$/;function M1(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}B1.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))ra.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 F1(e){let{ok:t,errors:n,warnings:r}=M1(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
142
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:Zs["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:y,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:sp},psbtPrepared:!1,fundingPrepared:!1}}function Li(){return Object.values(Zs).map(e=>({...e,disclaimer:sp}))}async function $i(e={}){let t=String(e.templateId||"").trim(),n=Zs[t];n||pt("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?p$(e):m$(e),o=d$(r.files);return N({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 sp,Zv,Zs,lp=xe(()=>{X();sp="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",Zv="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Zs=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})})});import jc from"node:fs";import x5 from"node:os";import no from"node:path";import{fileURLToPath as S5}from"node:url";function v1(){return process.env.ORACLE_FAKE_HOME||x5.homedir()}function I5(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function zc(){return I5()?process.env.ORACLE_CONFIG_DIR||no.join(v1(),".config","oracle"):no.join(v1(),".config","oracle")}function E5(){return no.join(zc(),"desk.json")}function A5(){return no.join(zc(),"env")}function to({force:e=!1}={}){if(to._done&&!e)return to._result||null;to._done=!0;let t={},n=(o,i)=>{if(i==null)return;let a=String(i).trim();a&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=a,t[o]=a))};try{let o=A5();if(jc.existsSync(o))for(let i of jc.readFileSync(o,"utf8").split(/\r?\n/)){let a=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),n(a[1],s)}}catch{}try{let o=E5();if(jc.existsSync(o)){let i=JSON.parse(jc.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),to._result=Object.keys(t).length?t:null,to._result}var k5,KV,x1=xe(()=>{k5=no.dirname(S5(import.meta.url)),KV=no.resolve(k5,"../..");try{to()}catch{}});var ff={};ua(ff,{armPreparedAction:()=>L5,callSigner:()=>S1,queueOwnerAction:()=>k1});import{existsSync as _5,readFileSync as P5}from"node:fs";import{request as T5}from"node:http";import C5 from"node:path";function O5(e=process.env){let t=String(e.ORACLE_SIGNER_URL||N5).replace(/\/$/,""),n;try{n=new URL(t)}catch{return null}return n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"&&n.hostname!=="::1"?null:n.origin}function R5(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=C5.join(zc(),"signer","signer-token");return _5(t)?P5(t,"utf8").trim():null}function S1(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=O5(r),a=R5(r);return!i||!a?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(s=>{let c=new URL(e,i),l=n?Buffer.from(JSON.stringify(n)):null,u=T5({hostname:c.hostname,port:c.port||80,path:c.pathname,method:t,timeout:o,headers:{authorization:`Bearer ${a}`,origin:i,...l?{"content-type":"application/json","content-length":l.length}:{}}},d=>{let p=[];d.on("data",m=>p.push(m)),d.on("end",()=>{let m=Buffer.concat(p).toString("utf8"),f={};try{f=m?JSON.parse(m):{}}catch{f={error:"signer refused"}}s({httpStatus:d.statusCode,...f})})});u.on("timeout",()=>{u.destroy(),s({ok:!1,error:"local signer timed out"})}),u.on("error",()=>s({ok:!1,error:"local signer is not running"})),l&&u.write(l),u.end()})}async function k1(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return S1("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function L5(e,t=process.env){let n=e?.localSignerEnvelope||e?.envelope;if(!n||n.version!==1||!n.surface)throw new Error("armPreparedAction: prepared.localSignerEnvelope v1 required");return k1(n,t)}var N5,hf=xe(()=>{x1();N5="http://127.0.0.1:9462"});var v_={};ua(v_,{CONTRACTS_EVAL_HERE:()=>Eq,runContractsEval:()=>Iq});import Qc from"node:fs";import kn from"node:path";import{spawnSync as dq}from"node:child_process";import{fileURLToPath as pq}from"node:url";function vq(){let e=process.env.HOME||"";for(let t of["forge",kn.join(e,".foundry/bin/forge")])if(dq(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function w_(e,t=[]){if(!Qc.existsSync(e))return t;for(let n of Qc.readdirSync(e)){let r=kn.join(e,n);if(Qc.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;w_(r,t)}else n.endsWith(".sol")&&!r.includes(`${kn.sep}lib${kn.sep}`)&&t.push(r)}return t}function xq(){let e=[];for(let t of Object.keys(jn)){let n=kn.join(mq,t),r=w_(kn.join(n,"src")),o=[];for(let i of r){let a=Qc.readFileSync(i,"utf8");for(let s of fq)s.test(a)&&o.push(`${kn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function Sq(){return vq()?Object.keys(jn).map(e=>{try{let t=Oi(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(jn).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function kq(){let e=[],t=Li();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 $i({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:hq,programId:yq,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 $i({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[gq,bq],recoveryPubkey:wq,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 Iq(){let e=xq(),t=Sq(),n=await kq(),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 mq,fq,hq,yq,gq,bq,wq,Eq,x_=xe(()=>{Gs();Xs();lp();rp();mq=Vs("protocols/templates",import.meta.url),fq=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],hq="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",yq="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",gq="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",bq="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",wq="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";Eq=kn.dirname(pq(import.meta.url))});fe();import{Interface as ph,getAddress as ho,isAddress as mh}from"ethers";O();var tP=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function Zf(e,t){let n=String(e||"").toLowerCase(),r=String(t?.quote||t?.quoteToken?.address||"").toLowerCase(),o=String(t?.base||t?.baseToken?.address||"").toLowerCase();return r===n?{address:t.base||t.baseToken?.address,symbol:t.baseToken?.symbol}:o===n?{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}:{address:t.quote||t.quoteToken?.address,symbol:t.quoteToken?.symbol}}function hl(e,t=[],{stables:n=[],wrappedNative:r=null}={}){let o=String(e||"").toLowerCase(),i=new Set((n||[]).map(c=>String(c).toLowerCase())),a=String(r||"").toLowerCase(),s=(t||[]).map((c,l)=>{let u=Zf(o,c),d=String(u.address||"").toLowerCase(),p=String(u.symbol||"").toLowerCase(),m=Number(c.liquidityUsd??c.liquidity?.usd),f=Number.isFinite(m)?m:0,h=String(c.dex||c.dexId||"").toLowerCase(),y=0;return i.has(d)||tP.has(p)?y=300:a&&d===a&&(y=100),h.includes("v4")?y+=20:h.includes("v3")?y+=10:(h.includes("v2")||h.includes("raydium")||h.includes("orca")||h.includes("meteora"))&&(y+=8),{pool:c,score:y*1e12+f,index:l,otherAddr:d,liquidityUsd:f}});return s.sort((c,l)=>l.score-c.score||c.index-l.index),s.map(c=>c.pool)}function eh(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Zf(e,n[0]).address||null}var nP="https://api.dexscreener.com",rP=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),ft=e=>String(e??"").toLowerCase(),oP=e=>Array.isArray(e)?e:e==null?[]:[e];function iP(e,t,n){let r=ft(t),o=ft(n),i=ft(e?.baseToken?.address),a=ft(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function aP(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function ha(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||nP).replace(/\/$/,"")}async function th(e={}){let n=(await v(`${ha(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function Ot(e,t={}){if(!e)throw new Error("tokenAddress required");return v(`${ha(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function mo(e,t={}){if(!e)throw new Error("query required");return v(`${ha(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function nh(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return v(`${ha(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function rh({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await fo({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function fo({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=ft(rP[Number(e)]||e),a=new Set(oP(r).filter(Boolean).map(ft)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>Ot(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=`${ft(m?.chainId)}:${ft(m?.dexId)}:${ft(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>ft(p?.chainId)===i).filter(p=>iP(p,t,n)).filter(p=>!a.size||a.has(ft(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:aP(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}import{createHash as dP,createHmac as ah,timingSafeEqual as pP}from"node:crypto";import{readFileSync as cP}from"node:fs";import{homedir as lP}from"node:os";import{join as ya}from"node:path";function uP(){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=lP();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||ya(t,".config","oracle")).trim();return[e,ya(n,"exec.env")].filter(Boolean)}return[e,ya(t,".config","oracle","exec.env"),ya(t,".config","mad-desk","exec.env")].filter(Boolean)}function oh(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of uP())try{let i=cP(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 ga=100,ih=2e4;function ba(e){return Array.isArray(e)?`[${e.map(ba).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ba(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function sh(e,{required:t=!1}={}){try{return oh(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function gl(e){let{signature:t,...n}=e;return n}function ch(e,{secret:t}={}){let n=sh(t);return n?{...e,signature:ah("sha256",n).update(ba(gl(e))).digest("hex")}:e}function mP(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 dP("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function he(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=sh(o);if(i){let m=ah("sha256",i).update(ba(gl(e))).digest("hex");if(!fP(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>ga||!Number.isInteger(s)||s<0||s>ga||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=yP(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 ch({...gl(e),calldataHash:mP(r)},{secret:o})}function fP(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:pP(n,r)}function yl(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function hP(e){let t=e==null?ga: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,ga)}function je({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=hP(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function bl({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=ih,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=je({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)||ih)),h=d*BigInt(1e4-p.selectedBps),y=h/10000n;if(h%10000n!==0n&&(y+=1n),y>d&&(y=d),d>0n&&y<=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-y)*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 ch({mode:"auto",chainId:Number(e),venue:String(t||"unknown"),quoteAmountOut:d.toString(),minAmountOut:y.toString(),requiredBps:p.requiredBps,selectedBps:p.selectedBps,capBps:p.capBps,quotedAtMs:m,expiresAtMs:m+f},{secret:u})}function yP(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 re(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=bl({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}}X();var Je={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"}},kP=[100,500,3e3,1e4],IP="0xddca3f43",wa=new ph(["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)"]),dh=new ph(["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)"]),fh="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",hh="0x0000000000000000000000000000000000000000",xl=[100,500,2500,1e4],EP={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:xl}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:xl}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:xl}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function kl(e,t){let n=Number(e),r=Je[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Je).join(", ")})`);let o=EP[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 Sl(e,t){let n=Je[Number(t)];if(!e||e===fh||e===hh||/^eth$/i.test(String(e)))return ho(n.weth);let r=String(e);if(/^weth$/i.test(r))return ho(n.weth);if(/^usdc$/i.test(r))return ho(n.usdc);if(!mh(r))throw new Error(`invalid token address: ${e}`);return ho(r)}function AP(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 _P(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 nr(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=kl(e.chainId??8453,e.venue),a=Sl(e.tokenIn||"WETH",n),s=Sl(e.tokenOut||Je[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:kP,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],p=await Promise.all(u.map(async k=>{let E=wa.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let P=await U(n,"eth_call",[{to:r,data:E},"latest"],t);if(!P||P==="0x")return{fee:k,ok:!1,error:"empty result"};let _=wa.decodeFunctionResult("quoteExactInputSingle",P);return{fee:k,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()}}catch(P){return{fee:k,ok:!1,error:String(P.message||P).slice(0,160)}}})),m=null;for(let k of p)k.ok&&(!m||BigInt(k.amountOut)>BigInt(m.amountOut))&&(m=k);if(!m){let k=p.map(E=>`${E.fee}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${k}`)}let f=e.liquidityUsd==null?await fo({chainId:n,tokenA:a,tokenB:s,dexIds:AP(e.venue)},t).catch(()=>[]):[],h={};await Promise.all(f.slice(0,8).map(async k=>{if(!(!k.pairAddress||!mh(k.pairAddress)))try{let E=await U(n,"eth_call",[{to:k.pairAddress,data:IP},"latest"],t),P=E&&E!=="0x"&&E.length<=66?Number.parseInt(E,16):NaN;if(!Number.isFinite(P)||P<=0||P>1e6)return;let _=h[P];(_==null||k.liquidityUsd>_.liquidityUsd)&&(h[P]=k)}catch{}}));let y=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(e.fee==null&&y>0&&BigInt(m.amountOut)>0n){let k=BigInt(m.amountOut),P=p.filter(_=>_.ok&&Number((k-BigInt(_.amountOut))*10000n/k)<=y).filter(_=>h[_.fee]?.liquidityUsd!=null).sort((_,C)=>h[C.fee].liquidityUsd-h[_.fee].liquidityUsd)[0];P&&P.fee!==m.fee&&(w={priceBestFee:m.fee,chosenFee:P.fee,chosenPoolUsd:h[P.fee].liquidityUsd,bandBps:y},m=P)}let x=h[m.fee]??null,g=f[0]??null,b=x??g,S=e.liquidityUsd??x?.liquidityUsd??g?.liquidityUsd??null,I=e.liquidityUsd!=null?"caller":x?"pool":g?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:Je[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:m.fee,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:S,liquiditySource:b,liquidityAttribution:I,liquidityPick:w,sqrtPriceX96After:m.sqrtPriceX96After,initializedTicksCrossed:m.initializedTicksCrossed,triedFees:p,best:!0},{chainId:n,venue:o,amountOut:m.amountOut,liquidityUsd:S,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function yh(e={},t={}){let{chainId:n,quoter:r,router:o}=kl(e.chainId??8453),i=(e.tokens||[]).map(p=>Sl(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=_P(i,a),l=wa.encodeFunctionData("quoteExactInput",[c,s]),u=await U(n,"eth_call",[{to:r,data:l},"latest"],t),d=wa.decodeFunctionResult("quoteExactInput",u);return re({venue:"uniswap-v3",chainId:n,chain:Je[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 Il(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await nr({chainId:n,tokenIn:Je[n].weth,tokenOut:Je[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function gh(e={},t={}){let n=Number(e.chainId??8453),r=kl(n,e.venue),o=ho(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===fh||i===hh||/^eth$/i.test(i),s=await nr(e,t),c=dh.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=dh.encodeFunctionData("multicall",[d,[c]]);return N({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:he(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function bh(e={}){let t=Number(e.chainId??8453);try{let n=await Il({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 wh(){return Object.entries(Je).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}fe();import{AbiCoder as TP,Interface as El,getAddress as It,isAddress as Al,keccak256 as CP}from"ethers";X();var yo=TP.defaultAbiCoder(),Me="0x0000000000000000000000000000000000000000",Et={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"}},xh=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],xa=new El(["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)"]),NP=new El(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),va=new El(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),vh=Object.freeze([[13,"beforeInitialize"],[12,"afterInitialize"],[11,"beforeAddLiquidity"],[10,"afterAddLiquidity"],[9,"beforeRemoveLiquidity"],[8,"afterRemoveLiquidity"],[7,"beforeSwap"],[6,"afterSwap"],[5,"beforeDonate"],[4,"afterDonate"],[3,"beforeSwapReturnsDelta"],[2,"afterSwapReturnsDelta"],[1,"afterAddLiquidityReturnsDelta"],[0,"afterRemoveLiquidityReturnsDelta"]]),OP=(1n<<14n)-1n,_l=8388608;function Sh(e){let t=wo(e),n=Number(BigInt(t)&OP),r=Object.fromEntries(vh.map(([a,s])=>[s,!!(n&1<<a)])),i=[["beforeSwapReturnsDelta","beforeSwap"],["afterSwapReturnsDelta","afterSwap"],["afterAddLiquidityReturnsDelta","afterAddLiquidity"],["afterRemoveLiquidityReturnsDelta","afterRemoveLiquidity"]].filter(([a,s])=>r[a]&&!r[s]).map(([a,s])=>`${a} requires ${s}`);return Object.freeze({address:t,mask:n,maskHex:`0x${n.toString(16).padStart(4,"0")}`,flags:Object.freeze(r),enabled:Object.freeze(vh.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var RP="0x10",LP="0x060c0f",$P="0x000000000022D473030F116dDEE9F6B43aC78BA3",BP="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function bo(e){let t=Number(e),n=Et[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(Et).join(", ")})`);return{chainId:t,...n}}function wo(e){if(e==null||e==="")return Me;let t=String(e);if(!Al(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return It(t)}function rr(e,t){let n=Et[Number(t)];if(go(e))return It(n.weth);let r=String(e);if(/^weth$/i.test(r))return It(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return It(n.usdc);if(!Al(r))throw new Error(`invalid token address: ${e}`);return It(r)}function go(e){let t=String(e||"").trim().toLowerCase();return!t||t===BP.toLowerCase()||t===Me.toLowerCase()||t==="eth"}function Pl({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Me}){let i=It(e),a=It(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=wo(o);return CP(yo.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Tl({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Me}){let i=It(e),a=It(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:wo(o)},zeroForOne:l}}function MP({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Sh(e),i=o.enabled.some(l=>l.endsWith("ReturnsDelta")),a=o.flags.beforeSwap||o.flags.afterSwap||o.flags.beforeDonate||o.flags.afterDonate,s=[],c="none";return e!==Me&&(c="low",s.push("nonzero hook requires independent contract review")),r&&(c="medium",s.push("pool uses a dynamic LP fee")),a&&(c="medium",s.push("hook runs during swap or donate flow")),i&&(c="high",s.push("hook can return custom accounting deltas")),o.valid||(c="critical",s.push(...o.violations)),r&&e===Me&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Me&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Me&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Me,returnsDelta:i,reasons:Object.freeze(s)})}async function kh(e={},t={}){let n=bo(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=rr(e.tokenIn||"WETH",n.chainId),o=rr(e.tokenOut||n.usdc,n.chainId),i=Number(e.fee),a=Number(e.tickSpacing);if(!Number.isInteger(i)||i<0||i>16777215)throw new Error("uniswap-v4 inspectHook requires uint24 fee");if(!Number.isInteger(a)||a<-8388608||a>8388607)throw new Error("uniswap-v4 inspectHook requires int24 tickSpacing");let s=wo(e.hooks),{poolKey:c}=Tl({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=Pl(c),u=t.rpcCall||U,d=va.encodeFunctionData("getSlot0",[l]),p=va.encodeFunctionData("getLiquidity",[l]),[m,f,h]=await Promise.all([u(n.chainId,"eth_call",[{to:n.stateView,data:d},"latest"],t),u(n.chainId,"eth_call",[{to:n.stateView,data:p},"latest"],t),s===Me?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),y=va.decodeFunctionResult("getSlot0",m),w=va.decodeFunctionResult("getLiquidity",f)[0],x=y[0],g=x>0n,b=s===Me?null:typeof h=="string"&&h!=="0x"&&h.length>4,S=!!(i&_l),I=MP({hook:s,codePresent:b,initialized:g,dynamicFee:S});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:g,sqrtPriceX96:x.toString(),tick:Number(y[1]),protocolFee:Number(y[2]),lpFee:Number(y[3]),liquidity:w.toString(),dynamicFee:S}),hook:Object.freeze({address:s,codePresent:b,codeBytes:b?(h.length-2)/2:0,permissions:Sh(s)}),risk:I})}var Ih=["uniswap-v4","uniswapv4"];async function vo(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=bo(e.chainId??8453),a=rr(e.tokenIn||"WETH",n),s=rr(e.tokenOut||Et[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}]:[...xh],u=e.hooks||Me,p=await Promise.all(l.map(async E=>{let{poolKey:P,zeroForOne:_}=Tl({tokenIn:a,tokenOut:s,fee:E.fee,tickSpacing:E.tickSpacing,hooks:u}),C=xa.encodeFunctionData("quoteExactInputSingle",[{poolKey:P,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let $=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:C},"latest"],t);if(!$||$==="0x")return{...E,ok:!1,error:"empty result"};let D=xa.decodeFunctionResult("quoteExactInputSingle",$);return{fee:E.fee,tickSpacing:E.tickSpacing,ok:!0,amountOut:D[0].toString(),gasEstimate:D[1].toString(),poolKey:P,zeroForOne:_,poolId:Pl({...P})}}catch($){return{...E,ok:!1,error:String($.message||$).slice(0,160)}}})),m=null;for(let E of p)E.ok&&(!m||BigInt(E.amountOut)>BigInt(m.amountOut))&&(m=E);if(!m){let E=p.map(P=>`${P.fee}/${P.tickSpacing}:${P.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${E}`)}let f=e.liquidityUsd==null?await fo({chainId:n,tokenA:a,tokenB:s,dexIds:Ih},t).catch(()=>[]):[],h=new Map;for(let E of f){let P=String(E.pairAddress||"").toLowerCase();P&&h.set(P,E)}let y=E=>h.get(String(E.poolId||"").toLowerCase())??null,w=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),x=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&w>0&&BigInt(m.amountOut)>0n){let E=BigInt(m.amountOut),_=p.filter(C=>C.ok&&Number((E-BigInt(C.amountOut))*10000n/E)<=w).filter(C=>y(C)?.liquidityUsd!=null).sort((C,$)=>y($).liquidityUsd-y(C).liquidityUsd)[0];_&&_.poolId!==m.poolId&&(x={priceBestFee:m.fee,chosenFee:_.fee,chosenPoolUsd:y(_).liquidityUsd,bandBps:w},m=_)}let g=y(m),b=f[0]??null,S=g??b,I=e.liquidityUsd??g?.liquidityUsd??b?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":g?"pool":b?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:Et[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,amountOut:m.amountOut,gasEstimate:m.gasEstimate,liquidityUsd:I,liquiditySource:S,liquidityAttribution:k,liquidityPick:x,triedTiers:p,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&Al(e.recipient)&&Number.isInteger(Number(e.slippageBps))&&Number(e.slippageBps)>=0&&Number(e.slippageBps)<=100&&Number.isInteger(Number(e.deadlineSeconds))&&Number(e.deadlineSeconds)>=30&&Number(e.deadlineSeconds)<=600&&!go(e.tokenIn)&&!go(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&m.poolKey.hooks===Me&&!(m.fee&_l)},{chainId:n,venue:i||r,amountOut:m.amountOut,liquidityUsd:I,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Eh(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=bo(e.chainId??8453),a=rr(e.tokenIn||"WETH",n),s=rr(e.tokenOut||Et[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}]:[...xh],u=e.hooks||Me,p=await Promise.all(l.map(async h=>{let{poolKey:y,zeroForOne:w}=Tl({tokenIn:a,tokenOut:s,fee:h.fee,tickSpacing:h.tickSpacing,hooks:u}),x=xa.encodeFunctionData("quoteExactOutputSingle",[{poolKey:y,zeroForOne:w,exactAmount:c,hookData:"0x"}]);try{let g=await(t.rpcCall||U)(n,"eth_call",[{to:r,data:x},"latest"],t);if(!g||g==="0x")return{...h,ok:!1,error:"empty result"};let b=xa.decodeFunctionResult("quoteExactOutputSingle",g);return{fee:h.fee,tickSpacing:h.tickSpacing,ok:!0,amountIn:b[0].toString(),gasEstimate:b[1].toString(),poolKey:y,zeroForOne:w,poolId:Pl({...y})}}catch(g){return{...h,ok:!1,error:String(g.message||g).slice(0,160)}}})),m=null;for(let h of p)h.ok&&(!m||BigInt(h.amountIn)<BigInt(m.amountIn))&&(m=h);if(!m){let h=p.map(y=>`${y.fee}/${y.tickSpacing}:${y.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${h}`)}let f=e.liquidityUsd==null?await rh({chainId:n,tokenA:a,tokenB:s,dexIds:Ih},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:Et[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:m.amountIn,amountOut:c.toString(),gasEstimate:m.gasEstimate,fee:m.fee,tickSpacing:m.tickSpacing,hooks:m.poolKey.hooks,poolId:m.poolId,zeroForOne:m.zeroForOne,liquidityUsd:e.liquidityUsd??f?.liquidityUsd??null,liquiditySource:f,triedTiers:p,best:!0,executionReady:!1,prepareReady:!1}}async function Ah(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(b=>Object.hasOwn(e,b)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=bo(r);if(wo(e.hooks)!==Me)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&_l)throw new Error("uniswap-v4 dynamic-fee pools are inspect/quote-only until a code-hash-specific adapter exists");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("uniswap-v4 opaque hookData is inspect/quote-only until a code-hash-specific adapter exists");if(!e.recipient)throw new Error("uniswap-v4 prepare requires recipient");let a=It(e.recipient);if(e.slippageBps==null)throw new Error("uniswap-v4 prepare requires explicit slippageBps");let s=Number(e.slippageBps);if(!Number.isInteger(s)||s<0||s>100)throw new Error("slippageBps must be an integer from 0 through 100");if(e.deadlineSeconds==null)throw new Error("uniswap-v4 prepare requires explicit deadlineSeconds");let c=Number(e.deadlineSeconds);if(!Number.isInteger(c)||c<30||c>600)throw new Error("deadlineSeconds must be an integer from 30 through 600");if(go(e.tokenIn)||go(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await vo(e,t);if(!o.universalRouter)throw new Error(`uniswap-v4: no Universal Router on chain ${r}`);let u=BigInt(l.amountOut)*BigInt(1e4-s)/10000n,d={currency0:l.zeroForOne?l.tokenIn:l.tokenOut,currency1:l.zeroForOne?l.tokenOut:l.tokenIn,fee:l.fee,tickSpacing:l.tickSpacing,hooks:l.hooks},m=yo.encode(["tuple(tuple(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"],[[d,l.zeroForOne,BigInt(l.amountIn),u,0n,"0x"]]),f=yo.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=yo.encode(["address","uint256"],[l.tokenOut,u]),y=yo.encode(["bytes","bytes[]"],[LP,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,g=NP.encodeFunctionData("execute",[RP,[y],x]);return N({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:x,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:$P,amount:l.amountIn,note:"Universal Router V4 settlement uses Permit2; Permit2 authorization for the Universal Router is also required"},transaction:{chainId:r,from:a,to:o.universalRouter,data:g,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function _h(){return Object.entries(Et).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 Ph(e={}){let t=bo(e.chainId??8453),n=await U(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}}O();import{readFileSync as HP,existsSync as jP}from"node:fs";import{getAddress as zP,Interface as ka,TypedDataEncoder as Rl,parseUnits as VP}from"ethers";var Th="ORACLE_ALLOW_CUSTOM_PROVIDER_URL";function Ee({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:Ch(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([Ch(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[Th]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Th}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Ch(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function ke(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 UP=/^(0|[1-9][0-9]*)$/,Cl=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function Pn(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(!UP.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 DP(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function qP(e={}){return e.maxFeePerGas!=null?Pn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?Pn(e.gasPrice,"gasPrice"):null}function Nl(e={}){try{let t=DP(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=Pn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=Pn(n.gasLimit??n.gas,"gasLimit"),s=qP(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=Pn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=Pn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:Pn(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 Nh(e={}){let t=Nl(e);if(!t.ok)throw new Cl(t);return t}var WP="https://api.opensea.io/api/v2",GP="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)",KP=new ka([`function ${GP}`]),Sa=new ka(["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"]),YP=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"]),JP=new Set(YP),Mh=new Set(["solana","flow"]),xo="0x0000000000000000000000000000000000000000";function XP(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!jP(e))return"";try{for(let t of HP(e,"utf8").split(`
|
|
143
|
+
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function Rt(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||XP()}function Fh(e={}){return Ee({provider:"opensea",defaultUrl:WP,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Tn(e={}){return Fh(e).baseUrl}function Cn(e={}){return ke({accept:"application/json"},{"x-api-key":Rt(e)},Fh(e).trusted)}function Uh(e){let t=String(e||"ethereum").trim().toLowerCase();if(!JP.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Q(e,t="address"){try{return zP(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Dh(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Mh.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return Q(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 QP(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 ZP(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 Oh(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 eT(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 qh(e={}){if(!Rt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await ko("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 ko(e,t={}){if(!e)throw new Error("collection slug required");if(!Rt(t))throw new Error("OPENSEA_API_KEY required");return v(`${Tn(t)}/collections/${encodeURIComponent(e)}`,{headers:Cn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Hh(e,t={}){let n=await ko(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 Io(e={},t={}){if(!Rt(t))throw new Error("OPENSEA_API_KEY required");let n=Uh(e.chain),r=Dh(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(`${Tn(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 v(l.toString(),{headers:Cn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(eT(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 Ia(e={},t={}){if(!Rt(t))throw new Error("OPENSEA_API_KEY required");let n=Dh(e.address||e.owner),r=await v(`${Tn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:Cn(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 Ea=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 Eo(e){let t=String(e||"").trim().toLowerCase(),n=Ea[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function ze(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 tT(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 So(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function jh(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 zh(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 nT(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function rT(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=Q(e?.token,t);if(n===0&&r!==xo)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===xo)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function oT(e,t){let n=ze(e?.startAmount,`${t} startAmount`),r=ze(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 Ol(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(nT);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=rT(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+=oT(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var iT=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 Xe(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Rh(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 Vh(e,t){return{itemType:Number(Xe(e?.itemType,`${t} itemType`)),token:Q(e?.token,`${t} token`),identifierOrCriteria:Xe(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:Xe(e?.startAmount,`${t} startAmount`),endAmount:Xe(e?.endAmount,`${t} endAmount`)}}function aT(e,t){return{...Vh(e,t),recipient:Q(e?.recipient,`${t} recipient`)}}function sT(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:Q(e.offerer,`${t} offerer`),zone:Q(e.zone,`${t} zone`),offer:n.map((o,i)=>Vh(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>aT(o,`${t} consideration[${i}]`)),orderType:Number(Xe(e.orderType,`${t} orderType`)),startTime:Xe(e.startTime,`${t} startTime`),endTime:Xe(e.endTime,`${t} endTime`),zoneHash:Rh(e.zoneHash,`${t} zoneHash`),salt:Xe(e.salt,`${t} salt`),conduitKey:Rh(e.conduitKey,`${t} conduitKey`),counter:Xe(e.counter,`${t} counter`)}}function Wh(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=sT(t,n);if(Rl.hashStruct("OrderComponents",iT,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Gh(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=Q(e?.token,`${t} contract`),o=So(e?.identifierOrCriteria),i=ze(e?.startAmount,`${t} startAmount`,{positive:!0}),a=ze(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 cT(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 Gh(r[0],`${t} offer NFT`)}function lT(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=Gh(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 uT(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&Q(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 dT(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 Kh(e,t,n,r){let o=Xe(t?.startTime,`${r} startTime`),i=Xe(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=zh(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&dT(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function pT(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(Ea[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=cT(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;uT(e.asset,s,c,"listing");let l=ze(e.price?.current?.value,"listing price",{positive:!0}),u=Wh(e,i,"listing"),d=Ol(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:Q(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:Kh(e,i,n,"listing"),counter:Xe(i?.counter,"listing counter")}}async function Ll(e={},t={}){if(!Rt(t))throw new Error("OPENSEA_API_KEY required");let n=Eo(e.chain);n.contract=e.contract?Q(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(`${Tn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await v(i.toString(),{headers:Cn(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=>pT(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Aa(e={},t={}){let n=So(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 Ll({...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 mT(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=lT(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=ze(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Ol(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=Ol(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:Wh(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:Q(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:Kh(e,i,r,"offer"),counter:Xe(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function _a(e={},t={}){if(!Rt(t))throw new Error("OPENSEA_API_KEY required");let n=Eo(e.chain);n.contract=e.contract?Q(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=So(e.tokenId),i=await v(`${Tn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:Cn(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 mT(a,n,o,s)}function fT(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 Yh(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"&&Yh(n))}function Jh(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function Xh(e){return!e||typeof e!="object"?!1:Jh(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&Xh(t))}function Qh(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"&&Qh(o,t,n);return t}function Lh(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Zh(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Jh(e))throw new Error("opensea: signed transaction material refused");if((e.from?Q(Lh(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=Q(Lh(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=KP.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=tT(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Pa(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 $l(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=await be(e,4,async c=>{let{chainId:l,...u}=Pa(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");let[,f]=await Promise.all([r.call(u),r.estimateGas(u)]);return BigInt(f).toString()}let{rpcCall:d}=await Promise.resolve().then(()=>(fe(),fa)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl},[,m]=await Promise.all([d(t,"eth_call",[u,"pending"],p),d(t,"eth_estimateGas",[u],p)]);return BigInt(m).toString()}),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(()=>(fe(),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 hT(e,t){if(Yh(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(Xh(e))throw new Error("opensea: signed transaction material refused");let n=Qh(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=>Zh(r,t))}function yT(e,t,n={}){return N({...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 e0(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function t0(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function gT(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=Q(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Ta(e={},t={}){if(!Rt(t))throw new Error("OPENSEA_API_KEY required");fT(e);let{chain:n,chainId:r}=Eo(e.chain),o=Q(e.buyer||e.minter||e.address,"buyer"),i=Q(e.contract,"NFT contract"),a=jh(e.quantity),s=ze(e.priceWei,"priceWei"),c=ze(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=zh(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 ko(d,t),m=gT(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await v(`${Tn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:Cn(t),body:{minter:o,quantity:a},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),y=t.allowedMintTargets?.[n]??t.allowedMintTargets?.[r]??e.mintTarget,w=Array.isArray(y)?y:y?[y]:[];if(!w.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let x=new Set(w.map(R=>Q(R,"SeaDrop mint target"))),g=hT(h,{buyer:o,chainId:r,targets:x});if(g.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let b,S,I=null,k;try{b=Sa.decodeFunctionData("mintPublic",g[0].data),S="public",k=Sa.encodeFunctionData("mintPublic",[b[0],b[1],b[2],b[3]])}catch{try{b=Sa.decodeFunctionData("mintAllowList",g[0].data),S="allowlist";let R=b[4],j=[...b[5]].map(String);if(j.length<1||j.length>64||j.some(Ie=>!/^0x[0-9a-fA-F]{64}$/.test(Ie)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let B=BigInt(R.startTime),W=BigInt(R.endTime),pe=BigInt(Math.floor(l/1e3));if(B>pe||W<=pe)throw new Error("opensea: allowlist mint stage is not open");if(BigInt(R.mintPrice)!==s)throw new Error("opensea: allowlist stage price does not match exact approved price");if(BigInt(R.maxTotalMintableByWallet)<BigInt(a))throw new Error("opensea: allowlist wallet cap is below requested quantity");k=Sa.encodeFunctionData("mintAllowList",[b[0],b[1],b[2],b[3],R,j]),I={mintPrice:BigInt(R.mintPrice).toString(),maxTotalMintableByWallet:BigInt(R.maxTotalMintableByWallet).toString(),startTime:B.toString(),endTime:W.toString(),dropStageIndex:BigInt(R.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(R.maxTokenSupplyForStage).toString(),feeBps:Number(R.feeBps),restrictFeeRecipients:!!R.restrictFeeRecipients,proof:j}}catch(R){throw/opensea:/.test(String(R?.message||""))?R:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=Q(b[0],"mint NFT contract"),P=Q(b[1],"mint fee recipient"),_=Q(b[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(_!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(b[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(k.toLowerCase()!==g[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let C=g.reduce((R,j)=>R+j.valueWei,0n);if(C!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(C>c)throw new Error("opensea: mint total exceeds total cap");let $=await $l(g,r,{...t,provider:e.provider||t.provider});if($.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let D=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},H=Nh({chainId:r,tx:g[0],policy:D});return yT({action:"mint",mintType:S,...I?{stage:I}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:C.toString(),maxTotalWei:c.toString(),mintTarget:g[0].to,feeRecipient:P,expiry:u,transactions:g.map(Pa),gasWar:H,...$},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+vl,Date.parse(u),I?Number(BigInt(I.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function bT(e={}){let t=Uh(e.chain);if(Mh.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Oh(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Oh(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:Q(e.contract,"NFT contract"),token_id:o,quantity:ZP(e.quantity??1,"quantity"),price:{amount:QP(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:Q(e.price?.currency??e.currency??xo,"price currency")},start_time:n.text,end_time:r.text}}var or={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"}]},$h=new ka(["function setApprovalForAll(address operator,bool approved)"]),wT=new ka(["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 Bh(e,t){return e?.[t]||(e?.action===t?e:null)}function vT(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(g=>Bh(g,"createListingsAction")).find(Boolean)||o.find(g=>/createListings/i.test(String(g?.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=Q(c.verifyingContract,"listing protocol"),u=s.message;if(Q(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(Q(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 g of u.consideration){if(Number(g.itemType)!==0||Q(g.token,"listing payment token")!==xo)throw new Error("opensea: executable listings currently require native fixed-price consideration");let b=BigInt(g.startAmount),S=BigInt(g.endAmount);if(b<=0n||b!==S)throw new Error("opensea: listing consideration must be fixed and positive");Q(g.recipient,"listing consideration recipient"),p+=b}let m=VP(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 y=Rl.hashStruct("OrderComponents",or,u),w=o.map(g=>Bh(g,"itemApprovalAction")).find(Boolean)||o.find(g=>/setApprovalForAll/i.test(String(g?.action||""))),x=null;if(w){let g=w.transaction||w.itemApprovalAction?.transaction,b=Zh(g,{buyer:t,chainId:r,targets:new Set([n.contract])}),S;try{S=$h.decodeFunctionData("setApprovalForAll",b.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let I=Q(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($h.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:or,primaryType:"OrderComponents",message:u},orderHash:y,priceWei:p,approval:x}}async function Ca(e={},t={}){if(!Rt(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=Q(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(bT);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=Q(e.taker,"taker"));let c=await v(`${Tn(t)}/listings/actions`,{method:"POST",headers:Cn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=Eo(o[0].chain),u=vT(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await $l(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return N({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(Pa),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 n0(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=Eo(e.chain),o=Q(e.seller||e.address||e.owner,"seller"),i=Q(e.protocolAddress,"reviewed Seaport protocol address"),a=Q(e.contract,"NFT contract"),s=So(e.tokenId),c=jh(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,P]of Object.entries(or)){let _=l.types?.[E];if(!Array.isArray(_)||_.length!==P.length||_.some((C,$)=>C?.name!==P[$].name||C?.type!==P[$].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(or).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=Q(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(Q(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(Q(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(So(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=ze(f.startAmount,"cancellation offer startAmount",{positive:!0}),y=ze(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||y!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let E of m.consideration){if(Number(E.itemType)!==0||Q(E.token,"cancellation payment token")!==xo)throw new Error("opensea: cancellation requires native fixed-price consideration");let P=ze(E.startAmount,"cancellation consideration startAmount",{positive:!0}),_=ze(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(P!==_)throw new Error("opensea: cancellation consideration must be fixed and positive");Q(E.recipient,"cancellation consideration recipient")}let w=ze(m.startTime,"cancellation startTime");if(ze(m.endTime,"cancellation endTime",{positive:!0})<=w)throw new Error("opensea: cancellation listing time bounds invalid");let g=Rl.hashStruct("OrderComponents",or,m),b=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(b)||b!==g.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let S=wT.encodeFunctionData("cancel",[[m]]),I=[{from:o,to:p,data:S,value:"0x0",valueWei:0n,chainId:r}],k=await $l(I,r,{...t,provider:e.provider||t.provider});if(k.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return N({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:g,typedData:{domain:d,types:or,primaryType:"OrderComponents",message:m},transactions:I.map(Pa),...k,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}fe();O();var Na=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),Y=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),z=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),ST=/^0x[0-9a-fA-F]{40}$/;function kT(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}ST.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))Na.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 IT(e){let{ok:t,errors:n,warnings:r}=kT(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
144
144
|
- ${n.join(`
|
|
145
|
-
- `)}`);let o=e.capabilities||{},i=ra.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:ra.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of ra)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 Uc=new Map;function Rf(e){let t=F1(e);return Uc.set(t.chainId,t),t}function Lf(e){return Uc.get(Number(e))||null}function $f(){return[...Uc.values()]}he();var Hc={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Xe=e=>BigInt(e).toString(16).padStart(64,"0"),uo=e=>e.slice(2).toLowerCase().padStart(64,"0");function D1(e,t){return`0x${Hc.getAmountsOut}`+Xe(e)+Xe(64)+Xe(t.length)+t.map(uo).join("")}function U1(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 qc(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var jc=100;function q1(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>jc)throw new Error(`slippageBps ${n} exceeds the ${jc} 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 Bf(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await D(t,"eth_call",[{to:o,data:D1(i,a)},"latest"],s);return U1(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=qc(c.scanner);if(!l)return{chainId:t,evidence:Y.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:Y.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:Y.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=qc(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:Y.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:Y.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:Y.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:Y.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:Y.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:Y.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=qc(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!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=q1(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${Hc.swapExactETHForTokens}`+Xe(g)+Xe(128)+uo(s)+Xe(w)+Xe(f.length)+f.map(uo).join(""):`0x${Hc.swapExactTokensForTokens}`+Xe(a)+Xe(g)+Xe(160)+uo(s)+Xe(w)+Xe(f.length)+f.map(uo).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:jc,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."}}}}he();var H1=[100,500,3e3,1e4],Mf={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Sn=e=>BigInt(e).toString(16).padStart(64,"0"),po=e=>e.slice(2).toLowerCase().padStart(64,"0"),Ff=/^0x[0-9a-fA-F]{40}$/,Vc=100;function j1(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Vc)throw new Error(`slippageBps ${n} exceeds the ${Vc} 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 zc(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Df(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${Mf.quoteExactInputSingle}`+po(a)+po(s)+Sn(c)+Sn(l)+Sn(0),p=await D(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=await Promise.all(H1.map(async p=>{let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);return{fee:p,amountOut:m?m.toString():null,out:m}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:m})=>({fee:p,amountOut:m}))}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=zc(c.scanner,"quoter");if(!l)return{chainId:t,evidence:Y.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(!Ff.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:Y.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:Y.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=zc(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(v=>String(v).toLowerCase()),d=null;!s&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),m=String(n||"").toLowerCase();if(m&&p===m)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let f=s||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!f)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let h=await o({quoter:l,tokenIn:f,tokenOut:i,amountIn:a},c);if(!h.best){let v=u.find(E=>E&&E!==String(f).toLowerCase()&&E!==String(i).toLowerCase());if(v){let E=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c);if(E.best){let S=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:E.best.amountOut},c);if(S.best){let I=S.best.amountOut,P=Number(I*10000n/BigInt(a)),_=z.PASS,T="round trip vs dollar book completes with expected fee/impact loss";return P<5e3?(_=z.FAIL,T=`round trip vs dollar book returns only ${(P/100).toFixed(2)}% -- punitive tax or no real liquidity`):P<9e3&&(_=z.CAUTION,T=`round trip vs dollar book returns ${(P/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:_,reason:T,amountIn:String(a),bought:E.best.amountOut.toString(),returned:I.toString(),retentionBps:P,buyFee:E.best.fee,sellFee:S.best.fee,evidence:Y.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let g=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!g.best){let v=u.find(E=>E&&E!==String(f).toLowerCase()&&E!==String(i).toLowerCase());if(v){let E=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c),S=E.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:E.best.amountOut},c):{best:null};if(E.best&&S.best){let I=S.best.amountOut,P=Number(I*10000n/BigInt(a)),_=z.PASS,T="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return P<5e3?(_=z.FAIL,T=`dollar-book round trip returns only ${(P/100).toFixed(2)}%`):P<9e3&&(_=z.CAUTION,T=`dollar-book round trip returns ${(P/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:v,quoteAsset:v,verdict:_,reason:T,amountIn:String(a),bought:E.best.amountOut.toString(),returned:I.toString(),retentionBps:P,buyFee:E.best.fee,sellFee:S.best.fee,evidence:Y.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"sell",bought:h.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=g.best.amountOut,x=Number(w*10000n/BigInt(a)),y=z.PASS,b="round trip completes with expected fee/impact loss";return x<5e3?(y=z.FAIL,b=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(y=z.CAUTION,b=`round trip returns ${(x/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:y,reason:b,amountIn:String(a),bought:h.best.amountOut.toString(),returned:w.toString(),retentionBps:x,buyFee:h.best.fee,sellFee:g.best.fee,evidence:Y.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=zc(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(!Ff.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!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=j1(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${Mf.exactInputSingle}`+po(i)+po(a)+Sn(f)+po(c)+Sn(s)+Sn(h)+Sn(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:Vc,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 oa={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function Uf(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function qf(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 z1(e){let{chainId:t}=e;async function n(r,o,i){return D(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Kr(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:Y.LIVE}},async nativeBalance(r,o={}){let i=await gn(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:Y.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await Yr({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:Y.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:Y.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,oa.decimals,o).catch(()=>null),n(r,oa.symbol,o).catch(()=>null),n(r,oa.name,o).catch(()=>null),n(r,oa.totalSupply,o).catch(()=>null)]),l=Uf(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:qf(a?.result??a),name:qf(s?.result??s),totalSupply:(Uf(c?.result??c)??null)?.toString()??null,evidence:u?Y.LIVE:Y.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:Y.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await yn(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=wc(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:Cm(r,l),evidence:l.length?Y.LIVE:Y.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 p=r;p<=o;p+=s){let m=Math.min(p+s-1,o);u.push([p,m])}let d=await be(u,4,async([p,m])=>{let f={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${m.toString(16)}`};i&&(f.address=i),a&&(f.topics=a);let h=await D(t,"eth_getLogs",[f],c).catch(g=>({error:String(g?.message||g)}));return{start:p,end:m,res:h}});for(let{start:p,end:m,res:f}of d){if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,m],error:f.error,evidence:Y.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:Y.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,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==Y.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`}),l.evidence===Y.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 Hf(e){let n={...z1(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Df({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,a)=>(await n.resolvePools(i,a)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,Bf({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 Jn=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function Wc(){return Jn.map(e=>Rf(Hf(e)))}var mo=new Map,V1=Object.keys(ze).map(Number),W1=Object.keys(yt).map(Number),G1=Jn.map(e=>e.chainId),K1=[...new Set(Object.values(Xi))],Gc=new Set,jf=!1;function C(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(jf&&Gc.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return mo.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),mo.get(t)}function Kc(e){return mo.get(e)||null}function ia({venue:e,op:t}={}){let n=[...mo.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function Y1(){Gc.clear();for(let e of mo.keys())Gc.add(e);jf=!0}C({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"});C({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."});C({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."});C({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."});C({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"});C({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."});C({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."});C({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."});C({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."});C({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."});C({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."});C({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."});C({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."});C({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."]])C({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});C({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."});C({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:G1,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Jn.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."});C({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)"});C({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)"});C({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"});C({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."});C({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."});C({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"});C({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."});C({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."});C({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."});C({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."});C({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."});C({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"});C({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)"});C({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});C({id:"uniswap-v3",venue:"dex",chainIds:V1,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"});C({id:"uniswap-v4",venue:"dex",chainIds:W1,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});C({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});C({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});C({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)"});C({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)"});C({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)"});C({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});C({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)"});C({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});C({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)"});C({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)"});C({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"});C({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"});C({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"});C({id:"opensea-nft",venue:"nft",chainIds:K1,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"});C({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});C({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});C({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});C({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});C({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"});C({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"});C({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"});C({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"});C({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"});C({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)"});C({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"});C({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)"});C({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"});C({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"});C({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."});C({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."});Y1();C({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});C({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."});C({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."});C({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."});C({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."});C({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)."});C({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."});C({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."});C({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."});C({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});C({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."});C({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."});C({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"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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."});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({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)"});C({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});C({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});C({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});C({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});C({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});C({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});C({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});C({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});C({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Derive options rank-only until official domain+contract is pinned."});C({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});C({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health","read"],execution:"read-only",description:"DOV vault reads. Empty reviewed registry fails closed."});C({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});C({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});C({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});C({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});C({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});$();st();st();var e_=/^0x[0-9a-fA-F]{40}$/,ho="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Yc(e,t){let n=String(e||"").trim();if(!e_.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Jf(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Xf(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 t_(e){return[...e].sort((t,n)=>(Jf(n.tvl)??-1)-(Jf(t.tvl)??-1))}function Jc(e){return e.hlInfo||ce}function Xc(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Qc(e={},t={}){let n=await Jc(t)({type:"vaultSummaries"},t),r=t_((Array.isArray(n)?n:[]).map(Xf));return Xc({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function la(e={},t={}){let r={type:"vaultDetails",vaultAddress:Yc(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Yc(e.user,"user"));let o=await Jc(t)(r,t);return Xc({provider:"hl-vaults",vault:Xf(o||{}),raw:o})}async function Zc(e={},t={}){let n=Yc(e.user||e.address,"user"),r=await Jc(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 Xc({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function el(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return la({...e,vaultAddress:ho},t);if(n==="summaries")return Qc(e,t);if(n==="details")return la(e,t);if(n==="mine")return Zc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Qf(e={}){try{let t=await el({mode:"hlp"},e);return{ok:t.vault.vaultAddress===ho&&!!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}}}he();import{AbiCoder as r_}from"ethers";var tl=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"}),nl=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),o_=r_.defaultAbiCoder();function go(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 yo(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 kn(e,t){return e.length?o_.encode(e,t):"0x"}function At(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 i_(e,t=0){let n=At(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Ut(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:tl});let r=await D(tl,"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 qt(e){return{provider:"hl-precompiles",chainId:tl,...nl,...e}}async function ua(e={}){let t=await Ut(Pe.l1BlockNumber,"0x",e);return qt({op:"l1BlockNumber",precompile:Pe.l1BlockNumber,l1BlockNumber:At(t).toString(),raw:t})}async function rl(e={},t={}){let n=yo(e.index??e.assetId??0,"index",32),r=await Ut(Pe.markPx,kn(["uint32"],[n]),t);return qt({op:"markPx",precompile:Pe.markPx,index:n,markPx:At(r).toString(),raw:r})}async function ol(e={},t={}){let n=yo(e.index??e.assetId??0,"index",32),r=await Ut(Pe.oraclePx,kn(["uint32"],[n]),t);return qt({op:"oraclePx",precompile:Pe.oraclePx,index:n,oraclePx:At(r).toString(),raw:r})}async function il(e={},t={}){let n=yo(e.index??e.assetId??0,"index",32),r=await Ut(Pe.spotPx,kn(["uint32"],[n]),t);return qt({op:"spotPx",precompile:Pe.spotPx,index:n,spotPx:At(r).toString(),raw:r})}async function al(e={},t={}){let n=go(e.user,"user"),r=yo(e.perp??e.assetId??0,"perp",16),o=await Ut(Pe.position,kn(["address","uint16"],[n,r]),t);return qt({op:"position",precompile:Pe.position,user:n,perp:r,szi:i_(o,0),raw:o})}async function sl(e={},t={}){let n=go(e.user,"user"),r=yo(e.token??0,"token",64),o=await Ut(Pe.spotBalance,kn(["address","uint64"],[n,r]),t);return qt({op:"spotBalance",precompile:Pe.spotBalance,user:n,token:r,total:At(o,0).toString(),hold:At(o,1).toString(),raw:o})}async function cl(e={},t={}){let n=go(e.user,"user"),r=go(e.vaultAddress??e.vault??ho,"vault"),o=await Ut(Pe.vaultEquity,kn(["address","address"],[n,r]),t);return qt({op:"vaultEquity",precompile:Pe.vaultEquity,user:n,vaultAddress:r,hlp:r===ho,equity:At(o,0).toString(),raw:o})}async function ll(e={},t={}){let n=go(e.user,"user"),r=await Ut(Pe.withdrawable,kn(["address"],[n]),t);return qt({op:"withdrawable",precompile:Pe.withdrawable,user:n,withdrawable:At(r).toString(),raw:r})}async function Zf(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return ua(t);if(n==="markPx")return rl(e,t);if(n==="oraclePx")return ol(e,t);if(n==="spotPx")return il(e,t);if(n==="position")return al(e,t);if(n==="spotBalance")return sl(e,t);if(n==="vaultEquity"||n==="hlp")return cl(e,t);if(n==="withdrawable")return ll(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function eh(e={}){try{let t=await ua(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...nl,l1BlockNumber:t.l1BlockNumber,precompiles:Pe}}catch(t){return{ok:!1,provider:"hl-precompiles",...nl,error:String(t?.message||t).slice(0,160)}}}st();X();function th(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function pa(e={},t,n){let r=String(t||""),o=th(e);if(o){let a=bo(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=bo(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function ma(e={},t=[],n){let r=th(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(bo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&bo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(bo(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var ul=Number.MAX_SAFE_INTEGER,da=String(ul);function bo(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=ul?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>da.length||t.length===da.length&&t>da||t===da&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=ul?r:null}function Sh(){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 Pt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function kh(e){let t=Pt(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function X_(e,t,n=4){let r=Pt(e),o=Pt(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 Eh(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=Pt(a.funding),l=Pt(a.markPx??a.oraclePx),u=Pt(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:Pt(a.oraclePx),openInterest:u,fundingAprPct:kh(c)})}return r}function Ih(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=Pt(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=kh(n),o=n>0,i={coin:e.coin,notionalUsd:Pt(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?X_(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 Pl(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await Qe(t),i=Eh(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 Cl(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 Qe(t),i=Eh(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return Ih(i,r)}async function Tl(e={},t={}){_h(e,t,"hl-delta-neutral");let n=Ph(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Cl(e,t);if(r.verdict==="skip")return N({...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=pa(e,r.coin,"hl-delta-neutral");if(!Ah.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(()=>(Eo(),_l)),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 N({...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 Ah=/^0x[0-9a-fA-F]{40}$/;function _h(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 Q_(e,t,n){_h(e,t,n)}function Z_(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=Ph(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"&&ma(e,n,"hl-delta-neutral"),t==="live"&&!Ah.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 Ph(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 Ch(e={},t={}){Q_(e,t,"hl-delta-neutral");let n=Z_(e),r=await Pl({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=Ih(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 Tl({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."}}$();X();Zn();var tP=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Io=14,Th=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function tr(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function Nl(e){let t=String(e||"").replace(/\/$/,"");if(!tP.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Nh(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=Th(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=Nl(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(En(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(En(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");tr(n.orderType,0,"orderType"),tr(n.timeInForce,1,"timeInForce"),tr(n.reduceOnly,0,"reduceOnly"),tr(n.triggerPrice,0,"triggerPrice"),tr(n.orderExpiry,-1,"orderExpiry");let c=Th(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=et(n.baseAmount,"lighter: baseAmount"),d=et(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=Ee(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=Ee(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>y)throw new Error("lighter: notional exceeds cap");let b=Ae(n.notionalUsd,"lighter: notionalUsd");return tr(n.txType,Io,"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 nP(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 Oh(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=Nl(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:nP(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??Io,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return Nh(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var Lh="https://mainnet.zklighter.elliot.ai",$h="https://testnet.zklighter.elliot.ai";function rP(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?$h:Lh}function Bh(){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 Gt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function oP(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 Mh(e){let t=Gt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function iP(e,t,n=4){let r=Gt(e),o=Gt(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 Rh(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Ol(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=Rh(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=Rh(a.market_id);if(s==null)continue;let c=o.get(s),l=Gt(c?.mark_price??c?.index_price),u=Gt(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:Gt(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:Mh(u)})}return i}function Fh(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Gt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=Mh(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Gt(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?iP(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 Rl(e={}){let t=rP(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 Dh(e={}){let{funding:t,books:n}=await Rl(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:Ol(t,n)}}async function Ll(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Rl(t),i=Ol(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 $l(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 Rl(t),a=Ol(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return Fh(a,r)}async function Bl(e={},t={}){qh(e,t,"lighter");let n=Hh(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 $l(e,t);if(o.verdict==="skip")return N({...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=pa(e,o.coin,"lighter");if(!Uh.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=oP(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:Io,submitTo:`${s?$h:Lh}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=Oh(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return N({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var Uh=/^0x[0-9a-fA-F]{40}$/;function qh(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 aP(e,t,n){qh(e,t,n)}function sP(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=Hh(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"&&ma(e,n,"lighter"),t==="live"&&!Uh.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 Hh(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 jh(e={},t={}){aP(e,t,"lighter");let n=sP(e),r=await Ll({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=Fh(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 Bl({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."}}$();var lP="https://clob.polymarket.com",uP="https://gamma-api.polymarket.com";function Ao(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||lP).replace(/\/$/,"")}function zh(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||uP).replace(/\/$/,"")}async function Ml(e={}){return k(`${Ao(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Vh(e={}){let t=await Ml(e);return{ok:t!=null&&t!=="",time:t}}async function Wh({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(`${zh(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Gh(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${Ao(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Kh(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${Ao(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Yh(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return k(`${Ao(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jh(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(`${Ao(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Xh({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(`${zh(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}he();$();import{createHash as Qh}from"node:crypto";var nr="mainnet-beta",pP="https://api.mainnet-beta.solana.com",Fl="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function mP(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||pP).trim()}function de(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 fP(e,t){return t?[...e,{commitment:t}]:e}async function _o(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(mP(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 Dl(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await _o("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:nr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Zh(e={}){try{let[t,n]=await Promise.all([_o("getHealth",[],e),Dl({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:nr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:nr,error:String(t?.message||t),exec:!1}}}async function va(e={},t={}){let n=de(e.address||e.owner,"address"),r=await _o("getBalance",fP([n],e.commitment),t);return{provider:"solana-rpc",cluster:nr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function hP(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 Po(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||Fl,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await _o("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(hP):[];return{provider:"solana-rpc",cluster:nr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function gP(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 yP(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 bP(e){let t=Buffer.from(e,"base64");try{let n=yP(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Qh("sha256").update(t.subarray(r)).digest("hex")}catch{return Qh("sha256").update(t).digest("hex")}}async function e0(e={},t={}){let n=gP(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await _o("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:nr,ok:i.err==null,transactionHash:bP(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}$();var xP="mainnet",vP="https://mempool.space/api",SP="https://mempool.space/testnet/api";function wt(e={}){return String(e.network||process.env.BTC_NETWORK||xP).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function ql(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):wt(e)==="testnet"?SP:vP}function Ul(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 ct(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 kP(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 Hl(e,t={}){let n=`${ql(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 Sa(e,t={}){let n=await Hl(e,t);try{return JSON.parse(n)}catch{return n}}async function t0(e={}){try{let t=await Hl("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:wt(e),baseUrl:Ul(ql(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:wt(e),baseUrl:Ul(ql(e)),error:Ul(t?.message||t),exec:!1}}}async function n0(e={}){let t=await Hl("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:wt(e),tipHeight:Number(t)}}async function r0(e={}){try{let t=await Sa("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:wt(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:wt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ka(e={},t={}){let n=ct(e.address||e.addr,"address"),r=await Sa(`/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:wt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function o0(e={},t={}){let n=ct(e.address||e.addr,"address"),r=await Sa(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:wt(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 i0(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 Sa(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:wt(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 a0(e={},t={}){let n=kP(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:wt(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 jl="https://ordinals.com";function Ea(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var IP=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function s0(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=Ea(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=IP.includes(o)&&(i==="https:"||a)}}catch{n=!1}return Ue({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function rr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:s0(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 c0(e={}){let t=Ea(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:s0(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 Ia(e={},t={}){let n=ct(e.address||e.addr,"address"),r=Ea(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 rr(a,t),c=AP(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 AP(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 or(e={},t={}){let n=ct(e.address||e.addr,"address"),r=Ea(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 rr(s,t),l=_P(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 l0(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||jl,o=await rr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function u0(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||jl,o=Number(e.page||0),i=await rr(`${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 d0(e={},t={}){let n=t.ordinalsBase||jl,r=e.height??await rr(`${n}/r/blockheight`,t),o=await rr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function _P(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 CP=["unsigned","notsigned","tosign","signable"],TP=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),NP=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function zl(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function OP(e){return CP.some(t=>e.startsWith(t))||TP.has(e)}function RP(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=zl(t);return OP(n)?!1:NP.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function LP(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 Vl(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=>Vl(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(RP(c)){o.push(c);continue}o.push(...Vl(l,t+1,n,r))}let a=Object.keys(e).map(zl).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(zl(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),LP(e)&&o.push("v/r/s"),o}function Ct(e,t){let n=Vl(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 $P="https://api.satflow.com/v1";function p0(e={}){return Ve({provider:"satflow",defaultUrl:$P,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Aa(e={}){return p0(e).baseUrl}function Gl(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function BP(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Gl(e)},p0(e).trusted)}async function Kt(e,{method:t="GET",body:n,opts:r={}}={}){if(!Gl(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Aa(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:BP(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 m0(e={}){if(!!!Gl(e))return{ok:!1,provider:"satflow",baseUrl:Aa(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 Kt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Aa(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:Aa(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function f0(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 Kt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function h0(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 Kt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function g0(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 Kt(`/item?${r}`,{opts:t})}}async function _a(e={},t={}){let n=ct(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 Kt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function y0(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 Kt(`/orders/floor?${r}`,{opts:t})}}var MP=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function b0(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))MP.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var FP=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"]),DP=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function Wl(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 UP(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=ct(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=ct(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 w0(e={},t={}){let n=b0(e,FP);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=Wl(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Kt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=Wl(a)??Wl(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`);Ct("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=UP(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return N({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 Pa(e={},t={}){let n=b0(e,DP);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 Kt("/intent/sell",{method:"POST",body:n,opts:t});return Ct("satflow",r),N({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."})}$();X();var Ta="https://lite-api.jup.ag/swap/v1",Kl="So11111111111111111111111111111111111111112",S0="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",HP=100,x0=2e4;function k0(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||Ta).replace(/\/$/,"")}function Co(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 E0(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>HP)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function Ca(e,t){return e==null?t:!!e}function jP(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 zP(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 I0(e){let t=Buffer.from(e,"base64"),n=zP(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 To(e={},{quotedAtMs:t=Date.now(),ttlMs:n=x0}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=Co(e.inAmount,"inAmount"),a=Co(e.outAmount,"outAmount"),s=Co(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=E0(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)||x0,1e3),3e4)}}function Yl({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Kl)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=I0(n),a=Co(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 VP=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),WP="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function v0(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=WP.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 A0(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(`${Ta}/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])=>v0(p)),c=[],l=a.filter(([p])=>!v0(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${Ta}/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&&VP.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:`${Ta}/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 _0(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Na({inputMint:Kl,outputMint:S0,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 Na(e={},t={}){let n=de(e.inputMint||e.fromMint||Kl,"inputMint"),r=de(e.outputMint||e.toMint||S0,"outputMint"),o=Co(e.amount||e.inAmount,"amount"),i=E0(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${k0(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=To({...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 GP(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function P0(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:To(e.quoteResponse,t)}:await Na(e,t),o=r.quote,i=r.solanaGuard||To(o,t);if(Ca(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(`${k0(t)}/swap`,{method:"POST",body:GP({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:Ca(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:Ca(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:Ca(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=jP(a?.swapTransaction);I0(s),Ct("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=Yl({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return N({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"})}$();var YP="https://coins.llama.fi",JP="https://api.llama.fi",XP="https://yields.llama.fi",QP="https://stablecoins.llama.fi";function ZP(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||YP).replace(/\/$/,"")}function C0(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||JP).replace(/\/$/,"")}async function An(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return k(`${ZP(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function T0(e={}){let n=(await An(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function N0(e={}){return k(`${C0(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function O0(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||XP).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 Oa(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||QP).replace(/\/$/,""),r=e.includePrices!==!1;return k(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function R0(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(`${C0(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function L0(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await An(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}$();var Yt="0x000000000000000000000000000000000000dEaD";function Jl(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Yt}X();ba();var tC="https://li.quest/v1";function Ql(e={}){return(e.baseUrl||process.env.LIFI_API_URL||tC).replace(/\/$/,"")}var Xl="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",nC="0x0000000000000000000000000000000000000000";function rC(e){let t=String(e||Xl).toLowerCase();return t===Xl.toLowerCase()||t===nC}function $0(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 B0(e={}){let t=await k(`${Ql(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 No(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Xl,toToken:i,fromAmount:a,fromAddress:s=Yt}=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=De({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 ya({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(fh(u)))c.set(g,w);let d=await k(`${Ql(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=re(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 M0(e={},t={}){let n=await No(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(!rC(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:$0(s,"approval token"),spender:$0(a,"approval spender"),amount:String(e.fromAmount)}}return N({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:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function F0(e={}){return k(`${Ql(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}he();import{Interface as q0,getAddress as Oo,isAddress as iC}from"ethers";X();var Jt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},aC=[1,50,100,200,2e3],D0=new q0(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),sC=new q0(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),H0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",j0="0x0000000000000000000000000000000000000000";function z0(e){let t=Number(e),n=Jt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Jt).join(", ")})`);return{chainId:t,...n}}function U0(e,t){let n=Jt[Number(t)];if(!e||e===H0||e===j0||/^eth$/i.test(String(e)))return Oo(n.weth);let r=String(e);if(/^weth$/i.test(r))return Oo(n.weth);if(/^usdc$/i.test(r))return Oo(n.usdc);if(!iC(r))throw new Error(`invalid token address: ${e}`);return Oo(r)}async function Ra(e={},t={}){let{chainId:n,quoter:r,router:o}=z0(e.chainId??8453),i=U0(e.tokenIn||"WETH",n),a=U0(e.tokenOut||Jt[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]:[...aC],u=await Promise.all(c.map(async p=>{let m=D0.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await D(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=D0.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return re({venue:"aerodrome",chainId:n,chain:Jt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function V0(e={},t={}){let n=Number(e.chainId??8453),r=z0(n),o=Oo(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===H0||i===j0||/^eth$/i.test(i),s=await Ra(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=sC.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 N({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:fe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function W0(e={}){let t=Number(e.chainId??8453);try{let n=await Ra({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:Jt[t]?.router,quoter:Jt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function G0(){return Object.entries(Jt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}$();X();var lC="https://api.0x.org";function K0(e={}){return Ve({provider:"zerox",defaultUrl:lC,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Y0(e={}){return K0(e).baseUrl}function La(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function J0(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":La(e)},K0(e).trusted)}async function X0(e={}){if(!La(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Zl({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 Zl(e={},t={}){if(!La(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(`${Y0(t)}/swap/allowance-holder/price?${s}`,{headers:J0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ro(e={},t={}){if(!La(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=De({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(`${Y0(t)}/swap/allowance-holder/quote?${c}`,{headers:J0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?re(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 Q0(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Ro(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 N({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:fe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}$();X();var dC="https://across.to/api",pC="https://api.hop.exchange/v1",mC="https://api.relay.link",fC={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function Z0(e={}){try{return{ok:!0,estimatedFillTimeSec:(await eu({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 eu(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||dC).replace(/\/$/,"");return k(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function eg(e={}){try{let t=await tu({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 tu(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=De({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||pC).replace(/\/$/,""),u=await k(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?re(u,{chainId:Number(e.originChainId||e.chainId||fC[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 tg(e={}){try{let t=await $a({user:Yt,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 $a(e={},t={}){let{user:n=Yt,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=De({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||mC).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}:re(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 ng(e={},t={}){let n=await $a(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:fe(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return N({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}$();import{TypedDataEncoder as ig,getAddress as Lo,isAddress as gC}from"ethers";var PU=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function nu(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function rg(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}X();var iu={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"},yC=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),bC=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ou={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},ag={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},og=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"}]}),MU=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function au(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=iu[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function $o(e,t){let n=String(e||"").trim();if(!gC(n))throw new Error(`cowswap: ${t} must be an address`);return Lo(n).toLowerCase()}function ru(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 wC(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 xC(e){let t=yC[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:Lo(t)}}function vC(e={},t,n){let r=$o(e.sellToken,"sellToken"),o=$o(e.buyToken,"buyToken"),i=$o(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=wC(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ru(e.sellAmount,"sellAmount"),buyAmount:ru(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:ru(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function sg(e={}){try{let t=await ir({chainId:1,sellToken:ou[1],buyToken:ag[1],sellAmountBeforeFee:"1000000000000000",from:Yt},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 ir(e={},t={}){let n=Number(e.chainId??1),r=Jl(e.from||e.owner),o=e.sellToken||ou[n],i=e.buyToken||ag[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=ou[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(`${au(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?re(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function cg(e={},t={}){let n=Number(e.chainId??1),r=$o(Jl(e.from||e.owner||e.signer),"owner"),o=await ir({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=vC(o?.quote||o,n,r),a=xC(n),s={domain:a,types:og,primaryType:"Order",message:i},c=ig.hash(a,og,i),l=bC[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return N({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:Lo(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:Lo(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:Lo(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:SC({chainId:n,owner:r,typedData:s,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function SC(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=iu[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=$o(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=ig.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${s.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??a+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function lg(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(`${au(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function ug(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(`${au(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function dg(){return Object.keys(iu).map(Number)}$();X();var EC="https://api.1inch.dev/swap/v6.0";function pg(e={}){return Ve({provider:"oneinch",defaultUrl:EC,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function su(e={}){return pg(e).baseUrl}function Bo(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function cu(e={}){let t=Bo(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},pg(e).trusted)}async function mg(e={}){if(!Bo(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await lu({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 lu(e={},t={}){if(!Bo(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(`${su(t)}/${n}/quote?${a}`,{headers:cu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?re(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function IC(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function uu(e={},t={}){if(!Bo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return k(`${su(t)}/${n}/approve/spender`,{headers:cu(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function fg(e={},t={}){if(!Bo(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=De({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(`${su(t)}/${n}/swap?${c}`,{headers:cu(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=re(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!IC(r)){let f=l?.spender||l?.approvalAddress||(await uu({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 N({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:fe(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}X();var _C=96*1024,hg=50;function PC(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>_C)throw new Error("x402: invalid PAYMENT-REQUIRED payload");if(t.startsWith("{"))try{return JSON.parse(t)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED JSON")}if(!/^[A-Za-z0-9+/_-]+={0,2}$/.test(t)||t.length%4===1)throw new Error("x402: invalid PAYMENT-REQUIRED Base64");let n=t.replace(/-/g,"+").replace(/_/g,"/"),r=n+"=".repeat((4-n.length%4)%4);try{let o=Buffer.from(r,"base64").toString("utf8");if(!o.trim().startsWith("{"))throw new Error("shape");return JSON.parse(o)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED Base64 JSON")}}function Tt(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function yg(e,t){let n=Tt(e,t);if(!/^\d+$/.test(n))throw new Error(`x402: ${t} must be atomic units`);let r=BigInt(n);if(r<=0n)throw new Error(`x402: ${t} must be positive`);return r.toString()}function CC(e){if(!e||typeof e!="object"||Array.isArray(e))return Object.freeze({});let t={};for(let n of["name","version"])typeof e[n]=="string"&&e[n].trim()&&(t[n]=e[n].trim());return Object.freeze(t)}function TC(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=Tt(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:Tt(e.network,`accepts[${t}].network`),amount:yg(e.amount,`accepts[${t}].amount`),asset:Tt(e.asset,`accepts[${t}].asset`),payTo:Tt(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:CC(e.extra)})}function du(e){let t=PC(e);if(t.x402Version!==2)throw new Error("x402: only x402Version 2 is supported");if(!Array.isArray(t.accepts)||t.accepts.length===0||t.accepts.length>hg)throw new Error(`x402: accepts must contain 1-${hg} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:Tt(t.resource.url,"resource.url"),description:String(t.resource.description||""),mimeType:String(t.resource.mimeType||"")}):null;if(!n)throw new Error("x402: resource required");let r=Object.freeze(t.accepts.map(TC));for(let o of r)if(!Number.isInteger(o.maxTimeoutSeconds)||o.maxTimeoutSeconds<=0)throw new Error("x402: maxTimeoutSeconds must be a positive integer");return Object.freeze({x402Version:2,resource:n,accepts:r})}function gg(e,t){return String(e)===String(t)}function NC(e,t={}){let n=du(e),r=Tt(t.network,"network"),o=Tt(t.asset,"asset"),i=Tt(t.payTo,"payTo"),a=BigInt(yg(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&gg(l.asset,o)&&gg(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function bg(e={}){return e.paymentRequired??e.header??e.body}function wg(e={}){return du(bg(e))}function xg(e={},t={}){let n=du(bg(e)),r=NC(n,e);return N({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function vg(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}$();var RC="https://api.bankr.bot";function pu(e={}){return Ve({provider:"bankr",defaultUrl:RC,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function Sg(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function LC(e={}){let t=Sg(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function kg(e={},t=!1){let n=LC(e),r=pu(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function Eg(e,t={}){return k(`${pu(t).baseUrl}${e}`,{headers:kg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function mu(e={}){return Eg("/wallet/me",e)}async function Ig(e={}){return Eg("/wallet/portfolio",e)}function Mo(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function $C(e){let t=Mo(e,"amount");if(!/^\d+(?:\.\d+)?$/.test(t)||Number(t)<=0)throw new Error("bankr: amount must be a positive decimal string");return t}async function Ag(e={},t={}){let n={fromChain:Mo(e.fromChain,"fromChain"),fromToken:Mo(e.fromToken,"fromToken"),toChain:Mo(e.toChain,"toChain"),toToken:Mo(e.toToken,"toToken"),amount:$C(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return k(`${pu(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:kg(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function _g(e={}){if(!Sg(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await mu(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var MC=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Fo(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||MC,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 Pg(e={}){try{let t=await Fo({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 Cg(e={}){let t=await Fo({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function Tg(e,t={}){if(!e)throw new Error("coin required");let n=await Fo({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var DC=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Ba(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||DC,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 Ng(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Ba([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 Og(e,t={}){if(!e)throw new Error("assetId required");let n=await Ba([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import Mg from"node:path";import{homedir as ZC}from"node:os";import{createHash as eT,randomUUID as tT}from"node:crypto";import ae from"node:fs";import Ma from"node:path";import{createHash as qC,randomUUID as Rg}from"node:crypto";var fu=1,lt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Xt(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(Xt).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Xt(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function Lg(e){return qC("sha256").update(Xt(e)).digest("hex")}function Fa(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function Da(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function $g(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function hu(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function ar({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>Rg()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let y=n();return r(y),{schemaVersion:fu,kind:t,generation:0,data:y}}function d(y){let b;try{b=JSON.parse(y)}catch(S){throw new lt(`corrupt ${t} snapshot: invalid JSON (${S.message})`,"STORE_CORRUPT")}if(!b||typeof b!="object"||Array.isArray(b))throw new lt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(b.schemaVersion!==fu)throw new lt(`unsupported ${t} schemaVersion ${String(b.schemaVersion)}`,"STORE_SCHEMA");if(b.kind!==t||!Number.isSafeInteger(b.generation)||b.generation<0)throw new lt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...E}=b;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||Lg(E)!==v)throw new lt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(b.data)}catch(S){throw new lt(`corrupt ${t} snapshot: ${S.message}`,"STORE_CORRUPT")}return E}function p(){if(!ae.existsSync(e))return u();let y=ae.statSync(e);if(!y.isFile()||y.size>i)throw new lt(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ae.chmodSync(e,384)}catch{}return d(ae.readFileSync(e,"utf8"))}function m(){$g(Ma.dirname(e));let y=Fa(o),b=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:b,pid:process.pid,acquiredAt:y})}
|
|
146
|
-
`,
|
|
147
|
-
`;if(Buffer.byteLength(v)>i)throw new lt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let E=Ma.dirname(e);$g(E);let S=Ma.join(E,`.${Ma.basename(e)}.${process.pid}.${Rg()}.tmp`),I;try{I=ae.openSync(S,"wx",384),ae.writeFileSync(I,v,"utf8"),ae.fsyncSync(I),ae.closeSync(I),I=void 0,ae.renameSync(S,e);try{ae.chmodSync(e,384)}catch{}try{let P=ae.openSync(E,"r");try{ae.fsyncSync(P)}finally{ae.closeSync(P)}}catch{}}finally{if(I!==void 0)try{ae.closeSync(I)}catch{}try{ae.unlinkSync(S)}catch(P){if(P?.code!=="ENOENT")throw P}}}function g(){return Da(p().data)}function w(){let y=p();return{schemaVersion:y.schemaVersion,kind:y.kind,generation:y.generation,data:Da(y.data)}}function x(y){if(typeof y!="function")throw new TypeError("mutator must be a function");let b=m();try{let v=p(),E=Da(v.data),S=y(E,{generation:v.generation,now:Fa(o)});return r(E),h({schemaVersion:fu,kind:t,generation:v.generation+1,data:E}),Da(S)}finally{f(b)}}return Object.freeze({filePath:e,read:g,inspect:w,mutate:x})}import{wordlists as HC}from"ethers";var jC=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),zC=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],VC=new Set([12,15,18,21,24]);function WC(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return VC.has(t.length)&&t.every(n=>HC.en.getWordIndex(n)>=0)}var GC=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,KC=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,YC=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function JC(e){let t=Bg(e);return YC.has(t)||KC.test(t)}var Do=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Bg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function XC(e){let t=Bg(e);return[...jC].some(n=>t.includes(n))}function QC(e,t,n){if(typeof t=="string"){if(zC.some(r=>r.test(t))||WC(t))throw new Do(n);if(GC.test(t)&&!JC(e))throw new Do(n)}}function gu(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return QC(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)=>gu(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(XC(o))throw new Do(i);e[o]!==void 0&&(r[o]=gu(e[o],i,o))}return r}function Nt(e){return gu(e)}var qa=1,Fg="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",n3=Object.freeze(["listing","offer","arm","instruct"]),nT=Object.freeze(["open","cancelled","expired","armed","submitted"]),r3=Object.freeze(["arm","sign-and-broadcast"]),rT=Object.freeze({protocol:"oracle-a2a/1",name:"oracle-local-marketplace",brand:"Oracle",publisher:"Oracle",product:"Oracle",role:"Oracle owner-local P2 catalog",consultOnly:!0,remoteDelegation:!1,pluginExecution:!1,refusesSignHash:!0,skills:Object.freeze(["list-local-listings"]),note:"Oracle consult-only local Agent Card. Untrusted A2A text cannot create, fill, cancel, sign, or broadcast listings. Existing marketplace providers are unchanged. No plugin pack loader."}),oT=/^(?:0|[1-9][0-9]*)$/,iT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,aT=/^0x[a-fA-F0-9]{40}$/,sT=/^0x[a-fA-F0-9]{64}$/,cT=/[\u0000-\u001f\u007f]/,lT=new Set(nT),wu=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function G(e,t){throw new wu(e,t)}function Cn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Cn(t);Object.freeze(e)}return e}function qo(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&G(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||cT.test(o))&&G(`${t} is invalid`),r?o.toLowerCase():o}function Le(e,t){let n=qo(e,t,{max:128});return iT.test(n)||G(`${t} must be a bounded id`),n}function Uo(e,t,{positive:n=!1}={}){typeof e=="number"&&G(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return oT.test(r)||G(`${t} must be a canonical integer string`),n&&r==="0"&&G(`${t} must be positive`),r}function Pn(e,t){let n=qo(e,t,{max:42,lower:!0});return aT.test(n)||G(`${t} must be a 20-byte EVM address`),n}function Dg(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&G(`${t} must be a plain object`),e}function _n(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&G("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function yu(e){return new Date(e).toISOString()}function uT(e){return eT("sha256").update(Xt(e),"utf8").digest("hex")}function dT(e=process.env){let t=e.ORACLE_CONFIG_DIR||Mg.join(ZC(),".config","oracle");return Mg.join(t,"local-marketplace.v1.json")}function Ua(e){let t=e.status==="submitted";return Cn({schemaVersion:qa,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:lT.has(e.status)?e.status:G("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>Cn({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:Fg,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function pT(e){(!e||e.schemaVersion!==qa||!Array.isArray(e.listings))&&G("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&G("marketplace capacity exceeded","STORE_LIMIT")}function bu(e,t){return Cn({schemaVersion:qa,recordType:"local-marketplace-armed",listingId:e.listingId,offerId:t.offerId,tenantId:e.tenantId,seller:e.seller,buyer:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId,listingHash:e.listingHash,unsigned:{kind:"local-p2-fill",from:e.seller,to:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId},review:`Local P2 fill ${e.listingId} is armed for the owner-local signer: seller ${e.seller} transfers ${t.amount} ${e.asset} to ${t.buyer} at ${e.price} on chain ${e.chainId}. Sign and broadcast still require an explicit instruction.`,label:Fg,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function mT(e,t,n){typeof e=="string"&&G("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=Dg(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&G("generic signHash is refused","SIGNHASH_REFUSED");let o=Pn(r.from??r.offerer??t.seller,"artifact.from"),i=Pn(r.to??r.recipient??n.buyer,"artifact.to"),a=Uo(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&G("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&G("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&G("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&G("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function fT(e,t){if(e==null)return{action:"arm"};let n=Dg(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&G("generic signHash is refused","SIGNHASH_REFUSED");let r=qo(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&G("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&G("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&G("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&G("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&G("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&G("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function Ug({filePath:e=dT(),clock:t=()=>Date.now(),idFactory:n=()=>tT()}={}){let r=ar({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:qa,listings:[]}),validateData:pT});function o(h,g){return h.tenantId===g}function i(h,g){return h.status==="open"&&Date.parse(h.expiresAt)<=g&&(h.status="expired"),h}function a(h={}){Nt(h);let g=Le(h.tenantId,"tenantId"),w=Pn(h.seller,"seller"),x=qo(h.asset,"asset",{max:128}),y=Uo(h.amount,"amount",{positive:!0}),b=Uo(h.price,"price",{positive:!0}),v=Uo(h.chainId,"chainId",{positive:!0}),E=_n(t),S=yu(E),I=h.expiresAt==null?yu(E+864e5):qo(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(I))||Date.parse(I)<=E)&&G("expiresAt must be after now");let P=Le(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(_=>{_.listings.some(U=>U.listingId===P)&&G("listingId already exists","DUPLICATE");let T={listingId:P,tenantId:g,seller:w,asset:x,amount:y,price:b,chainId:v,status:"open",createdAt:S,expiresAt:I,offers:[],custody:"none",execution:"armed-local"},L={...T,listingHash:uT(T)};return _.listings.push(L),Ua(L)})}function s({tenantId:h}={}){let g=Le(h,"tenantId"),w=_n(t);return Cn(r.read().listings.filter(x=>o(x,g)).map(x=>Ua(i({...x,offers:x.offers.map(y=>({...y}))},w))))}function c({tenantId:h,listingId:g,actor:w}={}){let x=Le(h,"tenantId"),y=Le(g,"listingId"),b=Pn(w,"actor"),v=_n(t);return r.mutate(E=>{let S=E.listings.find(I=>o(I,x)&&I.listingId===y);return S||G("listing not found","NOT_FOUND"),i(S,v),S.seller!==b&&G("only the seller can cancel","FORBIDDEN"),S.status!=="open"&&G("listing is not open","NOT_OPEN"),S.status="cancelled",Ua(S)})}function l(h={}){Nt(h);let g=Le(h.tenantId,"tenantId"),w=Le(h.listingId,"listingId"),x=Pn(h.buyer,"buyer"),y=Uo(h.amount,"amount",{positive:!0}),b=_n(t),v=Le(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(E=>{let S=E.listings.find(I=>o(I,g)&&I.listingId===w);return S||G("listing not found","NOT_FOUND"),i(S,b),S.status!=="open"&&G("listing is not open","NOT_OPEN"),S.seller===x&&G("seller cannot offer on their own listing","FORBIDDEN"),S.offers.some(I=>I.offerId===v)&&G("offerId already exists","DUPLICATE"),S.offers.push({offerId:v,buyer:x,amount:y,status:"open",createdAt:yu(b)}),Ua(S)})}function u(h,{tenantId:g,listingId:w,offerId:x,actor:y,now:b,allowed:v=["open","armed"]}){let E=h.listings.find(I=>o(I,g)&&I.listingId===w);E||G("listing not found","NOT_FOUND"),i(E,b),v.includes(E.status)||G("listing is not open","NOT_OPEN"),E.seller!==y&&G("only the seller can arm a fill","FORBIDDEN");let S=E.offers.find(I=>I.offerId===x);return(!S||!["open","armed"].includes(S.status))&&G("offer not found","NOT_FOUND"),{row:E,offer:S}}function d({tenantId:h,listingId:g,offerId:w,actor:x}={}){let y=Le(h,"tenantId"),b=Le(g,"listingId"),v=Le(w,"offerId"),E=Pn(x,"actor"),S=_n(t);return r.mutate(I=>{let{row:P,offer:_}=u(I,{tenantId:y,listingId:b,offerId:v,actor:E,now:S});return P.status="armed",_.status="armed",bu(P,_)})}async function p({tenantId:h,listingId:g,offerId:w,actor:x,instruction:y,executor:b}={}){let v=Le(h,"tenantId"),E=Le(g,"listingId"),S=Le(w,"offerId"),I=Pn(x,"actor"),P=_n(t),_=r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:E,offerId:S,actor:I,now:P,allowed:["open","armed"]}),ke=fT(y,W);return W.status="armed",pe.status="armed",{armed:bu(W,pe),instruction:ke,listingHash:W.listingHash}});if(_.instruction.action==="arm")return _.armed;let T=r.read().listings.find(B=>B.listingId===E&&B.tenantId===v),L=T?.offers.find(B=>B.offerId===S),U=mT(_.instruction.artifact,T,L);(!b||typeof b.executeConfirmedArtifact!="function")&&G("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof b.signHash=="function"&&G("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await b.executeConfirmedArtifact(U,_.instruction.nonce,b),O=H?.receipt?.transactionHash??H?.transactionHash;(typeof O!="string"||!sT.test(O))&&G("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let j=H?.receipt?.status??H?.status;return j!==1&&j!=="0x1"&&G("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:E,offerId:S,actor:I,now:_n(t),allowed:["armed"]});return W.status="submitted",pe.status="submitted",W.transactionHash=O.toLowerCase(),Cn({...bu(W,pe),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:W.transactionHash,review:`Local P2 fill ${W.listingId} signed and broadcast through the instructed local signer. transactionHash=${W.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Le(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&G("consult text required"),Cn({accepted:!1,reason:"untrusted consult text cannot create, fill, or cancel listings",custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1})}function f(){return rT}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import qg from"node:path";import{homedir as hT}from"node:os";import{createHash as gT,randomUUID as yT}from"node:crypto";var ja=1,Hg="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",u3=Object.freeze(["open","cancelled","armed","submitted"]),bT=/^(?:0|[1-9][0-9]*)$/,wT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,xT=/^0x[a-fA-F0-9]{40}$/,vT=/^0x[a-fA-F0-9]{64}$/,ST=/[\u0000-\u001f\u007f]/,Su=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function J(e,t){throw new Su(e,t)}function Ho(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Ho(t);Object.freeze(e)}return e}function jo(e,t,{max:n=256}={}){typeof e!="string"&&J(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||ST.test(r))&&J(`${t} is invalid`),r}function Ot(e,t){let n=jo(e,t,{max:128});return wT.test(n)||J(`${t} must be a bounded id`),n}function Ha(e,t,{positive:n=!1}={}){typeof e=="number"&&J(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return bT.test(r)||J(`${t} must be a canonical integer string`),n&&r==="0"&&J(`${t} must be positive`),r}function Tn(e,t){let n=jo(e,t,{max:42}).toLowerCase();return xT.test(n)||J(`${t} must be a 20-byte EVM address`),n}function kT(e){let t=jo(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{J("resource must be an https URL")}return n.protocol!=="https:"&&J("resource must be https"),(n.username||n.password)&&J("resource must not contain credentials"),n.toString()}function jg(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&J(`${t} must be a plain object`),e}function ET(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&J("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function IT(e){return new Date(e).toISOString()}function AT(e=process.env){let t=e.ORACLE_CONFIG_DIR||qg.join(hT(),".config","oracle");return qg.join(t,"local-x402.v1.json")}function xu(e){let t=e.status==="submitted";return Ho({schemaVersion:ja,intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,maxBudget:e.maxBudget,asset:e.asset,chainId:e.chainId,status:e.status,createdAt:e.createdAt,intentHash:e.intentHash,transactionHash:e.transactionHash||null,label:Hg,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function _T(e){(!e||e.schemaVersion!==ja||!Array.isArray(e.intents))&&J("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&J("x402 capacity exceeded","STORE_LIMIT")}function vu(e){return Ho({schemaVersion:ja,recordType:"local-x402-armed",intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,asset:e.asset,chainId:e.chainId,intentHash:e.intentHash,unsigned:{kind:"local-x402-pay",from:e.payer,to:e.payTo,amount:e.amount,asset:e.asset,chainId:e.chainId,resource:e.resource},review:`Oracle local x402 ${e.intentId} is armed: pay ${e.amount} ${e.asset} to ${e.payTo} for ${e.resource}. Sign and broadcast still require an explicit instruction.`,label:Hg,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function PT(e,t){typeof e=="string"&&J("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=jg(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=Tn(n.from??t.payer,"artifact.from"),o=Tn(n.to??t.payTo,"artifact.to"),i=Ha(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&J("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&J("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&J("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&J("amount exceeds maxBudget","BUDGET"),n}function CT(e,t){if(e==null)return{action:"arm"};let n=jg(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=jo(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&J("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&J("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&J("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&J("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function zg({filePath:e=AT(),clock:t=()=>Date.now(),idFactory:n=()=>yT()}={}){let r=ar({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:ja,intents:[]}),validateData:_T});function o(l={}){Nt(l);let u=Ot(l.tenantId,"tenantId"),d=Tn(l.payer,"payer"),p=Tn(l.payTo,"payTo"),m=kT(l.resource),f=Ha(l.amount,"amount",{positive:!0}),h=Ha(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&J("amount exceeds maxBudget","BUDGET");let g=jo(l.asset??"USDC","asset",{max:32}),w=Ha(l.chainId,"chainId",{positive:!0}),x=ET(t),y=Ot(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(b=>{b.intents.some(S=>S.intentId===y)&&J("intentId already exists","DUPLICATE");let v={intentId:y,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:w,status:"open",createdAt:IT(x),custody:"none",execution:"armed-local"},E={...v,intentHash:gT("sha256").update(Xt(v),"utf8").digest("hex")};return b.intents.push(E),xu(E)})}function i({tenantId:l}={}){let u=Ot(l,"tenantId");return Ho(r.read().intents.filter(d=>d.tenantId===u).map(xu))}function a({tenantId:l,intentId:u,actor:d}={}){let p=Ot(l,"tenantId"),m=Ot(u,"intentId"),f=Tn(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||J("intent not found","NOT_FOUND"),g.payer!==f&&J("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&J("intent is not open","NOT_OPEN"),g.status="cancelled",xu(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=Ot(l,"tenantId"),m=Ot(u,"intentId"),f=Tn(d,"actor");return r.mutate(h=>{let g=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return g||J("intent not found","NOT_FOUND"),g.payer!==f&&J("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||J("intent is not open","NOT_OPEN"),g.status="armed",vu(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=Ot(l,"tenantId"),h=Ot(u,"intentId"),g=Tn(d,"actor"),w=r.mutate(S=>{let I=S.intents.find(_=>_.tenantId===f&&_.intentId===h);I||J("intent not found","NOT_FOUND"),I.payer!==g&&J("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(I.status)||J("intent is not open","NOT_OPEN");let P=CT(p,I);return I.status="armed",{armed:vu(I),instruction:P}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(S=>S.tenantId===f&&S.intentId===h),y=PT(w.instruction.artifact,x);(!m||typeof m.executeConfirmedArtifact!="function")&&J("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&J("generic signHash executors are refused","SIGNHASH_REFUSED");let b=await m.executeConfirmedArtifact(y,w.instruction.nonce,m),v=b?.receipt?.transactionHash??b?.transactionHash;(typeof v!="string"||!vT.test(v))&&J("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let E=b?.receipt?.status??b?.status;return E!==1&&E!=="0x1"&&J("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(S=>{let I=S.intents.find(P=>P.tenantId===f&&P.intentId===h);return(!I||I.status!=="armed")&&J("intent is not armed","NOT_OPEN"),I.status="submitted",I.transactionHash=v.toLowerCase(),Ho({...vu(I),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:I.transactionHash,review:`Oracle local x402 ${I.intentId} signed and broadcast. transactionHash=${I.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import Vg from"node:path";import{homedir as TT}from"node:os";import{randomUUID as NT}from"node:crypto";var Iu=1,OT="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",w3=Object.freeze(["listed","revoked"]),RT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,LT=/[\u0000-\u001f\u007f]/,$T=/^[a-f0-9]{64}$/,BT=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,MT=new Set(["read","prepare","none"]),Eu=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function Ie(e,t){throw new Eu(e,t)}function Au(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Au(t);Object.freeze(e)}return e}function Qt(e,t,{max:n=256}={}){typeof e!="string"&&Ie(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||LT.test(r))&&Ie(`${t} is invalid`),r}function zo(e,t){let n=Qt(e,t,{max:128});return RT.test(n)||Ie(`${t} must be a bounded id`),n}function Wg(e,t){let n=Qt(e,t,{max:64}).toLowerCase();return $T.test(n)||Ie(`${t} must be 64 lowercase hex`),n}function FT(e,t){let n=Qt(e,t,{max:2048}),r;try{r=new URL(n)}catch{Ie(`${t} must be an https URL`)}return r.protocol!=="https:"&&Ie(`${t} must be https`),(r.username||r.password)&&Ie(`${t} must not contain credentials`),r.toString()}function DT(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Ie("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Qt(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!BT.test(r)||r==="0.0.0.0")&&Ie(`outboundHosts[${n}] is not an allowlisted host`),r}))}function Gg(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&Ie("clock invalid","CLOCK_INVALID"),n}function Kg(e){return new Date(e).toISOString()}function UT(e=process.env){let t=e.ORACLE_CONFIG_DIR||Vg.join(TT(),".config","oracle");return Vg.join(t,"local-pack-registry.v1.json")}function ku(e){return Au({schemaVersion:Iu,packId:e.packId,tenantId:e.tenantId,name:e.name,version:e.version,publisher:e.publisher,manifestDigest:e.manifestDigest,sbomDigest:e.sbomDigest,homepage:e.homepage,outboundHosts:e.outboundHosts,spendScope:e.spendScope,status:e.status,createdAt:e.createdAt,revokedAt:e.revokedAt,label:OT,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function qT(e){(!e||e.schemaVersion!==Iu||!Array.isArray(e.packs))&&Ie("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Ie("pack registry capacity exceeded","STORE_LIMIT")}function Yg({filePath:e=UT(),clock:t=()=>Date.now(),idFactory:n=()=>NT()}={}){let r=ar({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Iu,packs:[]}),validateData:qT});function o(l={}){Nt(l);let u=zo(l.tenantId,"tenantId"),d=Qt(l.name,"name",{max:128}),p=Qt(l.version,"version",{max:64}),m=Qt(l.publisher,"publisher",{max:128}),f=Wg(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Wg(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:FT(l.homepage,"homepage"),w=DT(l.outboundHosts),x=Qt(l.spendScope??"none","spendScope",{max:16});MT.has(x)||Ie("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&Ie("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let y=Gg(t),b=zo(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(S=>S.packId===b||S.tenantId===u&&S.name===d&&S.version===p&&S.status==="listed")&&Ie("pack already listed","DUPLICATE");let E={packId:b,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:w,spendScope:x,status:"listed",createdAt:Kg(y),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(E),ku(E)})}function i({tenantId:l}={}){let u=zo(l,"tenantId");return Au(r.read().packs.filter(d=>d.tenantId===u).map(ku))}function a({tenantId:l,packId:u}={}){let d=zo(l,"tenantId"),p=zo(u,"packId"),m=Gg(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||Ie("pack not found","NOT_FOUND"),h.status!=="listed"&&Ie("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=Kg(m),ku(h)})}function s(){Ie("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){Ie("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}$();import{getAddress as KT,Interface as cr,keccak256 as Cu}from"ethers";import{createHash as Tu,createHmac as YT,timingSafeEqual as uy}from"node:crypto";he();import{Interface as Qg,getAddress as _u,isAddress as HT}from"ethers";var jT="0x0000000000000000000000000000000000000000",Zg=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),zT=new Qg(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),VT=new Qg(["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 WT(e){let t=Number(e??4663),n=Zg[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Jg(e,t){if(/^weth$/i.test(String(e||"")))return _u(Zg[t].weth);if(!HT(String(e||"")))throw new Error(`up33: invalid token ${e}`);return _u(e)}function GT(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function Xg(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 ey(e,t={},n={}){try{let r=WT(t.chainId),o=Jg(t.tokenIn,r.chainId),i=Jg(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=GT(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||D,l=await Xg(c,r.chainId,r.factory,zT,"getPool",[o,i,s]),u=_u(l[0]);if(u.toLowerCase()===jT)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 Xg(c,r.chainId,r.quoter,VT,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 ty(e={},t={}){return ey("exact-input",e,t)}async function ny(e={},t={}){return ey("exact-output",e,t)}X();var V=4663,za="https://anvil.clutch.market",JT=`${za}/api/markets/snapshot?chainId=${V}`,XT=`${za}/api/rpc?chainId=${V}`,QT=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Ge="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Nu="0x0000000000000000000000000000000000000000",Nn=1e5,ZT=256e3,ry=256,eN=3e4,tN=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"}),tt=Object.freeze({chainId:V,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ne=new cr(["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"]),nN=new cr(["function allowance(address owner,address spender) view returns (uint256)"]),dy=new cr(["function decimals() view returns (uint8)"]),oy=new cr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),nt=new cr(["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)"]),Zt=new cr(["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 q(e,t){try{return KT(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Lt(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 Ke(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(V,"eth_call",[{to:q(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function py(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 iy(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>ry)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${ry}`);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)!==V)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${V}`);return{name:n.name||n.collectionName||null,chainId:V,collection:q(n.collection||n.collectionAddress,"Anvil collection"),market:q(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?q(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 rN(e,t,n=[],r={}){if(Number(e)!==V)throw new Error(`stonkbrokers: Anvil supports chain ${V} only`);if(!QT.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await k(XT,{method:"POST",headers:{origin:za,referer:`${za}/`,"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 ut(e={}){return e.rpcCall||((t,n,r)=>rN(t,n,r,e))}async function lr(e={},t={}){if(e.snapshot){let s=iy(e.snapshot),c={kind:"anvil-markets",chainId:V,total:s.length,contentHash:Tu("sha256").update(sr(s)).digest("hex")},l=Ou(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(JT,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:ZT,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=iy(r),i={kind:"anvil-markets",chainId:V,total:o.length,contentHash:Tu("sha256").update(sr(o)).digest("hex")},a=Ou(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 Va(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 my({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 lr({},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=tN[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=ut(n),c=Va(await s(V,"eth_blockNumber",[])),l=await s(V,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||Va(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(V,"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=Cu(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+eN}}function fy(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:V,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 Wo(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=Lt(e.tokenId),i=await my({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Ne,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Ne,"inventory",[BigInt(o)],s),ee(a,r,nt,"ownerOf",[BigInt(o)],s),ee(a,n,Ne,"collection",[],s),ee(a,n,Ne,"token",[],s),ee(a,n,Ne,"robinhoodSwapFeeWei",[],s)]),f=q(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=q(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,dy,"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=fy(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),y=!!c[4],b=!!l[0],v=q(u[0],"NFT owner")===n,E=y&&b&&v;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:V,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:py(c[2],c[3]),available:E,evidence:{quoteAvailable:y,inventory:b,ownerIsMarket:v,marketCollection:f,attestation:x},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Wa(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await my({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Ne,"quoteSellNFT",[],a),ee(i,n,Ne,"collection",[],a),ee(i,n,Ne,"token",[],a),ee(i,n,Ne,"robinhoodSwapFeeWei",[],a)]),d=q(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=q(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,dy,"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=fy(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:V,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:py(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function hy(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 Rt(e,t){let n=Ke(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function gy({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:V,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Rt(o,"gasLimit").toString(),maxFeePerGas:Rt(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=Rt(a,"maxPriorityFeePerGasWei").toString()),c}function yy(e,t){return N({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 by(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=q(e.market,"Anvil market"),o=q(e.collection,"NFT collection"),i=Lt(e.tokenId),a=Rt(e.maxTotalCostRaw,"maxTotalCostRaw"),s=Ke(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 Wo({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=Rt(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=q(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,w={blockHash:g.blockHash,requireCanonical:!0},x=BigInt((await ee(ut(t),f,nN,"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=[gy({...y,to:r,data:Ne.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],v={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},E={version:1,surface:"evm-nft",action:"nft",nftAction:"buy",provider:"anvil-nft",owner:n,destination:r,contract:o,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),marketCollection:l.evidence.marketCollection,anvilAttestation:g,anvilQuote:v,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:hy(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:v,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return yy(E,l)}async function wy(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=ut(t),r=q(e.seller,"seller"),o=q(e.market,"Anvil market"),i=q(e.collection,"NFT collection"),a=Lt(e.tokenId),s=Rt(e.minPayoutRaw,"minPayoutRaw"),c=Ke(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 Wa({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ee(n,i,nt,"ownerOf",[BigInt(a)],p).then(_=>q(_[0],"NFT owner")),ee(n,i,nt,"getApproved",[BigInt(a)],p).then(_=>q(_[0],"NFT approval")),ee(n,i,nt,"isApprovedForAll",[r,o],p).then(_=>!!_[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=Rt(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=q(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[gy({...E,to:o,data:Ne.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],I={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},P={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:b,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:I,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:hy(e.tradeId),slippageBps:0,expiresAtMs:x+y,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:I,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:S}};return yy(P,u)}async function oN(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(v=>Lt(v)),y={kind:"anvil-inventory",chainId:V,market:q(e.market,"Anvil market"),collection:q(e.collection,"NFT collection"),total:x.length,contentHash:Tu("sha256").update(sr(x)).digest("hex")},b=Ou(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=ut(t),r=q(e.market,"Anvil market"),o=Va(await n(V,"eth_blockNumber",[])),i=await n(V,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||Va(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Ne,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>Nn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${Nn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>Nn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${Nn}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:Nn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Ne,"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,Ne,"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 iN(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 aN(e,t,n){let r=ut(n);try{let o=String((await ee(r,e,nt,"tokenURI",[BigInt(t)]))[0]),i=iN(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,nt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function xy(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 sN(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 Ga(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await oN({...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=ut(t),p=(await be(i,s,async h=>{try{let g=await ee(u,r,nt,"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 be(p,s,async h=>{try{let g=await Wo({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:V,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 be(i,s,async u=>{try{let[d,p]=await Promise.all([aN(r,u,t),Wo({market:n,collection:r,tokenId:u},t)]),m=xy(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?sN(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:V,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 vy(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function ay(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 Sy(e={}){return{maxMarkets:ay(e,"maxMarkets",Nn),maxItemsPerMarket:ay(e,"maxItemsPerMarket",Nn)}}function ky(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Vo(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 Ey(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 Iy(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Sy(e),o=await lr(e,t),i=ky(o,e,n),a=t.scanCollection||Ga,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await be(i,s,async l=>{let u=vy(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,...Vo(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Vo(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:V,marketCount:i.length,...Ey(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 Ay(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Sy(e),o=await lr(e,t),i=o.snapshotCoverage?.complete===!0,a=ky(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Ru,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await be(a,l,async d=>{let p=vy(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",...Vo(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=Vo(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),...Vo(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:V,marketCount:a.length,...Ey(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 sy(e,t){return e>t?"ARB":"PASS"}async function cN(e={},t={}){let n=String(e.direction||""),r=Ke(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=q(e.paymentToken,"Anvil payment token"),i={chainId:V,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:ut(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||ny)({chainId:V,tokenIn:Ge,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Ge,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||ef)({...i,tokenIn:Ge,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Ge,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||ty)({chainId:V,tokenIn:o,tokenOut:Ge,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Ge,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||oo)({...i,tokenIn:o,tokenOut:Ge,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Ge,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 cy(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=q(e.quoteToken,"conversion quote token");if(n!==Ge)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=Ke(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=Ke(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function lN(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 sr(e){return Array.isArray(e)?`[${e.map(sr).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${sr(e[t])}`).join(",")}}`:JSON.stringify(e)}function _y(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:YT("sha256",n).update(sr(r)).digest("hex")}}function uN(e,t){return _y(e,t)}function Ou(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=uN(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!uy(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 dN(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:lN(e,t)}function Pu(e,t,n,r,o,i){let a=dN(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==V)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=_y(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!uy(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&&q(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=Ke(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Rt(a.gasLimit,`${r} evidence gasLimit`),g=Rt(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)!==V)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(q(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let y=q(w.sender,`${r} simulation sender`),b=q(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(Ke(w.valueWei,`${r} simulation valueWei`))!==String(Ke(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&&q(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 v=Number(w.quotedAtMs),E=Number(w.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(E)||v>n||E<=n||E<=v)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 ly(e){let t=q(e,"OpenSea payment token");if(t!==Nu&&t!==Ge)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Ru(e={},t={}){let n=await Ga(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=q(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,v)=>Pu(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(y,b,x,v),o),c=(w,x)=>{let y=null;try{y=q(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 v=Pu(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",b,o);if(v.amount!=null||w?.gasEstimate==null)return v;let E=Pu(e.gasPriceEvidence,x,r,"gas price",{...b,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let S=Ke(w.gasEstimate,"conversion gasEstimate");return{amount:S*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:S.toString(),gasPriceEvidence:E.evidence},error:null}},l=(w,x,y,b,v)=>{try{let E=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(E))throw new Error("exact Seaport order hash is required");let S=q(x?.protocolAddress,"Seaport protocol address"),I=String(x?.executionCalldataHash||"").toLowerCase(),P=/^0x[0-9a-f]{64}$/.test(I)?I:null,_=b==="seaport-fulfillment"&&v===Nu?String(x?.priceWei??""):"0",T={orderHash:E,protocolAddress:S,target:S,valueWei:_},L=s(w,b,P,y,T);if(L.amount==null)throw new Error(L.error);if(L.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let U=L.evidence?.approvalRequired;if(typeof U!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==U)throw new Error("Seaport approval requirement evidence mismatch");let H=[L];if(U){let j=String(x?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(j)?j:null,W=b==="seaport-offer-acceptance"?n.collection:v;H.push(s(w,"seaport-approval",B,y,{...T,target:W,valueWei:"0"}))}if(v===Nu){let j=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",B=String(x?.prerequisiteCalldataHash||"").toLowerCase(),W=/^0x[0-9a-f]{64}$/.test(B)?B:null,pe=j==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";H.push(s(w,j,W,y,{...T,target:Ge,valueWei:pe}))}let O=H.find(j=>j.amount==null);if(O)throw new Error(O.error);return{amount:H.reduce((j,B)=>j+B.amount,0n),evidence:H.map(j=>j.evidence),error:null}}catch(E){return{amount:null,evidence:null,error:String(E.message||E)}}},u=Ke(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Qi,p=t.openSeaBestOffer||Zi,m=t.paymentTokenConversion||(w=>cN({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await Wa({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=Cu(Ne.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(y.totalCostRaw)])).toLowerCase(),v=s("anvil-to-opensea","anvil-call",b,y.evidence.attestation,{target:n.market,valueWei:y.nativeSwapFeeWei}),E=null,S=null;if(x)try{E=ly(x.paymentToken)}catch(B){S=String(B.message||B)}let I=S||!x?{amount:null,evidence:null,error:S||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,y.evidence.attestation,"seaport-offer-acceptance",E),P={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:E,gasCostWei:v.amount==null?null:v.amount.toString(),gasEvidence:v.evidence,marketplaceGasCostWei:I.amount==null?null:I.amount.toString(),marketplaceGasEvidence:I.evidence,conversionGasCostWei:null};if(x?.sellerNetWei==null||!y.available)h.push({...P,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(S)h.push({...P,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${S}`});else if(v.amount==null)h.push({...P,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${v.error}`});else if(I.amount==null)h.push({...P,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${I.error}`});else if(typeof m!="function")h.push({...P,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let B=cy(await m({chainId:V,direction:"acquire-exact-output",amountRaw:y.totalCostRaw,paymentToken:y.paymentToken,quoteToken:Ge}),{direction:"acquire-exact-output",amountRaw:y.totalCostRaw}),W=c(B,"anvil-to-opensea");if(W.amount==null)h.push({...P,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=v.amount+I.amount+W.amount,ke=BigInt(x.sellerNetWei)-BigInt(B.amountInWei)-BigInt(y.nativeSwapFeeWei)-pe;h.push({...P,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:ke.toString(),decision:sy(ke,u),reason:ke>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(B){h.push({...P,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}let _=null;try{_=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!_)continue;let T=Cu(Ne.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),L=s("opensea-to-anvil","anvil-call",T,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),U=null,H=null;try{U=ly(_.paymentToken)}catch(B){H=String(B.message||B)}let O=H?{amount:null,evidence:null,error:H}:l("opensea-to-anvil",_,f.evidence.attestation,"seaport-fulfillment",U),j={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(_.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:U,gasCostWei:L.amount==null?null:L.amount.toString(),gasEvidence:L.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(H){h.push({...j,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${H}`});continue}if(L.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${L.error}`});continue}if(O.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${O.error}`});continue}if(typeof m!="function"){h.push({...j,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let B=cy(await m({chainId:V,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:Ge}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),W=c(B,"opensea-to-anvil");if(W.amount==null)h.push({...j,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=L.amount+O.amount+W.amount,ke=BigInt(B.amountOutWei)-BigInt(_.priceWei)-BigInt(f.nativeSwapFeeWei)-pe;h.push({...j,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilPayoutInWethWei:B.amountOutWei,conversion:B,netWei:ke.toString(),decision:sy(ke,u),reason:ke>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(B){h.push({...j,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}}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:V,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 Ka(e={},t={}){let n=ut(t),r=Lt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,tt.ammVault,oy,"quoteSpecificBuy",[BigInt(r)]),ee(n,tt.ammVault,oy,"inventory",[BigInt(r)]),ee(n,tt.nft,nt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:q(a[0],"broker owner")===tt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:V,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 Py(e,t){try{return q((await ee(t,tt.nft,nt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return q((await ee(t,tt.nft,nt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function Cy(e={},t={}){let n=ut(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await be(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Lt(a.brokerTokenId,"brokerTokenId"),c=Lt(a.nestedTokenId,"nestedTokenId"),l=q(a.tba,"TBA"),u=q(a.nestedCollection,"nested collection"),d=xy({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([Py(s,n),ee(n,u,nt,"ownerOf",[BigInt(c)]).then(g=>q(g[0],"nested owner")),Ka({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:V,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function Ty(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=Lt(e.brokerTokenId,"brokerTokenId"),o=Ke(e.maxTokenCostWei,"maxTokenCostWei"),i=Ke(e.maxEthFeeWei,"maxEthFeeWei"),a=await Ka({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 N({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:V,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:tt.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 Go(e={},t={}){let n=ut(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?tt.overtimeBooster:tt.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,Zt,"pendingEth"),ee(n,o,Zt,"minDropWei"),ee(n,o,Zt,"roundActive"),ee(n,o,Zt,"currentRound"),ee(n,o,Zt,"roundState").catch(()=>null),ee(n,o,Zt,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:V,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=>q(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function Ny(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?tt.overtimeBooster:tt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Zt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Zt.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return N({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:V,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:V,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function Oy(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Lt(s,"brokerTokenId")):[],r=ut(t),o=await be(n,8,async s=>{let[c,l]=await Promise.all([ee(r,tt.nft,nt,"ownerOf",[BigInt(s)]).then(u=>q(u[0],"broker owner")),Py(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Go({which:"stock"},t),Go({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:V,owner:e.owner?q(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function Ry(e={},t={}){try{let n=await lr(e,t);return{ok:!0,chainId:V,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Ly(e={},t={}){try{let n=await Go({which:"stock"},t);return{ok:!0,chainId:V,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180)}}}X();import{createHash as mN}from"node:crypto";var Ya="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",fN=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(fN.map(e=>[e.name,e.selector]))),hN=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),gN=new Set(["name","endpoint","version","skills","domains"]),yN=new Set(["agentId","agentRegistry"]),$y=new Set(["reputation","crypto-economic","tee-attestation"]),bN=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,wN=64*1024;function Ko(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 Lu(e,t,n){for(let r of Object.keys(e)){if(bN.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 ur(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 By(e,t,{service:n=!1}={}){let r=ur(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 $u(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 Ja(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function Bu(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 Mu(e){let t=Ja(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return $u(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Fy(){let e=[];try{let t=Ja(process.env.ORACLE_ERC8004_CHAIN_ID);Mu(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 xN(e){return JSON.parse(JSON.stringify(e))}function Xa(e){let t=Ko(e,"registration file");if(Lu(t,hN,"registration"),t.type!==Ya)throw new Error("erc8004: registration-v1 type required");let n={type:Ya,name:ur(t.name,"name",128),description:ur(t.description,"description",4096),image:By(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=Ko(a,`services[${s}]`);Lu(c,gN,`services[${s}]`);let l=ur(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:By(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=ur(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=Ko(a,`registrations[${s}]`);Lu(c,yN,`registrations[${s}]`);let l=Bu(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>$y.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!$y.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>wN)throw new Error("erc8004: registration metadata oversized");return xN(n)}function vN(e){if(Ko(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Ya)throw new Error("erc8004: registration-v1 type required");return Xa({type:Ya,...e})}function SN(e){let t=Xa(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Yo(e){return BigInt(e).toString(16).padStart(64,"0")}function Dy(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Yo(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function kN(e){return`${On.register}${Yo(32)}${Dy(e)}`}function EN(e,t){return`${On.setAgentURI}${Yo(e)}${Yo(64)}${Dy(t)}`}function IN(e,t){return`${e}${Yo(t)}`}function AN(e){return mN("sha256").update(e,"utf8").digest("hex")}function Fu(e,t){Ko(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 Uy(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ja(e.chainId),c=$u(e.owner,"owner"),l=Mu(s),u=Number(t?.nowMs??Date.now());return N({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:AN(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 qy(e={},t={}){Fu(e,new Set(["chainId","owner","registration"]));let n=SN(vN(e.registration));return Uy(e,t,{kind:"erc8004-register",uri:n,selector:On.register,data:kN(n)})}function Hy(e={},t={}){Fu(e,new Set(["chainId","owner","agentId","agentURI"]));let n=Bu(e.agentId),r=jy(e.agentURI);return Uy(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:On.setAgentURI,data:EN(n,r),id:n})}function jy(e){let t=ur(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 Xa(o),t}function My(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 $u(`0x${e.slice(-40)}`,t)}function _N(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 zy(e={},t={}){Fu(e,new Set(["chainId","agentId"]));let n=Ja(e.chainId),r=Bu(e.agentId),o=Mu(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:IN(d,r)},"latest"]),[a,s,c]=await Promise.all([i(On.ownerOf),i(On.tokenURI),i(On.getAgentWallet)]),l=jy(_N(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Xa(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:My(a,"owner"),tokenURI:l,agentURI:l,agentWallet:My(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}he();var Vy=999;async function Wy(e={}){let t={chainId:Vy,rpc:null,dex:null};try{t.rpc=await Wn(Vy,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Xr("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 Gy(e="HYPE",t={}){let r=(await Xr(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 Ky(e,t={}){return yn(e,t)}$();X();var TN="https://api-mainnet.magiceden.dev/v2",Jo=1e9;function Yy(e={}){return Ve({provider:"magiceden",defaultUrl:TN,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function pr(e={}){return Yy(e).baseUrl}function Rn(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function mr(e={}){let t=Rn(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Yy(e).trusted)}function Du(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 dr(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 NN(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 ON(e){return Math.round(dr(e,"priceSol")*Jo)}function RN(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 LN({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function $N(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=LN(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Jy(e={}){try{let t=await Uu({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!Rn(e),readTier:"keyless",prepareTier:Rn(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!Rn(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Uu(e={},t={}){let n=Du(e.symbol||e.collection),r=await k(`${pr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:mr(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/Jo:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Jo:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Jo:null,exec:!1,raw:r}}function Xy(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*Jo):null,tokenSize:e.tokenSize??1}}async function Qy(e={},t={}){let n=Du(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(`${pr(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:mr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Xy);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Zy(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await k(`${pr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:mr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Xy);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function eb(e={},t={}){if(!Rn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=de(e.seller,"seller"),o=de(e.tokenMint,"tokenMint"),i=de(e.tokenATA||e.tokenAddress,"tokenATA"),a=de(e.auctionHouse,"auctionHouse"),s=dr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:dr(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${pr(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:mr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Ct("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 N({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:ON(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Qa(e={},t={}){if(!Rn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=de(e.seller||e.userPublicKey,"seller"),r=de(e.tokenMint,"tokenMint"),o=de(e.tokenATA||e.tokenAddress,"tokenATA"),i=de(e.auctionHouse,"auctionHouse"),a=dr(e.priceSol??e.price,"priceSol"),s=RN(e.expiry),c=$N(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${pr(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",de(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await k(l.toString(),{headers:mr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Ct("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 N({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 tb(e={},t={}){if(!Rn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=Du(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=dr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:dr(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${pr(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:mr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=NN(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`);Ct("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 N({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();fl();$();st();var fr=8,qu=10n**BigInt(fr),MN="0xa4b1",nb=7,Hu=1,FN=2n**64n-1n;function DN(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 Qo(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function gr(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 Xo(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>fr)throw new Error(`hl-staking: ${t} has more than ${fr} decimals`);let i=BigInt(r)*qu+BigInt((o+"0".repeat(fr)).slice(0,fr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>FN)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function hr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function $t(e){let t=BigInt(String(e||"0")),n=t/qu,r=(t%qu).toString().padStart(fr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function rb(e={}){try{let t=await ju(e);return{ok:t.count>0,provider:"hl-staking",chain:Qo(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 ju(e={}){let t=await ce({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 zu(e={},t={}){let n=gr(e.user||e.address,"user"),r=await ce({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 Vu(e={},t={}){let n=gr(e.user||e.address,"user"),r=await ce({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 ob(e={},t={}){let n=gr(e.user||e.address,"user"),r=await ce({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function ib(e={},t={}){let n=gr(e.user||e.address,"user"),r=await ce({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Wu(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 Za(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||MN)}function UN(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Za(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Gu({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:Qo(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:DN(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:UN(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=ha(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,N(l,{provider:"hl-staking",kind:e})}function ab(e={},t={}){let n=Xo(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Xo(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${$t(n)} HYPE exceeds maxHype cap ${$t(r)} HYPE`);let o=Wu(e),i=Qo(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Za(t),wei:hr(n),nonce:o};return Gu({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:hr(n),nonce:o},opts:t,args:e,caps:{amountHype:$t(n),maxHype:r?$t(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 sb(e={},t={}){let n=Xo(e.amountHype??e.amount,"amountHype"),r=Wu(e),o=Qo(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Za(t),wei:hr(n),nonce:r};return Gu({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:hr(n),nonce:r},opts:t,args:e,caps:{amountHype:$t(n)},notes:[`Starts the ${nb} 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 cb(e={},t={}){let n=gr(e.validator,"validator"),r=Xo(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:Xo(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${$t(r)} HYPE exceeds maxHype cap ${$t(s)} HYPE`);let c=Wu(e),l=Qo(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Za(t),validator:n,wei:hr(r),isUndelegate:a,nonce:c};return Gu({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:hr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:$t(r),maxHype:s?$t(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Hu} 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 ${Hu} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function lb(e={},t={}){let n=gr(e.user||e.address,"user"),r=await zu({user:n},t),o=await Vu({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:nb,validatorLockupDays:Hu,exec:!1}}st();async function Ku(e={}){let t=Date.now();try{let n=await It(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 HN=24*365,jN=8;function Oe(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function zN(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function yr(e={},t={}){let[n,r]=await Promise.all([Qe(t),It(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=Oe(u.markPx),p=Oe(u.prevDayPx),m=Oe(u.openInterest),f=Oe(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Oe(u.oraclePx),midPx:Oe(u.midPx)??Oe(r?.[c.name]),prevDayPx:p,change24hPct:zN(d,p),dayNtlVolumeUsd:Oe(u.dayNtlVlm),premium:Oe(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(HN/jN)*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 ub(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await yr(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 db(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([yr({},t),sa({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Xn(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:Oe(h.o),high:Oe(h.h),low:Oe(h.l),close:Oe(h.c),volume:Oe(h.v)})),p=l?.levels??[],m=Oe(p?.[0]?.[0]?.px),f=Oe(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 pb(e={},t={}){let n=await ca(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 lO,readFileSync as uO,readdirSync as dO,renameSync as pO,writeFileSync as mO}from"node:fs";import{homedir as fO}from"node:os";import{join as os}from"node:path";var Zo=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});$();he();X();import{Interface as Yu,getAddress as wb,isAddress as WN}from"ethers";var mb=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),fb=Object.freeze({42161:{name:"arbitrum",api:mb[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:mb[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),hb="0x0000000000000000000000000000000000000000",GN=`0x${"0".repeat(64)}`,gb=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),yb=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),es=new Yu(["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"]),xb=new Yu(["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)"]),KN=new Yu(["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)"]),YN=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function wr(e){let t=Number(e??42161),n=fb[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(fb).join(", ")})`);return{chainId:t,...n}}function ts(e,t={}){let n=wr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function rt(e,t){if(!WN(e))throw new Error(`${t} must be a valid EVM address`);return wb(e)}function ne(e){return wb(e).toLowerCase()}function br(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 Ln(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 JN(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 XN(e){let t=String(e||"marketIncrease").trim();if(!(t in gb))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:gb[t]}}function QN(e){let t=String(e||"noSwap").trim();if(!(t in yb))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:yb[t]}}function ZN(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function eO(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function tO(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function nO({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=br(e?.minPrice,"gmx minPrice"),i=br(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 rO(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function oO(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function xt(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 iO(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:xt(t,"account",a=>ne(a)),market:xt(t,"market",a=>ne(a)),initialCollateralToken:xt(t,"initialCollateralToken",a=>ne(a)),key:xt(o,"key",a=>String(a).toLowerCase()),reason:xt(i,"reason",a=>String(a)),sizeDeltaUsd:xt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:xt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:xt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:xt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:xt(r,"isLong",a=>!!a)}}function aO(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=KN.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=YN[r];if(!o)return null;let i=iO(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||oO(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?ne(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 bb(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function sO(e=[],{chainId:t}={}){let n=wr(t);return(Array.isArray(e)?e:[]).map(r=>aO(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function vb(e={},t={}){return k(`${ts(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ju(e={},t={}){return k(`${ts(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Sb(e={},t={}){return k(`${ts(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function en(e={},t={}){return k(`${ts(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function kb(e={}){let t=await en({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Eb(e={},t={}){let n=wr(e.chainId??42161),r=rt(e.account||e.owner||e.user,"gmx account"),o=Ln(e.start??0,"gmx start"),i=Ln(e.end??e.limit??20,"gmx end"),a=xb.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||D)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),account:ne(r),raw:c}}async function Ib(e={},t={}){let n=wr(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=xb.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||D)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),key:r,raw:a}}async function Ab(e={},t={}){let n=wr(e.chainId??42161),r=t.receipt||await Jr({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=sO(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)=>bb(d.status)>=bb(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?ne(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:ne(n.eventEmitter),events:s,receipt:r}}async function ns(e={},t={}){let n=wr(e.chainId??42161),r=XN(e.orderType||e.type),o=QN(e.decreasePositionSwapType),i=rt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=rt(e.receiver||i,"gmx receiver"),s=rt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?rt(e.callbackContract,"gmx callbackContract"):hb,l=e.uiFeeReceiver?rt(e.uiFeeReceiver,"gmx uiFeeReceiver"):hb,u=rt(e.market||e.marketToken,"gmx market"),d=rt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?br(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Ln(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=br(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=br(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=JN(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[y,b]=await Promise.all([Ju({chainId:n.chainId},t),en({chainId:n.chainId},t)]),v=eO(ZN(y,"markets"),u);if(!v)throw new Error("gmx market not found in public registry");if(v.isListed===!1)throw new Error("gmx market is not listed");let E=rt(v.indexToken,"gmx market indexToken"),S=rt(v.longToken,"gmx market longToken"),I=rt(v.shortToken,"gmx market shortToken"),P=ne(d);if(![ne(S),ne(I)].includes(P))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let _=rO(v,x);if(_>0n&&m>_)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=tO(b,E);if(!T)throw new Error("gmx index ticker not found");let L=e.acceptablePrice?br(e.acceptablePrice,"gmx acceptablePrice").toString():nO({ticker:T,isLong:x,typeKey:r.key,maxSlippageBps:w}),U=(e.swapPath||[]).map(me=>rt(me,"gmx swapPath market"));if(U.length>3)throw new Error("gmx swapPath too long for guarded slice");let H=Ln(e.triggerPrice??"0","gmx triggerPrice"),O=Ln(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=Ln(e.minOutputAmount??"0","gmx minOutputAmount"),B=Ln(e.validFromTime??"0","gmx validFromTime"),W=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,ke=String(e.referralCode||GN);if(!/^0x[0-9a-fA-F]{64}$/.test(ke))throw new Error("gmx referralCode must be bytes32 hex");let kt=Array.isArray(e.dataList)?e.dataList:[];for(let me of kt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(me)))throw new Error("gmx dataList entries must be bytes32 hex");let Ft={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:U},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt(L),executionFee:f,callbackGasLimit:O,minOutputAmount:j,validFromTime:B},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:W,autoCancel:pe,referralCode:ke,dataList:kt},R=[];r.key==="marketIncrease"&&p>0n&&R.push(es.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(es.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(es.encodeFunctionData("createOrder",[Ft]));let F=es.encodeFunctionData("multicall",[R]),Z={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:ne(i),receiver:ne(a),exchangeRouter:ne(n.exchangeRouter),router:ne(n.router),orderVault:ne(n.orderVault),market:ne(u),indexToken:ne(E),initialCollateralToken:ne(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:L,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return N({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:ne(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:ne(d),spender:ne(n.router),amount:p.toString()}:null,gmxGuard:Z,transaction:{chainId:n.chainId,from:ne(i),to:ne(n.exchangeRouter),data:F,value:f.toString(),gmxGuard:Z}},{provider:"gmx",kind:"gmx-order"})}st();var tn="oracle.hl.entry-state.v1",hO=8,gO=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function xr(e){return e==null||e===0?0:e>0?1:-1}function ei(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function yO(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||os(fO(),".config","oracle")}function Cb(e={}){return os(yO(e),"hl-entry-states")}function rs(e,t,n){return n==null&&e.push(t),n}function bO(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 Bt(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function wO(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:le(a.time),rate:le(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return Bt("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)xr(o[a].rate)!==xr(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 xO(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return Bt("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=le(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}:Bt("defillama.stablecoins","no peggedUSD")}function _b(e,t){let n=le(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 vO(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 Bt("gmx.tickers","no matching symbol");let c=_b(s.minPrice,n),l=_b(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return Bt("gmx.tickers","unreadable price");let d=n!=null&&n>0?ei(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?Bt("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 SO({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?Bt("hl-info.fundingHistory","not fetched"):wO(r,{coin:e,asOfMs:n}),llamaStables:o==null?Bt("defillama.stablecoins","not fetched"):xO(o,n),gmxTicker:i==null?Bt("gmx.tickers","not fetched"):vO(i,{coin:e,hlMark:t,asOfMs:n})}}function Pb(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=le(s?.px),l=le(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 kO(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=le(i.szi),s=le(i.positionValue)!=null&&a?Math.abs(le(i.positionValue)/a):null,c=le(i.entryPx),l=le(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:le(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function EO({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=bO(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=rs(u,"markPx",le(m.markPx)),h=rs(u,"oraclePx",le(m.oraclePx)),g=le(m.midPx),w=le(m.premium),x=rs(u,"fundingRate",le(m.funding)),y=rs(u,"openInterestCoin",le(m.openInterest)),b=le(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],E=le(v[0]),S=le(v[1]),I=x==null?null:x*(gO/hO)*100,P=y==null||f==null?null:y*f,_=i==null||i===0||y==null?null:(y-i)/i*100;_==null&&u.push("oiDeltaPct");let T=r?.levels,L=Array.isArray(T)?T[0]:[],U=Array.isArray(T)?T[1]:[],H=le(L?.[0]?.px),O=le(U?.[0]?.px);H==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let j=Pb(U,Number(t)||0,"buy"),B=Pb(L,Number(t)||0,"sell");j.fillable||u.push("book.buyFillable"),B.fillable||u.push("book.sellFillable");let W=g??f,pe=j.avgFillPx==null||W==null?null:ei(j.avgFillPx,W),ke=B.avgFillPx==null||W==null?null:ei(W,B.avgFillPx),kt=kO(o,e);for(let Z of kt.unknown||[])u.push(Z);let Ft=le(m.prevDayPx),R=f==null||Ft==null||Ft===0?null:(f-Ft)/Ft*100;R==null&&u.push("change24hPct");let F=SO({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:ei(f,h),fundingRate:x,fundingAprPct:I,openInterestCoin:y,openInterestUsd:P,oiDeltaPct:_,dayNtlVolumeUsd:b,change24hPct:R,impactBidPx:E,impactAskPx:S,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:O,spreadBps:H==null||O==null?null:ei(O,H),notionalUsd:Number(t)||0,buy:j,sell:B,buySlipBps:pe,sellSlipBps:ke},position:kt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function Tb(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 IO(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 AO({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=IO(n),a=Tb(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:Zo.ALERT_ONLY},c=Cb({...o,configDir:r||o.configDir});lO(c,{recursive:!0,mode:448});let l=os(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return mO(u,`${JSON.stringify(s,null,2)}
|
|
148
|
-
`,{mode:384}),pO(u,l),s}function Xu(e={}){let t=Cb(e),n=[];try{n=dO(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(uO(os(t,r),"utf8")))}function _O(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Zo.ALERT_ONLY};let r=e.see,o=t;xr(r.fundingRate)!==xr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),xr(r.premium)!==xr(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:Zo.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function Nb(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await Qe(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 ti(e={},t={}){let n=e.coin,r=le(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([Qe(t),n?Xn(n,t).catch(()=>null):Promise.resolve(null),e.user?Qn(e.user,t).catch(()=>null):Promise.resolve(null),n?Gf({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Oa({},t).catch(()=>null),en({chainId:42161},t).catch(()=>null)]);return EO({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function Ob(e={},t={}){let n=e.see&&e.see.schema===tn?e.see:await ti(e,t);return{see:n,...Tb(n,e.side)}}async function Rb(e={},t={}){let n=e.see&&e.see.schema===tn?e.see:await ti(e,t);return AO({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Lb(e={},t={}){let n=e.locked||Xu(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Zo.ALERT_ONLY};let r=await ti({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return _O(n,r)}st();fa();Eo();async function $b(e={}){let t=await fo(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Bb(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ht(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=Fb(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=Qu(i)));let a=n==null?null:jt(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 fo(t))?.outcomes||[]).find(f=>{try{return Ht(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=Qu(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=Ht(r,i).coin}if(a=jt(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,Wt(c,t)}async function Mb(e={},t={}){let n=e.coin,r=e.outcome==null?null:Ht(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=Fb(e.outcomeSide):(o=e.side,o!=null&&(o=Qu(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Ht(r,o).coin}let i=jt(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,ko(a,t)}function Fb(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function Qu(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();Zn();var lq="0x"+"00".repeat(32);function TO(e){let t=typeof e=="bigint"?e:et(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 Db(e,t){let n=et(e.makerAmount,"poly: makerAmount"),r=et(e.takerAmount,"poly: takerAmount");return TO(t==="BUY"?n:r)}Zn();var NO=new Set(["https://clob.polymarket.com/order"]),ni=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),mq=Object.freeze(ni.map(e=>e[0])),OO=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),RO="0xe111180000d2663c0091e4f400237545b87b996b",LO="0xe2222d279d744050d28e00520010520000310f59",Ub=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function qb(e){let t=String(e||"").replace(/\/$/,"");if(!NO.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Hb(e){let t=Ze(e,"poly: exchange").toLowerCase();if(!OO.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function jb(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=Ub(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(Ze(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(qb(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(Hb(o.verifyingContract),Hb(n.exchange),Ze(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==Ze(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?LO:RO;if(Ze(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!==ni.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<ni.length;S+=1)if(s[S]?.name!==ni[S][0]||s[S]?.type!==ni[S][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(Ze(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(Ze(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=Ub(n.tokenId,"tokenId",80);if(Ze(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=et(a.makerAmount,"poly: makerAmount"),m=et(a.takerAmount,"poly: takerAmount"),f=et(n.makerAmount,"poly: prepared makerAmount"),h=et(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=Ee(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let y=Ee(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(Ee(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=Db(a,d);if(Ee(v,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let E=t.maxNotionalUsd??t.maxNotionalUsdc;if(E!=null){let S=Ee(E,6,"poly: maxNotionalUsd");if(g>S)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:g.toString(),notional:g.toString(),fee:"0",kind:r,tokenId:l,side:d,makerAmount:p.toString(),takerAmount:m.toString(),price:String(n.price),quantity:String(n.quantity),notionalUsdc:v,submitTo:qb(n.submitTo)})}function $O(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 zb(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:$O({...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 jb(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as xq,randomInt as BO}from"node:crypto";import{keccak256 as Sq,concat as kq,zeroPadValue as Eq,getCreate2Address as Iq,AbiCoder as Aq}from"ethers";var Yb=137;var MO="0xE111180000d2663C0091e4f400237545B87B996B",FO="0xe2222d279d744050d28e00520010520000310F59",Vb="0x0000000000000000000000000000000000000000000000000000000000000000",Zu=6;var DO={name:"Polymarket CTF Exchange",version:"2",chainId:Yb},UO={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"}]},Wb={"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 is(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function as(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function Gb(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Jb(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function qO(e,t,n,r){let o=Jb(Number(n),r.price);if(e==="BUY"){let c=as(Number(t),r.size),l=c*o;return is(l)>r.amount&&(l=Gb(l,r.amount+4),is(l)>r.amount&&(l=as(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=as(Number(t),r.size),s=a*o;return is(s)>r.amount&&(s=Gb(s,r.amount+4),is(s)>r.amount&&(s=as(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function Kb(e){let t=Number(e).toFixed(Zu),[n,r=""]=t.split(".");return(n+r.padEnd(Zu,"0").slice(0,Zu)).replace(/^0+/,"")||"0"}function HO(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=Vb,builder:p=Vb}=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=Wb[String(c)]||Wb["0.01"],g=Jb(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=qO(n,f,g,h),y=Kb(w),b=Kb(x),v=String(BO(1,2**31-1)),E=Date.now().toString(),S=n==="BUY"?0:1,I=s?FO:MO,P={salt:v,maker:i,signer:a,tokenId:String(t),makerAmount:y,takerAmount:b,side:S,signatureType:u,timestamp:E,metadata:d,builder:p},_={...DO,verifyingContract:I},T=n==="BUY"?w:x;return{domain:_,types:UO,value:P,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:T,exchange:I,negRisk:s}}function Xb(){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 Qb(e={},t={}){let n=HO(e),r={provider:"poly-clob",kind:"poly-order",chainId:Yb,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=zb(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as ZO,keccak256 as cw}from"ethers";X();ms();ls();var e2=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function t2(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Nt(e);for(let o of Object.keys(n))if(!e2.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 lw(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=nw(n,o),a=sw(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 ZO(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}:{...t2(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return N({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:cw(s),authorityReport:rw(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:cw(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:ds},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"})}ms();sd();Eo();$();var m2="https://api.geckoterminal.com/api/v2",gs=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||m2).replace(/\/$/,""),Sr=e=>encodeURIComponent(String(e));async function cd(e={},t={}){let n=Math.max(1,Number(e.page||1));return k(`${gs(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yw(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return k(`${gs(t)}/networks/${Sr(e.network)}/pools/${Sr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function bw(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return k(`${gs(t)}/networks/${Sr(e.network)}/tokens/${Sr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ww(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(`${gs(t)}/networks/${Sr(e.network)}/pools/${Sr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function xw(e={}){let t=await cd({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}$();he();import{Interface as Ew,getAddress as Iw,isAddress as h2}from"ethers";X();var g2="https://api.curve.finance/v1",Aw=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||g2).replace(/\/$/,""),y2=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),_w="0x0000000000000000000000000000000000000000",ld=new Ew(["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)"]),vw=new Ew(["function coins(uint256) view returns (address)"]);function Pw(e){let t=y2[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function ui(e,t){if(!h2(e))throw new Error(`${t} must be a valid EVM address`);return Iw(e)}function b2(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 Sw(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 Cw(e,t,n){return[e,t,n,...Array(8).fill(_w)]}function Tw(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Nw(e){return[e,...Array(4).fill(_w)]}async function w2({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){return(await Promise.all(Array.from({length:n},(a,s)=>{let c=vw.encodeFunctionData("coins",[s]);return r(e,"eth_call",[{to:t,data:c},o.blockTag||"latest"],o)}))).map(a=>Iw(vw.decodeFunctionResult("coins",a)[0]))}function kw(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 Ow(e={}){return k(`${Aw(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function ud(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(`${Aw(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Rw(e={}){let t=await ud({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function dd(e={},t={}){let n=Number(e.chainId??8453),r=Pw(n),o=ui(e.pool,"curve pool"),i=ui(e.tokenIn,"curve tokenIn"),a=ui(e.tokenOut,"curve tokenOut"),s=b2(e.amountIn,"curve amountIn"),c=Sw(e.nCoins??2,"curve nCoins",2,8),l=Sw(e.poolType,"curve poolType",1,4),u=t.rpcCall||D,d=await w2({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=kw(d,i,"tokenIn"),m=kw(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=Cw(i,o,a),h=Tw(p,m,l,c),g=Nw(o),w=ld.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),y=ld.decodeFunctionResult("get_dy",x),b=BigInt(y[0]);if(b<=0n)throw new Error("curve quote returned zero output");return re({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(v=>v.map(E=>E.toString())),pools:g},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Lw(e={},t={}){let n=Number(e.chainId??8453),r=Pw(n),o=ui(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=ui(e.receiver||e.recipient||o,"curve receiver"),a=await dd({...e,sender:o},t),s=Cw(a.tokenIn,a.pool,a.tokenOut),c=Tw(a.i,a.j,a.poolType,a.nCoins),l=Nw(a.pool),u=ld.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return N({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:fe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}$();he();X();import{Interface as v2,getAddress as S2,isAddress as k2,keccak256 as $w,toUtf8Bytes as Bw}from"ethers";var E2="https://api.morpho.org/graphql",ys=new v2(["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)"]),I2=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||E2;async function md(e,t,n={}){return k(I2(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var A2="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 } } } }",_2="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 di(e,t){let n=String(e||"").trim();if(!k2(n))throw new Error(`morpho: ${t} must be an address`);return S2(n).toLowerCase()}function P2(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 pd(e){return Array.isArray(e)?`[${e.map(pd).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${pd(e[t])}`).join(",")}}`:JSON.stringify(e)}async function pi(e,t,n,r,o={}){let i=ys.encodeFunctionData(n,r),s=await(o.rpcCall||D)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return ys.decodeFunctionResult(n,s)}function C2(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Mw(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return md(A2,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function fd(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return md(_2,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Fw(e={}){return{ok:(await md("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Dw(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=di(e.vault||e.vaultAddress,"vault"),i=di(e.owner||e.from||e.sender,"owner"),a=di(e.receiver||i,"receiver"),s=P2(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),[l,[u]]=await Promise.all([fd({chainId:n,first:100},t),pi(n,o,"asset",[],t)]),d=C2(l?.data?.vaults?.items,o);if(!d)throw new Error("morpho: vault not found in public Morpho vault registry");if(d.listed===!1)throw new Error("morpho: vault is not listed");let p=Number(d?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&p<c)throw new Error(`morpho: vault totalAssetsUsd ${p} below minimum ${c}`);let m=di(u,"vault asset");if((d?.asset?.address?di(d.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[[x],[y]]=await Promise.all([pi(n,o,"maxDeposit",[i],t),pi(n,o,"previewDeposit",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");if(BigInt(y.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:y.toString()},h=ys.encodeFunctionData("deposit",[s,a])}else{let[[x],[y]]=await Promise.all([pi(n,o,"maxWithdraw",[i],t),pi(n,o,"previewWithdraw",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");if(BigInt(y.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:y.toString()},h=ys.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:p,...g,calldataHash:$w(Bw(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=$w(Bw(pd(w))),N({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:d,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"})}$();he();import{Interface as N2,getAddress as hd,isAddress as O2}from"ethers";X();var R2="https://api-v3.balancer.fi/",L2=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||R2;async function Hw(e,t,n={}){return k(L2(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var $2="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Uw=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"}}),B2="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",M2="0x0000000000000000000000000000000000000000",gd=new N2(["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 jw(e){let t=Number(e??8453),n=Uw[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Uw).join(", ")})`);return{chainId:t,...n}}function zw(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===M2||t===B2.toLowerCase()}function bs(e,t){if(!O2(e))throw new Error(`${t} must be a valid EVM address`);return hd(e)}function qw(e,t,n){let r=String(e||"");return zw(r)||/^weth$/i.test(r)?hd(t.weth):/^usdc$/i.test(r)?hd(t.usdc):bs(r,n)}function F2(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 Vw(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 Ww(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 Hw($2,{first:n,chains:r,where:{chainIn:r}},t)}async function Gw(e={}){return{ok:(await Hw("query { __typename }",{},e))?.data?.__typename==="Query"}}async function yd(e={},t={}){let n=jw(e.chainId),r=bs(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=qw(o,n,"balancer tokenIn"),a=qw(e.tokenOut||"USDC",n,"balancer tokenOut"),s=F2(e.amountIn,"balancer amountIn"),c=bs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=gd.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Vw(e.userData)]),d=await(t.rpcCall||D)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=gd.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return re({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 Kw(e={},t={}){let n=jw(e.chainId),r=bs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=zw(o),a=await yd({...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=gd.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Vw(e.userData)]);return N({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:fe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}$();import{getAddress as U2}from"ethers";X();var q2="https://api-v2.pendle.finance/core",H2=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),j2="0x0000000000000000000000000000000000000000",z2="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Yw=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||q2).replace(/\/$/,"");function ws(e,t){try{return U2(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function kr(e,t){return ws(e,t).toLowerCase()}function V2(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===z2||t===j2}function bd(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 W2(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:ws(t.token,`pendle input ${n} token`),amount:bd(t.amount,`pendle input ${n} amount`)}))}function G2(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>ws(t,`pendle output ${n} token`))}function K2(e){let t=H2[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function Y2(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 bd(t,"pendle output amount")}function J2(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!V2(r.token)).map(r=>({token:kr(r.token,"pendle approval token"),spender:kr(t,"pendle approval spender"),amount:bd(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function wd(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(`${Yw(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jw(e={}){let t=await wd({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function xd(e={},t={}){let n=Number(e.chainId??42161),r=K2(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=ws(e.receiver||o,"pendle receiver"),a=W2(e.inputs),s=G2(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=De({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(`${Yw(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(kr(p.to,"pendle tx target")!==kr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&kr(p.from,"pendle tx sender")!==kr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=Y2(u),f=re(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return N({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:J2(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:fe(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Xw(e={},t={}){let n=await xd(e,t),{transaction:r,...o}=n;return o}$();import{isAddress as Q2}from"ethers";X();var Z2="https://api.odos.xyz",vd=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||Z2).replace(/\/$/,"");async function Sd(e={}){return k(`${vd(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function eR(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(!Q2(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Qw(e={},t={}){let n=eR(e),r=De({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(`${vd(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 Zw(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Qw(e,t);return{...re(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 ex(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Qw(e,t),i=await k(`${vd(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=re(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 N({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:fe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function tx(e={}){let t=await Sd(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}$();var nx=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,nR=/[<>&`*_~[\]()|\\]/g,rR=/[\u0000-\u001F\u007F]/g;function kd(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(nx,"").replace(rR,"").replace(nR,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Ed(e){if(e==null)return!1;let t=String(e);return nx.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var rx=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 xs(e,t={}){let n=Number(e),r=t.baseUrl||rx[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function ox(e){return!!rx[Number(e)]}async function Id(e={},t={}){return k(`${xs(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ix(e={},t={}){if(!e.address)throw new Error("address required");return k(`${xs(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ax(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return k(`${xs(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function sx(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${xs(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 cx(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=kd(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=kd(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:Ed(o.symbol)||Ed(o.name)||void 0})}return n}async function lx(e={}){let t=await Id({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as iR}from"ethers";$();he();st();var aR="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",dx=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 nn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function vs(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function ux(e){if(!e)return null;try{return iR(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Mn(e={},t=process.env){let n=e.addresses||{},r=ux(n.evm||e.evmAddress||vs(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||vs(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||vs(t,"ORACLE_BITCOIN_ADDRESS"),a=ux(n.hyperliquid||e.hyperliquidAddress||vs(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?de(o,"portfolio Solana address"):null,bitcoin:i?ct(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function mi(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 Er(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ss(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function rn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function px(e,t){let n=dx[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 sR(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:mi(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 Ad(e,t){return{family:e,status:"unsupported",reason:t}}function _d(e,t){if(!e||e.status!=="ok")return e;let n=px(t,e.symbol),r=Er(e.amount),o=r!=null&&n.priceUsd!=null?Ss(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function mx(e={}){let t=Mn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function ks(e={},t={}){let n=new Date().toISOString(),r=Mn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Jn.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(dx))],u=o?Se(()=>An(l,nn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=be(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 Z={...nn(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},me=await Se(()=>gn(R,r.evm,Z));if(!me.ok)return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"unavailable",latencyMs:me.ms,error:me.error};let Te=F.nativeCurrency?.decimals??18,je=F.nativeCurrency?.symbol||"NATIVE",K=me.data.balanceWei,we={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&ox(R)){let fn=await Se(()=>sx({chainId:R,address:r.evm},{...nn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));fn.ok?we={status:"ok",assets:cx(fn.data,{fungibleOnly:!0}).map(jr=>{let zr=mi(jr.amountRaw,jr.decimals);return{...jr,amount:zr,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:fn.ms}:we={status:"unavailable",assets:[],reason:fn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:fn.ms}}return{family:"evm",chainId:R,name:F.name,address:r.evm,status:"ok",latencyMs:me.ms,native:{status:"ok",symbol:je,amountRaw:K,decimals:Te,amount:mi(K,Te)},fungibleTokens:we,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:we.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=nn(t,"solana"),F=await Se(()=>va({address:r.solana},R)),Z=i||a?await Promise.all([Se(()=>Po({owner:r.solana,programId:Fl},R)).then(we=>({...we,program:"spl-token"})),Se(()=>Po({owner:r.solana,programId:aR},R)).then(we=>({...we,program:"token-2022"}))]):[],me=sR(Z),Te=me.filter(we=>we.classification==="collectible-candidate"),je=me.filter(we=>we.classification!=="collectible-candidate"),K=Z.filter(we=>!we.ok).map(we=>we.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Z.some(we=>we.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:mi(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?K.length===Z.length?"unavailable":K.length?"partial":"ok":"not-requested",assets:i?je:[],errors:K,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?K.length===Z.length?"unavailable":"partial":"not-requested",assets:a?Te:[],errors:K,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=nn(t,"bitcoin"),F=nn(t,"bitcoinMeta"),[Z,me,Te]=await Promise.all([Se(()=>ka({address:r.bitcoin},R)),i?Se(()=>Ia({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Se(()=>or({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),je=me.ok?me.data:null,K=Te.ok?Te.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:Z.ok||je?.ok||K?.ok?"ok":"unavailable",native:Z.ok?{status:"ok",symbol:"BTC",amountRaw:Z.data.balanceSats,decimals:8,amount:mi(Z.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:Z.error},fungibleTokens:{status:i?je?.ok?"ok":"unavailable":"not-requested",assets:je?.balances||[],error:je?.ok?null:je?.error||me.error,verification:"indexer-reported"},collectibles:{status:a?K?.ok?"ok":"unavailable":"not-requested",assets:K?.inscriptions||[],error:K?.ok?null:K?.error||Te.error,unknownNotEmpty:!!K?.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=nn(t,"hyperliquid"),[F,Z,me]=await Promise.all([Se(()=>aa(r.hyperliquid,R)),Se(()=>Qn(r.hyperliquid,R)),Se(()=>It(R))]),Te=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(K=>rn(K.total)||rn(K.hold)).map(K=>({coin:K.coin||null,total:String(K.total??"0"),hold:String(K.hold??"0"),priceUsd:null,usdValue:null})),je=(Z.ok&&Array.isArray(Z.data?.assetPositions)?Z.data.assetPositions:[]).map(K=>K.position||K).filter(K=>rn(K.szi)).map(K=>({coin:K.coin||null,size:String(K.szi??"0"),entryPrice:K.entryPx??null,positionValueUsd:K.positionValue??null,unrealizedPnlUsd:K.unrealizedPnl??null,liquidationPrice:K.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||Z.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Te,error:F.ok?null:F.error},perps:{status:Z.ok?"ok":"unavailable",accountValueUsd:Z.data?.marginSummary?.accountValue??null,withdrawableUsd:Z.data?.withdrawable??null,positions:je,error:Z.ok?null:Z.error},mids:me.ok?me.data:{},source:"hyperliquid-info"}})(),[h,g,w,x,y]=await Promise.all([d,p,m,f,u]),b=y.ok?y.data:null,v=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),E=[];for(let R of h){if(R.family!=="evm"||R.fungibleTokens?.status!=="ok")continue;let F=v[R.chainId];if(F)for(let Z of R.fungibleTokens.assets||[])Z.address&&E.push(`${F}:${String(Z.address).toLowerCase()}`)}let S=null;if(o&&E.length){let R=[...new Set(E)],F=await Se(()=>An(R,nn(t,"prices")));F.ok&&(S=F.data)}let I=h.map(R=>{let F=R.native?{...R,native:_d(R.native,b)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Z=v[F.chainId],me=F.fungibleTokens.assets.map(Te=>{let je=String(Te.symbol||"").toUpperCase(),K=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(je)&&(K=1),K==null&&Z&&Te.address&&S?.coins){let sm=`${Z}:${String(Te.address).toLowerCase()}`,jr=S.coins[sm],zr=Number(jr?.price);Number.isFinite(zr)&&zr>0&&(K=zr)}let we=Er(Te.amount),fn=we!=null&&K!=null?Ss(we*K):null;return{...Te,priceUsd:K,usdValue:fn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});g.native&&(g.native=_d(g.native,b)),w.native&&(w.native=_d(w.native,b));let P=0,_=0,T=0;for(let R of[...I,g,w]){R.native?.status==="ok"&&rn(R.native.amount)&&(R.native.usdValue!=null?(P+=R.native.usdValue,_+=1):T+=1);for(let F of R.fungibleTokens?.assets||[])!rn(F.amount)&&!rn(F.amountRaw)||(F.usdValue!=null?(P+=F.usdValue,_+=1):T+=1)}let L=px(b,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),Z=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?L.priceUsd||Er(x.mids?.HYPE):Er(x.mids?.[R.coin]),me=Er(R.total);R.priceUsd=Z,R.usdValue=me!=null&&Z!=null?Ss(me*Z):null,rn(R.total)&&(R.usdValue!=null?(P+=R.usdValue,_+=1):T+=1)}let U=Er(x.perps?.accountValueUsd);U!=null&&U!==0&&(P+=U,_+=1);let H=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>rn(R.amount)).length,O=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;T+=H+O;let j=[...I,g,w,x],B=R=>j.filter(F=>F.status===R).length,W=[],pe=I.filter(R=>R.fungibleTokens?.status==="unavailable"),ke=I.filter(R=>R.fungibleTokens?.status==="ok");pe.length&&!ke.length?W.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):pe.length&&W.push(`EVM token discovery partial: Blockscout covered ${ke.length} chain(s); ${pe.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&W.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&W.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),y.ok||W.push(`Price provider unavailable: ${y.error}`);let kt=[Ad("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Ad("sui","Sui balance adapter is not installed"),Ad("aptos","Aptos balance adapter is not installed")],Ft=j.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:j.length,ok:B("ok"),unavailable:B("unavailable"),notConfigured:B("not-configured"),unsupported:B("unsupported")+kt.length,evmChainsRequested:c.length,evmChainsOk:I.filter(R=>R.status==="ok").length},valuation:{knownUsd:Ss(P),label:"known priced value, not a complete portfolio total",pricedItems:_,unpricedNonzeroItems:T,complete:T===0&&!Ft&&B("unavailable")===0&&B("not-configured")===0&&kt.length===0,priceSource:o?"DefiLlama":null,priceStatus:y.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...I,g,w,x],unsupportedFamilies:kt,warnings:W}}import{constants as Is}from"node:fs";import{chmod as OR,mkdir as RR,open as LR,readFile as $R}from"node:fs/promises";import{createHash as BR,randomUUID as MR}from"node:crypto";import FR from"node:os";import Ar from"node:path";$();$();var lR=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"]),uR=new Set(["image/jpeg","image/png","image/webp"]);function dR(e){let t=String(e||"").toLowerCase();return lR.some(n=>t===n||t.endsWith(`.${n}`))}function pR(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 fx(e){let t=pR(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!dR(n.hostname)?null:n}async function mR(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=fx(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 Se(()=>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=fx(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(!uR.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 Pd(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function fR(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function hx(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 mR(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:v},E)=>{let S=E%u,I=Math.floor(E/u),P=S*d,_=m+I*p,T=b?`<image x="${P+14}" y="${_+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${P+14}" y="${_+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${P+170}" y="${_+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,L=Pd(fR(y,E).slice(0,34)),U=Pd(y.chain||"unknown chain");return`${T}<text x="${P+16}" y="${_+350}" fill="#f3f5f7" font-size="17" font-weight="600">${L}</text><text x="${P+16}" y="${_+376}" fill="#8d98a8" font-size="13">${U}${v?" \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 ${Pd(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 hR=[/\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],gR=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,yR=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function bR(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;gR.test(n)&&t.push("url-in-name");let i=hR.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),yR.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 gx(e={}){let t=bR(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}X();var wR=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"}]),xR=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 Fn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function fi(e,t){let n=await Se(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function vR(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 SR(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 kR(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 wx(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function ER(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 IR(e,t){let n=wx(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 AR(e){let t=new Map;for(let n of e){let r=wx(n);t.has(r)||t.set(r,n)}return[...t.values()]}function _R(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 xx(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Ir(e={},t={}){let n=new Date().toISOString(),r=Mn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=wR.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=Fn(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await be(l,4,async b=>({row:b,result:await fi(`opensea-${b.chain}`,()=>co({chain:b.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:b,result:v}of u)if(v.ok){let E=v.data.nfts.map(S=>({...S,family:b.family,chainId:b.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:v.data.complete?"ok":"partial",count:E.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else a.push({family:b.family,chain:b.chain,chainId:b.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let b of i.filter(v=>v.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 fi("opensea-solana",()=>co({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(b.ok){let v=b.data.nfts.map(E=>({...E,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...v),a.push({family:"solana",chain:"solana",status:b.data.complete?"ok":"partial",count:v.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 fi("satflow-wallet-contents",()=>_a({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Fn(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let v=vR(b.data.contents).map(S=>SR(S,r.bitcoin));s.push(...v);let E=v.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:E?"ok":"partial",count:v.length,complete:E,source:"satflow"})}else{let v=await fi("bitcoin-meta-inscriptions",()=>or({address:r.bitcoin},Fn(t,"bitcoinMeta")),t.timeoutMs??35e3),E=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];s.push(...E.map(S=>kR(S,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:E.length?"partial":"unavailable",count:E.length,complete:!1,source:E.length?"bitcoin-meta":"satflow",error:E.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 v=await fi(`opensea-pnl-${b}`,()=>Ji({address:b},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:b,source:"opensea-indexed-account-pnl",error:v.error})}let p=ER(e.costBasis),m=AR(s).map(b=>IR(b,p)).map(b=>gx(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,v)=>b+Number(v.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:xR,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:_R(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 yx(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 PR(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 vx(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 na(e,Fn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=yx(e.expiry??e.endTime,"Solana NFT listing expiry");return Qa({...e,expiry:r},Fn(t,"magiceden"))}if(n==="satflow"){let r=yx(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Pa({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:PR(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Fn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Cd(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 Td(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Es(e){return String(e??"").trim().toLowerCase()}function CR(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Es(t),i=Es(n);return!o||!i?!1:r.some(a=>Es(a.trait_type??a.traitType??a.type)===o&&Es(a.value??a.trait_value??a.traitValue)===i)}function TR(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function bx(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 Nd(e){return Math.round(Number(e)*1e6)/1e6}function on(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 Sx(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return on(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(S=>e[S]==null||e[S]==="");if(o.length)return on(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Cd(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Cd(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Cd(e.traitFloorEth,"traitFloorEth"),d=Td(e.collectionFloorEth),p=Td(e.maxListingAgeMs),m=Td(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return on(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return on(e,"invalid-min-trait-sales");if(u<=0)return on(e,"trait-floor-unavailable");let f=S=>CR(S,e.traitType,e.traitValue)&&TR(S,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(S=>{if(!m)return!0;let I=bx(S,["timestamp","soldAt","createdAt"]);return I!=null&&i-I<=m}),g=Nd(h.reduce((S,I)=>S+Number(I.priceEth??I.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return on(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(S=>{let I=Number(S.priceEth??S.price);if(!Number.isFinite(I)||I<=0||I>a)return!1;if(!p)return!0;let P=bx(S,["listedAt","createdAt","timestamp"]);return P!=null&&i-P<=p}).map(S=>{let I=Number(S.priceEth??S.price),P=Math.round((u-I)/u*1e4);return{...S,priceEth:I,discountBps:P}}).filter(S=>S.discountBps>=s).sort((S,I)=>S.priceEth-I.priceEth||I.discountBps-S.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 on(e,"invalid-min-trait-listings",y);if(x.length<b)return on(e,"trait-listing-depth-insufficient",y);let v=x[0],E=N({provider:"nft-portfolio",kind:"nft-trait-buy-intent",marketplace:n,chain:e.chain||null,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,tokenId:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Nd(v.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:v.tokenId==null?null:String(v.tokenId),listingId:v.listingId||null,orderHash:v.orderHash||null,priceEth:Nd(v.priceEth),discountBps:v.discountBps},evidence:y,prepareIntent:E}}async function kx(e={},t={}){let n=await Ir({...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 Ex(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Ir({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await hx({...e,items:n},Fn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Ix=10*1024*1024,Px=1e3;function an(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function _r(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Ax(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 Cx(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 DR(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function Tx(e={}){return`portfolio_${BR("sha256").update(DR(e)).digest("hex").slice(0,20)}`}function Nx(e={}){if(e.historyFile)return Ar.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Ar.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Ar.join(FR.homedir(),".hermes");return Ar.join(Ar.resolve(n),"state","oracle","portfolio-history.jsonl")}function UR(e){let t=an(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?_r(t):null}function qR(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=an(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?_r(t):null}function HR(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=an(c.usdValue);return l==null?s:s+l},0),i=an(n.perps?.accountValueUsd),a=_r(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>an(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=an(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:_r(r)})}return t}function jR(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 zR(e,t){let n=Nx(t),r=`${JSON.stringify(e)}
|
|
149
|
-
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await
|
|
150
|
-
`))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 WR(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Mn(e,t.env||process.env);return Object.values(n).some(Boolean)?Tx(n):null}async function Od(e={},t={}){let n=Cx(e.limit,100,1,Px,"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=Ax(e.since,"portfolio history since"),i=Ax(e.until,"portfolio history until"),a=WR(e,t),s=await VR(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=>an(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 _x(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function As(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function GR(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 KR(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 v=b/4,E=100+v*470,S=u-v*(u-l);return`<line x1="100" y1="${E}" x2="1140" y2="${E}" stroke="#26313c" stroke-width="1"/><text x="86" y="${E+5}" text-anchor="end" fill="#8795a5" font-size="15">${_x(S)}</text>`}).join(""),h=e.map((y,b)=>`<circle cx="${d(b)}" cy="${p(y.value)}" r="5" fill="#b8f0ff"><title>${As(y.recordedAt)}: ${_x(y.value)}</title></circle>`).join(""),g=As(e[0].recordedAt.slice(0,10)),w=As(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 ${As(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 Rx(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=Cx(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Od({...e,order:"asc",limit:e.limit??Px},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:an(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=GR(o,n),a=i[0].value,s=i.at(-1).value,c=_r(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=KR(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"}}}he();var JR=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"}}),XR=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),QR=`0x${"0".repeat(64)}`;function ZR(e){return!e||e==="0x"||e===QR}async function Dn(e={},t={}){let n=t.rpcCall||D,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(h){return{address:r,chainId:o,status:"unavailable",error:h?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[h,g]of Object.entries(JR))c.includes(h)&&s.push({selector:`0x${h}`,...g});let l=!1,u=null,d=null,p=await Promise.all(XR.map(async({label:h,slot:g})=>{try{let w=await n(o,"eth_getStorageAt",[r,g,"latest"],t);return{label:h,word:w,error:null}}catch{return{label:h,word:null,error:`proxy slot (${h}) unreadable; proxy status uncertain`}}}));for(let h of p)h.error&&a.push(h.error),!l&&h.word&&!ZR(h.word)&&(l=!0,u=h.label,d=`0x${String(h.word).slice(-40)}`);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 f=s.filter(h=>h.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:f,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function Lx(e={}){let t=Date.now();try{let n=await Dn({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var tL=/^0x[0-9a-fA-F]{40}$/,$x=4663;function _s(e,t){let n=String(e||"").trim();if(!tL.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Rd(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 hi(e,t){return e==null||e===""?null:Rd(e,t)}function nL({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=_s(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=Rd(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=hi(u.gasLimit??c.gasLimit,"gasLimit"),h=hi(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=Sc({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:w,secret:l.routeAttestationSecret}),y=fe(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},v=hi(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(b.maxPriorityFeePerGas=v),c.nonce!==void 0&&(b.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(b.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(b.l1FeeWei=hi(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(b.operatorFeeWei=hi(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 rL(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}Wc();let n=Lf(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function oL({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==Y.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!==Y.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 Bx(e={},t={}){let n=Number(e.chainId??$x);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=_s(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?_s(e.tokenIn,"tokenIn"):null,i=e.recipient?_s(e.recipient,"recipient"):null,a=e.amountIn==null?null:Rd(e.amountIn,"amountIn"),s=rL(n,t.scanner),c=t.scanContractRisk||Dn,[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=oL({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=nL({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 Mx(){Wc();let e=$f();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:$x,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"}}he();he();var aL=5,Ld=[50,75,90],Fx=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Un(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 sL(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 Ps(e={},t={}){let n=t.rpcCall||D,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Fx[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Fx).join(", ")}`};let i,a,s,c;try{i=Un(e.maxFeePerGasWei,"maxFeePerGasWei"),a=Un(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=Un(e.gasLimit,"gasLimit"),c=Un(e.maxTotalGasWei,"maxTotalGasWei")}catch(S){return{status:"error",viable:!1,error:S.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${aL.toString(16)}`,"pending",Ld],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(S){return{status:"unavailable",viable:!1,error:S?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Un(u?.baseFeePerGas,"baseFeePerGas")??Un(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(S=>{try{return Un(S?.[o.percentile],"reward")}catch{return null}}).filter(S=>S!=null&&S>0n),f=sL(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,v=c==null||y==null||y<=c,E=b&&v;return b||h.push(`tip cap ${g} is below the observed ${Ld[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||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:E,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:Ld[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:y==null?null:y.toString(),clamps:x,notes:h}}he();var lL="08c379a0",uL="4e487b71",dL=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 pL(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===lL)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===uL){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:dL[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 mL(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 fL(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 hL(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 gi(e={},t={}){let n=t.rpcCall||D,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=hL(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=mL(f);if(!fL(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=pL(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 Dx(e={}){let t=Date.now();try{let n=await gi({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 yL=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 bL(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 wL(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 Ux(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=wL(t);else if(o==="quantity")r+=bL(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function xL({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 Cs(e={},t={}){let n=t.rpcCall||D,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=yL.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 qx(e={}){let t=Date.now();try{let n=await Cs({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 $d(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 Cs({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 Dn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await gi({chainId:r,tx:{from:o,to:n,data:Ux(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 Ps({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=Ux(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=$c({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=xL({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 y$}from"node:crypto";import{createHash as SL}from"node:crypto";var kL=1,EL=8,Ce=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},IL=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),AL=new Set(["family","id"]),_L=new Set(["id","startsAt","endsAt","eligibility"]),PL=new Set(["kind","proofFormat","proofDigest"]),CL=new Set(["amount","unit"]),TL=new Set(["value","unit"]);function Pr(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 Cr(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 it(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new Ce(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function NL(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Ce(`${t} must be a positive safe integer`);return e}function Bd(e,t){if(e=Pr(e,t),Cr(e,CL,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Ce(`${t} requires amount and unit`,"ambiguous-unit");let n=it(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Ce(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:it(e.unit,`${t}.unit`)}}function Md(e,t){if(e=Pr(e,t),Cr(e,TL,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Ce(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function OL(e,t){e=Pr(e,t),Cr(e,PL,t);let n=it(e.kind,`${t}.kind`),r=it(e.proofFormat,`${t}.proofFormat`),o=it(e.proofDigest,`${t}.proofDigest`);if(!/^[a-z0-9][a-z0-9+._-]*:[0-9a-f]+$/.test(o))throw new Ce(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function RL(e,t){let n=`stages[${t}]`;e=Pr(e,n),Cr(e,_L,n);let r=Md(e.startsAt,`${n}.startsAt`),o=Md(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Ce(`${n} must end after it starts`,"invalid-stage-range");return{id:it(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:OL(e.eligibility,`${n}.eligibility`)}}function Fd(e){if(e=Pr(e,"input"),Cr(e,IL,"input"),e.version!==kL)throw new Ce("version must be 1");let t=Pr(e.chain,"chain");Cr(t,AL,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>EL)throw new Ce("stages must contain 1 through 8 entries","stage-count");let r=n.map(RL).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 Ce("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 Ce("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Ce("maxExecutions must equal 1","execution-limit");let i={version:1,chain:{family:it(t.family,"chain.family"),id:it(t.id,"chain.id")},marketplace:it(e.marketplace,"marketplace"),mechanism:it(e.mechanism,"mechanism"),collection:it(e.collection,"collection"),recipient:it(e.recipient,"recipient"),quantity:NL(e.quantity,"quantity"),stages:r,mintValueCap:Bd(e.mintValueCap,"mintValueCap"),networkFeeCap:Bd(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Bd(e.priorityFeeCap,"priorityFeeCap"),expiry:Md(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Ce("every stage must end no later than expiry","stage-after-expiry");return i}function LL(e){return JSON.stringify(Fd(e))}function Hx(e){return`sha256:${SL("sha256").update(LL(e),"utf8").digest("hex")}`}var Dd=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),qn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Ud=Object.freeze(Object.values(qn)),jx=new Set(Ud),zx=Object.freeze(Ud.slice(0,4)),$L=Ud,BL=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),$e=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function Ts(e,t){if(!Array.isArray(e)||e.length===0)throw new $e(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new $e(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new $e(`${t} contains duplicates`);return[...n].sort()}function ML(e){if(!Array.isArray(e))throw new $e("capabilities must be an array");let t=new Set(e);for(let n of t)if(!jx.has(n))throw new $e(`unknown capability ${n}`,"unknown-capability");return $L.every(n=>t.has(n))?Dd.AUTOMINT_READY:zx.every(n=>t.has(n))?Dd.PREPARE_READY:Dd.RESEARCH_ONLY}function qd(e=[]){if(!Array.isArray(e))throw new $e("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new $e("entry must be an object");for(let i of Object.keys(n))if(!BL.has(i))throw new $e(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new $e("entry id must be an exact string");if(t.has(n.id))throw new $e(`duplicate entry id ${n.id}`,"duplicate-entry");let r=Ts(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(Ts(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(Ts(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(Ts(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:ML(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=zx){let o=t.get(n);if(!o)throw new $e(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!jx.has(i))throw new $e(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new $e(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var dH=qd([]);X();import{getAddress as FL,Interface as Hd,keccak256 as DL}from"ethers";var sn=Object.freeze({manifold:new Hd(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Hd(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Hd(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),zd=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"})}),hH=Object.freeze(Object.fromEntries(Object.entries(zd).map(([e,t])=>[sn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function oe(e){throw new Error(`evm-mint-launchpads: ${e}`)}function Ye(e,t){try{return FL(String(e||""))}catch{return oe(`invalid ${t}`)}}function Be(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&oe(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return oe(`${t} must be an unsigned integer`)}}function jd(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&oe(`invalid ${t}`),e.map(String)}function UL(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&oe("invalid chainId");let o=Ye(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&Ye(u.contract,"reviewed contract")===o);a||oe("unsupported contract or wrong chain");let s=Ye(a.mintTarget||a.contract,"reviewed mint target"),c=sn[e].getFunction(zd[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))&&oe("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function qL(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);oe("runtime bytecode verification required")}function HL(e,t){let n=e.stage;if(!n)return null;let r=Be(n.startTime,"stage startTime"),o=Be(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&oe("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function jL(e,t){let n=zd[e];String(t).slice(0,10).toLowerCase()!==sn[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=sn[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=sn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=sn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=sn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&oe("calldata must be canonical with no suffix"),r}async function Vx(e,t={},n={}){sn[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=UL(e,t,n),s=Ye(t.recipient||t.minter,"recipient"),c=Be(t.quantity,"quantity",{positive:!0}),l=Be(t.priceWei,"priceWei"),u=Be(t.maxValueWei,"maxValueWei"),d=Be(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&oe("transaction chain mismatch"),Ye(p.to,"transaction target")!==i&&oe("transaction target mismatch");let m=await qL(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||DL(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let f=jL(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=HL(t,h),w,x,y,b=null,v=[];if(e==="manifold")Ye(f[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||Be(f[1],"instanceId")!==Be(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||Be(f[2],"mintIndex")!==Be(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),v=jd([...f[3]]),w=Ye(f[4],"calldata recipient"),x=1n,y=l;else if(e==="zora")w=Ye(f[0],"calldata recipient"),x=BigInt(f[1]),y=l,t.comment!=null&&f[2]!==String(t.comment)&&oe("comment mismatch"),t.mintReferral!=null&&Ye(f[3],"mint referral")!==Ye(t.mintReferral,"expected mint referral")&&oe("mint referral mismatch");else{w=Ye(f[0],"calldata recipient"),x=BigInt(f[1]),y=BigInt(f[3]);let _=f[4];v=jd([..._.proof]),b=BigInt(_.quantityLimitPerWallet),b<c&&oe("wallet allowance below quantity"),(BigInt(_.pricePerToken)!==l||Ye(_.currency,"allowlist currency")!==Ye(f[2],"currency"))&&oe("allowlist terms mismatch")}w!==s&&oe("recipient mismatch"),x!==c&&oe("quantity mismatch"),y!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(v.map(_=>_.toLowerCase()))!==JSON.stringify(jd(t.proof).map(_=>_.toLowerCase()))&&oe("proof mismatch");let E=Be(p.value??0,"transaction value"),S=l*c;(E<S||E-S>d||E>u)&&oe("transaction value or fee cap exceeded");let I=p.gasLimit==null?null:Be(p.gasLimit,"gasLimit"),P=p.maxFeePerGas==null?null:Be(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(I==null||I>Be(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>Be(t.maxFeePerGasWei,"maxFeePerGasWei"))&&oe("gas fee cap exceeded"),N({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:E.toString(),platformFeeWei:(E-S).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...b==null?{}:{walletAllowance:b.toString()},proof:v,transaction:{chainId:r,to:i,data:p.data,value:E.toString(),...I==null?{}:{gasLimit:I.toString()},...P==null?{}:{maxFeePerGas:P.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var zL="RESEARCH_ONLY";var VL="canonical serialized-message decoding and program-specific instruction validation are not implemented",Ns=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),yH=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function WL(){throw new Error(`solana-mint: ${zL}; disabled until ${VL}`)}function Wx(){WL()}X();import{Address as GL,CompactSize as KL,NETWORK as YL,OutScript as rv,Script as JL,TEST_NETWORK as Gx,Transaction as XL,utils as QL}from"@scure/btc-signer";import{createHash as yi}from"node:crypto";var Kx="universal-ordinals-mint",Yx="bitcoin-ordinals-mint-plan",ZL=1800*1e3,e$=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Jx=new Set,t$=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function pt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function cn(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 Vd(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 ov(e,t){let n=pt(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 n$(e){return e==="bitcoin"||e==="mainnet"?YL:e==="regtest"?{...Gx,bech32:"bcrt"}:Gx}function Xx(e,t){try{let n=rv.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 r$(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function o$(e){let t=yi("sha256").update(e.unsignedTx).digest();return yi("sha256").update(t).digest().reverse().toString("hex")}function Qx(e,...t){let n=yi("sha256").update(e,"ascii").digest();return yi("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function i$(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=Qx("TapLeaf",Buffer.from([a]),Buffer.from(KL.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Qx("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=QL.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 Zx(e,t){let n=pt(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=XL.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(r$(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=Xx(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)=>i$(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 Xx(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:o$(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 a$(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 s$(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 c$=new Set([1,3]);function l$(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=s$(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!c$.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 u$(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(l$(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(yi("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||a$(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 ev(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 d$(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 iv(e,t="parentId"){let n=pt(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 av(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=pt(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=cn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function p$(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:pt(a.role,`revealOutputs[${s}].role`),address:pt(a.address,`revealOutputs[${s}].address`),valueSats:cn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:ov(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:iv(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 m$(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:pt(n?.role,`commitOutputs[${r}].role`),valueSats:cn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:ov(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 tv(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 nv(e,t,n){try{return Buffer.from(rv.encode(GL(n$(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 f$(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)=>av({...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 h$(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");d$(e);for(let T of["content","contentBytes","body","file","path","url","contentUrl"])if(e[T]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let T of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[T]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=pt(e.network,"network").toLowerCase();if(!e$.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=pt(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=pt(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=iv(e.parentId??e.parentInscriptionId),a=pt(e.recipient??e.destination,"recipient"),s=cn(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(av);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");f$(e,c);let l=Zx(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Zx(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=m$(e.commitOutputs),p=p$(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((T,L)=>T.txid!==c[L].txid||T.vout!==c[L].vout||T.valueSats!==c[L].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");tv(l.outputs,d,"commit PSBT"),tv(u.outputs,p,"reveal PSBT");let m=nv(a,n,"recipient");if(p.find(T=>T.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[T,L]of p.entries())if(L.scriptHex!==nv(L.address,n,`revealOutputs[${T}].address`))throw new Error(`ordinals mint: reveal output ${T} script does not pay its bound address`);let f=d.findIndex(T=>T.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(T=>T.txid===l.txid&&T.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");u$(u,{contentHash:r,contentType:o,parentId:i});let g=Vd(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Vd(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Vd(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let y=cn(e.commitFeeSats,"commitFeeSats"),b=cn(e.revealFeeSats,"revealFeeSats"),v=cn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(y+b>v)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(T=>T.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let I=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:cn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(I.enabled){if(!Number.isSafeInteger(I.outputIndex)||I.outputIndex<0||p[I.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[I.outputIndex].valueSats!==I.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(T=>T.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let P=Number(t.nowMs??Date.now()),_=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(_)||_<=P||_-P>ZL)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(ev),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(ev),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:y.toString(),revealFee:b.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:I,expiresAt:_}}function g$(e={},t={}){let n=h$(e,t),r=n.commitInputs.find(s=>Jx.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:Kx,kind:Yx,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...t$},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=N(i,{provider:Kx,kind:Yx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Jx.add(s.outpoint);return a}var sv=g$;var b$=Object.freeze([qn.DISCOVERY,qn.ELIGIBILITY,qn.PREPARATION,qn.SIMULATION]),cv=[["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",Ns.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",Ns.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",Ns.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],lv=Object.freeze(cv.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([qn.DISCOVERY]):b$,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),NH=qd(lv.map(({family:e,tier:t,enabled:n,...r})=>r)),uv=new Map(cv.map(e=>[e[0],e])),w$=new Set(["intent","adapterId","input"]),x$=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,Os=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ue(e,t,n){throw new Os(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function _e(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function dv(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))x$.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),dv(r,`${t}.${n}`)}function v$(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function S$(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ue("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ue("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${y$("sha256").update(JSON.stringify(v$(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))&&ue("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)&&ue("expired-intent","canonical mint stage is not active at authoritative now"),o}function k$(e,t){let n=uv.get(t);n||ue("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))&&ue("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function E$(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,_e(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,_e(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,_e(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,_e(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,_e(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,_e(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,_e(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,_e(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,_e(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function I$(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==bn(e))&&ue("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ue("custody-refused","leaf artifact is not strictly prepare-only")}function A$(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=_e(e,"mintValueCap","wei"),o=_e(e,"networkFeeCap","wei"),i=_e(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||ue("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)&&ue("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)&&ue("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&&ue("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function _$(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,_e(e,"mintValueCap","lamports"),"mint-value cap");let r=_e(e,"networkFeeCap","lamports"),o=_e(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)&&ue("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function P$(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,_e(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,_e(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,_e(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 Wd(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:lv})}async function pv(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Wd()}}async function mv(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ue("invalid-request","request must be a plain object");for(let u of Object.keys(e))w$.has(u)||ue("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ue("invalid-request","explicit adapterId is required; adapter inference is refused"),uv.has(e.adapterId)||ue("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ue("invalid-request","family-specific decoded input is required"),dv(n);let r;try{r=Fd(e.intent)}catch(u){ue("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ue("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ue("expired-intent","canonical mint intent has expired");let i=k$(r,e.adapterId);i[1]==="solana"&&ue("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=S$(r,n,r.chain.family,o);E$(r,n);let s;try{i[4]==="evm"?s=await Vx(i[5],n,t):i[4]==="opensea"?s=await ta(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await Wx(n,t)):s=await sv(n,t)}catch(u){if(u instanceof Os)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}I$(s);let c=i[4]==="bitcoin"?P$(r,n,s):i[4]==="solana"?_$(r,n,s):A$(r,n,s),l=Object.freeze({intentHash:Hx(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 N({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 Gd="ROUTE_ONLY",Kd=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),hv=new Set(Object.values(Kd)),T$=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),N$=new Set(["amount","currency"]),O$=new Set(["value","unit"]),R$=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),L$=new Set(["provider","operations"]),se=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function Or(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new se(`${t} must be a plain object`);return e}function bi(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new se(`${n} has unknown field ${r}`,"unknown-field")}function ge(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new se(`${t} must be an exact non-empty string`);return e}function gv(e,t,{positive:n=!1}={}){if(e=ge(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new se(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function Tr(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new se(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>ge(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new se(`${t} contains duplicates`);return r}function yv(e,t){return e=Or(e,t),bi(e,N$,t),{amount:gv(e.amount,`${t}.amount`),currency:ge(e.currency,`${t}.currency`)}}function fv(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>yv(n,`${t}[${r}]`))}function $$(e){if(e=Or(e,"expiry"),bi(e,O$,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new se("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function B$(e,t,n){Object.hasOwn(e,n)&&(t[n]=ge(e[n],n))}function bv(e){e=Or(e,"intent"),bi(e,T$,"intent");let t=ge(e.action,"action");if(!hv.has(t))throw new se(`unsupported action ${t}`,"invalid-action");let n={action:t,family:ge(e.family,"family"),network:ge(e.network,"network"),standard:ge(e.standard,"standard"),collection:ge(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])B$(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 se("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new se("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new se("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=ge(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new se("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=ge(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=ge(e.sender,"sender"))}else n.owner=ge(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=ge(e.recipient,"recipient")),n.quantity=gv(e.quantity,"quantity",{positive:!0}),n.marketplace=ge(e.marketplace,"marketplace"),n.protocol=ge(e.protocol,"protocol"),n.artifactKind=ge(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new se(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=yv(e.price,"price"),n.expiry=$$(e.expiry),n.fees=fv(e.fees,"fees"),n.royalties=fv(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ge(e.listingId,"listingId")),n}function M$(e){e=Or(e,"adapter"),bi(e,R$,"adapter");let t=Tr(e.actions,"adapter.actions");for(let o of t)if(!hv.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=Or(e.surface,"adapter.surface");bi(n,L$,"adapter.surface");let r=Or(n.operations,"adapter.surface.operations");for(let o of t)ge(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new se(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:ge(e.id,"adapter.id"),family:ge(e.family,"adapter.family"),networks:Object.freeze(Tr(e.networks,"adapter.networks")),standards:Object.freeze(Tr(e.standards,"adapter.standards")),marketplaces:Object.freeze(Tr(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(Tr(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(Tr(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Gd,custody:"user",surface:Object.freeze({provider:ge(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function F$(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(M$);if(new Set(t.map(r=>r.id)).size!==t.length)throw new se("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:Gd,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=bv(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new se("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new se(`adapter lacks ${o.action}`,"unsupported-operation"):new se("no exact adapter route","unsupported-operation")}})}var Nr=(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}}),Yd=F$([Nr("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"}),Nr("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"}),Nr("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"}),Nr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Nr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Nr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function wv(e,{access:t="public",feeProfile:n="default",registry:r=Yd,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new se("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new se("nowMs must be a non-negative safe integer","invalid-expiry");let i=bv(e);if(i.expiry&&o>=i.expiry.value)throw new se("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Gd,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:ge(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 Ls="universal-evm-nft-transfer",xv="evm-nft-safe-transfer",U$=1800*1e3,q$=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),H$=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function vv(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(H$.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);vv(r,t)}}}function Jd(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 Hn(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 wi=e=>e.toString(16).padStart(64,"0"),Rs=e=>e.slice(2).padStart(64,"0");function j$(e,t,n,r,o){return e==="erc721"?`0x42842e0e${Rs(t)}${Rs(n)}${wi(r)}`:`0xf242432a${Rs(t)}${Rs(n)}${wi(r)}${wi(o)}${wi(160n)}${wi(0n)}`}function z$(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(vv(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=Hn(e.chainId,"chainId",{positive:!0,safe:!0}),o=Jd(e.sender??e.from,"sender"),i=Jd(e.recipient??e.to,"recipient"),a=Jd(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Hn(e.tokenId,"tokenId"),c=Hn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Hn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Hn(e.gasLimit,"gasLimit",{positive:!0}),u=Hn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Hn(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)>U$)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=j$(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 Sv(e={},t={}){let n=z$(e,t),r={provider:Ls,kind:xv,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...q$},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 N(r,{provider:Ls,kind:xv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}X();var $s="universal-solana-nft-transfer",kv="solana-verified-nft-transfer",Iv="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",jn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Ev=new Set(Object.values(jn)),W$=new Set([jn.token,jn.token2022]),G$=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),K$=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function te(e){throw new Error(`solana nft transfer: ${e}`)}function mt(e,t){let n=String(e??"").trim();return n||te(`${t} required`),n}function St(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||te(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&te(`${t} must be positive`),r}function xe(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function Av(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))K$.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),Av(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&te(`${r} refused; adapter is prepare-only`)}}function Y$(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&te(`${t} must be decoded`),Array.isArray(e.accounts)||te(`${t} decoded accounts required`),e.decoded}function J$(e,t,n){for(let r of e.accounts){let o=mt(r.pubkey,"account pubkey");t.has(o)||te(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&te(`unexpected writable account ${o}`)}}function X$(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),Av(e),(e.network!=="mainnet-beta"||e.genesisHash!==Iv)&&te("mainnet genesis/network mismatch"),e.reviewed!==!0&&te("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=mt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&te("standard must be metaplex or core");let n=mt(e.mint??e.asset,"mint/asset"),r=mt(e.collection,"collection");e.collectionVerified!==!0&&te("verified collection required");let o=mt(e.owner,"owner"),i=mt(e.recipient,"recipient"),a=St(e.quantity,"quantity",{positive:!0}),s=St(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&te("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&te("Core quantity must be exactly 1");let c=mt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==jn.core:!W$.has(c))&&te("reviewed transfer program mismatch");let l=t==="metaplex"?mt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?mt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&xe(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(St(e.decimals??0,"decimals")):null,p=St(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=St(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=St(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&te("priority fee exceeds reviewed cap");let g=St(e.networkFeeLamports,"networkFeeLamports"),w=St(e.networkFeeCapLamports,"networkFeeCapLamports");g>w&&te("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&te("transaction object required"),x.version!==0&&x.version!=="legacy"&&te("transaction version must be 0 or legacy");let y=mt(x.recentBlockhash,"recentBlockhash");xe(y,e.approvedBlockhash,"blockhash mutation after approval");let b=St(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=St(e.currentBlockHeight,"currentBlockHeight");v>b&&te("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&te("canonical instructions required");let E=new Set([o,n,l,u].filter(Boolean)),S=new Set([o,i,n,r,l,u,...Ev].filter(Boolean)),I=0,P=0,_=0,T=0;for(let[L,U]of x.instructions.entries()){let H=mt(U.programId,`instructions[${L}].programId`);Ev.has(H)||te(`unknown program ${H}`);let O=Y$(U,`instructions[${L}]`);J$(U,S,E);let j=String(O.type??O.instruction??"").toLowerCase();H===jn.computeBudget?j.includes("limit")?(xe(O.units??O.computeUnitLimit,p,"compute-unit limit"),I++):j.includes("price")?(xe(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),P++):te("unsupported compute budget instruction"):H===jn.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),xe(O.payer,o,"ATA payer"),xe(O.owner,i,"ATA recipient"),xe(O.mint,n,"ATA mint"),xe(O.tokenAccount,u,"recipient ATA"),xe(O.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&H===c?(j!=="transferchecked"&&te("only canonical transferChecked is allowed"),xe(O.mint,n,"mint"),xe(O.owner,o,"owner"),xe(O.recipient,i,"recipient"),xe(O.sourceTokenAccount,l,"source token account"),xe(O.destinationTokenAccount,u,"recipient ATA"),xe(O.amount,a,"quantity"),xe(O.decimals,d,"decimals"),_++):t==="core"&&H===jn.core?(j!=="transfer"&&te("only canonical Core transfer is allowed"),xe(O.asset,n,"mint/asset"),xe(O.collection,r,"collection"),O.collectionVerified!==!0&&te("verified collection required in Core instruction"),xe(O.owner,o,"owner"),xe(O.newOwner,i,"recipient"),xe(O.amount??1,1,"quantity"),_++):te(`program ${H} is not valid for ${t} transfer`)}return(I!==1||P!==1)&&te("exactly one compute-unit limit and price instruction required"),_!==1&&te("exactly one canonical transfer instruction required"),t==="metaplex"&&T>1&&te("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:v.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:w.toString(),transaction:x}}function _v(e={},t={}){let n=X$(e),r=Number(t.nowMs??Date.now()),o={provider:$s,kind:kv,chain:"solana-mainnet-beta",genesisHash:Iv,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...G$},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 N(o,{provider:$s,kind:kv,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}X();var Bs="universal-ordinals-transfer",Pv="bitcoin-ordinals-transfer-plan",Cv=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),Z$=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function un(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function ln(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ie(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ie(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ie(`${t} out of range`),o}function Tv(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function Lv(e,t){let n=un(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function $v(e,t="inscriptionId"){let n=un(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function Bv(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&&ie(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Bv(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ie(`${r} bypass refused; adapter is prepare-only`)}function Mv(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ie(`${t}.${n} arbitrary script refused; use a bound address`)}function Nv(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Mv(e,t);let n=Lv(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ie(`${t}.vout invalid`),{txid:n,vout:r,valueSats:ln(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:un(e.address,`${t}.address`),sequence:Number(ln(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function Ov(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Mv(e,t),{role:un(e.role,`${t}.role`),address:un(e.address,`${t}.address`),valueSats:ln(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:$v(e.inscriptionId,`${t}.inscriptionId`)}}}function Rv(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function eB(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),Bv(e);let t=un(e.network,"network").toLowerCase(),n=Lv(e.genesisHash,"genesisHash");(!Cv[t]||n!==Cv[t])&&ie("network/genesis mismatch");let r=$v(e.inscriptionId),o=Nv(e.ownerInput,"ownerInput");un(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=un(e.destination,"destination"),a=ln(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:Ov(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=Tv(e.feeRateSatVb,"feeRateSatVb"),l=Tv(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=ln(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=ln(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(ln(e.locktime,"locktime",{max:0xffffffffn})),m=Number(ln(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&ie("RBF sequence refused"),o.sequence!==m&&ie("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&ie("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&ie("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&ie("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&ie("exactly one PSBT input required; extra inputs refused"),Rv(Nv(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((y,b)=>Ov(y,`psbt.outputs[${b}]`)):ie("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};Rv(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(y=>y.role==="inscription"&&y.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let x=h.reduce((y,b)=>y+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==x+u&&ie("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 Fv(e={},t={}){let n=eB(e);return N({provider:Bs,kind:Pv,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...Z$},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:Bs,kind:Pv,env:t.env})}he();function nB(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 Dv(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(!nu(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=nB(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 Uv(e={},t={}){let n=t.rpcCall||D,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 oB=1440*60*1e3;function iB(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>oB&&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 qv="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",aB=4663,sB="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Hv="a22cb465",cB="a0712d68";function Xd(e){return String(e||"").trim().toLowerCase()}function Rr(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function lB(e){let t=Rr(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Hv}${t.padStart(64,"0")}${"0".repeat(64)}`}function uB(e){return Rr(e).includes(Rr(qv))}function dB(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Rr(n?.data).startsWith(Hv))}function pB(e={},t){let n=Rr(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return Xd(i[0])!==sB?!1:Rr(i[2])===n})}function mB(e=1){return`0x${cB}${BigInt(e).toString(16).padStart(64,"0")}`}function jv(e={},t={}){let n=Xd(e.contract),r=Xd(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!==aB&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),uB(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"),dB(s)&&a.push("simulation sets approval / setApprovalForAll"),pB(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:mB(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:lB(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!rg(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=iB(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:qv.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"]}}$();X();ba();var hB="https://api.paraswap.io",Qd=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||hB).replace(/\/$/,"");function Lr(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 Zd(e={},t={}){let n=Number(e.chainId||1);return k(`${Qd(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $r(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Lr(e.srcToken,"srcToken"),destToken:Lr(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 ya({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(hh(o)))r.set(s,c);let i=await k(`${Qd(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...re(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 zv(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=Lr(e.userAddress,"userAddress"),o=await $r(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Lr(e.srcToken,"srcToken"),destToken:Lr(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=Lr(e.receiver,"receiver"));let c=await k(`${Qd(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 N({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:fe(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Vv(e={}){let t=await Zd({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 yB}from"node:crypto";import{getAddress as Xv,isAddress as ep}from"ethers";var Wv="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",bB=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),wB=Object.freeze(["lifi"]),Gv=/^0x[0-9a-fA-F]{64}$/,xB=/^\d+$/;function ye(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Kv(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ye(t,"must be a positive chainId"),n}function Ms(e,t){let n=String(e??"").trim();return(!xB.test(n)||BigInt(n)<=0n)&&ye(t,"must be a positive integer string"),n}function vB(e,t){return e==null||e===""?null:Ms(e,t)}function Yv(e,t){let n=String(e??"").trim();return n.toLowerCase()===Wv.toLowerCase()?Wv:(ep(n)||ye(t,"must be an EVM address or native token sentinel"),Xv(n))}function Qv(e,t){let n=String(e??"").trim();return ep(n)||ye(t,"must be an EVM address"),Xv(n)}function SB(e,t){return e==null||e===""?null:Qv(e,t)}function Jv(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ye(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function kB(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ye(r,"must be a finite millisecond timestamp"),o<=t&&ye(r,"expired"),o>t+n&&ye(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Br(e){if(Array.isArray(e))return e.map(Br);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Br(e[n]));return t}return e}function EB(e){return JSON.stringify(Br(e))}function Fs(e){return`0x${yB("sha256").update(EB(e)).digest("hex")}`}function Zv(e,t){let n={...e};for(let r of t)delete n[r];return n}function IB(e){return Fs(Zv(e,["intentHash"]))}function AB(e){return Fs(Zv(e,["firmQuoteHash"]))}function tp(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ye("time","is invalid");let o=Kv(e.fromChainId??e.fromChain,"fromChainId"),i=Kv(e.toChainId??e.toChain,"toChainId"),s=o===i?bB:wB,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Yv(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Yv(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Ms(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Qv(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:kB(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:vB(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Jv(e.allowedSources,"allowedSources",s),allowedRouters:Jv(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)?Br(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ye("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Fs({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=IB(c),Object.freeze(c)}function _B(e){return(!e||typeof e!="object"||Array.isArray(e))&&ye("artifact","required"),e.typedDataHash!=null&&!Gv.test(String(e.typedDataHash))&&ye("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Gv.test(String(e.calldataHash))&&ye("artifact.calldataHash","must be bytes32"),e.to!=null&&!ep(String(e.to))&&ye("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ye("artifact.data","must be hex"),Br(e)}function eS(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ye("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ye("quote expiry","required"),o<=r&&ye("quote","expired"),o>e.deadlineMs&&ye("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ye("source","required"),e.allowedSources.includes(i)||ye("source","not allowed by intent");let a=Ms(t.amountOut??t.buyAmount,"amountOut"),s=Ms(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ye("minBuyAmount","exceeds amountOut");let c=_B(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||ye("quotedAtMs","must be finite");let u=SB(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)?Br(t.metadata):{}};return d.quoteId||(d.quoteId=Fs({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=AB(d),Object.freeze(d)}function xi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function tS(e,t){return String(e?.[t]??"").trim()}function vi(e,t){return Object.freeze({source:e,run:t})}function PB(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??ze,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return xi(e,"lifi")&&a.push(vi("lifi",async()=>{let c=await(r.lifiQuote??No)({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 CB(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(xi(e,"paraswap")&&a.push(vi("paraswap",async()=>{let c=await(r.paraswapPrice??$r)({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}}})),xi(e,"0x")&&(tS(n,"ZEROX_API_KEY")||tS(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(vi("0x",async()=>{let c=await(r.zeroxQuote??Ro)({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}}})),xi(e,"cow")&&a.push(vi("cow",async()=>{let c=await(r.cowQuote??ir)({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}}})),xi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(vi("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Gn)({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 CB(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function TB(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function NB(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>TB(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(eS(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 OB(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 nS(e,t={}){let n=PB(e,t),{quotes:r,failed:o}=await NB(e,n,t),i=OB(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 rS(e={},t={}){return tp(e,t)}async function oS(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:tp(e,t);return nS(n,t)}async function iS(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}$();var LB="https://app.across.to";function np(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||LB).replace(/\/$/,"")}async function aS(e={}){try{let t=await k(`${np(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 sS(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return k(`${np(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function cS(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(`${np(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var BB="https://api.beefy.finance";function rp(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||BB).replace(/\/$/,"")}async function lS(e={}){try{let t=await k(`${rp(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 uS(e={},t={}){let n=await k(`${rp(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 dS(e={}){return k(`${rp(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}$();var FB="https://public-api.birdeye.so";function pS(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||FB).replace(/\/$/,"")}async function mS(e={}){try{let t=await k(`${pS(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 fS(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(`${pS(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var UB="https://api.celenium.io";function op(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||UB).replace(/\/$/,"")}async function hS(e={}){try{let t=await k(`${op(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 gS(e={}){return k(`${op(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function yS(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(`${op(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var HB="https://api.mainnet-beta.solana.com";function jB(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||HB).replace(/\/$/,"")}async function Ds(e,t,n={}){let r=jB(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 bS(e={}){try{let t=await Ds("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 wS(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 Ds("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function xS(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)),Ds("searchAssets",o,t)}async function vS(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Ds("getAssetProof",{id:n},t)}$();var VB="https://api.l2beat.com";function ip(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||VB).replace(/\/$/,"")}async function SS(e={}){try{let t=await k(`${ip(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 kS(e={},t={}){let n=await k(`${ip(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 ES(e={},t={}){return k(`${ip(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var GB="https://api.spark.fi";function ap(e={}){return(e.baseUrl||process.env.SPARK_API_URL||GB).replace(/\/$/,"")}async function IS(e={}){try{return{ok:(await k(`${ap(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 AS(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?k(`${ap(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):k(`${ap(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}$();var YB="https://api.symbiotic.fi";function sp(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||YB).replace(/\/$/,"")}async function _S(e={}){try{let t=await k(`${sp(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 PS(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await k(`${sp(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 CS(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return k(`${sp(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}$();var XB="https://staking-api.polygon.technology/api/v2",QB=18,ZB=200,eM=50,tM=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function lp(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||XB).replace(/\/$/,"")}function nM(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 rM(e,t=eM){let n=Number(e??t);return Number.isFinite(n)?Math.min(ZB,Math.max(1,Math.trunc(n))):t}function cp(e){let t=Number(e);return Number.isFinite(t)?t/10**QB:null}async function up(e,t={}){let n=await k(`${lp(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 TS(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:cp(e.totalStaked),selfStakePolApprox:cp(e.selfStake),delegatedStakePolApprox:cp(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function NS(e={},t={}){let n=await up("/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=tM.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=rM(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(TS)}}async function OS(e={},t={}){let n=nM(e.id??e.validatorId,"id"),o=(await up(`/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:{...TS(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 RS(e={}){try{let t=await up("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:lp(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:lp(e),error:String(t?.message||t),exec:!1}}}$();var iM="https://api.v3.aave.com/graphql",p9=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),aM=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||iM;async function Us(e,t,n={}){let r=await k(aM(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 sM=`query Markets($request: MarketsRequest!) {
|
|
145
|
+
- `)}`);let o=e.capabilities||{},i=Na.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:Na.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Na)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 Bl=new Map;function r0(e){let t=IT(e);return Bl.set(t.chainId,t),t}function o0(e){return Bl.get(Number(e))||null}function i0(){return[...Bl.values()]}fe();var Fl={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},it=e=>BigInt(e).toString(16).padStart(64,"0"),Ao=e=>e.slice(2).toLowerCase().padStart(64,"0");function ET(e,t){return`0x${Fl.getAmountsOut}`+it(e)+it(64)+it(t.length)+t.map(Ao).join("")}function AT(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 Ml(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Ul=100;function _T(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Ul)throw new Error(`slippageBps ${n} exceeds the ${Ul} 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 a0(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await U(t,"eth_call",[{to:o,data:ET(i,a)},"latest"],s);return AT(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Ml(c.scanner);if(!l)return{chainId:t,evidence:Y.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:Y.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:Y.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=Ml(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:z.UNKNOWN,evidence:Y.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:Y.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:Y.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:Y.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:Y.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,y="round trip completes with expected fee/impact loss";return f<5e3?(h=z.FAIL,y=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=z.CAUTION,y=`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:y,amountIn:String(i),bought:d.toString(),returned:m.toString(),retentionBps:f,evidence:Y.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=Ml(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!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let y=_T(h.amountOut,c);if(y<=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,g=x?`0x${Fl.swapExactETHForTokens}`+it(y)+it(128)+Ao(s)+it(w)+it(f.length)+f.map(Ao).join(""):`0x${Fl.swapExactTokensForTokens}`+it(a)+it(y)+it(160)+Ao(s)+it(w)+it(f.length)+f.map(Ao).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:g,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:y.toString(),slippageBps:c,maxSlippageBps:Ul,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."}}}}fe();var PT=[100,500,3e3,1e4],s0={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},Nn=e=>BigInt(e).toString(16).padStart(64,"0"),_o=e=>e.slice(2).toLowerCase().padStart(64,"0"),c0=/^0x[0-9a-fA-F]{40}$/,ql=100;function TT(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>ql)throw new Error(`slippageBps ${n} exceeds the ${ql} 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 Dl(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function l0(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${s0.quoteExactInputSingle}`+_o(a)+_o(s)+Nn(c)+Nn(l)+Nn(0),p=await U(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=await Promise.all(PT.map(async p=>{let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);return{fee:p,amountOut:m?m.toString():null,out:m}})),d=null;for(let p of u)p.out&&(!d||p.out>d.amountOut)&&(d={fee:p.fee,amountOut:p.out});return{best:d,tried:u.map(({fee:p,amountOut:m})=>({fee:p,amountOut:m}))}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=Dl(c.scanner,"quoter");if(!l)return{chainId:t,evidence:Y.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(!c0.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:Y.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:Y.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=Dl(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(S=>String(S).toLowerCase()),d=null;!s&&typeof e.resolveQuoteAsset=="function"&&(d=await e.resolveQuoteAsset(i,c).catch(()=>null));let p=String(i).toLowerCase(),m=String(n||"").toLowerCase();if(m&&p===m)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};let f=s||d||(u[0]&&p!==u[0]?u[0]:null)||n;if(f&&p===String(f).toLowerCase())return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:"token is the base asset for this chain, so there is nothing to round-trip against. Sellability must be judged against a different quote asset."};if(!l||!f)return{chainId:t,token:i,verdict:z.UNKNOWN,evidence:Y.UNAVAILABLE,reason:l?"no wrappedNative configured, so there is no base asset to round-trip against":"no verified quoter configured for this chain"};let h=await o({quoter:l,tokenIn:f,tokenOut:i,amountIn:a},c);if(!h.best){let S=u.find(I=>I&&I!==String(f).toLowerCase()&&I!==String(i).toLowerCase());if(S){let I=await o({quoter:l,tokenIn:S,tokenOut:i,amountIn:a},c);if(I.best){let k=await o({quoter:l,tokenIn:i,tokenOut:S,amountIn:I.best.amountOut},c);if(k.best){let E=k.best.amountOut,P=Number(E*10000n/BigInt(a)),_=z.PASS,C="round trip vs dollar book completes with expected fee/impact loss";return P<5e3?(_=z.FAIL,C=`round trip vs dollar book returns only ${(P/100).toFixed(2)}% -- punitive tax or no real liquidity`):P<9e3&&(_=z.CAUTION,C=`round trip vs dollar book returns ${(P/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:S,quoteAsset:S,verdict:_,reason:C,amountIn:String(a),bought:I.best.amountOut.toString(),returned:E.toString(),retentionBps:P,buyFee:I.best.fee,sellFee:k.best.fee,evidence:Y.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"buy",reason:"no V3 pool priced the buy leg on any fee tier against wrapped native or the dollar book"}}let y=await o({quoter:l,tokenIn:i,tokenOut:f,amountIn:h.best.amountOut},c);if(!y.best){let S=u.find(I=>I&&I!==String(f).toLowerCase()&&I!==String(i).toLowerCase());if(S){let I=await o({quoter:l,tokenIn:S,tokenOut:i,amountIn:a},c),k=I.best?await o({quoter:l,tokenIn:i,tokenOut:S,amountIn:I.best.amountOut},c):{best:null};if(I.best&&k.best){let E=k.best.amountOut,P=Number(E*10000n/BigInt(a)),_=z.PASS,C="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return P<5e3?(_=z.FAIL,C=`dollar-book round trip returns only ${(P/100).toFixed(2)}%`):P<9e3&&(_=z.CAUTION,C=`dollar-book round trip returns ${(P/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:S,quoteAsset:S,verdict:_,reason:C,amountIn:String(a),bought:I.best.amountOut.toString(),returned:E.toString(),retentionBps:P,buyFee:I.best.fee,sellFee:k.best.fee,evidence:Y.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:z.FAIL,evidence:Y.LIVE,leg:"sell",bought:h.best.amountOut.toString(),reason:"SELL LEG FAILED against wrapped native and the dollar book. This is the honeypot signature: do not trade."}}let w=y.best.amountOut,x=Number(w*10000n/BigInt(a)),g=z.PASS,b="round trip completes with expected fee/impact loss";return x<5e3?(g=z.FAIL,b=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(g=z.CAUTION,b=`round trip returns ${(x/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:g,reason:b,amountIn:String(a),bought:h.best.amountOut.toString(),returned:w.toString(),retentionBps:x,buyFee:h.best.fee,sellFee:y.best.fee,evidence:Y.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=Dl(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(!c0.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!==Y.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=TT(m.amountOut,l);if(h<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let y=!!(d.useNative||m.useNative)&&n&&String(i).toLowerCase()===String(n).toLowerCase(),w=`0x${s0.exactInputSingle}`+_o(i)+_o(a)+Nn(f)+_o(c)+Nn(s)+Nn(h)+Nn(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:w,value:y?String(s):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:ql,fee:f},requires:y?[]:[{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 Oa={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function u0(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function d0(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 CT(e){let{chainId:t}=e;async function n(r,o,i){return U(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await lo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:Y.LIVE}},async nativeBalance(r,o={}){let i=await An(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:Y.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:Y.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:Y.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,Oa.decimals,o).catch(()=>null),n(r,Oa.symbol,o).catch(()=>null),n(r,Oa.name,o).catch(()=>null),n(r,Oa.totalSupply,o).catch(()=>null)]),l=u0(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:d0(a?.result??a),name:d0(s?.result??s),totalSupply:(u0(c?.result??c)??null)?.toString()??null,evidence:u?Y.LIVE:Y.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:Y.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await Ot(r,o).catch(()=>null),c=(a?.pairs||a?.data?.pairs||[]).filter(u=>String(u.chainId).toLowerCase()===String(i).toLowerCase()).map(u=>({pair:u.pairAddress,dex:u.dexId,base:u.baseToken?.address,quote:u.quoteToken?.address,liquidityUsd:u.liquidity?.usd??null,priceUsd:u.priceUsd??null,volume24hUsd:u.volume?.h24??null,createdAt:u.pairCreatedAt??null})).sort((u,d)=>(d.liquidityUsd??0)-(u.liquidityUsd??0)),l=hl(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:eh(r,l),evidence:l.length?Y.LIVE:Y.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 p=r;p<=o;p+=s){let m=Math.min(p+s-1,o);u.push([p,m])}let d=await be(u,4,async([p,m])=>{let f={fromBlock:`0x${p.toString(16)}`,toBlock:`0x${m.toString(16)}`};i&&(f.address=i),a&&(f.topics=a);let h=await U(t,"eth_getLogs",[f],c).catch(y=>({error:String(y?.message||y)}));return{start:p,end:m,res:h}});for(let{start:p,end:m,res:f}of d){if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[p,m],error:f.error,evidence:Y.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:Y.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,l]=await Promise.all([this.resolveToken(r,o),this.resolvePools(r,o)]);if(c.evidence!==Y.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`}),l.evidence===Y.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 p0(e){let n={...CT(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,l0({chainId:e.chainId,wrappedNative:e.wrappedNative,stableQuoteAssets:e.stableQuoteAssets||[],resolveQuoteAsset:async(i,a)=>(await n.resolvePools(i,a)).quoteAsset||null})):e.venueKind==="uniswap-v2"&&r.has("router")&&Object.assign(n,a0({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 ir=Object.freeze([{key:"ethereum",chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://etherscan.io",dexscreenerSlug:"ethereum",venueKind:"uniswap-v3",wrappedNative:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",stableQuoteAssets:["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","0xdAC17F958D2ee523a2206206994597C13D831ec7"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.71 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:1}}]},{key:"optimism",chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://optimistic.etherscan.io",dexscreenerSlug:"optimism",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0x94b008aA00579c1307B0EF2c499aD98a8ce58e58"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1905.23 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:10}}]},{key:"bsc",chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],nativeCurrency:{symbol:"BNB",decimals:18},explorer:"https://bscscan.com",dexscreenerSlug:"bsc",venueKind:"uniswap-v3",wrappedNative:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",stableQuoteAssets:["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d","0x55d398326f99059fF775485246999027B3197955"],venues:[{kind:"quoter",address:"0x78D78E420Da98ad378D7799bE8f4AF69033EB077",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WBNB->USDC fee 500 quoted 413.86 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}},{kind:"router",address:"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:56}}]},{key:"polygon",chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],nativeCurrency:{symbol:"POL",decimals:18},explorer:"https://polygonscan.com",dexscreenerSlug:"polygon",venueKind:"uniswap-v3",wrappedNative:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",stableQuoteAssets:["0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359","0xc2132D05D31c914a87C6611C10748AEb04B58e8F"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WMATIC->USDC fee 500 quoted 0.0720 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:137}}]},{key:"stable",chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],nativeCurrency:{symbol:"USDT0",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x5d442b349590a6048Eb2dC0eC346cAA5F47A9ab5",venues:[{kind:"quoter",address:"0xb070179E7032CdA868b53e6C1742F80c9e940d1A",label:"Uniswap V3 QuoterV2 (canonical)",verified:{method:"Stable is on the OFFICIAL Uniswap v3 Deployments List (governance-recognised 2026-05-12, UAC process completed 2026-04, deployed by Protofire), so this is a canonical deployment rather than a fork. eth_getCode returned 8273 bytes, the same size as the canonical quoter on the seven already-verified chains. Functional probe on a live pool (TOAST -> USDT0, fee 10000): 100 in -> 0.000003, 1000 -> 0.000031, 10000 -> 0.000319 USDT0. Output scales monotonically with input, which is a working quoter answering, not a revert. Two of three sampled pools carry non-zero liquidity. NOTE: the pools discovered so far are thin, so real routing size is limited -- the venue is proved, deep liquidity is not.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:988}},{kind:"router",address:"0x32eaf9B5d5F2CD7361c5012890C943D7de84C22a",label:"Uniswap SwapRouter02 (canonical)",verified:{method:"eth_getCode returned 24497 bytes. Cross-checked on-chain rather than trusted from docs: router.factory() returns 0x88f0a512ef09175d456bc9547f914f48c013e4aa, the same v3 core factory that created the pools quoted above, and router.WETH9() returns the wrappedNative recorded on this chain entry. Address published in the Stable docs DEX reference and the Uniswap deployments list.",source:"docs.stable.xyz/en/reference/dexes + on-chain factory()/WETH9() round-trip",date:"2026-08-05",chainId:988}}]},{key:"hyperevm",chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],nativeCurrency:{symbol:"HYPE",decimals:18},dexscreenerSlug:"hyperevm",venueKind:"uniswap-v3",wrappedNative:"0x5555555555555555555555555555555555555555",venues:[{kind:"quoter",address:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",label:"HyperSwap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle(1 WHYPE -> USDT0) returned live output on all four fee tiers (100: 57.3385, 500: 57.4187, 3000: 57.3237, 10000: 56.1963 USDT0). Decimals read on-chain: WHYPE 18, USDT0 6. Best tier checked against an INDEPENDENT control the same minute -- Hyperliquid allMids put HYPE at 57.3205, so the pool is 0.171% from the perp mid, which is the right shape for fee plus impact rather than a wrong contract or a decimals bug.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}},{kind:"router",address:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D",label:"HyperSwap V3 SwapRouter",verified:{method:"eth_getCode returned 12070 bytes, and it is the router paired with the quoter proved above -- the same pair already shipped in UNI_V3_VENUES[999].hyperswap, which is the map the quote/prepare path actually routes through.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:999}}]},{key:"abstract",chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},venueKind:"uniswap-v3",wrappedNative:"0x3439153EB7AF838Ad19d56E1571FBD09333C2809",venues:[{kind:"quoter",address:"0x728BD3eC25D5EDBafebB84F3d67367Cd9EBC7693",label:"Uniswap V3 QuoterV2 (Abstract deployment)",verified:{method:"Abstract is a ZK-stack chain, so CREATE2 addresses differ and the canonical Uniswap addresses are NOT valid here -- probing them returns codesize 0, which is what previously made this chain look like it had no V3 at all. Found the real deployment from live traffic instead: scanned recent Swap(...) logs, took the busiest pool, read pool.factory() = 0xa1160e73b63f322ae88cc2d8e700833e71d0b2a1, then enumerated that factory's deployer (0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e) and probed each of its 56 contracts with a real quoteExactInputSingle call. Exactly one answered: 1 WETH -> 1846.475731 USDC.e at fee 500. Independent sanity check: the pool's own slot0() spot price is 1873.11 USDC.e per WETH, so the quoter sits ~1.4% below spot, the right shape for fee plus price impact on this size.",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-08-05",chainId:2741}},{kind:"router",address:"0x7712FA47387542819d4E35A23f8116C90C18767C",label:"Uniswap SwapRouter02 (Abstract deployment)",verified:{method:"eth_getCode returned 167392 bytes and the runtime contains the exactInputSingle selector. router.factory() matches the factory proved above and router.WETH9() matches the wrappedNative on this entry. Chosen over its byte-identical twin (0xfD6257F4...) because this is the address real users actually route through: it appeared as tx.to on live swaps against the WETH/USDC.e pool.",source:"on-chain factory()/WETH9() round-trip + live swap tx.to sampling",date:"2026-08-05",chainId:2741}}]},{key:"robinhood",chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC","ROBINHOOD_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},dexscreenerSlug:"robinhood",venueKind:"uniswap-v3",wrappedNative:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",stableQuoteAssets:["0x5fc5360d0400a0fd4f2af552add042d716f1d168"],venues:[{kind:"quoter",address:"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDG fee 100 quoted 1866.58 USDG, and USDG->CASHCAT fee 10000 quoted a live amount). A contract that correctly prices known pairs IS a working V3 quoter",source:"live eth_call against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"router",address:"0xcaf681a66d020601342297493863e78c959e5cb2",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode (24497 bytes) on this chain and the paired quoter at the same deployment passed a live functional quote",source:"live eth_getCode against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}},{kind:"factory",address:"0x1f7d7550b1b028f7571e69a784071f0205fd2efa",label:"Uniswap V3 Factory",verified:{method:"eth_getCode returned real bytecode (24535 bytes) and a PoolCreated log scan over this factory returned 76 pools in ~9000 recent blocks",source:"live eth_getLogs against rpc.mainnet.chain.robinhood.com",date:"2026-07-31",chainId:4663}}]},{key:"base",chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://basescan.org",dexscreenerSlug:"base",venueKind:"uniswap-v3",wrappedNative:"0x4200000000000000000000000000000000000006",stableQuoteAssets:["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],venues:[{kind:"quoter",address:"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",label:"Uniswap V3 QuoterV2 (Base)",verified:{method:"functional probe: quoteExactInputSingle returned WETH->USDC at fee 500 = 1908.44 USDC, a live sane price. The canonical mainnet quoter address also has bytecode on Base but does NOT price this pair, which is exactly the false positive a codesize-only check accepts",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router",address:"0x2626664c2603336E57B271c5C0b26F421741e481",label:"Uniswap V3 SwapRouter02 (Base)",verified:{method:"eth_getCode returned real bytecode and the paired Base quoter passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:8453}},{kind:"router-v2",address:"0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24",label:"Uniswap V2 Router02 (Base)",verified:{method:"eth_getCode returned 17891 bytes; live getAmountsOut on WETH->USDC round-tripped to 98.75% (2x0.30% fee + impact)",source:"https://docs.uniswap.org/contracts/v2/reference/smart-contracts/v2-deployments",date:"2026-07-30",chainId:8453}}]},{key:"arbitrum",chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],nativeCurrency:{symbol:"ETH",decimals:18},explorer:"https://arbiscan.io",dexscreenerSlug:"arbitrum",venueKind:"uniswap-v3",wrappedNative:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",stableQuoteAssets:["0xaf88d065e77c8cC2239327C5EDb3A432268e5831","0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9"],venues:[{kind:"quoter",address:"0x61fFE014bA17989E743c5F6cB21bF9697530B21e",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WETH->USDC fee 500 quoted 1908.72 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}},{kind:"router",address:"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:42161}}]},{key:"avalanche",chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],nativeCurrency:{symbol:"AVAX",decimals:18},explorer:"https://snowtrace.io",dexscreenerSlug:"avalanche",venueKind:"uniswap-v3",wrappedNative:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",stableQuoteAssets:["0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"],venues:[{kind:"quoter",address:"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F",label:"Uniswap V3 QuoterV2",verified:{method:"functional probe, not a codesize check: quoteExactInputSingle returned a live sane price (WAVAX->USDC fee 500 quoted 6.48 USDC). A contract that correctly prices a known pair IS a working V3 quoter",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}},{kind:"router",address:"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE",label:"Uniswap V3 SwapRouter02",verified:{method:"eth_getCode returned real bytecode on this chain and the paired quoter at the same deployment passed a live functional quote",source:"scripts/verify-v3-venues.mjs (re-runnable)",date:"2026-07-30",chainId:43114}}]}]);function Hl(){return ir.map(e=>r0(p0(e)))}var Po=new Map,NT=Object.keys(Je).map(Number),OT=Object.keys(Et).map(Number),RT=ir.map(e=>e.chainId),LT=[...new Set(Object.values(Ea))],jl=new Set,m0=!1;function T(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(m0&&jl.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return Po.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),Po.get(t)}function zl(e){return Po.get(e)||null}function Ra({venue:e,op:t}={}){let n=[...Po.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function $T(){jl.clear();for(let e of Po.keys())jl.add(e);m0=!0}T({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"});T({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."});T({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."});T({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."});T({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"});T({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."});T({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."});T({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."});T({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."});T({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."});T({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."});T({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."});T({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."});T({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."]])T({id:e,venue:t,chainIds:[],auth:"none",ops:["health","prepare"],execution:"prepare",description:n});T({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."});T({id:"evm-token-sniper",venue:"evm-token-launches",chainIds:RT,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:ir.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."});T({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)"});T({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)"});T({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"});T({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."});T({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."});T({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"});T({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."});T({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."});T({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."});T({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."});T({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."});T({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"});T({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)"});T({id:"dexscreener",venue:"dex",chainIds:[],auth:"none",ops:["health","token","search","pair"],baseEnv:["DEXSCREENER_API_URL"],description:"DexScreener public token/pair discovery"});T({id:"uniswap-v3",venue:"dex",chainIds:NT,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"});T({id:"uniswap-v4",venue:"dex",chainIds:OT,auth:"none",ops:["health","quote","inspectHook","prepare","chains"],execution:"prepare",baseEnv:["ETH_RPC_URL","BASE_RPC_URL","ARBITRUM_RPC_URL","OPTIMISM_RPC_URL","BSC_RPC_URL","POLYGON_RPC_URL","AVALANCHE_RPC_URL","RH_CHAIN_RPC"],description:"Uniswap V4 quotes, hook permission/code/pool-state inspection, and guarded unsigned Universal Router preparation across official deployments plus Robinhood Chain."});T({id:"x402",venue:"payments",chainIds:[],auth:"none",ops:["health","inspect","prepare"],execution:"prepare",description:"x402 v2 PAYMENT-REQUIRED inspection and explicit-cap exact-payment templates. Never signs, calls a facilitator, or retries a paid request."});T({id:"bankr",venue:"wallet-data",chainIds:[],auth:"apiKey",ops:["health","wallet","portfolio","swapQuote"],execution:"read-only",baseEnv:["BANKR_API_KEY","BANKR_API_URL"],description:"Bankr Wallet API read-only identity, portfolio, and swap quotes. Oracle excludes Bankr swap, transfer, sign, submit, agent, and LLM endpoints."});T({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)"});T({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)"});T({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)"});T({id:"hop",venue:"bridge",chainIds:[1,10,137,42161],auth:"none",ops:["health","quote"],baseEnv:["HOP_API_URL"],description:"Hop Protocol bridge quotes (public)"});T({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)"});T({id:"cowswap",venue:"dex",chainIds:[1,100,42161,8453],auth:"none",ops:["health","quote","prepareOrder","order","status","chains","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],baseEnv:[],description:"CowSwap batch auction. Quote is public; Allow posts official api.cow.fi orders."});T({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)"});T({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)"});T({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"});T({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"});T({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"});T({id:"opensea-nft",venue:"nft",chainIds:LT,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"});T({id:"local-marketplace",venue:"local-p2",chainIds:[],auth:"none",ops:["health","createListing","listListings","cancelListing","createOffer","armFill"],execution:"prepare",localSignerSurfaces:["evm-nft"],description:"Owner-local P2 catalog stored under ~/.config/oracle. Additive and isolated from OpenSea, Magic Eden, Satflow, Bisq, Anvil, and Polymarket. Listings are armed for the owner-local signer; sign-and-broadcast is an explicit createLocalMarketplace().instructFill instruction. Generic signHash is refused."});T({id:"local-x402",venue:"local-x402",chainIds:[],auth:"none",ops:["health","createIntent","listIntents","cancelIntent","armPayment"],execution:"prepare",localSignerSurfaces:["evm-swap"],description:"Owner-local x402 payment budgets under ~/.config/oracle. Additive and isolated from OpenSea and Telegram. Intents are armed; sign-and-broadcast is an explicit createLocalX402().instructPay instruction. Generic signHash is refused."});T({id:"local-pack-registry",venue:"local-packs",chainIds:[],auth:"none",ops:["health","registerPack","listPacks","revokePack"],execution:"read-only",description:"Owner-local third-party pack REGISTRY under ~/.config/oracle. Catalog only: packs are never loaded or executed. Isolated from OpenSea and Telegram."});T({id:"erc8004-identity",venue:"agent-identity",chainIds:[],auth:"none",ops:["health","prepareIdentityRegistration","prepareAgentURIUpdate","inspectIdentity","arm"],execution:"armed-local",localSignerSurfaces:["evm"],baseEnv:["ORACLE_ERC8004_CHAIN_ID","ORACLE_ERC8004_IDENTITY_REGISTRY"],description:"Draft ERC-8004 identity. Public prepare is keyless; Allow broadcasts type-2 register/setAgentURI."});T({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"});T({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"});T({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"});T({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"});T({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"});T({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)"});T({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"});T({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)"});T({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"});T({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"});T({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."});T({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."});$T();T({id:"polygon-staking",venue:"polygon-staking",chainIds:[137],auth:"none",ops:["health","validators","validatorDetail"],baseEnv:["POLYGON_STAKING_API_URL"],description:"Polygon POS staking validators"});T({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."});T({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."});T({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."});T({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."});T({id:"tron-public",venue:"tron",chainIds:[],auth:"none",ops:["health","account","trc20Balances","trc20Transfers","chainParameters"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TRON_API_URL","TRONGRID_API_KEY"],description:"Tron mainnet via public TronGrid. TRX balance, TRC20 token balances, USDT-TRC20 transfer history, chain parameters. Tron carries the largest USDT float of any chain. Keyless; TRONGRID_API_KEY only raises the rate ceiling and never travels to a non-TronGrid host."});T({id:"ton-public",venue:"ton",chainIds:[],auth:"none",ops:["health","accountState","jettonBalances","transactions"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TON_API_URL","TONCENTER_API_KEY"],description:"TON via public toncenter. Account state + nanoton balance, jetton (TON's ERC20) balances, transaction history. The settlement layer for Telegram-native assets. Keyless; TONCENTER_API_KEY only raises the rate ceiling."});T({id:"cosmos-lcd",venue:"cosmos",chainIds:[],auth:"none",ops:["health","chains","balances","delegations","denomTrace"],execution:"read-only",localSignerSurfaces:[],baseEnv:["COSMOS_LCD_URL","COSMOS_CHAIN"],description:"Cosmos SDK chains via keyless LCD/REST \u2014 one provider, many chains (cosmoshub default, plus osmosis/celestia/injective/neutron/dydx/noble/kava, or any LCD via COSMOS_LCD_URL_<CHAIN>). Bank balances, staking delegations + unbondings + rewards, and IBC denom-trace resolution for ibc/<hash> denoms."});T({id:"sui-public",venue:"sui",chainIds:[],auth:"none",ops:["health","balances","ownedObjects","coinMetadata"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SUI_RPC_URL"],description:"Sui mainnet via the public JSON-RPC fullnode. Coin balances (suix_getAllBalances), owned objects with display metadata, and coin metadata. Execute/sign/dry-run methods are refused before the request is issued."});T({id:"aptos-public",venue:"aptos",chainIds:[],auth:"none",ops:["health","account","resources","coinBalances"],execution:"read-only",localSignerSurfaces:[],baseEnv:["APTOS_FULLNODE_URL","APTOS_API_KEY"],description:"Aptos mainnet via the public fullnode REST API. Ledger info, account sequence/auth key, Move resources, and coin balances (0x1::coin::balance view with a CoinStore resource fallback). Read-only; the transaction submit door is never called."});T({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)."});T({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."});T({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."});T({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."});T({id:"social-intel",venue:"oracle-social",chainIds:[],auth:"none",ops:["health","trendingTokens","trendingCas","keywordMentions","smartAccounts","narratives"],execution:"read-only",localSignerSurfaces:[],baseEnv:["ORACLE_SOCIAL_INTEL_STORE","ORACLE_SOCIAL_INTEL_STALE_MIN"],description:"Local curated-account crypto social intelligence. Sample = graded caller list, NOT a firehose; every response reports sample size and snapshot age."});T({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."});T({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."});T({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"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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."});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({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)"});T({id:"limit-order",venue:"1inch-lop",chainIds:[1,10,56,137,8453,42161],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["evm-order"],description:"1inch Limit Order Protocol v4. Queues on the local signer; Allow posts the order."});T({id:"jupiter-dca",venue:"jupiter",chainIds:[],auth:"none",ops:["health","prepare","arm"],execution:"armed-local",localSignerSurfaces:["sol"],description:"Jupiter limit/DCA. Unsigned tx queues on the sol signer; Allow submits."});T({id:"protective-monitors",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"],execution:"read-only",description:"Alert-only depeg, oracle deviation, exploit feed, GoPlus second opinion, liquidation ladder."});T({id:"funding-scanner",venue:"perps",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",description:"Cross-venue funding carry ranked net of fee drag. Failed venues stay FAILED."});T({id:"perp-universal",venue:"perps",chainIds:[],auth:"none",ops:["health","fundingAll","prepareOrder"],execution:"prepare-only",description:"Live fundingAll across HL/GMX/dYdX + honest FAILED Drift/Vertex. prepareOrder unsigned."});T({id:"onchain-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Local Black-Scholes ranking. No arm until official Derive/Lyra domain is pinned."});T({id:"holder-clusters",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","score"],execution:"read-only",description:"Heuristic holder HHI + common-funding clusters. Not identity."});T({id:"kalshi",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Kalshi market catalog read-only. Trading may be US-restricted. Prepare refused."});T({id:"derive-options",venue:"options",chainIds:[],auth:"none",ops:["health","rank"],execution:"read-only",description:"Derive options rank-only until official domain+contract is pinned."});T({id:"limitless",venue:"prediction",chainIds:[],auth:"none",ops:["health","markets"],execution:"read-only",description:"Limitless market catalog. Prepare refused \u2014 no grant-bound decoder."});T({id:"dov-vaults",venue:"options",chainIds:[],auth:"none",ops:["health","read"],execution:"read-only",description:"DOV vault reads. Empty reviewed registry fails closed."});T({id:"prediction-match",venue:"prediction",chainIds:[],auth:"none",ops:["health","match"],execution:"read-only",description:"Cross-venue event match. Same title is not a match."});T({id:"tee-attestation",venue:"identity",chainIds:[],auth:"none",ops:["health","verify"],execution:"read-only",description:"TEE schema stub. Hardware unavailable. Unknown root unverified."});T({id:"keeper-mirror",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health"],execution:"read-only",description:"Keeper alert-mirror. Off by default. No execute path."});T({id:"erc7715-permissions",venue:"aa",chainIds:[],auth:"none",ops:["health","normalize"],execution:"read-only",description:"ERC-7715 permission normalize. Wildcards refused. aa allowlist empty."});T({id:"erc7710-delegation",venue:"aa",chainIds:[],auth:"none",ops:["health","inspect"],execution:"read-only",description:"ERC-7710 delegation inspect. Missing revocation/expiry fails closed."});T({id:"binance-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","BINANCE_FAPI_URL"],description:"Binance public spot + USD-M perp market data (ticker, depth, premiumIndex funding, open interest). Keyless reads only; no trading endpoints."});T({id:"okx-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest"],execution:"read-only",localSignerSurfaces:[],baseEnv:["OKX_API_URL"],description:"OKX public v5 market data (ticker, books, swap funding-rate, mark-price, open-interest). Keyless reads only; no trading endpoints."});T({id:"bybit-public",venue:"cex",chainIds:[],auth:"none",ops:["health","ticker","orderbook","funding","markPrice","openInterest","fundingHistory"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BYBIT_API_URL"],description:"Bybit public v5 market data (spot/linear tickers, orderbook, funding, open interest). Keyless reads only; no trading endpoints."});T({id:"cex-basis",venue:"cex",chainIds:[],auth:"none",ops:["health","basis","fundingSpread","legs"],execution:"read-only",localSignerSurfaces:[],baseEnv:["BINANCE_API_URL","OKX_API_URL","BYBIT_API_URL","HL_INFO_URL"],description:"Cross-venue perp basis and annualized funding spreads across Binance, OKX, Bybit and Hyperliquid public data. Analysis only, no sizing and no prepare."});T({id:"snapshot-governance",venue:"governance",chainIds:[],auth:"none",ops:["health","spaces","proposals","activeProposals","proposal","votes","votingPower"],execution:"read-only",localSignerSurfaces:[],baseEnv:["SNAPSHOT_API_URL"],description:"Snapshot.org off-chain governance reads: spaces, proposals, proposal detail, an address's votes and voting power. Never signs a vote."});T({id:"tally-governance",venue:"governance",chainIds:[1,10,42161],auth:"none",ops:["health","governors","info","proposals","proposal","voterStatus","tallyProposals"],execution:"read-only",localSignerSurfaces:[],baseEnv:["TALLY_API_URL","TALLY_API_KEY"],description:"Governor Bravo / OZ Governor on-chain proposal state and vote tallies for major DAOs, plus optional keyed Tally metadata. Read-only ABI has no vote/queue/execute selector."});T({id:"stablecoin-peg",venue:"oracle-intel",chainIds:[],auth:"none",ops:["health","scan"],execution:"read-only",localSignerSurfaces:[],baseEnv:[],description:"Peg-deviation scan across major and Hyperliquid-native stables. Ranks by absolute bps from $1 and classifies normal/watch/warn/depeg. Unpriced is unknown, never on-peg. Read-only composition of DefiLlama/Pyth/DexScreener."});O();at();at();var DT=/^0x[0-9a-fA-F]{40}$/,Co="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Vl(e,t){let n=String(e||"").trim();if(!DT.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function v0(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function x0(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)=>(v0(n.tvl)??-1)-(v0(t.tvl)??-1))}function Wl(e){return e.hlInfo||ce}function Gl(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Kl(e={},t={}){let n=await Wl(t)({type:"vaultSummaries"},t),r=qT((Array.isArray(n)?n:[]).map(x0));return Gl({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Ma(e={},t={}){let r={type:"vaultDetails",vaultAddress:Vl(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Vl(e.user,"user"));let o=await Wl(t)(r,t);return Gl({provider:"hl-vaults",vault:x0(o||{}),raw:o})}async function Yl(e={},t={}){let n=Vl(e.user||e.address,"user"),r=await Wl(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 Gl({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Jl(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Ma({...e,vaultAddress:Co},t);if(n==="summaries")return Kl(e,t);if(n==="details")return Ma(e,t);if(n==="mine")return Yl(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function S0(e={}){try{let t=await Jl({mode:"hlp"},e);return{ok:t.vault.vaultAddress===Co&&!!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}}}fe();import{AbiCoder as jT}from"ethers";var Xl=999;var Ne=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Ql=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),zT=jT.defaultAbiCoder();function No(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 Oo(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 On(e,t){return e.length?zT.encode(e,t):"0x"}function Lt(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 VT(e,t=0){let n=Lt(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Yt(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Xl});let r=await U(Xl,"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 Jt(e){return{provider:"hl-precompiles",chainId:Xl,...Ql,...e}}async function Fa(e={}){let t=await Yt(Ne.l1BlockNumber,"0x",e);return Jt({op:"l1BlockNumber",precompile:Ne.l1BlockNumber,l1BlockNumber:Lt(t).toString(),raw:t})}async function Zl(e={},t={}){let n=Oo(e.index??e.assetId??0,"index",32),r=await Yt(Ne.markPx,On(["uint32"],[n]),t);return Jt({op:"markPx",precompile:Ne.markPx,index:n,markPx:Lt(r).toString(),raw:r})}async function eu(e={},t={}){let n=Oo(e.index??e.assetId??0,"index",32),r=await Yt(Ne.oraclePx,On(["uint32"],[n]),t);return Jt({op:"oraclePx",precompile:Ne.oraclePx,index:n,oraclePx:Lt(r).toString(),raw:r})}async function tu(e={},t={}){let n=Oo(e.index??e.assetId??0,"index",32),r=await Yt(Ne.spotPx,On(["uint32"],[n]),t);return Jt({op:"spotPx",precompile:Ne.spotPx,index:n,spotPx:Lt(r).toString(),raw:r})}async function nu(e={},t={}){let n=No(e.user,"user"),r=Oo(e.perp??e.assetId??0,"perp",16),o=await Yt(Ne.position,On(["address","uint16"],[n,r]),t);return Jt({op:"position",precompile:Ne.position,user:n,perp:r,szi:VT(o,0),raw:o})}async function ru(e={},t={}){let n=No(e.user,"user"),r=Oo(e.token??0,"token",64),o=await Yt(Ne.spotBalance,On(["address","uint64"],[n,r]),t);return Jt({op:"spotBalance",precompile:Ne.spotBalance,user:n,token:r,total:Lt(o,0).toString(),hold:Lt(o,1).toString(),raw:o})}async function ou(e={},t={}){let n=No(e.user,"user"),r=No(e.vaultAddress??e.vault??Co,"vault"),o=await Yt(Ne.vaultEquity,On(["address","address"],[n,r]),t);return Jt({op:"vaultEquity",precompile:Ne.vaultEquity,user:n,vaultAddress:r,hlp:r===Co,equity:Lt(o,0).toString(),raw:o})}async function iu(e={},t={}){let n=No(e.user,"user"),r=await Yt(Ne.withdrawable,On(["address"],[n]),t);return Jt({op:"withdrawable",precompile:Ne.withdrawable,user:n,withdrawable:Lt(r).toString(),raw:r})}async function k0(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Fa(t);if(n==="markPx")return Zl(e,t);if(n==="oraclePx")return eu(e,t);if(n==="spotPx")return tu(e,t);if(n==="position")return nu(e,t);if(n==="spotBalance")return ru(e,t);if(n==="vaultEquity"||n==="hlp")return ou(e,t);if(n==="withdrawable")return iu(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function I0(e={}){try{let t=await Fa(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Ql,l1BlockNumber:t.l1BlockNumber,precompiles:Ne}}catch(t){return{ok:!1,provider:"hl-precompiles",...Ql,error:String(t?.message||t).slice(0,160)}}}at();X();function E0(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Da(e={},t,n){let r=String(t||""),o=E0(e);if(o){let a=Ro(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=Ro(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function qa(e={},t=[],n){let r=E0(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(Ro(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&Ro(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(Ro(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var au=Number.MAX_SAFE_INTEGER,Ua=String(au);function Ro(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=au?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Ua.length||t.length===Ua.length&&t>Ua||t===Ua&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=au?r:null}function W0(){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 Bt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function G0(e){let t=Bt(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function MC(e,t,n=4){let r=Bt(e),o=Bt(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 K0(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=Bt(a.funding),l=Bt(a.markPx??a.oraclePx),u=Bt(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:Bt(a.oraclePx),openInterest:u,fundingAprPct:G0(c)})}return r}function Y0(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=Bt(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=G0(n),o=n>0,i={coin:e.coin,notionalUsd:Bt(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?MC(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 Iu(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await Ve(t),i=K0(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 Eu(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 Ve(t),i=K0(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return Y0(i,r)}async function Au(e={},t={}){X0(e,t,"hl-delta-neutral");let n=Q0(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Eu(e,t);if(r.verdict==="skip")return N({...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=Da(e,r.coin,"hl-delta-neutral");if(!J0.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(()=>(Uo(),ku)),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 N({...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 J0=/^0x[0-9a-fA-F]{40}$/;function X0(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 FC(e,t,n){X0(e,t,n)}function UC(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=Q0(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"&&qa(e,n,"hl-delta-neutral"),t==="live"&&!J0.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 Q0(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 Z0(e={},t={}){FC(e,t,"hl-delta-neutral");let n=UC(e),r=await Iu({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=Y0(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 Au({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."}}O();X();cr();var qC=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Do=14,ey=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function ur(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function _u(e){let t=String(e||"").replace(/\/$/,"");if(!qC.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function ty(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=ey(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=_u(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(Rn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(Rn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");ur(n.orderType,0,"orderType"),ur(n.timeInForce,1,"timeInForce"),ur(n.reduceOnly,0,"reduceOnly"),ur(n.triggerPrice,0,"triggerPrice"),ur(n.orderExpiry,-1,"orderExpiry");let c=ey(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=ct(n.baseAmount,"lighter: baseAmount"),d=ct(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 y=f+h,w=u*d,x=Ae(n.notionalUsd,y,"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 g=Ae(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,y,"lighter: maxNotionalUsd");if(w>g)throw new Error("lighter: notional exceeds cap");let b=Pe(n.notionalUsd,"lighter: notionalUsd");return ur(n.txType,Do,"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 HC(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 ny(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=_u(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:HC(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??Do,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return ty(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var oy="https://mainnet.zklighter.elliot.ai",iy="https://testnet.zklighter.elliot.ai";function jC(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?iy:oy}function ay(){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 nn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function zC(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 sy(e){let t=nn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function VC(e,t,n=4){let r=nn(e),o=nn(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 ry(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Pu(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=ry(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=ry(a.market_id);if(s==null)continue;let c=o.get(s),l=nn(c?.mark_price??c?.index_price),u=nn(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:nn(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:sy(u)})}return i}function cy(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=nn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=sy(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:nn(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?VC(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 Tu(e={}){let t=jC(e),n=e.fetchImpl,r=await v(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await v(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function ly(e={}){let{funding:t,books:n}=await Tu(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:Pu(t,n)}}async function Cu(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Tu(t),i=Pu(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 Nu(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 Tu(t),a=Pu(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return cy(a,r)}async function Ou(e={},t={}){dy(e,t,"lighter");let n=py(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 Nu(e,t);if(o.verdict==="skip")return N({...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=Da(e,o.coin,"lighter");if(!uy.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=zC(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:Do,submitTo:`${s?iy:oy}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=ny(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return N({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var uy=/^0x[0-9a-fA-F]{40}$/;function dy(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 WC(e,t,n){dy(e,t,n)}function GC(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=py(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"&&qa(e,n,"lighter"),t==="live"&&!uy.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 py(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 my(e={},t={}){WC(e,t,"lighter");let n=GC(e),r=await Cu({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=cy(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 Ou({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."}}O();var YC="https://clob.polymarket.com",JC="https://gamma-api.polymarket.com";function qo(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||YC).replace(/\/$/,"")}function fy(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||JC).replace(/\/$/,"")}async function Ru(e={}){return v(`${qo(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function hy(e={}){let t=await Ru(e);return{ok:t!=null&&t!=="",time:t}}async function yy({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 v(`${fy(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function gy(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return v(`${qo(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function by(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return v(`${qo(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function wy(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return v(`${qo(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function vy(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 v(`${qo(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function xy({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 v(`${fy(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}fe();O();import{createHash as Sy}from"node:crypto";var dr="mainnet-beta",QC="https://api.mainnet-beta.solana.com",Lu="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function ZC(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||QC).trim()}function de(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 eN(e,t){return t?[...e,{commitment:t}]:e}async function Ho(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 v(ZC(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 $u(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await Ho("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:dr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function ky(e={}){try{let[t,n]=await Promise.all([Ho("getHealth",[],e),$u({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:dr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:dr,error:String(t?.message||t),exec:!1}}}async function Ya(e={},t={}){let n=de(e.address||e.owner,"address"),r=await Ho("getBalance",eN([n],e.commitment),t);return{provider:"solana-rpc",cluster:dr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function tN(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 jo(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||Lu,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await Ho("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(tN):[];return{provider:"solana-rpc",cluster:dr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function nN(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 rN(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 oN(e){let t=Buffer.from(e,"base64");try{let n=rN(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Sy("sha256").update(t.subarray(r)).digest("hex")}catch{return Sy("sha256").update(t).digest("hex")}}async function Iy(e={},t={}){let n=nN(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await Ho("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:dr,ok:i.err==null,transactionHash:oN(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}O();var aN="mainnet",sN="https://mempool.space/api",cN="https://mempool.space/testnet/api";function _t(e={}){return String(e.network||process.env.BTC_NETWORK||aN).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Mu(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):_t(e)==="testnet"?cN:sN}function Bu(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 yt(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 lN(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 Fu(e,t={}){let n=`${Mu(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 Ja(e,t={}){let n=await Fu(e,t);try{return JSON.parse(n)}catch{return n}}async function Ey(e={}){try{let t=await Fu("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:_t(e),baseUrl:Bu(Mu(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:_t(e),baseUrl:Bu(Mu(e)),error:Bu(t?.message||t),exec:!1}}}async function Ay(e={}){let t=await Fu("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:_t(e),tipHeight:Number(t)}}async function _y(e={}){try{let t=await Ja("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:_t(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:_t(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Xa(e={},t={}){let n=yt(e.address||e.addr,"address"),r=await Ja(`/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:_t(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Py(e={},t={}){let n=yt(e.address||e.addr,"address"),r=await Ja(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:_t(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 Ty(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 Ja(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:_t(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 Cy(e={},t={}){let n=lN(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:_t(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 Uu="https://ordinals.com";function Qa(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var dN=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Ny(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=Qa(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=dN.includes(o)&&(i==="https:"||a)}}catch{n=!1}return ke({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function pr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Ny(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 Oy(e={}){let t=Qa(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:Ny(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 Za(e={},t={}){let n=yt(e.address||e.addr,"address"),r=Qa(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 pr(a,t),c=pN(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 pN(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 mr(e={},t={}){let n=yt(e.address||e.addr,"address"),r=Qa(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 pr(s,t),l=mN(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 Ry(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||Uu,o=await pr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Ly(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||Uu,o=Number(e.page||0),i=await pr(`${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 $y(e={},t={}){let n=t.ordinalsBase||Uu,r=e.height??await pr(`${n}/r/blockheight`,t),o=await pr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function mN(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 hN=["unsigned","notsigned","tosign","signable"],yN=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),gN=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Du(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function bN(e){return hN.some(t=>e.startsWith(t))||yN.has(e)}function wN(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Du(t);return bN(n)?!1:gN.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function vN(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 qu(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=>qu(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(wN(c)){o.push(c);continue}o.push(...qu(l,t+1,n,r))}let a=Object.keys(e).map(Du).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Du(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),vN(e)&&o.push("v/r/s"),o}function Mt(e,t){let n=qu(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 xN="https://api.satflow.com/v1";function By(e={}){return Ee({provider:"satflow",defaultUrl:xN,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function es(e={}){return By(e).baseUrl}function ju(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function SN(e={}){return ke({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":ju(e)},By(e).trusted)}async function rn(e,{method:t="GET",body:n,opts:r={}}={}){if(!ju(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:SN(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 My(e={}){if(!!!ju(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 rn("/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 Fy(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 rn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Uy(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 rn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Dy(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 rn(`/item?${r}`,{opts:t})}}async function ts(e={},t={}){let n=yt(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 rn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function qy(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 rn(`/orders/floor?${r}`,{opts:t})}}var kN=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Hy(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))kN.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var IN=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"]),EN=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function Hu(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 AN(e={},{psbt:t,priceSats:n,nowMs:r=Date.now()}={}){if(!t)throw new Error("satflow: local signer envelope requires unsigned PSBT");let o=yt(e.owner||e.buyer_address||e.buyerAddress||e.payment_address||e.pay_address,"owner"),i=yt(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 jy(e={},t={}){let n=Hy(e,IN);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=Hu(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await rn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=Hu(a)??Hu(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`);Mt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=AN(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return N({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 ns(e={},t={}){let n=Hy(e,EN);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 rn("/intent/sell",{method:"POST",body:n,opts:t});return Mt("satflow",r),N({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."})}O();X();var os="https://lite-api.jup.ag/swap/v1",zu="So11111111111111111111111111111111111111112",Wy="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",PN=100,zy=2e4;function Gy(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||os).replace(/\/$/,"")}function zo(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 Ky(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>PN)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function rs(e,t){return e==null?t:!!e}function TN(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 CN(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 Yy(e){let t=Buffer.from(e,"base64"),n=CN(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 Vo(e={},{quotedAtMs:t=Date.now(),ttlMs:n=zy}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=zo(e.inAmount,"inAmount"),a=zo(e.outAmount,"outAmount"),s=zo(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Ky(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)||zy,1e3),3e4)}}function Vu({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==zu)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=Yy(n),a=zo(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 NN=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),ON="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Vy(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=ON.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 Jy(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(`${os}/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])=>Vy(p)),c=[],l=a.filter(([p])=>!Vy(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${os}/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(([y])=>y),{encoding:"base64",dataSlice:{offset:0,length:0}}]})}catch{await new Promise(y=>setTimeout(y,2e3*(h+1)))}if(!f){for(let[h,y]of m)l.push({programId:h,label:y,reason:"rpc batch failed after 3 attempts"});continue}f.value.forEach((h,y)=>{let[w,x]=m[y];h&&h.executable===!0&&NN.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:`${os}/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 Xy(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await is({inputMint:zu,outputMint:Wy,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 is(e={},t={}){let n=de(e.inputMint||e.fromMint||zu,"inputMint"),r=de(e.outputMint||e.toMint||Wy,"outputMint"),o=zo(e.amount||e.inAmount,"amount"),i=Ky(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Gy(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 v(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Vo({...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 RN(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Qy(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Vo(e.quoteResponse,t)}:await is(e,t),o=r.quote,i=r.solanaGuard||Vo(o,t);if(rs(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await v(`${Gy(t)}/swap`,{method:"POST",body:RN({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:rs(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:rs(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:rs(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=TN(a?.swapTransaction);Yy(s),Mt("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=Vu({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return N({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"})}O();var $N="https://coins.llama.fi",BN="https://api.llama.fi",MN="https://yields.llama.fi",FN="https://stablecoins.llama.fi";function UN(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||$N).replace(/\/$/,"")}function Zy(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||BN).replace(/\/$/,"")}async function Ft(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return v(`${UN(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function eg(e={}){let n=(await Ft(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function tg(e={}){return v(`${Zy(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function ng(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||MN).replace(/\/$/,""),r=await v(`${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 as(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||FN).replace(/\/$/,""),r=e.includePrices!==!1;return v(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function rg(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 v(`${Zy(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function og(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Ft(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}O();var on="0x000000000000000000000000000000000000dEaD";function Wu(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:on}X();Wa();var qN="https://li.quest/v1";function Ku(e={}){return(e.baseUrl||process.env.LIFI_API_URL||qN).replace(/\/$/,"")}var Gu="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",HN="0x0000000000000000000000000000000000000000";function jN(e){let t=String(e||Gu).toLowerCase();return t===Gu.toLowerCase()||t===HN}function ig(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 ag(e={}){let t=await v(`${Ku(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 Wo(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Gu,toToken:i,fromAmount:a,fromAddress:s=on}=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=je({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 Va({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[y,w]of Object.entries(F0(u)))c.set(y,w);let d=await v(`${Ku(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=re(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 sg(e={},t={}){let n=await Wo(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(!jN(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:ig(s,"approval token"),spender:ig(a,"approval spender"),amount:String(e.fromAmount)}}return N({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:he(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function cg(e={}){return v(`${Ku(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}fe();import{Interface as dg,getAddress as Go,isAddress as VN}from"ethers";X();var an={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},WN=[1,50,100,200,2e3],lg=new dg(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),GN=new dg(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),pg="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",mg="0x0000000000000000000000000000000000000000";function fg(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 ug(e,t){let n=an[Number(t)];if(!e||e===pg||e===mg||/^eth$/i.test(String(e)))return Go(n.weth);let r=String(e);if(/^weth$/i.test(r))return Go(n.weth);if(/^usdc$/i.test(r))return Go(n.usdc);if(!VN(r))throw new Error(`invalid token address: ${e}`);return Go(r)}async function ss(e={},t={}){let{chainId:n,quoter:r,router:o}=fg(e.chainId??8453),i=ug(e.tokenIn||"WETH",n),a=ug(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]:[...WN],u=await Promise.all(c.map(async p=>{let m=lg.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:p,sqrtPriceLimitX96:0n}]);try{let f=await U(n,"eth_call",[{to:r,data:m},"latest"],t);if(!f||f==="0x")return{tickSpacing:p,ok:!1,error:"empty result"};let h=lg.decodeFunctionResult("quoteExactInputSingle",f);return{tickSpacing:p,ok:!0,amountOut:h[0].toString(),sqrtPriceX96After:h[1].toString(),initializedTicksCrossed:Number(h[2]),gasEstimate:h[3].toString()}}catch(f){return{tickSpacing:p,ok:!1,error:String(f.message||f).slice(0,160)}}})),d=null;for(let p of u)p.ok&&(!d||BigInt(p.amountOut)>BigInt(d.amountOut))&&(d=p);if(!d){let p=u.map(m=>`${m.tickSpacing}:${m.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${p}`)}return re({venue:"aerodrome",chainId:n,chain:an[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:d.tickSpacing,amountOut:d.amountOut,gasEstimate:d.gasEstimate,sqrtPriceX96After:d.sqrtPriceX96After,initializedTicksCrossed:d.initializedTicksCrossed,triedTickSpacings:u,best:!0},{chainId:n,venue:o,amountOut:d.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function hg(e={},t={}){let n=Number(e.chainId??8453),r=fg(n),o=Go(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===pg||i===mg||/^eth$/i.test(i),s=await ss(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=GN.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 N({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:he(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function yg(e={}){let t=Number(e.chainId??8453);try{let n=await ss({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 gg(){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}))}O();X();var YN="https://api.0x.org";function bg(e={}){return Ee({provider:"zerox",defaultUrl:YN,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function wg(e={}){return bg(e).baseUrl}function cs(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function vg(e={}){return ke({"0x-version":"v2",accept:"application/json"},{"0x-api-key":cs(e)},bg(e).trusted)}async function xg(e={}){if(!cs(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Yu({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 Yu(e={},t={}){if(!cs(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),v(`${wg(t)}/swap/allowance-holder/price?${s}`,{headers:vg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ko(e={},t={}){if(!cs(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=je({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 v(`${wg(t)}/swap/allowance-holder/quote?${c}`,{headers:vg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?re(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 Sg(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Ko(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 N({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:he(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}O();X();var XN="https://across.to/api",QN="https://api.hop.exchange/v1",ZN="https://api.relay.link",eO={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function kg(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Ju({token:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",destinationToken:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",originChainId:1,destinationChainId:42161,amount:"1000000000000000"},e)).estimatedFillTimeSec}}catch(t){return{ok:!1,error:String(t.message||t).slice(0,160)}}}async function Ju(e={},t={}){let{token:n,destinationToken:r=n,originChainId:o,destinationChainId:i,amount: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||XN).replace(/\/$/,"");return v(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ig(e={}){try{let t=await Xu({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 Xu(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=je({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||QN).replace(/\/$/,""),u=await v(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?re(u,{chainId:Number(e.originChainId||e.chainId||eO[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 Eg(e={}){try{let t=await ls({user:on,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 ls(e={},t={}){let{user:n=on,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=je({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||ZN).replace(/\/$/,""),d=await v(`${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}:re(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 Ag(e={},t={}){let n=await ls(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:he(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return N({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}O();import{TypedDataEncoder as Tg,getAddress as Yo,isAddress as nO}from"ethers";var yH=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Qu(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function _g(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}X();var td={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"},rO=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),oO=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),ed={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Cg={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},Pg=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"}]}),EH=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function nd(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=td[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function Jo(e,t){let n=String(e||"").trim();if(!nO(n))throw new Error(`cowswap: ${t} must be an address`);return Yo(n).toLowerCase()}function Zu(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 iO(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 aO(e){let t=rO[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:Yo(t)}}function sO(e={},t,n){let r=Jo(e.sellToken,"sellToken"),o=Jo(e.buyToken,"buyToken"),i=Jo(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=iO(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Zu(e.sellAmount,"sellAmount"),buyAmount:Zu(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Zu(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function Ng(e={}){try{let t=await fr({chainId:1,sellToken:ed[1],buyToken:Cg[1],sellAmountBeforeFee:"1000000000000000",from:on},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 fr(e={},t={}){let n=Number(e.chainId??1),r=Wu(e.from||e.owner),o=e.sellToken||ed[n],i=e.buyToken||Cg[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=ed[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 v(`${nd(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?re(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function Og(e={},t={}){let n=Number(e.chainId??1),r=Jo(Wu(e.from||e.owner||e.signer),"owner"),o=await fr({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=sO(o?.quote||o,n,r),a=aO(n),s={domain:a,types:Pg,primaryType:"Order",message:i},c=Tg.hash(a,Pg,i),l=oO[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return N({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:Yo(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:Yo(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:Yo(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:cO({chainId:n,owner:r,typedData:s,quoteId:o?.id??e.quoteId??null,cowGuard:{expiresAtMs:Math.min(i.validTo*1e3,Date.now()+2e4)}})},{provider:"cowswap",kind:"cow-order"})}function cO(e={},t={}){let n=e.typedData;if(!n?.domain||!n?.types||!n?.message)throw new Error("cowswap: typedData required to arm");let r=Number(e.chainId??n.domain.chainId),o=td[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=Jo(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=Tg.hash(n.domain,n.types,n.message);return Object.freeze({tradeId:`cow:${r}:${s.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:i,destination:"cowswap",chainId:r,expiresAtMs:Number(e.cowGuard?.expiresAtMs??a+2e4),slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"cow",chainId:r,submitTo:`${o}/orders`,quoteId:e.quoteId??null,domain:n.domain,types:n.types,message:n.message,typedData:n})})}async function Rg(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return v(`${nd(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Lg(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return v(`${nd(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function $g(){return Object.keys(td).map(Number)}O();X();var uO="https://api.1inch.dev/swap/v6.0";function Bg(e={}){return Ee({provider:"oneinch",defaultUrl:uO,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function rd(e={}){return Bg(e).baseUrl}function Xo(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function od(e={}){let t=Xo(e);return ke({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Bg(e).trusted)}async function Mg(e={}){if(!Xo(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await id({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 id(e={},t={}){if(!Xo(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 v(`${rd(t)}/${n}/quote?${a}`,{headers:od(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?re(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function dO(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function ad(e={},t={}){if(!Xo(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return v(`${rd(t)}/${n}/approve/spender`,{headers:od(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Fg(e={},t={}){if(!Xo(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=je({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 v(`${rd(t)}/${n}/swap?${c}`,{headers:od(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=re(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!dO(r)){let f=l?.spender||l?.approvalAddress||(await ad({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 N({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:he(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}X();var mO=96*1024,Ug=50;function fO(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>mO)throw new Error("x402: invalid PAYMENT-REQUIRED payload");if(t.startsWith("{"))try{return JSON.parse(t)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED JSON")}if(!/^[A-Za-z0-9+/_-]+={0,2}$/.test(t)||t.length%4===1)throw new Error("x402: invalid PAYMENT-REQUIRED Base64");let n=t.replace(/-/g,"+").replace(/_/g,"/"),r=n+"=".repeat((4-n.length%4)%4);try{let o=Buffer.from(r,"base64").toString("utf8");if(!o.trim().startsWith("{"))throw new Error("shape");return JSON.parse(o)}catch{throw new Error("x402: invalid PAYMENT-REQUIRED Base64 JSON")}}function Ut(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function qg(e,t){let n=Ut(e,t);if(!/^\d+$/.test(n))throw new Error(`x402: ${t} must be atomic units`);let r=BigInt(n);if(r<=0n)throw new Error(`x402: ${t} must be positive`);return r.toString()}function hO(e){if(!e||typeof e!="object"||Array.isArray(e))return Object.freeze({});let t={};for(let n of["name","version"])typeof e[n]=="string"&&e[n].trim()&&(t[n]=e[n].trim());return Object.freeze(t)}function yO(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=Ut(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:Ut(e.network,`accepts[${t}].network`),amount:qg(e.amount,`accepts[${t}].amount`),asset:Ut(e.asset,`accepts[${t}].asset`),payTo:Ut(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:hO(e.extra)})}function sd(e){let t=fO(e);if(t.x402Version!==2)throw new Error("x402: only x402Version 2 is supported");if(!Array.isArray(t.accepts)||t.accepts.length===0||t.accepts.length>Ug)throw new Error(`x402: accepts must contain 1-${Ug} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:Ut(t.resource.url,"resource.url"),description:String(t.resource.description||""),mimeType:String(t.resource.mimeType||"")}):null;if(!n)throw new Error("x402: resource required");let r=Object.freeze(t.accepts.map(yO));for(let o of r)if(!Number.isInteger(o.maxTimeoutSeconds)||o.maxTimeoutSeconds<=0)throw new Error("x402: maxTimeoutSeconds must be a positive integer");return Object.freeze({x402Version:2,resource:n,accepts:r})}function Dg(e,t){return String(e)===String(t)}function gO(e,t={}){let n=sd(e),r=Ut(t.network,"network"),o=Ut(t.asset,"asset"),i=Ut(t.payTo,"payTo"),a=BigInt(qg(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&Dg(l.asset,o)&&Dg(l.payTo,i));if(s.length===0)throw new Error("x402: no exact requirement matches network, asset, and payTo");let c=s.sort((l,u)=>{let d=BigInt(l.amount),p=BigInt(u.amount);return d<p?-1:d>p?1:0})[0];if(BigInt(c.amount)>a)throw new Error(`x402: amount ${c.amount} exceeds maxAmount ${a}`);return c}function Hg(e={}){return e.paymentRequired??e.header??e.body}function jg(e={}){return sd(Hg(e))}function zg(e={},t={}){let n=sd(Hg(e)),r=gO(n,e);return N({provider:"x402",x402Version:2,resource:n.resource,accepted:r,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1,paymentReady:!1,requestTemplate:{x402Version:2,resource:n.resource,accepted:r,payload:null},nextStep:"A user-controlled wallet must create the scheme-specific payload. Oracle does not sign, call a facilitator, or retry the paid request."},{provider:"x402",kind:"x402-payment-template",nowMs:t.nowMs})}function Vg(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}O();var wO="https://api.bankr.bot";function cd(e={}){return Ee({provider:"bankr",defaultUrl:wO,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function Wg(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function vO(e={}){let t=Wg(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function Gg(e={},t=!1){let n=vO(e),r=cd(e);return ke({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function Kg(e,t={}){return v(`${cd(t).baseUrl}${e}`,{headers:Gg(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function ld(e={}){return Kg("/wallet/me",e)}async function Yg(e={}){return Kg("/wallet/portfolio",e)}function Qo(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function xO(e){let t=Qo(e,"amount");if(!/^\d+(?:\.\d+)?$/.test(t)||Number(t)<=0)throw new Error("bankr: amount must be a positive decimal string");return t}async function Jg(e={},t={}){let n={fromChain:Qo(e.fromChain,"fromChain"),fromToken:Qo(e.fromToken,"fromToken"),toChain:Qo(e.toChain,"toChain"),toToken:Qo(e.toToken,"toToken"),amount:xO(e.amount)};if(e.slippageBps!=null){let r=Number(e.slippageBps);if(!Number.isInteger(r)||r<10||r>2e3)throw new Error("bankr: slippageBps must be an integer from 10 through 2000");n.slippageBps=r}return v(`${cd(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:Gg(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function Xg(e={}){if(!Wg(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await ld(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var kO=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Zo(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||kO,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 y;try{y=JSON.parse(typeof h.data=="string"?h.data:String(h.data))}catch{y={raw:String(h.data).slice(0,200)}}u.push(y),y.channel&&y.channel!=="subscriptionResponse"?d+=1:y.data&&y.channel==="subscriptionResponse"||y.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 Qg(e={}){try{let t=await Zo({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 Zg(e={}){let t=await Zo({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function eb(e,t={}){if(!e)throw new Error("coin required");let n=await Zo({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var EO=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function us(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||EO,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",y=>{let w;try{w=JSON.parse(typeof y.data=="string"?y.data:String(y.data))}catch{w={raw:String(y.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 tb(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await us([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 nb(e,t={}){if(!e)throw new Error("assetId required");let n=await us([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}O();var _O="https://api.binance.com",PO="https://fapi.binance.com",TO=8;function ud(e={}){return(e.spotBaseUrl||e.baseUrl||process.env.BINANCE_API_URL||_O).replace(/\/$/,"")}function ds(e={}){return(e.futuresBaseUrl||process.env.BINANCE_FAPI_URL||PO).replace(/\/$/,"")}function ei(e){return{error:String(e.message||e).slice(0,200)}}function Qe(e){let t=Number(e);return Number.isFinite(t)?t:null}function ti(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}async function ps(e={}){try{let t=await v(`${ud(e)}/api/v3/ping`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:t&&typeof t=="object",provider:"binance-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"binance-public",error:String(t.message||t).slice(0,160)}}}async function ms(e={},t={}){let n=ti(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceTicker requires symbol or coin"};try{let r=e.full?"/api/v3/ticker/24hr":"/api/v3/ticker/price",o=await v(`${ud(t)}${r}?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"spot",symbol:n,price:Qe(o?.price??o?.lastPrice),volume24h:Qe(o?.volume),quoteVolume24h:Qe(o?.quoteVolume),raw:o}}catch(r){return ei(r)}}async function rb(e={},t={}){let n=ti(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOrderbook requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||20,1),1e3),o=String(e.market||"spot").toLowerCase()==="perp";try{let i=o?`${ds(t)}/fapi/v1/depth?symbol=${encodeURIComponent(n)}&limit=${r}`:`${ud(t)}/api/v3/depth?symbol=${encodeURIComponent(n)}&limit=${r}`,a=await v(i,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return ri({venue:"binance",market:o?"perp":"spot",symbol:n,bids:a?.bids,asks:a?.asks,raw:a})}catch(i){return ei(i)}}async function ni(e={},t={}){let n=ti(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFunding requires symbol or coin"};try{let r=await v(`${ds(t)}/fapi/v1/premiumIndex?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=Array.isArray(r)?r[0]:r,i=Number(e.fundingIntervalHours)||TO,a=Qe(o?.lastFundingRate);return{venue:"binance",market:"perp",symbol:n,markPrice:Qe(o?.markPrice),indexPrice:Qe(o?.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:Qe(o?.nextFundingTime),raw:o??null}}catch(r){return ei(r)}}async function ob(e={},t={}){let n=await ni(e,t);return n?.error?n:{venue:"binance",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function ib(e={},t={}){let n=ti(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceOpenInterest requires symbol or coin"};try{let r=await v(`${ds(t)}/fapi/v1/openInterest?symbol=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3});return{venue:"binance",market:"perp",symbol:n,openInterest:Qe(r?.openInterest),time:Qe(r?.time),raw:r??null}}catch(r){return ei(r)}}async function ab(e={},t={}){let n=ti(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"binanceFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),1e3);try{let o=await v(`${ds(t)}/fapi/v1/fundingRate?symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=Array.isArray(o)?o:[];return{venue:"binance",symbol:n,count:i.length,history:i.map(a=>({fundingTime:Qe(a?.fundingTime),fundingRate:Qe(a?.fundingRate)}))}}catch(o){return ei(o)}}function ri({venue:e,market:t,symbol:n,bids:r,asks:o,raw:i}){let a=m=>(Array.isArray(m)?m:[]).map(f=>{let h=Qe(Array.isArray(f)?f[0]:f?.price),y=Qe(Array.isArray(f)?f[1]:f?.size);return h==null||y==null?null:{price:h,size:y}}).filter(Boolean),s=a(r),c=a(o),l=s[0]?.price??null,u=c[0]?.price??null,d=l!=null&&u!=null?(l+u)/2:null,p=d?(u-l)/d*1e4:null;return{venue:e,market:t,symbol:n,bids:s,asks:c,bestBid:l,bestAsk:u,mid:d,spreadBps:p,raw:i??null}}O();var CO="https://www.okx.com",NO=8;function hr(e={}){return(e.baseUrl||process.env.OKX_API_URL||CO).replace(/\/$/,"")}function oi(e){return{error:String(e.message||e).slice(0,200)}}function Ge(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ii(e,{market:t="spot",quote:n="USDT"}={}){let r=String(e||"").trim().toUpperCase();if(!r)return"";if(r.includes("-"))return r;let o=`${r}-${n}`;return t==="perp"?`${o}-SWAP`:o}function yr(e){if(e&&String(e.code)!=="0"&&e.code!==void 0)throw new Error(`okx error ${e.code}: ${e.msg||"unknown"}`);let t=e?.data;return Array.isArray(t)?t:[]}async function fs(e={}){try{let t=await v(`${hr(e)}/api/v5/public/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:yr(t).length>0,provider:"okx-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"okx-public",error:String(t.message||t).slice(0,160)}}}async function hs(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=ii(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxTicker requires instId, symbol or coin"};try{let o=await v(`${hr(t)}/api/v5/market/ticker?instId=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=yr(o)[0];return i?{venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,price:Ge(i.last),bestBid:Ge(i.bidPx),bestAsk:Ge(i.askPx),volume24h:Ge(i.vol24h),quoteVolume24h:Ge(i.volCcy24h),raw:i}:{error:`okx ticker empty for ${r}`}}catch(o){return oi(o)}}async function cb(e={},t={}){let n=String(e.market||"spot").toLowerCase(),r=ii(e.instId||e.symbol||e.coin,{market:n,quote:e.quote||"USDT"});if(!r)return{error:"okxOrderbook requires instId, symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||20,1),400);try{let i=await v(`${hr(t)}/api/v5/market/books?instId=${encodeURIComponent(r)}&sz=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=yr(i)[0];return a?ri({venue:"okx",market:r.endsWith("-SWAP")?"perp":"spot",symbol:r,bids:a.bids,asks:a.asks,raw:a}):{error:`okx books empty for ${r}`}}catch(i){return oi(i)}}async function ys(e={},t={}){let n=ii(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxFunding requires instId, symbol or coin"};try{let r=await v(`${hr(t)}/api/v5/public/funding-rate?instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=yr(r)[0];if(!o)return{error:`okx funding-rate empty for ${n}`};let i=Number(e.fundingIntervalHours)||NO,a=Ge(o.fundingRate);return{venue:"okx",market:"perp",symbol:n,fundingRate:a,nextFundingRate:Ge(o.nextFundingRate),fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:Ge(o.nextFundingTime??o.fundingTime),raw:o}}catch(r){return oi(r)}}async function gs(e={},t={}){let n=ii(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxMarkPrice requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await v(`${hr(t)}/api/v5/public/mark-price?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=yr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,markPrice:Ge(i.markPx),time:Ge(i.ts),raw:i}:{error:`okx mark-price empty for ${n}`}}catch(o){return oi(o)}}async function lb(e={},t={}){let n=ii(e.instId||e.symbol||e.coin,{market:"perp",quote:e.quote||"USDT"});if(!n)return{error:"okxOpenInterest requires instId, symbol or coin"};let r=String(e.instType||"SWAP").toUpperCase();try{let o=await v(`${hr(t)}/api/v5/public/open-interest?instType=${encodeURIComponent(r)}&instId=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=yr(o)[0];return i?{venue:"okx",market:"perp",symbol:n,openInterest:Ge(i.oiCcy??i.oi),openInterestContracts:Ge(i.oi),openInterestUsd:Ge(i.oiUsd),time:Ge(i.ts),raw:i}:{error:`okx open-interest empty for ${n}`}}catch(o){return oi(o)}}O();var OO="https://api.bybit.com",RO=8;function ai(e={}){return(e.baseUrl||process.env.BYBIT_API_URL||OO).replace(/\/$/,"")}function si(e){return{error:String(e.message||e).slice(0,200)}}function Te(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function bs(e,t="USDT"){let n=String(e||"").trim().toUpperCase().replace(/[-_/]/g,"");return n?n.endsWith(t)?n:`${n}${t}`:""}function dd(e){let t=String(e||"spot").toLowerCase();return t==="perp"||t==="linear"||t==="swap"?"linear":t==="inverse"?"inverse":"spot"}function ci(e){if(e&&e.retCode!==void 0&&Number(e.retCode)!==0)throw new Error(`bybit error ${e.retCode}: ${e.retMsg||"unknown"}`);return e?.result??null}async function ws(e={}){try{let t=await v(`${ai(e)}/v5/market/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:!!ci(t),provider:"bybit-public",execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"bybit-public",error:String(t.message||t).slice(0,160)}}}async function db(e,t){let n=dd(e.market),r=bs(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybit requires symbol or coin"};let o=await v(`${ai(t)}/v5/market/tickers?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ci(o)?.list?.[0];return i?{row:i,symbol:r,category:n}:{error:`bybit tickers empty for ${r}`}}async function vs(e={},t={}){try{let n=await db(e,t);if(n.error)return n;let{row:r,symbol:o,category:i}=n;return{venue:"bybit",market:i==="spot"?"spot":"perp",symbol:o,price:Te(r.lastPrice),bestBid:Te(r.bid1Price),bestAsk:Te(r.ask1Price),markPrice:Te(r.markPrice),indexPrice:Te(r.indexPrice),volume24h:Te(r.volume24h),quoteVolume24h:Te(r.turnover24h),raw:r}}catch(n){return si(n)}}async function pb(e={},t={}){let n=dd(e.market),r=bs(e.symbol||e.coin,e.quote||"USDT");if(!r)return{error:"bybitOrderbook requires symbol or coin"};let o=Math.min(Math.max(Number(e.limit)||25,1),200);try{let i=await v(`${ai(t)}/v5/market/orderbook?category=${encodeURIComponent(n)}&symbol=${encodeURIComponent(r)}&limit=${o}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),a=ci(i);return a?ri({venue:"bybit",market:n==="spot"?"spot":"perp",symbol:r,bids:a.b,asks:a.a,raw:a}):{error:`bybit orderbook empty for ${r}`}}catch(i){return si(i)}}async function li(e={},t={}){try{let n=await db({...e,market:e.market||"perp"},t);if(n.error)return n;let{row:r,symbol:o}=n,i=Number(e.fundingIntervalHours)||RO,a=Te(r.fundingRate);return{venue:"bybit",market:"perp",symbol:o,markPrice:Te(r.markPrice),indexPrice:Te(r.indexPrice),fundingRate:a,fundingIntervalHours:i,fundingAprPct:a==null?null:a*(8760/i)*100,nextFundingTime:Te(r.nextFundingTime),openInterest:Te(r.openInterest),raw:r}}catch(n){return si(n)}}async function mb(e={},t={}){let n=await li(e,t);return n?.error?n:{venue:"bybit",market:"perp",symbol:n.symbol,markPrice:n.markPrice,indexPrice:n.indexPrice}}async function fb(e={},t={}){let n=bs(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitOpenInterest requires symbol or coin"};let r=dd(e.market||"perp"),o=String(e.intervalTime||"1h"),i=Math.min(Math.max(Number(e.limit)||1,1),200);try{let a=await v(`${ai(t)}/v5/market/open-interest?category=${encodeURIComponent(r)}&symbol=${encodeURIComponent(n)}&intervalTime=${encodeURIComponent(o)}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=ci(a)?.list,c=Array.isArray(s)?s[0]:null;return c?{venue:"bybit",market:"perp",symbol:n,openInterest:Te(c.openInterest),time:Te(c.timestamp),history:(Array.isArray(s)?s:[]).map(l=>({openInterest:Te(l?.openInterest),timestamp:Te(l?.timestamp)}))}:{error:`bybit open-interest empty for ${n}`}}catch(a){return si(a)}}async function hb(e={},t={}){let n=bs(e.symbol||e.coin,e.quote||"USDT");if(!n)return{error:"bybitFundingHistory requires symbol or coin"};let r=Math.min(Math.max(Number(e.limit)||10,1),200);try{let o=await v(`${ai(t)}/v5/market/funding/history?category=linear&symbol=${encodeURIComponent(n)}&limit=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),i=ci(o)?.list,a=Array.isArray(i)?i:[];return{venue:"bybit",symbol:n,count:a.length,history:a.map(s=>({fundingRate:Te(s?.fundingRate),fundingTime:Te(s?.fundingRateTimestamp)}))}}catch(o){return si(o)}}at();var pd=["binance","okx","bybit","hyperliquid"],gb=1;function ui(e){return{error:String(e.message||e).slice(0,200)}}function Le(e){if(e===""||e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function LO(e,t){return e==null||!t?null:e*(8760/t)*100}function md(e={}){return String(e.coin||e.symbol||"").trim().toUpperCase().replace(/[-_/]/g,"").replace(/USDT?$/,"")||""}function $O(e={}){let t=e.venues,n=Array.isArray(t)?t:typeof t=="string"&&t.trim()&&t.trim().toLowerCase()!=="all"?t.split(","):pd,r=new Set(n.map(i=>String(i).trim().toLowerCase()).filter(Boolean)),o=pd.filter(i=>r.has(i));return o.length?o:pd}async function BO(e={},t={}){let n=md(e);if(!n)return{error:"hyperliquidPerpLeg requires coin"};try{let r=await Ve(t),o=r?.[0]?.universe,i=r?.[1];if(!Array.isArray(o)||!Array.isArray(i))return{error:"hyperliquid metaAndAssetCtxs returned an unexpected shape"};let a=o.findIndex(l=>String(l?.name||"").toUpperCase()===n);if(a<0)return{error:`hyperliquid has no perp for ${n}`};let s=i[a]||{},c=Le(s.funding);return{venue:"hyperliquid",market:"perp",symbol:n,markPrice:Le(s.markPx),indexPrice:Le(s.oraclePx),midPrice:Le(s.midPx),fundingRate:c,fundingIntervalHours:gb,fundingAprPct:LO(c,gb),openInterest:Le(s.openInterest)}}catch(r){return ui(r)}}async function MO(e={},t={}){let n=md(e);if(!n)return{error:"hyperliquidSpotLeg requires coin"};try{let r=await ht(t),o=Le(r?.[n]);return o==null?{error:`hyperliquid allMids has no entry for ${n}`}:{venue:"hyperliquid",market:"spot",symbol:n,price:o}}catch(r){return ui(r)}}async function FO(e={},t={}){let[n,r]=await Promise.all([ys(e,t).catch(ui),gs(e,t).catch(ui)]);return n?.error&&r?.error?n:{...n?.error?{venue:"okx",market:"perp",fundingError:n.error}:n,markPrice:r?.error?null:Le(r.markPrice),...r?.error?{markError:r.error}:{}}}async function sn(e,t){try{let n=await t;return[e,n&&typeof n=="object"?n:{error:"empty response"}]}catch(n){return[e,ui(n)]}}async function fd(e={},t={}){let n=md(e);if(!n)return{error:"cexVenueLegs requires coin"};let r=e.quote||"USDT",o=$O(e),i=[];o.includes("binance")&&(i.push(sn("binance:perp",ni({coin:n,quote:r},t))),i.push(sn("binance:spot",ms({coin:n,quote:r},t)))),o.includes("okx")&&(i.push(sn("okx:perp",FO({coin:n,quote:r},t))),i.push(sn("okx:spot",hs({coin:n,quote:r,market:"spot"},t)))),o.includes("bybit")&&(i.push(sn("bybit:perp",li({coin:n,quote:r},t))),i.push(sn("bybit:spot",vs({coin:n,quote:r,market:"spot"},t)))),o.includes("hyperliquid")&&(i.push(sn("hyperliquid:perp",BO({coin:n},t))),i.push(sn("hyperliquid:spot",MO({coin:n},t))));let a=await Promise.all(i),s={};for(let[c,l]of a){let[u,d]=c.split(":");s[u]=s[u]||{},s[u][d]=l}return{coin:n,quote:r,venues:o,legs:s}}function bb(e){return!e||e.error?null:Le(e.price)??Le(e.mid)??null}function UO(e){return!e||e.error?null:Le(e.markPrice)??Le(e.midPrice)??null}async function hd(e={},t={}){let n=await fd(e,t);if(n.error)return n;let{coin:r,quote:o,venues:i,legs:a}=n,s=[];for(let f of i){let h=bb(a[f]?.spot);h!=null&&h>0&&s.push(h)}let c=[...s].sort((f,h)=>f-h),l=c.length?c.length%2?c[(c.length-1)/2]:(c[c.length/2-1]+c[c.length/2])/2:null,u=[];for(let f of i){let h=a[f]?.perp,y=a[f]?.spot,w=UO(h),x=bb(y),g=x??l,b=w!=null&&g?(w-g)/g*1e4:null;u.push({venue:f,symbol:h?.symbol??y?.symbol??r,markPrice:w,spotPrice:x,spotSource:x!=null?f:l!=null?"cross-venue-median":null,basisBps:b,fundingRate:h&&!h.error?Le(h.fundingRate):null,fundingIntervalHours:h&&!h.error?Le(h.fundingIntervalHours):null,fundingAprPct:h&&!h.error?Le(h.fundingAprPct):null,openInterest:h&&!h.error?Le(h.openInterest):null,errors:[h?.error,y?.error].filter(Boolean)})}let d=DO(u),p=u.filter(f=>f.markPrice!=null),m=u.filter(f=>f.basisBps!=null);return{coin:r,quote:o,referenceSpot:l,asOf:new Date().toISOString(),venues:u,fundingSpreads:d,widestFundingSpread:d[0]??null,richestBasis:m.length?m.reduce((f,h)=>h.basisBps>f.basisBps?h:f):null,cheapestBasis:m.length?m.reduce((f,h)=>h.basisBps<f.basisBps?h:f):null,venuesPriced:p.length,venuesRequested:i.length,execution:"read-only",exec:!1,note:"Public market data only. Funding compared on an annualized basis (HL settles hourly, CEXes 8h). Not advice."}}function DO(e=[]){let t=e.filter(r=>Le(r?.fundingAprPct)!=null),n=[];for(let r=0;r<t.length;r++)for(let o=r+1;o<t.length;o++){let i=t[r],a=t[o],s=i.fundingAprPct-a.fundingAprPct,c=s>0?a.venue:i.venue,l=s>0?i.venue:a.venue;n.push({pair:`${i.venue}/${a.venue}`,aprSpreadPct:Math.abs(s),signedAprSpreadPct:s,longVenue:c,shortVenue:l})}return n.sort((r,o)=>o.aprSpreadPct-r.aprSpreadPct)}async function wb(e={},t={}){let n=await hd(e,t);return n.error?n:{coin:n.coin,asOf:n.asOf,venues:n.venues.map(r=>({venue:r.venue,symbol:r.symbol,fundingRate:r.fundingRate,fundingIntervalHours:r.fundingIntervalHours,fundingAprPct:r.fundingAprPct,errors:r.errors})),fundingSpreads:n.fundingSpreads,widestFundingSpread:n.widestFundingSpread,execution:"read-only",exec:!1}}async function vb(e={}){try{let t=await Promise.all([ps(e).catch(()=>({ok:!1})),fs(e).catch(()=>({ok:!1})),ws(e).catch(()=>({ok:!1}))]),n={binance:!!t[0]?.ok,okx:!!t[1]?.ok,bybit:!!t[2]?.ok};return{ok:Object.values(n).some(Boolean),provider:"cex-basis",upstream:n,execution:"read-only",exec:!1}}catch(t){return{ok:!1,provider:"cex-basis",error:String(t.message||t).slice(0,160)}}}import Eb from"node:path";import{homedir as e2}from"node:os";import{createHash as t2,randomUUID as n2}from"node:crypto";import ae from"node:fs";import xs from"node:path";import{createHash as HO,randomUUID as xb}from"node:crypto";var yd=1,gt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function cn(e){if(e===null)return"null";if(typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError("durable store values must contain finite numbers");return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(cn).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${cn(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function Sb(e){return HO("sha256").update(cn(e)).digest("hex")}function Ss(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);if(!Number.isFinite(n))throw new TypeError("clock must return epoch milliseconds, an ISO string, or a Date");return Math.trunc(n)}function ks(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function kb(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function gd(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function gr({filePath:e,kind:t,initialData:n,validateData:r,clock:o=()=>Date.now(),maxBytes:i=4*1024*1024,lockStaleMs:a=3e4,lockWaitMs:s=2e3,lockIdFactory:c=()=>xb()}={}){if(typeof e!="string"||e==="")throw new TypeError("filePath is required");if(!/^[a-z][a-z0-9._-]{0,63}$/i.test(String(t)))throw new TypeError("a bounded store kind is required");if(typeof n!="function"||typeof r!="function")throw new TypeError("initialData and validateData are required");if(!Number.isSafeInteger(i)||i<1024)throw new TypeError("maxBytes must be at least 1024");if(!Number.isSafeInteger(a)||a<1e3)throw new TypeError("lockStaleMs must be at least 1000");if(!Number.isSafeInteger(s)||s<0||s>3e4)throw new TypeError("lockWaitMs must be between 0 and 30000");let l=`${e}.lock`;function u(){let g=n();return r(g),{schemaVersion:yd,kind:t,generation:0,data:g}}function d(g){let b;try{b=JSON.parse(g)}catch(k){throw new gt(`corrupt ${t} snapshot: invalid JSON (${k.message})`,"STORE_CORRUPT")}if(!b||typeof b!="object"||Array.isArray(b))throw new gt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(b.schemaVersion!==yd)throw new gt(`unsupported ${t} schemaVersion ${String(b.schemaVersion)}`,"STORE_SCHEMA");if(b.kind!==t||!Number.isSafeInteger(b.generation)||b.generation<0)throw new gt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:S,...I}=b;if(typeof S!="string"||!/^[a-f0-9]{64}$/.test(S)||Sb(I)!==S)throw new gt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(b.data)}catch(k){throw new gt(`corrupt ${t} snapshot: ${k.message}`,"STORE_CORRUPT")}return I}function p(){if(!ae.existsSync(e))return u();let g=ae.statSync(e);if(!g.isFile()||g.size>i)throw new gt(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ae.chmodSync(e,384)}catch{}return d(ae.readFileSync(e,"utf8"))}function m(){kb(xs.dirname(e));let g=Ss(o),b=String(c()),S=`${JSON.stringify({schemaVersion:1,lockId:b,pid:process.pid,acquiredAt:g})}
|
|
146
|
+
`,I=()=>{let _;try{return _=ae.openSync(l,"wx",384),ae.writeFileSync(_,S,"utf8"),ae.fsyncSync(_),ae.closeSync(_),{lockId:b}}catch(C){let $=_!==void 0;if($)try{ae.closeSync(_)}catch{}if($)try{ae.unlinkSync(l)}catch{}if(C?.code!=="EEXIST")throw C;return null}},E=Ss(o)+s,P=new Int32Array(new SharedArrayBuffer(4));for(;;){let _=I();if(_)return _;let C=Ss(o),$=gd(l),D=!1;if($){let R=C-Number($.acquiredAt??$.mtimeMs);D=Number.isFinite(R)&&R>=a}else try{D=C-ae.statSync(l).mtimeMs>=a}catch{D=!1}if(D){let R=gd(l);if($?R?.lockId===$.lockId:R===null){try{ae.unlinkSync(l)}catch(B){if(B?.code!=="ENOENT")throw B}continue}}let H=E-C;if(H<=0)throw new gt(`${t} store is busy`,"STORE_BUSY");Atomics.wait(P,0,0,Math.min(10,H))}}function f(g){if(gd(l)?.lockId===g.lockId)try{ae.unlinkSync(l)}catch(S){if(S?.code!=="ENOENT")throw S}}function h(g){r(g.data);let b={...g,integrity:Sb(g)},S=`${cn(b)}
|
|
147
|
+
`;if(Buffer.byteLength(S)>i)throw new gt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let I=xs.dirname(e);kb(I);let k=xs.join(I,`.${xs.basename(e)}.${process.pid}.${xb()}.tmp`),E;try{E=ae.openSync(k,"wx",384),ae.writeFileSync(E,S,"utf8"),ae.fsyncSync(E),ae.closeSync(E),E=void 0,ae.renameSync(k,e);try{ae.chmodSync(e,384)}catch{}try{let P=ae.openSync(I,"r");try{ae.fsyncSync(P)}finally{ae.closeSync(P)}}catch{}}finally{if(E!==void 0)try{ae.closeSync(E)}catch{}try{ae.unlinkSync(k)}catch(P){if(P?.code!=="ENOENT")throw P}}}function y(){return ks(p().data)}function w(){let g=p();return{schemaVersion:g.schemaVersion,kind:g.kind,generation:g.generation,data:ks(g.data)}}function x(g){if(typeof g!="function")throw new TypeError("mutator must be a function");let b=m();try{let S=p(),I=ks(S.data),k=g(I,{generation:S.generation,now:Ss(o)});return r(I),h({schemaVersion:yd,kind:t,generation:S.generation+1,data:I}),ks(k)}finally{f(b)}}return Object.freeze({filePath:e,read:y,inspect:w,mutate:x})}import{wordlists as jO}from"ethers";var zO=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),VO=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],WO=new Set([12,15,18,21,24]);function GO(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return WO.has(t.length)&&t.every(n=>jO.en.getWordIndex(n)>=0)}var KO=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,YO=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,JO=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function XO(e){let t=Ib(e);return JO.has(t)||YO.test(t)}var di=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Ib(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function QO(e){let t=Ib(e);return[...zO].some(n=>t.includes(n))}function ZO(e,t,n){if(typeof t=="string"){if(VO.some(r=>r.test(t))||GO(t))throw new di(n);if(KO.test(t)&&!XO(e))throw new di(n)}}function bd(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return ZO(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)=>bd(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(QO(o))throw new di(i);e[o]!==void 0&&(r[o]=bd(e[o],i,o))}return r}function Dt(e){return bd(e)}var Es=1,Ab="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",JH=Object.freeze(["listing","offer","arm","instruct"]),r2=Object.freeze(["open","cancelled","expired","armed","submitted"]),XH=Object.freeze(["arm","sign-and-broadcast"]),o2=Object.freeze({protocol:"oracle-a2a/1",name:"oracle-local-marketplace",brand:"Oracle",publisher:"Oracle",product:"Oracle",role:"Oracle owner-local P2 catalog",consultOnly:!0,remoteDelegation:!1,pluginExecution:!1,refusesSignHash:!0,skills:Object.freeze(["list-local-listings"]),note:"Oracle consult-only local Agent Card. Untrusted A2A text cannot create, fill, cancel, sign, or broadcast listings. Existing marketplace providers are unchanged. No plugin pack loader."}),i2=/^(?:0|[1-9][0-9]*)$/,a2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,s2=/^0x[a-fA-F0-9]{40}$/,c2=/^0x[a-fA-F0-9]{64}$/,l2=/[\u0000-\u001f\u007f]/,u2=new Set(r2),xd=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function G(e,t){throw new xd(e,t)}function Mn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Mn(t);Object.freeze(e)}return e}function mi(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&G(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||l2.test(o))&&G(`${t} is invalid`),r?o.toLowerCase():o}function Fe(e,t){let n=mi(e,t,{max:128});return a2.test(n)||G(`${t} must be a bounded id`),n}function pi(e,t,{positive:n=!1}={}){typeof e=="number"&&G(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return i2.test(r)||G(`${t} must be a canonical integer string`),n&&r==="0"&&G(`${t} must be positive`),r}function Bn(e,t){let n=mi(e,t,{max:42,lower:!0});return s2.test(n)||G(`${t} must be a 20-byte EVM address`),n}function _b(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&G(`${t} must be a plain object`),e}function $n(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&G("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function wd(e){return new Date(e).toISOString()}function d2(e){return t2("sha256").update(cn(e),"utf8").digest("hex")}function p2(e=process.env){let t=e.ORACLE_CONFIG_DIR||Eb.join(e2(),".config","oracle");return Eb.join(t,"local-marketplace.v1.json")}function Is(e){let t=e.status==="submitted";return Mn({schemaVersion:Es,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:u2.has(e.status)?e.status:G("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>Mn({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:Ab,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function m2(e){(!e||e.schemaVersion!==Es||!Array.isArray(e.listings))&&G("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&G("marketplace capacity exceeded","STORE_LIMIT")}function vd(e,t){return Mn({schemaVersion:Es,recordType:"local-marketplace-armed",listingId:e.listingId,offerId:t.offerId,tenantId:e.tenantId,seller:e.seller,buyer:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId,listingHash:e.listingHash,unsigned:{kind:"local-p2-fill",from:e.seller,to:t.buyer,asset:e.asset,amount:t.amount,price:e.price,chainId:e.chainId},review:`Local P2 fill ${e.listingId} is armed for the owner-local signer: seller ${e.seller} transfers ${t.amount} ${e.asset} to ${t.buyer} at ${e.price} on chain ${e.chainId}. Sign and broadcast still require an explicit instruction.`,label:Ab,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function f2(e,t,n){typeof e=="string"&&G("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=_b(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&G("generic signHash is refused","SIGNHASH_REFUSED");let o=Bn(r.from??r.offerer??t.seller,"artifact.from"),i=Bn(r.to??r.recipient??n.buyer,"artifact.to"),a=pi(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&G("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&G("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&G("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&G("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function h2(e,t){if(e==null)return{action:"arm"};let n=_b(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&G("generic signHash is refused","SIGNHASH_REFUSED");let r=mi(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&G("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&G("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&G("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&G("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&G("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&G("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function Pb({filePath:e=p2(),clock:t=()=>Date.now(),idFactory:n=()=>n2()}={}){let r=gr({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Es,listings:[]}),validateData:m2});function o(h,y){return h.tenantId===y}function i(h,y){return h.status==="open"&&Date.parse(h.expiresAt)<=y&&(h.status="expired"),h}function a(h={}){Dt(h);let y=Fe(h.tenantId,"tenantId"),w=Bn(h.seller,"seller"),x=mi(h.asset,"asset",{max:128}),g=pi(h.amount,"amount",{positive:!0}),b=pi(h.price,"price",{positive:!0}),S=pi(h.chainId,"chainId",{positive:!0}),I=$n(t),k=wd(I),E=h.expiresAt==null?wd(I+864e5):mi(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(E))||Date.parse(E)<=I)&&G("expiresAt must be after now");let P=Fe(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(_=>{_.listings.some(D=>D.listingId===P)&&G("listingId already exists","DUPLICATE");let C={listingId:P,tenantId:y,seller:w,asset:x,amount:g,price:b,chainId:S,status:"open",createdAt:k,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},$={...C,listingHash:d2(C)};return _.listings.push($),Is($)})}function s({tenantId:h}={}){let y=Fe(h,"tenantId"),w=$n(t);return Mn(r.read().listings.filter(x=>o(x,y)).map(x=>Is(i({...x,offers:x.offers.map(g=>({...g}))},w))))}function c({tenantId:h,listingId:y,actor:w}={}){let x=Fe(h,"tenantId"),g=Fe(y,"listingId"),b=Bn(w,"actor"),S=$n(t);return r.mutate(I=>{let k=I.listings.find(E=>o(E,x)&&E.listingId===g);return k||G("listing not found","NOT_FOUND"),i(k,S),k.seller!==b&&G("only the seller can cancel","FORBIDDEN"),k.status!=="open"&&G("listing is not open","NOT_OPEN"),k.status="cancelled",Is(k)})}function l(h={}){Dt(h);let y=Fe(h.tenantId,"tenantId"),w=Fe(h.listingId,"listingId"),x=Bn(h.buyer,"buyer"),g=pi(h.amount,"amount",{positive:!0}),b=$n(t),S=Fe(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(I=>{let k=I.listings.find(E=>o(E,y)&&E.listingId===w);return k||G("listing not found","NOT_FOUND"),i(k,b),k.status!=="open"&&G("listing is not open","NOT_OPEN"),k.seller===x&&G("seller cannot offer on their own listing","FORBIDDEN"),k.offers.some(E=>E.offerId===S)&&G("offerId already exists","DUPLICATE"),k.offers.push({offerId:S,buyer:x,amount:g,status:"open",createdAt:wd(b)}),Is(k)})}function u(h,{tenantId:y,listingId:w,offerId:x,actor:g,now:b,allowed:S=["open","armed"]}){let I=h.listings.find(E=>o(E,y)&&E.listingId===w);I||G("listing not found","NOT_FOUND"),i(I,b),S.includes(I.status)||G("listing is not open","NOT_OPEN"),I.seller!==g&&G("only the seller can arm a fill","FORBIDDEN");let k=I.offers.find(E=>E.offerId===x);return(!k||!["open","armed"].includes(k.status))&&G("offer not found","NOT_FOUND"),{row:I,offer:k}}function d({tenantId:h,listingId:y,offerId:w,actor:x}={}){let g=Fe(h,"tenantId"),b=Fe(y,"listingId"),S=Fe(w,"offerId"),I=Bn(x,"actor"),k=$n(t);return r.mutate(E=>{let{row:P,offer:_}=u(E,{tenantId:g,listingId:b,offerId:S,actor:I,now:k});return P.status="armed",_.status="armed",vd(P,_)})}async function p({tenantId:h,listingId:y,offerId:w,actor:x,instruction:g,executor:b}={}){let S=Fe(h,"tenantId"),I=Fe(y,"listingId"),k=Fe(w,"offerId"),E=Bn(x,"actor"),P=$n(t),_=r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:S,listingId:I,offerId:k,actor:E,now:P,allowed:["open","armed"]}),Ie=h2(g,W);return W.status="armed",pe.status="armed",{armed:vd(W,pe),instruction:Ie,listingHash:W.listingHash}});if(_.instruction.action==="arm")return _.armed;let C=r.read().listings.find(B=>B.listingId===I&&B.tenantId===S),$=C?.offers.find(B=>B.offerId===k),D=f2(_.instruction.artifact,C,$);(!b||typeof b.executeConfirmedArtifact!="function")&&G("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof b.signHash=="function"&&G("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await b.executeConfirmedArtifact(D,_.instruction.nonce,b),R=H?.receipt?.transactionHash??H?.transactionHash;(typeof R!="string"||!c2.test(R))&&G("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let j=H?.receipt?.status??H?.status;return j!==1&&j!=="0x1"&&G("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:S,listingId:I,offerId:k,actor:E,now:$n(t),allowed:["armed"]});return W.status="submitted",pe.status="submitted",W.transactionHash=R.toLowerCase(),Mn({...vd(W,pe),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:W.transactionHash,review:`Local P2 fill ${W.listingId} signed and broadcast through the instructed local signer. transactionHash=${W.transactionHash}`})})}function m({tenantId:h,text:y}={}){return Fe(h,"tenantId"),(typeof y!="string"||y.trim()==="")&&G("consult text required"),Mn({accepted:!1,reason:"untrusted consult text cannot create, fill, or cancel listings",custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1})}function f(){return o2}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import Tb from"node:path";import{homedir as y2}from"node:os";import{createHash as g2,randomUUID as b2}from"node:crypto";var _s=1,Cb="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",o9=Object.freeze(["open","cancelled","armed","submitted"]),w2=/^(?:0|[1-9][0-9]*)$/,v2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,x2=/^0x[a-fA-F0-9]{40}$/,S2=/^0x[a-fA-F0-9]{64}$/,k2=/[\u0000-\u001f\u007f]/,Id=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function J(e,t){throw new Id(e,t)}function fi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))fi(t);Object.freeze(e)}return e}function hi(e,t,{max:n=256}={}){typeof e!="string"&&J(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||k2.test(r))&&J(`${t} is invalid`),r}function qt(e,t){let n=hi(e,t,{max:128});return v2.test(n)||J(`${t} must be a bounded id`),n}function As(e,t,{positive:n=!1}={}){typeof e=="number"&&J(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return w2.test(r)||J(`${t} must be a canonical integer string`),n&&r==="0"&&J(`${t} must be positive`),r}function Fn(e,t){let n=hi(e,t,{max:42}).toLowerCase();return x2.test(n)||J(`${t} must be a 20-byte EVM address`),n}function I2(e){let t=hi(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{J("resource must be an https URL")}return n.protocol!=="https:"&&J("resource must be https"),(n.username||n.password)&&J("resource must not contain credentials"),n.toString()}function Nb(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&J(`${t} must be a plain object`),e}function E2(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&J("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function A2(e){return new Date(e).toISOString()}function _2(e=process.env){let t=e.ORACLE_CONFIG_DIR||Tb.join(y2(),".config","oracle");return Tb.join(t,"local-x402.v1.json")}function Sd(e){let t=e.status==="submitted";return fi({schemaVersion:_s,intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,maxBudget:e.maxBudget,asset:e.asset,chainId:e.chainId,status:e.status,createdAt:e.createdAt,intentHash:e.intentHash,transactionHash:e.transactionHash||null,label:Cb,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function P2(e){(!e||e.schemaVersion!==_s||!Array.isArray(e.intents))&&J("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&J("x402 capacity exceeded","STORE_LIMIT")}function kd(e){return fi({schemaVersion:_s,recordType:"local-x402-armed",intentId:e.intentId,tenantId:e.tenantId,payer:e.payer,payTo:e.payTo,resource:e.resource,amount:e.amount,asset:e.asset,chainId:e.chainId,intentHash:e.intentHash,unsigned:{kind:"local-x402-pay",from:e.payer,to:e.payTo,amount:e.amount,asset:e.asset,chainId:e.chainId,resource:e.resource},review:`Oracle local x402 ${e.intentId} is armed: pay ${e.amount} ${e.asset} to ${e.payTo} for ${e.resource}. Sign and broadcast still require an explicit instruction.`,label:Cb,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function T2(e,t){typeof e=="string"&&J("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=Nb(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=Fn(n.from??t.payer,"artifact.from"),o=Fn(n.to??t.payTo,"artifact.to"),i=As(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&J("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&J("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&J("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&J("amount exceeds maxBudget","BUDGET"),n}function C2(e,t){if(e==null)return{action:"arm"};let n=Nb(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=hi(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&J("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&J("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&J("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&J("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function Ob({filePath:e=_2(),clock:t=()=>Date.now(),idFactory:n=()=>b2()}={}){let r=gr({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:_s,intents:[]}),validateData:P2});function o(l={}){Dt(l);let u=qt(l.tenantId,"tenantId"),d=Fn(l.payer,"payer"),p=Fn(l.payTo,"payTo"),m=I2(l.resource),f=As(l.amount,"amount",{positive:!0}),h=As(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&J("amount exceeds maxBudget","BUDGET");let y=hi(l.asset??"USDC","asset",{max:32}),w=As(l.chainId,"chainId",{positive:!0}),x=E2(t),g=qt(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(b=>{b.intents.some(k=>k.intentId===g)&&J("intentId already exists","DUPLICATE");let S={intentId:g,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:y,chainId:w,status:"open",createdAt:A2(x),custody:"none",execution:"armed-local"},I={...S,intentHash:g2("sha256").update(cn(S),"utf8").digest("hex")};return b.intents.push(I),Sd(I)})}function i({tenantId:l}={}){let u=qt(l,"tenantId");return fi(r.read().intents.filter(d=>d.tenantId===u).map(Sd))}function a({tenantId:l,intentId:u,actor:d}={}){let p=qt(l,"tenantId"),m=qt(u,"intentId"),f=Fn(d,"actor");return r.mutate(h=>{let y=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return y||J("intent not found","NOT_FOUND"),y.payer!==f&&J("only the payer can cancel","FORBIDDEN"),y.status!=="open"&&J("intent is not open","NOT_OPEN"),y.status="cancelled",Sd(y)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=qt(l,"tenantId"),m=qt(u,"intentId"),f=Fn(d,"actor");return r.mutate(h=>{let y=h.intents.find(w=>w.tenantId===p&&w.intentId===m);return y||J("intent not found","NOT_FOUND"),y.payer!==f&&J("only the payer can arm","FORBIDDEN"),["open","armed"].includes(y.status)||J("intent is not open","NOT_OPEN"),y.status="armed",kd(y)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=qt(l,"tenantId"),h=qt(u,"intentId"),y=Fn(d,"actor"),w=r.mutate(k=>{let E=k.intents.find(_=>_.tenantId===f&&_.intentId===h);E||J("intent not found","NOT_FOUND"),E.payer!==y&&J("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||J("intent is not open","NOT_OPEN");let P=C2(p,E);return E.status="armed",{armed:kd(E),instruction:P}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(k=>k.tenantId===f&&k.intentId===h),g=T2(w.instruction.artifact,x);(!m||typeof m.executeConfirmedArtifact!="function")&&J("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&J("generic signHash executors are refused","SIGNHASH_REFUSED");let b=await m.executeConfirmedArtifact(g,w.instruction.nonce,m),S=b?.receipt?.transactionHash??b?.transactionHash;(typeof S!="string"||!S2.test(S))&&J("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let I=b?.receipt?.status??b?.status;return I!==1&&I!=="0x1"&&J("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(k=>{let E=k.intents.find(P=>P.tenantId===f&&P.intentId===h);return(!E||E.status!=="armed")&&J("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=S.toLowerCase(),fi({...kd(E),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:E.transactionHash,review:`Oracle local x402 ${E.intentId} signed and broadcast. transactionHash=${E.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import Rb from"node:path";import{homedir as N2}from"node:os";import{randomUUID as O2}from"node:crypto";var _d=1,R2="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",m9=Object.freeze(["listed","revoked"]),L2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,$2=/[\u0000-\u001f\u007f]/,B2=/^[a-f0-9]{64}$/,M2=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,F2=new Set(["read","prepare","none"]),Ad=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function _e(e,t){throw new Ad(e,t)}function Pd(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Pd(t);Object.freeze(e)}return e}function ln(e,t,{max:n=256}={}){typeof e!="string"&&_e(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||$2.test(r))&&_e(`${t} is invalid`),r}function yi(e,t){let n=ln(e,t,{max:128});return L2.test(n)||_e(`${t} must be a bounded id`),n}function Lb(e,t){let n=ln(e,t,{max:64}).toLowerCase();return B2.test(n)||_e(`${t} must be 64 lowercase hex`),n}function U2(e,t){let n=ln(e,t,{max:2048}),r;try{r=new URL(n)}catch{_e(`${t} must be an https URL`)}return r.protocol!=="https:"&&_e(`${t} must be https`),(r.username||r.password)&&_e(`${t} must not contain credentials`),r.toString()}function D2(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&_e("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=ln(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!M2.test(r)||r==="0.0.0.0")&&_e(`outboundHosts[${n}] is not an allowlisted host`),r}))}function $b(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&_e("clock invalid","CLOCK_INVALID"),n}function Bb(e){return new Date(e).toISOString()}function q2(e=process.env){let t=e.ORACLE_CONFIG_DIR||Rb.join(N2(),".config","oracle");return Rb.join(t,"local-pack-registry.v1.json")}function Ed(e){return Pd({schemaVersion:_d,packId:e.packId,tenantId:e.tenantId,name:e.name,version:e.version,publisher:e.publisher,manifestDigest:e.manifestDigest,sbomDigest:e.sbomDigest,homepage:e.homepage,outboundHosts:e.outboundHosts,spendScope:e.spendScope,status:e.status,createdAt:e.createdAt,revokedAt:e.revokedAt,label:R2,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function H2(e){(!e||e.schemaVersion!==_d||!Array.isArray(e.packs))&&_e("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&_e("pack registry capacity exceeded","STORE_LIMIT")}function Mb({filePath:e=q2(),clock:t=()=>Date.now(),idFactory:n=()=>O2()}={}){let r=gr({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:_d,packs:[]}),validateData:H2});function o(l={}){Dt(l);let u=yi(l.tenantId,"tenantId"),d=ln(l.name,"name",{max:128}),p=ln(l.version,"version",{max:64}),m=ln(l.publisher,"publisher",{max:128}),f=Lb(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Lb(l.sbomDigest,"sbomDigest"),y=l.homepage==null?null:U2(l.homepage,"homepage"),w=D2(l.outboundHosts),x=ln(l.spendScope??"none","spendScope",{max:16});F2.has(x)||_e("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&_e("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let g=$b(t),b=yi(String(l.packId??`pack-${n()}`),"packId");return r.mutate(S=>{S.packs.some(k=>k.packId===b||k.tenantId===u&&k.name===d&&k.version===p&&k.status==="listed")&&_e("pack already listed","DUPLICATE");let I={packId:b,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:y,outboundHosts:w,spendScope:x,status:"listed",createdAt:Bb(g),revokedAt:null,execution:"none",pluginExecution:!1};return S.packs.push(I),Ed(I)})}function i({tenantId:l}={}){let u=yi(l,"tenantId");return Pd(r.read().packs.filter(d=>d.tenantId===u).map(Ed))}function a({tenantId:l,packId:u}={}){let d=yi(l,"tenantId"),p=yi(u,"packId"),m=$b(t);return r.mutate(f=>{let h=f.packs.find(y=>y.tenantId===d&&y.packId===p);return h||_e("pack not found","NOT_FOUND"),h.status!=="listed"&&_e("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=Bb(m),Ed(h)})}function s(){_e("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){_e("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}O();import{getAddress as Y2,Interface as wr,keccak256 as Nd}from"ethers";import{createHash as Od,createHmac as J2,timingSafeEqual as Qb}from"node:crypto";fe();import{Interface as Db,getAddress as Td,isAddress as j2}from"ethers";var z2="0x0000000000000000000000000000000000000000",qb=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),V2=new Db(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),W2=new Db(["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 G2(e){let t=Number(e??4663),n=qb[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Fb(e,t){if(/^weth$/i.test(String(e||"")))return Td(qb[t].weth);if(!j2(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Td(e)}function K2(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function Ub(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 Hb(e,t={},n={}){try{let r=G2(t.chainId),o=Fb(t.tokenIn,r.chainId),i=Fb(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=K2(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||U,l=await Ub(c,r.chainId,r.factory,V2,"getPool",[o,i,s]),u=Td(l[0]);if(u.toLowerCase()===z2)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 Ub(c,r.chainId,r.quoter,W2,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 jb(e={},t={}){return Hb("exact-input",e,t)}async function zb(e={},t={}){return Hb("exact-output",e,t)}X();var V=4663,Ps="https://anvil.clutch.market",X2=`${Ps}/api/markets/snapshot?chainId=${V}`,Q2=`${Ps}/api/rpc?chainId=${V}`,Z2=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Ze="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Rd="0x0000000000000000000000000000000000000000",Un=1e5,eR=256e3,Vb=256,tR=3e4,nR=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"}),lt=Object.freeze({chainId:V,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),$e=new wr(["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"]),rR=new wr(["function allowance(address owner,address spender) view returns (uint256)"]),Zb=new wr(["function decimals() view returns (uint8)"]),Wb=new wr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),ut=new wr(["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)"]),un=new wr(["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 q(e,t){try{return Y2(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function jt(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 et(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(V,"eth_call",[{to:q(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function ew(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 Gb(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>Vb)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Vb}`);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)!==V)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${V}`);return{name:n.name||n.collectionName||null,chainId:V,collection:q(n.collection||n.collectionAddress,"Anvil collection"),market:q(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?q(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 oR(e,t,n=[],r={}){if(Number(e)!==V)throw new Error(`stonkbrokers: Anvil supports chain ${V} only`);if(!Z2.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await v(Q2,{method:"POST",headers:{origin:Ps,referer:`${Ps}/`,"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 bt(e={}){return e.rpcCall||((t,n,r)=>oR(t,n,r,e))}async function vr(e={},t={}){if(e.snapshot){let s=Gb(e.snapshot),c={kind:"anvil-markets",chainId:V,total:s.length,contentHash:Od("sha256").update(br(s)).digest("hex")},l=Ld(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 v(X2,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:eR,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=Gb(r),i={kind:"anvil-markets",chainId:V,total:o.length,contentHash:Od("sha256").update(br(o)).digest("hex")},a=Ld(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 Ts(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 tw({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=nR[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=bt(n),c=Ts(await s(V,"eth_blockNumber",[])),l=await s(V,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||Ts(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(V,"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=Nd(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+tR}}function nw(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:V,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 bi(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=jt(e.tokenId),i=await tw({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,$e,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,$e,"inventory",[BigInt(o)],s),ee(a,r,ut,"ownerOf",[BigInt(o)],s),ee(a,n,$e,"collection",[],s),ee(a,n,$e,"token",[],s),ee(a,n,$e,"robinhoodSwapFeeWei",[],s)]),f=q(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=q(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let y=Number((await ee(a,h,Zb,"decimals",[],s))[0]);if(!Number.isSafeInteger(y)||y<0||y>255)throw new Error("stonkbrokers: invalid payment token decimals");let w=BigInt(m[0]).toString(),x=nw(i,{paymentToken:h,paymentTokenDecimals:y,nativeSwapFeeWei:w}),g=!!c[4],b=!!l[0],S=q(u[0],"NFT owner")===n,I=g&&b&&S;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:V,market:n,collection:r,tokenId:o,paymentToken:h,paymentTokenDecimals:y,amountUnits:"payment-token-raw",totalCostRaw:BigInt(c[0]).toString(),baseCostRaw:BigInt(c[1]).toString(),nativeSwapFeeWei:w,fees:ew(c[2],c[3]),available:I,evidence:{quoteAvailable:g,inventory:b,ownerIsMarket:S,marketCollection:f,attestation:x},reason:I?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Cs(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await tw({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,$e,"quoteSellNFT",[],a),ee(i,n,$e,"collection",[],a),ee(i,n,$e,"token",[],a),ee(i,n,$e,"robinhoodSwapFeeWei",[],a)]),d=q(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=q(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,Zb,"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=nw(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:V,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:ew(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function rw(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 Ht(e,t){let n=et(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function ow({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:V,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:Ht(o,"gasLimit").toString(),maxFeePerGas:Ht(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=Ht(a,"maxPriorityFeePerGasWei").toString()),c}function iw(e,t){return N({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 aw(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=q(e.market,"Anvil market"),o=q(e.collection,"NFT collection"),i=jt(e.tokenId),a=Ht(e.maxTotalCostRaw,"maxTotalCostRaw"),s=et(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 bi({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=Ht(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=q(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),y=l.evidence.attestation,w={blockHash:y.blockHash,requireCanonical:!0},x=BigInt((await ee(bt(t),f,rR,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let g={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},b=[ow({...g,to:r,data:$e.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:y,anvilQuote:S,preconditions:{allowanceVerified:!0,allowanceRaw:x.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:rw(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:y,anvilQuote:S,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:b}};return iw(I,l)}async function sw(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=bt(t),r=q(e.seller,"seller"),o=q(e.market,"Anvil market"),i=q(e.collection,"NFT collection"),a=jt(e.tokenId),s=Ht(e.minPayoutRaw,"minPayoutRaw"),c=et(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 Cs({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([ee(n,i,ut,"ownerOf",[BigInt(a)],p).then(_=>q(_[0],"NFT owner")),ee(n,i,ut,"getApproved",[BigInt(a)],p).then(_=>q(_[0],"NFT approval")),ee(n,i,ut,"isApprovedForAll",[r,o],p).then(_=>!!_[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 y=BigInt(u.netPayoutRaw),w=Ht(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(w!==y)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let x=Number(t.nowMs??Date.now()),g=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),b=q(u.paymentToken,"Anvil payment token"),S=Number(u.paymentTokenDecimals),I={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},k=[ow({...I,to:o,data:$e.encodeFunctionData("sellNFT",[BigInt(a),y]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},P={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:y.toString(),minPayoutRaw:y.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:E,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:w.toString()},tradeId:rw(e.tradeId),slippageBps:0,expiresAtMs:x+g,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:b,paymentTokenDecimals:S,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:y.toString(),minPayoutRaw:y.toString(),transactions:k}};return iw(P,u)}async function iR(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(S=>jt(S)),g={kind:"anvil-inventory",chainId:V,market:q(e.market,"Anvil market"),collection:q(e.collection,"NFT collection"),total:x.length,contentHash:Od("sha256").update(br(x)).digest("hex")},b=Ld(e.inventoryCompletenessEvidence,g,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=bt(t),r=q(e.market,"Anvil market"),o=Ts(await n(V,"eth_blockNumber",[])),i=await n(V,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||Ts(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,$e,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>Un)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${Un}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>Un))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${Un}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:Un};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,$e,"oldestTokenId",[],s))[0]),h=[],y=new Set;for(;h.length<l&&h.length<p&&!y.has(f.toString());){let x=f.toString();y.add(x),h.push(x),f=BigInt((await ee(n,r,$e,"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 aR(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 sR(e,t,n){let r=bt(n);try{let o=String((await ee(r,e,ut,"tokenURI",[BigInt(t)]))[0]),i=aR(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await v(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,ut,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function cw(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 cR(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 Ns(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await iR({...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=bt(t),p=(await be(i,s,async h=>{try{let y=await ee(u,r,ut,"rarityOf",[BigInt(h)]);return{tokenId:h,stars:Number(y[0])+1}}catch(y){return e.includeErrors?{tokenId:h,stars:null,error:String(y.message||y)}:null}})).filter(h=>h&&h.stars>=a),f=(await be(p,s,async h=>{try{let y=await bi({market:n,collection:r,tokenId:h.tokenId},t);return{tokenId:h.tokenId,stars:h.stars,traits:[{trait_type:"Stars",value:h.stars}],available:y.available,quote:y,decision:"WATCH",reason:"rarity is ranking-only until exact exit liquidity clears net-profit gates"}}catch(y){return e.includeErrors?{tokenId:h.tokenId,stars:h.stars,available:!1,error:String(y.message||y)}:null}})).filter(Boolean).sort((h,y)=>Number(y.stars||0)-Number(h.stars||0)||(BigInt(h.tokenId)<BigInt(y.tokenId)?-1:1));return{provider:"stonkbrokers",source:"anvil-live-inventory-rarityOf",chainId:V,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 be(i,s,async u=>{try{let[d,p]=await Promise.all([sR(r,u,t),bi({market:n,collection:r,tokenId:u},t)]),m=cw(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?cR(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:V,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 lw(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Kb(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 uw(e={}){return{maxMarkets:Kb(e,"maxMarkets",Un),maxItemsPerMarket:Kb(e,"maxItemsPerMarket",Un)}}function dw(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function gi(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 pw(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 mw(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=uw(e),o=await vr(e,t),i=dw(o,e,n),a=t.scanCollection||Ns,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await be(i,s,async l=>{let u=lw(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,...gi(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...gi(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:V,marketCount:i.length,...pw(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 fw(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=uw(e),o=await vr(e,t),i=o.snapshotCoverage?.complete===!0,a=dw(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||$d,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await be(a,l,async d=>{let p=lw(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",...gi(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),y=gi(d,h);return{...d,decision:i&&y.complete&&h.arbCount>0?"ARB":"WATCH",slug:m,scan:h,...y}}catch(f){return{...d,decision:"WATCH",slug:m,reason:String(f.message||f).slice(0,240),...gi(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:V,marketCount:a.length,...pw(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 Yb(e,t){return e>t?"ARB":"PASS"}async function lR(e={},t={}){let n=String(e.direction||""),r=et(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=q(e.paymentToken,"Anvil payment token"),i={chainId:V,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:bt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||zb)({chainId:V,tokenIn:Ze,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:Ze,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||Eh)({...i,tokenIn:Ze,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Ze,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||jb)({chainId:V,tokenIn:o,tokenOut:Ze,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:Ze,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||vo)({...i,tokenIn:o,tokenOut:Ze,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:Ze,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 Jb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=q(e.quoteToken,"conversion quote token");if(n!==Ze)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=et(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=et(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function uR(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 br(e){return Array.isArray(e)?`[${e.map(br).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${br(e[t])}`).join(",")}}`:JSON.stringify(e)}function hw(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:J2("sha256",n).update(br(r)).digest("hex")}}function dR(e,t){return hw(e,t)}function Ld(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=dR(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!Qb(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 pR(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:uR(e,t)}function Cd(e,t,n,r,o,i){let a=pR(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==V)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=hw(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!Qb(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&&q(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=et(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=Ht(a.gasLimit,`${r} evidence gasLimit`),y=Ht(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*y!==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)!==V)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(q(w.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let g=q(w.sender,`${r} simulation sender`),b=q(w.owner,`${r} simulation owner`);if(!o.owner||g!==o.owner||b!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(et(w.valueWei,`${r} simulation valueWei`))!==String(et(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&&q(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 Xb(e){let t=q(e,"OpenSea payment token");if(t!==Rd&&t!==Ze)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function $d(e={},t={}){let n=await Ns(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=q(e.owner,"execution owner")}catch{}let a=(w,x,g,b={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:g,owner:i,...b}),s=(w,x,g,b,S)=>Cd(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(g,b,x,S),o),c=(w,x)=>{let g=null;try{g=q(w?.target,"conversion target")}catch{}let b=a(w?.calldataHash,w,"conversion",{target:g,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=Cd(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",b,o);if(S.amount!=null||w?.gasEstimate==null)return S;let I=Cd(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 k=et(w.gasEstimate,"conversion gasEstimate");return{amount:k*I.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:k.toString(),gasPriceEvidence:I.evidence},error:null}},l=(w,x,g,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 k=q(x?.protocolAddress,"Seaport protocol address"),E=String(x?.executionCalldataHash||"").toLowerCase(),P=/^0x[0-9a-f]{64}$/.test(E)?E:null,_=b==="seaport-fulfillment"&&S===Rd?String(x?.priceWei??""):"0",C={orderHash:I,protocolAddress:k,target:k,valueWei:_},$=s(w,b,P,g,C);if($.amount==null)throw new Error($.error);if($.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let D=$.evidence?.approvalRequired;if(typeof D!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof x?.approvalRequired=="boolean"&&x.approvalRequired!==D)throw new Error("Seaport approval requirement evidence mismatch");let H=[$];if(D){let j=String(x?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(j)?j:null,W=b==="seaport-offer-acceptance"?n.collection:S;H.push(s(w,"seaport-approval",B,g,{...C,target:W,valueWei:"0"}))}if(S===Rd){let j=w==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",B=String(x?.prerequisiteCalldataHash||"").toLowerCase(),W=/^0x[0-9a-f]{64}$/.test(B)?B:null,pe=j==="wrap-native-to-weth"?String(x?.sellerNetWei??""):"0";H.push(s(w,j,W,g,{...C,target:Ze,valueWei:pe}))}let R=H.find(j=>j.amount==null);if(R)throw new Error(R.error);return{amount:H.reduce((j,B)=>j+B.amount,0n),evidence:H.map(j=>j.evidence),error:null}}catch(I){return{amount:null,evidence:null,error:String(I.message||I)}}},u=et(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Aa,p=t.openSeaBestOffer||_a,m=t.paymentTokenConversion||(w=>lR({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await Cs({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 g=w.quote,b=Nd($e.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(g.totalCostRaw)])).toLowerCase(),S=s("anvil-to-opensea","anvil-call",b,g.evidence.attestation,{target:n.market,valueWei:g.nativeSwapFeeWei}),I=null,k=null;if(x)try{I=Xb(x.paymentToken)}catch(B){k=String(B.message||B)}let E=k||!x?{amount:null,evidence:null,error:k||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,g.evidence.attestation,"seaport-offer-acceptance",I),P={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:g.paymentToken,amountUnits:g.amountUnits,anvilTotalCostRaw:g.totalCostRaw,anvilBaseCostRaw:g.baseCostRaw,anvilFeeRaw:g.fees.totalFeeRaw,paymentTokenDecimals:g.paymentTokenDecimals,nativeSwapFeeWei:g.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||!g.available)h.push({...P,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(k)h.push({...P,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${k}`});else if(S.amount==null)h.push({...P,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({...P,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({...P,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let B=Jb(await m({chainId:V,direction:"acquire-exact-output",amountRaw:g.totalCostRaw,paymentToken:g.paymentToken,quoteToken:Ze}),{direction:"acquire-exact-output",amountRaw:g.totalCostRaw}),W=c(B,"anvil-to-opensea");if(W.amount==null)h.push({...P,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=S.amount+E.amount+W.amount,Ie=BigInt(x.sellerNetWei)-BigInt(B.amountInWei)-BigInt(g.nativeSwapFeeWei)-pe;h.push({...P,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:Ie.toString(),decision:Yb(Ie,u),reason:Ie>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(B){h.push({...P,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}let _=null;try{_=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:w.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!_)continue;let C=Nd($e.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),$=s("opensea-to-anvil","anvil-call",C,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),D=null,H=null;try{D=Xb(_.paymentToken)}catch(B){H=String(B.message||B)}let R=H?{amount:null,evidence:null,error:H}:l("opensea-to-anvil",_,f.evidence.attestation,"seaport-fulfillment",D),j={route:"opensea-to-anvil",tokenId:w.tokenId,stars:w.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(_.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:D,gasCostWei:$.amount==null?null:$.amount.toString(),gasEvidence:$.evidence,marketplaceGasCostWei:R.amount==null?null:R.amount.toString(),marketplaceGasEvidence:R.evidence,conversionGasCostWei:null};if(H){h.push({...j,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${H}`});continue}if($.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${$.error}`});continue}if(R.amount==null){h.push({...j,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${R.error}`});continue}if(typeof m!="function"){h.push({...j,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let B=Jb(await m({chainId:V,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:Ze}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),W=c(B,"opensea-to-anvil");if(W.amount==null)h.push({...j,conversion:B,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${W.error}`});else{let pe=$.amount+R.amount+W.amount,Ie=BigInt(B.amountOutWei)-BigInt(_.priceWei)-BigInt(f.nativeSwapFeeWei)-pe;h.push({...j,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilPayoutInWethWei:B.amountOutWei,conversion:B,netWei:Ie.toString(),decision:Yb(Ie,u),reason:Ie>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(B){h.push({...j,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(B.message||B)}`})}}let y=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:V,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:y.sort((w,x)=>{let g=BigInt(w.netWei??"-1"),b=BigInt(x.netWei??"-1");return b>g?1:b<g?-1:0}),arbCount:y.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Os(e={},t={}){let n=bt(t),r=jt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,lt.ammVault,Wb,"quoteSpecificBuy",[BigInt(r)]),ee(n,lt.ammVault,Wb,"inventory",[BigInt(r)]),ee(n,lt.nft,ut,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:q(a[0],"broker owner")===lt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:V,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 yw(e,t){try{return q((await ee(t,lt.nft,ut,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return q((await ee(t,lt.nft,ut,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function gw(e={},t={}){let n=bt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await be(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=jt(a.brokerTokenId,"brokerTokenId"),c=jt(a.nestedTokenId,"nestedTokenId"),l=q(a.tba,"TBA"),u=q(a.nestedCollection,"nested collection"),d=cw({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([yw(s,n),ee(n,u,ut,"ownerOf",[BigInt(c)]).then(y=>q(y[0],"nested owner")),Os({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:V,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function bw(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=jt(e.brokerTokenId,"brokerTokenId"),o=et(e.maxTokenCostWei,"maxTokenCostWei"),i=et(e.maxEthFeeWei,"maxEthFeeWei"),a=await Os({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 N({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:V,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:lt.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 wi(e={},t={}){let n=bt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?lt.overtimeBooster:lt.stockBooster,[i,a,s,c,l,u]=await Promise.all([ee(n,o,un,"pendingEth"),ee(n,o,un,"minDropWei"),ee(n,o,un,"roundActive"),ee(n,o,un,"currentRound"),ee(n,o,un,"roundState").catch(()=>null),ee(n,o,un,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:V,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(y=>q(y,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function ww(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?lt.overtimeBooster:lt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?un.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):un.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return N({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:V,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:V,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function vw(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>jt(s,"brokerTokenId")):[],r=bt(t),o=await be(n,8,async s=>{let[c,l]=await Promise.all([ee(r,lt.nft,ut,"ownerOf",[BigInt(s)]).then(u=>q(u[0],"broker owner")),yw(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([wi({which:"stock"},t),wi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:V,owner:e.owner?q(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function xw(e={},t={}){try{let n=await vr(e,t);return{ok:!0,chainId:V,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function Sw(e={},t={}){try{let n=await wi({which:"stock"},t);return{ok:!0,chainId:V,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:V,error:String(n.message||n).slice(0,180)}}}X();import{createHash as fR}from"node:crypto";var Rs="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",hR=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"}]),Dn=Object.freeze(Object.fromEntries(hR.map(e=>[e.name,e.selector]))),yR=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),gR=new Set(["name","endpoint","version","skills","domains"]),bR=new Set(["agentId","agentRegistry"]),kw=new Set(["reputation","crypto-economic","tee-attestation"]),wR=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,vR=64*1024;function vi(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 Bd(e,t,n){for(let r of Object.keys(e)){if(wR.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 xr(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 Iw(e,t,{service:n=!1}={}){let r=xr(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 Md(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 Ls(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function Fd(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 Ud(e){let t=Ls(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Md(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Aw(){let e=[];try{let t=Ls(process.env.ORACLE_ERC8004_CHAIN_ID);Ud(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 xR(e){return JSON.parse(JSON.stringify(e))}function $s(e){let t=vi(e,"registration file");if(Bd(t,yR,"registration"),t.type!==Rs)throw new Error("erc8004: registration-v1 type required");let n={type:Rs,name:xr(t.name,"name",128),description:xr(t.description,"description",4096),image:Iw(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=vi(a,`services[${s}]`);Bd(c,gR,`services[${s}]`);let l=xr(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:Iw(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=xr(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=vi(a,`registrations[${s}]`);Bd(c,bR,`registrations[${s}]`);let l=Fd(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>kw.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!kw.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>vR)throw new Error("erc8004: registration metadata oversized");return xR(n)}function SR(e){if(vi(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Rs)throw new Error("erc8004: registration-v1 type required");return $s({type:Rs,...e})}function kR(e){let t=$s(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function xi(e){return BigInt(e).toString(16).padStart(64,"0")}function _w(e){let t=Buffer.from(e,"utf8").toString("hex");return`${xi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function IR(e){return`${Dn.register}${xi(32)}${_w(e)}`}function ER(e,t){return`${Dn.setAgentURI}${xi(e)}${xi(64)}${_w(t)}`}function AR(e,t){return`${e}${xi(t)}`}function _R(e){return fR("sha256").update(e,"utf8").digest("hex")}function Dd(e,t){vi(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 Pw(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ls(e.chainId),c=Md(e.owner,"owner"),l=Ud(s),u=Number(t?.nowMs??Date.now());return N({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:_R(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 Tw(e={},t={}){Dd(e,new Set(["chainId","owner","registration"]));let n=kR(SR(e.registration));return Pw(e,t,{kind:"erc8004-register",uri:n,selector:Dn.register,data:IR(n)})}function Cw(e={},t={}){Dd(e,new Set(["chainId","owner","agentId","agentURI"]));let n=Fd(e.agentId),r=Nw(e.agentURI);return Pw(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:Dn.setAgentURI,data:ER(n,r),id:n})}function Nw(e){let t=xr(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 $s(o),t}function Ew(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 Md(`0x${e.slice(-40)}`,t)}function PR(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 Ow(e={},t={}){Dd(e,new Set(["chainId","agentId"]));let n=Ls(e.chainId),r=Fd(e.agentId),o=Ud(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:AR(d,r)},"latest"]),[a,s,c]=await Promise.all([i(Dn.ownerOf),i(Dn.tokenURI),i(Dn.getAgentWallet)]),l=Nw(PR(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=$s(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:Ew(a,"owner"),tokenURI:l,agentURI:l,agentWallet:Ew(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}fe();var Rw=999;async function Lw(e={}){let t={chainId:Rw,rpc:null,dex:null};try{t.rpc=await tr(Rw,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await mo("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 $w(e="HYPE",t={}){let r=(await mo(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 Bw(e,t={}){return Ot(e,t)}O();X();var NR="https://api-mainnet.magiceden.dev/v2",Si=1e9;function Mw(e={}){return Ee({provider:"magiceden",defaultUrl:NR,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function kr(e={}){return Mw(e).baseUrl}function qn(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function Ir(e={}){let t=qn(e);return ke({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Mw(e).trusted)}function qd(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 Sr(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 OR(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 RR(e){return Math.round(Sr(e,"priceSol")*Si)}function LR(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 $R({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function BR(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=$R(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Fw(e={}){try{let t=await Hd({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!qn(e),readTier:"keyless",prepareTier:qn(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!qn(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Hd(e={},t={}){let n=qd(e.symbol||e.collection),r=await v(`${kr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:Ir(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/Si:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Si:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Si:null,exec:!1,raw:r}}function Uw(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*Si):null,tokenSize:e.tokenSize??1}}async function Dw(e={},t={}){let n=qd(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 v(i.toString(),{headers:Ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Uw);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function qw(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await v(`${kr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:Ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Uw);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Hw(e={},t={}){if(!qn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=de(e.seller,"seller"),o=de(e.tokenMint,"tokenMint"),i=de(e.tokenATA||e.tokenAddress,"tokenATA"),a=de(e.auctionHouse,"auctionHouse"),s=Sr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:Sr(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 v(l.toString(),{headers:Ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Mt("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 N({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:RR(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Bs(e={},t={}){if(!qn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=de(e.seller||e.userPublicKey,"seller"),r=de(e.tokenMint,"tokenMint"),o=de(e.tokenATA||e.tokenAddress,"tokenATA"),i=de(e.auctionHouse,"auctionHouse"),a=Sr(e.priceSol??e.price,"priceSol"),s=LR(e.expiry),c=BR(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",de(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await v(l.toString(),{headers:Ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Mt("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 N({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 jw(e={},t={}){if(!qn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=qd(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=Sr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:Sr(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 v(a.toString(),{headers:Ir(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=OR(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`);Mt("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 N({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();uu();O();at();var Er=8,jd=10n**BigInt(Er),FR="0xa4b1",zw=7,zd=1,UR=2n**64n-1n;function DR(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 Ii(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function _r(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 ki(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>Er)throw new Error(`hl-staking: ${t} has more than ${Er} decimals`);let i=BigInt(r)*jd+BigInt((o+"0".repeat(Er)).slice(0,Er)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>UR)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function Ar(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function zt(e){let t=BigInt(String(e||"0")),n=t/jd,r=(t%jd).toString().padStart(Er,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Vw(e={}){try{let t=await Vd(e);return{ok:t.count>0,provider:"hl-staking",chain:Ii(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 Vd(e={}){let t=await ce({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 Wd(e={},t={}){let n=_r(e.user||e.address,"user"),r=await ce({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 Gd(e={},t={}){let n=_r(e.user||e.address,"user"),r=await ce({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 Ww(e={},t={}){let n=_r(e.user||e.address,"user"),r=await ce({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Gw(e={},t={}){let n=_r(e.user||e.address,"user"),r=await ce({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Kd(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 Ms(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||FR)}function qR(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ms(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Yd({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:Ii(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:DR(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:qR(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=ja(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,N(l,{provider:"hl-staking",kind:e})}function Kw(e={},t={}){let n=ki(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:ki(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${zt(n)} HYPE exceeds maxHype cap ${zt(r)} HYPE`);let o=Kd(e),i=Ii(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ms(t),wei:Ar(n),nonce:o};return Yd({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:Ar(n),nonce:o},opts:t,args:e,caps:{amountHype:zt(n),maxHype:r?zt(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 Yw(e={},t={}){let n=ki(e.amountHype??e.amount,"amountHype"),r=Kd(e),o=Ii(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ms(t),wei:Ar(n),nonce:r};return Yd({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:Ar(n),nonce:r},opts:t,args:e,caps:{amountHype:zt(n)},notes:[`Starts the ${zw} 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 Jw(e={},t={}){let n=_r(e.validator,"validator"),r=ki(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:ki(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${zt(r)} HYPE exceeds maxHype cap ${zt(s)} HYPE`);let c=Kd(e),l=Ii(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ms(t),validator:n,wei:Ar(r),isUndelegate:a,nonce:c};return Yd({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:Ar(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:zt(r),maxHype:s?zt(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${zd} 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 ${zd} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Xw(e={},t={}){let n=_r(e.user||e.address,"user"),r=await Wd({user:n},t),o=await Gd({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:zw,validatorLockupDays:zd,exec:!1}}at();async function Jd(e={}){let t=Date.now();try{let n=await ht(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 jR=24*365,zR=8;function Be(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function VR(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Pr(e={},t={}){let[n,r]=await Promise.all([Ve(t),ht(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=Be(u.markPx),p=Be(u.prevDayPx),m=Be(u.openInterest),f=Be(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Be(u.oraclePx),midPx:Be(u.midPx)??Be(r?.[c.name]),prevDayPx:p,change24hPct:VR(d,p),dayNtlVolumeUsd:Be(u.dayNtlVlm),premium:Be(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(jR/zR)*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 Qw(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Pr(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 Zw(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([Pr({},t),$a({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),ar(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:Be(h.o),high:Be(h.h),low:Be(h.l),close:Be(h.c),volume:Be(h.v)})),p=l?.levels??[],m=Be(p?.[0]?.[0]?.px),f=Be(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 ev(e={},t={}){let n=await Ba(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 uL,readFileSync as dL,readdirSync as pL,renameSync as mL,writeFileSync as fL}from"node:fs";import{homedir as hL}from"node:os";import{join as Hs}from"node:path";var Ei=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});O();fe();X();import{Interface as Xd,getAddress as sv,isAddress as GR}from"ethers";var tv=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),nv=Object.freeze({42161:{name:"arbitrum",api:tv[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:tv[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),rv="0x0000000000000000000000000000000000000000",KR=`0x${"0".repeat(64)}`,ov=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),iv=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Fs=new Xd(["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"]),cv=new Xd(["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)"]),YR=new Xd(["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)"]),JR=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Cr(e){let t=Number(e??42161),n=nv[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(nv).join(", ")})`);return{chainId:t,...n}}function Us(e,t={}){let n=Cr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function dt(e,t){if(!GR(e))throw new Error(`${t} must be a valid EVM address`);return sv(e)}function ne(e){return sv(e).toLowerCase()}function Tr(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 Hn(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 XR(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 QR(e){let t=String(e||"marketIncrease").trim();if(!(t in ov))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:ov[t]}}function ZR(e){let t=String(e||"noSwap").trim();if(!(t in iv))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:iv[t]}}function eL(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function tL(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function nL(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function rL({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=Tr(e?.minPrice,"gmx minPrice"),i=Tr(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 oL(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function iL(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Pt(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 aL(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:Pt(t,"account",a=>ne(a)),market:Pt(t,"market",a=>ne(a)),initialCollateralToken:Pt(t,"initialCollateralToken",a=>ne(a)),key:Pt(o,"key",a=>String(a).toLowerCase()),reason:Pt(i,"reason",a=>String(a)),sizeDeltaUsd:Pt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:Pt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:Pt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:Pt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:Pt(r,"isLong",a=>!!a)}}function sL(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=YR.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=JR[r];if(!o)return null;let i=aL(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||iL(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?ne(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 av(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function cL(e=[],{chainId:t}={}){let n=Cr(t);return(Array.isArray(e)?e:[]).map(r=>sL(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function lv(e={},t={}){return v(`${Us(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Qd(e={},t={}){return v(`${Us(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function uv(e={},t={}){return v(`${Us(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function dn(e={},t={}){return v(`${Us(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function dv(e={}){let t=await dn({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function pv(e={},t={}){let n=Cr(e.chainId??42161),r=dt(e.account||e.owner||e.user,"gmx account"),o=Hn(e.start??0,"gmx start"),i=Hn(e.end??e.limit??20,"gmx end"),a=cv.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),account:ne(r),raw:c}}async function mv(e={},t={}){let n=Cr(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=cv.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:ne(n.reader),dataStore:ne(n.dataStore),key:r,raw:a}}async function fv(e={},t={}){let n=Cr(e.chainId??42161),r=t.receipt||await po({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=cL(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)=>av(d.status)>=av(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?ne(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:ne(n.eventEmitter),events:s,receipt:r}}async function Ds(e={},t={}){let n=Cr(e.chainId??42161),r=QR(e.orderType||e.type),o=ZR(e.decreasePositionSwapType),i=dt(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=dt(e.receiver||i,"gmx receiver"),s=dt(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?dt(e.callbackContract,"gmx callbackContract"):rv,l=e.uiFeeReceiver?dt(e.uiFeeReceiver,"gmx uiFeeReceiver"):rv,u=dt(e.market||e.marketToken,"gmx market"),d=dt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?Tr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Hn(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=Tr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=Tr(e.executionFee,"gmx executionFee"),h=BigInt(String(e.maxExecutionFeeWei??"10000000000000000"));if(f>h)throw new Error("gmx executionFee exceeds maxExecutionFeeWei");let y=BigInt(String(e.maxSizeDeltaUsd??"50000000000000000000000000000000000"));if(m>y)throw new Error("gmx sizeDeltaUsd exceeds maxSizeDeltaUsd");let w=XR(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[g,b]=await Promise.all([Qd({chainId:n.chainId},t),dn({chainId:n.chainId},t)]),S=tL(eL(g,"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=dt(S.indexToken,"gmx market indexToken"),k=dt(S.longToken,"gmx market longToken"),E=dt(S.shortToken,"gmx market shortToken"),P=ne(d);if(![ne(k),ne(E)].includes(P))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let _=oL(S,x);if(_>0n&&m>_)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let C=nL(b,I);if(!C)throw new Error("gmx index ticker not found");let $=e.acceptablePrice?Tr(e.acceptablePrice,"gmx acceptablePrice").toString():rL({ticker:C,isLong:x,typeKey:r.key,maxSlippageBps:w}),D=(e.swapPath||[]).map(me=>dt(me,"gmx swapPath market"));if(D.length>3)throw new Error("gmx swapPath too long for guarded slice");let H=Hn(e.triggerPrice??"0","gmx triggerPrice"),R=Hn(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=Hn(e.minOutputAmount??"0","gmx minOutputAmount"),B=Hn(e.validFromTime??"0","gmx validFromTime"),W=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,Ie=String(e.referralCode||KR);if(!/^0x[0-9a-fA-F]{64}$/.test(Ie))throw new Error("gmx referralCode must be bytes32 hex");let Nt=Array.isArray(e.dataList)?e.dataList:[];for(let me of Nt)if(!/^0x[0-9a-fA-F]{64}$/.test(String(me)))throw new Error("gmx dataList entries must be bytes32 hex");let Gt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:D},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt($),executionFee:f,callbackGasLimit:R,minOutputAmount:j,validFromTime:B},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:W,autoCancel:pe,referralCode:Ie,dataList:Nt},L=[];r.key==="marketIncrease"&&p>0n&&L.push(Fs.encodeFunctionData("sendTokens",[d,n.orderVault,p])),L.push(Fs.encodeFunctionData("sendWnt",[n.orderVault,f])),L.push(Fs.encodeFunctionData("createOrder",[Gt]));let F=Fs.encodeFunctionData("multicall",[L]),Z={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:ne(i),receiver:ne(a),exchangeRouter:ne(n.exchangeRouter),router:ne(n.router),orderVault:ne(n.orderVault),market:ne(u),indexToken:ne(I),initialCollateralToken:ne(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:$,maxSlippageBps:w,isLong:x,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return N({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:ne(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:ne(d),spender:ne(n.router),amount:p.toString()}:null,gmxGuard:Z,transaction:{chainId:n.chainId,from:ne(i),to:ne(n.exchangeRouter),data:F,value:f.toString(),gmxGuard:Z}},{provider:"gmx",kind:"gmx-order"})}at();var pn="oracle.hl.entry-state.v1",yL=8,gL=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Nr(e){return e==null||e===0?0:e>0?1:-1}function Ai(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function bL(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Hs(hL(),".config","oracle")}function gv(e={}){return Hs(bL(e),"hl-entry-states")}function qs(e,t,n){return n==null&&e.push(t),n}function wL(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 Vt(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function vL(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:le(a.time),rate:le(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return Vt("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)Nr(o[a].rate)!==Nr(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 xL(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return Vt("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=le(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}:Vt("defillama.stablecoins","no peggedUSD")}function hv(e,t){let n=le(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 SL(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 Vt("gmx.tickers","no matching symbol");let c=hv(s.minPrice,n),l=hv(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return Vt("gmx.tickers","unreadable price");let d=n!=null&&n>0?Ai(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?Vt("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 kL({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?Vt("hl-info.fundingHistory","not fetched"):vL(r,{coin:e,asOfMs:n}),llamaStables:o==null?Vt("defillama.stablecoins","not fetched"):xL(o,n),gmxTicker:i==null?Vt("gmx.tickers","not fetched"):SL(i,{coin:e,hlMark:t,asOfMs:n})}}function yv(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=le(s?.px),l=le(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 IL(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=le(i.szi),s=le(i.positionValue)!=null&&a?Math.abs(le(i.positionValue)/a):null,c=le(i.entryPx),l=le(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:le(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function EL({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:pn,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=wL(n,e);if(!d)return{schema:pn,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=qs(u,"markPx",le(m.markPx)),h=qs(u,"oraclePx",le(m.oraclePx)),y=le(m.midPx),w=le(m.premium),x=qs(u,"fundingRate",le(m.funding)),g=qs(u,"openInterestCoin",le(m.openInterest)),b=le(m.dayNtlVlm),S=Array.isArray(m.impactPxs)?m.impactPxs:[],I=le(S[0]),k=le(S[1]),E=x==null?null:x*(gL/yL)*100,P=g==null||f==null?null:g*f,_=i==null||i===0||g==null?null:(g-i)/i*100;_==null&&u.push("oiDeltaPct");let C=r?.levels,$=Array.isArray(C)?C[0]:[],D=Array.isArray(C)?C[1]:[],H=le($?.[0]?.px),R=le(D?.[0]?.px);H==null&&u.push("book.bidPx"),R==null&&u.push("book.askPx");let j=yv(D,Number(t)||0,"buy"),B=yv($,Number(t)||0,"sell");j.fillable||u.push("book.buyFillable"),B.fillable||u.push("book.sellFillable");let W=y??f,pe=j.avgFillPx==null||W==null?null:Ai(j.avgFillPx,W),Ie=B.avgFillPx==null||W==null?null:Ai(W,B.avgFillPx),Nt=IL(o,e);for(let Z of Nt.unknown||[])u.push(Z);let Gt=le(m.prevDayPx),L=f==null||Gt==null||Gt===0?null:(f-Gt)/Gt*100;L==null&&u.push("change24hPct");let F=kL({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:pn,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:y,premium:w,markOracleBps:Ai(f,h),fundingRate:x,fundingAprPct:E,openInterestCoin:g,openInterestUsd:P,oiDeltaPct:_,dayNtlVolumeUsd:b,change24hPct:L,impactBidPx:I,impactAskPx:k,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:R,spreadBps:H==null||R==null?null:Ai(R,H),notionalUsd:Number(t)||0,buy:j,sell:B,buySlipBps:pe,sellSlipBps:Ie},position:Nt,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function bv(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 AL(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 _L({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==pn||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=AL(n),a=bv(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:pn,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Ei.ALERT_ONLY},c=gv({...o,configDir:r||o.configDir});uL(c,{recursive:!0,mode:448});let l=Hs(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return fL(u,`${JSON.stringify(s,null,2)}
|
|
148
|
+
`,{mode:384}),mL(u,l),s}function Zd(e={}){let t=gv(e),n=[];try{n=pL(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(dL(Hs(t,r),"utf8")))}function PL(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Ei.ALERT_ONLY};let r=e.see,o=t;Nr(r.fundingRate)!==Nr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),Nr(r.premium)!==Nr(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:pn,id:e.id,coin:e.see.coin,side:e.side,actionMode:Ei.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function wv(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await Ve(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 _i(e={},t={}){let n=e.coin,r=le(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([Ve(t),n?ar(n,t).catch(()=>null):Promise.resolve(null),e.user?sr(e.user,t).catch(()=>null):Promise.resolve(null),n?g0({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),as({},t).catch(()=>null),dn({chainId:42161},t).catch(()=>null)]);return EL({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function vv(e={},t={}){let n=e.see&&e.see.schema===pn?e.see:await _i(e,t);return{see:n,...bv(n,e.side)}}async function xv(e={},t={}){let n=e.see&&e.see.schema===pn?e.see:await _i(e,t);return _L({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function Sv(e={},t={}){let n=e.locked||Zd(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Ei.ALERT_ONLY};let r=await _i({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return PL(n,r)}at();Ha();Uo();async function kv(e={}){let t=await To(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function Iv(e={},t={}){let n=e.coin,r=e.outcome==null?null:Xt(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=Av(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=ep(i)));let a=n==null?null:Qt(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 To(t))?.outcomes||[]).find(f=>{try{return Xt(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=ep(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=Xt(r,i).coin}if(a=Qt(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,tn(c,t)}async function Ev(e={},t={}){let n=e.coin,r=e.outcome==null?null:Xt(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=Av(e.outcomeSide):(o=e.side,o!=null&&(o=ep(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=Xt(r,o).coin}let i=Qt(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,Fo(a,t)}function Av(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function ep(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();cr();var r7="0x"+"00".repeat(32);function NL(e){let t=typeof e=="bigint"?e:ct(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 _v(e,t){let n=ct(e.makerAmount,"poly: makerAmount"),r=ct(e.takerAmount,"poly: takerAmount");return NL(t==="BUY"?n:r)}cr();var OL=new Set(["https://clob.polymarket.com/order"]),Pi=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),s7=Object.freeze(Pi.map(e=>e[0])),RL=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),LL="0xe111180000d2663c0091e4f400237545b87b996b",$L="0xe2222d279d744050d28e00520010520000310f59",Pv=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function Tv(e){let t=String(e||"").replace(/\/$/,"");if(!OL.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Cv(e){let t=st(e,"poly: exchange").toLowerCase();if(!RL.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Nv(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=Pv(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(st(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Tv(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(Cv(o.verifyingContract),Cv(n.exchange),st(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==st(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?$L:LL;if(st(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!==Pi.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let k=0;k<Pi.length;k+=1)if(s[k]?.name!==Pi[k][0]||s[k]?.type!==Pi[k][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(st(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(st(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=Pv(n.tokenId,"tokenId",80);if(st(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=ct(a.makerAmount,"poly: makerAmount"),m=ct(a.takerAmount,"poly: takerAmount"),f=ct(n.makerAmount,"poly: prepared makerAmount"),h=ct(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 y=d==="BUY"?p:m,w=d==="BUY"?m:p,x=Ae(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let g=Ae(n.price,6,"poly: price");if(g<=0n||g>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*g!==y*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Ae(n.notionalUsdc,6,"poly: notionalUsdc")!==y)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let S=_v(a,d);if(Ae(S,6,"poly: displayed notionalUsdc")!==y)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let I=t.maxNotionalUsd??t.maxNotionalUsdc;if(I!=null){let k=Ae(I,6,"poly: maxNotionalUsd");if(y>k)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:y.toString(),notional:y.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:Tv(n.submitTo)})}function BL(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 Ov(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:BL({...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 Nv(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as f7,randomInt as ML}from"node:crypto";import{keccak256 as y7,concat as g7,zeroPadValue as b7,getCreate2Address as w7,AbiCoder as v7}from"ethers";var Mv=137;var FL="0xE111180000d2663C0091e4f400237545B87B996B",UL="0xe2222d279d744050d28e00520010520000310F59",Rv="0x0000000000000000000000000000000000000000000000000000000000000000",tp=6;var DL={name:"Polymarket CTF Exchange",version:"2",chainId:Mv},qL={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"}]},Lv={"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 js(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function zs(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function $v(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Fv(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function HL(e,t,n,r){let o=Fv(Number(n),r.price);if(e==="BUY"){let c=zs(Number(t),r.size),l=c*o;return js(l)>r.amount&&(l=$v(l,r.amount+4),js(l)>r.amount&&(l=zs(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=zs(Number(t),r.size),s=a*o;return js(s)>r.amount&&(s=$v(s,r.amount+4),js(s)>r.amount&&(s=zs(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function Bv(e){let t=Number(e).toFixed(tp),[n,r=""]=t.split(".");return(n+r.padEnd(tp,"0").slice(0,tp)).replace(/^0+/,"")||"0"}function jL(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=Rv,builder:p=Rv}=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=Lv[String(c)]||Lv["0.01"],y=Fv(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=HL(n,f,y,h),g=Bv(w),b=Bv(x),S=String(ML(1,2**31-1)),I=Date.now().toString(),k=n==="BUY"?0:1,E=s?UL:FL,P={salt:S,maker:i,signer:a,tokenId:String(t),makerAmount:g,takerAmount:b,side:k,signatureType:u,timestamp:I,metadata:d,builder:p},_={...DL,verifyingContract:E},C=n==="BUY"?w:x;return{domain:_,types:qL,value:P,orderType:l,side:n,price:String(y),quantity:String(n==="BUY"?x:w),notionalUsdc:C,exchange:E,negRisk:s}}function Uv(){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 Dv(e={},t={}){let n=jL(e),r={provider:"poly-clob",kind:"poly-order",chainId:Mv,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=Ov(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as e$,keccak256 as Jv}from"ethers";X();Xs();Gs();var t$=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function n$(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Dt(e);for(let o of Object.keys(n))if(!t$.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 Xv(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=zv(n,o),a=Yv(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 e$(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}:{...n$(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return N({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:Jv(s),authorityReport:Vv(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:Jv(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:Ys},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"})}Xs();lp();Uo();O();var f$="https://api.geckoterminal.com/api/v2",ec=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||f$).replace(/\/$/,""),Rr=e=>encodeURIComponent(String(e));async function up(e={},t={}){let n=Math.max(1,Number(e.page||1));return v(`${ec(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ix(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return v(`${ec(t)}/networks/${Rr(e.network)}/pools/${Rr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ax(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return v(`${ec(t)}/networks/${Rr(e.network)}/tokens/${Rr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sx(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)),v(`${ec(t)}/networks/${Rr(e.network)}/pools/${Rr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function cx(e={}){let t=await up({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}O();fe();import{Interface as px,getAddress as mx,isAddress as y$}from"ethers";X();var g$="https://api.curve.finance/v1",fx=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||g$).replace(/\/$/,""),b$=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),hx="0x0000000000000000000000000000000000000000",dp=new px(["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)"]),lx=new px(["function coins(uint256) view returns (address)"]);function yx(e){let t=b$[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function Bi(e,t){if(!y$(e))throw new Error(`${t} must be a valid EVM address`);return mx(e)}function w$(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 ux(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 gx(e,t,n){return[e,t,n,...Array(8).fill(hx)]}function bx(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function wx(e){return[e,...Array(4).fill(hx)]}async function v$({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){return(await Promise.all(Array.from({length:n},(a,s)=>{let c=lx.encodeFunctionData("coins",[s]);return r(e,"eth_call",[{to:t,data:c},o.blockTag||"latest"],o)}))).map(a=>mx(lx.decodeFunctionResult("coins",a)[0]))}function dx(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 vx(e={}){return v(`${fx(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function pp(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 v(`${fx(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function xx(e={}){let t=await pp({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function mp(e={},t={}){let n=Number(e.chainId??8453),r=yx(n),o=Bi(e.pool,"curve pool"),i=Bi(e.tokenIn,"curve tokenIn"),a=Bi(e.tokenOut,"curve tokenOut"),s=w$(e.amountIn,"curve amountIn"),c=ux(e.nCoins??2,"curve nCoins",2,8),l=ux(e.poolType,"curve poolType",1,4),u=t.rpcCall||U,d=await v$({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=dx(d,i,"tokenIn"),m=dx(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=gx(i,o,a),h=bx(p,m,l,c),y=wx(o),w=dp.encodeFunctionData("get_dy",[f,h,s,y]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),g=dp.decodeFunctionResult("get_dy",x),b=BigInt(g[0]);if(b<=0n)throw new Error("curve quote returned zero output");return re({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:y},{chainId:n,venue:r,amountOut:b.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Sx(e={},t={}){let n=Number(e.chainId??8453),r=yx(n),o=Bi(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=Bi(e.receiver||e.recipient||o,"curve receiver"),a=await mp({...e,sender:o},t),s=gx(a.tokenIn,a.pool,a.tokenOut),c=bx(a.i,a.j,a.poolType,a.nCoins),l=wx(a.pool),u=dp.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return N({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:he(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}O();fe();X();import{Interface as S$,getAddress as k$,isAddress as I$,keccak256 as kx,toUtf8Bytes as Ix}from"ethers";var E$="https://api.morpho.org/graphql",tc=new S$(["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)"]),A$=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||E$;async function hp(e,t,n={}){return v(A$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var _$="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 } } } }",P$="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 Mi(e,t){let n=String(e||"").trim();if(!I$(n))throw new Error(`morpho: ${t} must be an address`);return k$(n).toLowerCase()}function T$(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 fp(e){return Array.isArray(e)?`[${e.map(fp).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${fp(e[t])}`).join(",")}}`:JSON.stringify(e)}async function Fi(e,t,n,r,o={}){let i=tc.encodeFunctionData(n,r),s=await(o.rpcCall||U)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return tc.decodeFunctionResult(n,s)}function C$(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function Ex(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return hp(_$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function yp(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return hp(P$,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Ax(e={}){return{ok:(await hp("query { __typename }",{},e))?.data?.__typename==="Query"}}async function _x(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=Mi(e.vault||e.vaultAddress,"vault"),i=Mi(e.owner||e.from||e.sender,"owner"),a=Mi(e.receiver||i,"receiver"),s=T$(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),[l,[u]]=await Promise.all([yp({chainId:n,first:100},t),Fi(n,o,"asset",[],t)]),d=C$(l?.data?.vaults?.items,o);if(!d)throw new Error("morpho: vault not found in public Morpho vault registry");if(d.listed===!1)throw new Error("morpho: vault is not listed");let p=Number(d?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&p<c)throw new Error(`morpho: vault totalAssetsUsd ${p} below minimum ${c}`);let m=Mi(u,"vault asset");if((d?.asset?.address?Mi(d.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,y;if(r==="deposit"){let[[x],[g]]=await Promise.all([Fi(n,o,"maxDeposit",[i],t),Fi(n,o,"previewDeposit",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");if(BigInt(g.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");y={minSharesOut:g.toString()},h=tc.encodeFunctionData("deposit",[s,a])}else{let[[x],[g]]=await Promise.all([Fi(n,o,"maxWithdraw",[i],t),Fi(n,o,"previewWithdraw",[s],t)]);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");if(BigInt(g.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");y={maxSharesIn:g.toString()},h=tc.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:p,...y,calldataHash:kx(Ix(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=kx(Ix(fp(w))),N({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:d,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"})}O();fe();import{Interface as O$,getAddress as gp,isAddress as R$}from"ethers";X();var L$="https://api-v3.balancer.fi/",$$=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||L$;async function Cx(e,t,n={}){return v($$(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var B$="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Px=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"}}),M$="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",F$="0x0000000000000000000000000000000000000000",bp=new O$(["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 Nx(e){let t=Number(e??8453),n=Px[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Px).join(", ")})`);return{chainId:t,...n}}function Ox(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===F$||t===M$.toLowerCase()}function nc(e,t){if(!R$(e))throw new Error(`${t} must be a valid EVM address`);return gp(e)}function Tx(e,t,n){let r=String(e||"");return Ox(r)||/^weth$/i.test(r)?gp(t.weth):/^usdc$/i.test(r)?gp(t.usdc):nc(r,n)}function U$(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 Rx(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 Lx(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 Cx(B$,{first:n,chains:r,where:{chainIn:r}},t)}async function $x(e={}){return{ok:(await Cx("query { __typename }",{},e))?.data?.__typename==="Query"}}async function wp(e={},t={}){let n=Nx(e.chainId),r=nc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Tx(o,n,"balancer tokenIn"),a=Tx(e.tokenOut||"USDC",n,"balancer tokenOut"),s=U$(e.amountIn,"balancer amountIn"),c=nc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=bp.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Rx(e.userData)]),d=await(t.rpcCall||U)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=bp.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return re({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 Bx(e={},t={}){let n=Nx(e.chainId),r=nc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Ox(o),a=await wp({...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=bp.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Rx(e.userData)]);return N({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:he(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}O();import{getAddress as q$}from"ethers";X();var H$="https://api-v2.pendle.finance/core",j$=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),z$="0x0000000000000000000000000000000000000000",V$="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Mx=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||H$).replace(/\/$/,"");function rc(e,t){try{return q$(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function Lr(e,t){return rc(e,t).toLowerCase()}function W$(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===V$||t===z$}function vp(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 G$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:rc(t.token,`pendle input ${n} token`),amount:vp(t.amount,`pendle input ${n} amount`)}))}function K$(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>rc(t,`pendle output ${n} token`))}function Y$(e){let t=j$[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 vp(t,"pendle output amount")}function X$(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!W$(r.token)).map(r=>({token:Lr(r.token,"pendle approval token"),spender:Lr(t,"pendle approval spender"),amount:vp(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function xp(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)),v(`${Mx(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Fx(e={}){let t=await xp({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Sp(e={},t={}){let n=Number(e.chainId??42161),r=Y$(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=rc(e.receiver||o,"pendle receiver"),a=G$(e.inputs),s=K$(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=je({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 v(`${Mx(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(Lr(p.to,"pendle tx target")!==Lr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&Lr(p.from,"pendle tx sender")!==Lr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=J$(u),f=re(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return N({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:X$(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:he(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function Ux(e={},t={}){let n=await Sp(e,t),{transaction:r,...o}=n;return o}O();import{isAddress as Z$}from"ethers";X();var eB="https://api.odos.xyz",kp=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||eB).replace(/\/$/,"");async function Ip(e={}){return v(`${kp(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function tB(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(!Z$(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Dx(e={},t={}){let n=tB(e),r=je({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 v(`${kp(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 qx(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Dx(e,t);return{...re(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 Hx(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Dx(e,t),i=await v(`${kp(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=re(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 N({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:he(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function jx(e={}){let t=await Ip(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}O();var zx=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,rB=/[<>&`*_~[\]()|\\]/g,oB=/[\u0000-\u001F\u007F]/g;function Ep(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(zx,"").replace(oB,"").replace(rB,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Ap(e){if(e==null)return!1;let t=String(e);return zx.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Vx=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 oc(e,t={}){let n=Number(e),r=t.baseUrl||Vx[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Wx(e){return!!Vx[Number(e)]}async function _p(e={},t={}){return v(`${oc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Gx(e={},t={}){if(!e.address)throw new Error("address required");return v(`${oc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Kx(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return v(`${oc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Yx(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${oc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await v(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function Jx(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=Ep(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Ep(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:Ap(o.symbol)||Ap(o.name)||void 0})}return n}async function Xx(e={}){let t=await _p({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as aB}from"ethers";O();fe();at();var sB="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",Zx=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 mn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ic(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function Qx(e){if(!e)return null;try{return aB(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Vn(e={},t=process.env){let n=e.addresses||{},r=Qx(n.evm||e.evmAddress||ic(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ic(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ic(t,"ORACLE_BITCOIN_ADDRESS"),a=Qx(n.hyperliquid||e.hyperliquidAddress||ic(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?de(o,"portfolio Solana address"):null,bitcoin:i?yt(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function Ui(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 $r(e){let t=Number(e);return Number.isFinite(t)?t:null}function ac(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function fn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function eS(e,t){let n=Zx[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 cB(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:Ui(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 Pp(e,t){return{family:e,status:"unsupported",reason:t}}function Tp(e,t){if(!e||e.status!=="ok")return e;let n=eS(t,e.symbol),r=$r(e.amount),o=r!=null&&n.priceUsd!=null?ac(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function tS(e={}){let t=Vn({},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=Vn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(ir.map(L=>[L.chainId,L])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(Zx))],u=o?Se(()=>Ft(l,mn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=be(c,e.concurrency||5,async L=>{let F=s.get(L);if(!F)return{family:"evm",chainId:L,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:L,name:F.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let Z={...mn(t,"evm"),rpcUrl:e.rpcUrls?.[L]||t.evm?.rpcUrls?.[L]},me=await Se(()=>An(L,r.evm,Z));if(!me.ok)return{family:"evm",chainId:L,name:F.name,address:r.evm,status:"unavailable",latencyMs:me.ms,error:me.error};let Re=F.nativeCurrency?.decimals??18,Ye=F.nativeCurrency?.symbol||"NATIVE",K=me.data.balanceWei,we={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Wx(L)){let In=await Se(()=>Yx({chainId:L,address:r.evm},{...mn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));In.ok?we={status:"ok",assets:Jx(In.data,{fungibleOnly:!0}).map(oo=>{let io=Ui(oo.amountRaw,oo.decimals);return{...oo,amount:io,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:In.ms}:we={status:"unavailable",assets:[],reason:In.error||"blockscout token-balances failed",source:"blockscout",latencyMs:In.ms}}return{family:"evm",chainId:L,name:F.name,address:r.evm,status:"ok",latencyMs:me.ms,native:{status:"ok",symbol:Ye,amountRaw:K,decimals:Re,amount:Ui(K,Re)},fungibleTokens:we,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:we.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 L=mn(t,"solana"),F=await Se(()=>Ya({address:r.solana},L)),Z=i||a?await Promise.all([Se(()=>jo({owner:r.solana,programId:Lu},L)).then(we=>({...we,program:"spl-token"})),Se(()=>jo({owner:r.solana,programId:sB},L)).then(we=>({...we,program:"token-2022"}))]):[],me=cB(Z),Re=me.filter(we=>we.classification==="collectible-candidate"),Ye=me.filter(we=>we.classification!=="collectible-candidate"),K=Z.filter(we=>!we.ok).map(we=>we.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Z.some(we=>we.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:Ui(F.data.lamports,9),slot:F.data.slot}:{status:"unavailable",symbol:"SOL",error:F.error},fungibleTokens:{status:i?K.length===Z.length?"unavailable":K.length?"partial":"ok":"not-requested",assets:i?Ye:[],errors:K,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?K.length===Z.length?"unavailable":"partial":"not-requested",assets:a?Re:[],errors:K,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 L=mn(t,"bitcoin"),F=mn(t,"bitcoinMeta"),[Z,me,Re]=await Promise.all([Se(()=>Xa({address:r.bitcoin},L)),i?Se(()=>Za({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?Se(()=>mr({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),Ye=me.ok?me.data:null,K=Re.ok?Re.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:Z.ok||Ye?.ok||K?.ok?"ok":"unavailable",native:Z.ok?{status:"ok",symbol:"BTC",amountRaw:Z.data.balanceSats,decimals:8,amount:Ui(Z.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:Z.error},fungibleTokens:{status:i?Ye?.ok?"ok":"unavailable":"not-requested",assets:Ye?.balances||[],error:Ye?.ok?null:Ye?.error||me.error,verification:"indexer-reported"},collectibles:{status:a?K?.ok?"ok":"unavailable":"not-requested",assets:K?.inscriptions||[],error:K?.ok?null:K?.error||Re.error,unknownNotEmpty:!!K?.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 L=mn(t,"hyperliquid"),[F,Z,me]=await Promise.all([Se(()=>La(r.hyperliquid,L)),Se(()=>sr(r.hyperliquid,L)),Se(()=>ht(L))]),Re=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(K=>fn(K.total)||fn(K.hold)).map(K=>({coin:K.coin||null,total:String(K.total??"0"),hold:String(K.hold??"0"),priceUsd:null,usdValue:null})),Ye=(Z.ok&&Array.isArray(Z.data?.assetPositions)?Z.data.assetPositions:[]).map(K=>K.position||K).filter(K=>fn(K.szi)).map(K=>({coin:K.coin||null,size:String(K.szi??"0"),entryPrice:K.entryPx??null,positionValueUsd:K.positionValue??null,unrealizedPnlUsd:K.unrealizedPnl??null,liquidationPrice:K.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:F.ok||Z.ok?"ok":"unavailable",spot:{status:F.ok?"ok":"unavailable",balances:Re,error:F.ok?null:F.error},perps:{status:Z.ok?"ok":"unavailable",accountValueUsd:Z.data?.marginSummary?.accountValue??null,withdrawableUsd:Z.data?.withdrawable??null,positions:Ye,error:Z.ok?null:Z.error},mids:me.ok?me.data:{},source:"hyperliquid-info"}})(),[h,y,w,x,g]=await Promise.all([d,p,m,f,u]),b=g.ok?g.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 L of h){if(L.family!=="evm"||L.fungibleTokens?.status!=="ok")continue;let F=S[L.chainId];if(F)for(let Z of L.fungibleTokens.assets||[])Z.address&&I.push(`${F}:${String(Z.address).toLowerCase()}`)}let k=null;if(o&&I.length){let L=[...new Set(I)],F=await Se(()=>Ft(L,mn(t,"prices")));F.ok&&(k=F.data)}let E=h.map(L=>{let F=L.native?{...L,native:Tp(L.native,b)}:L;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Z=S[F.chainId],me=F.fungibleTokens.assets.map(Re=>{let Ye=String(Re.symbol||"").toUpperCase(),K=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(Ye)&&(K=1),K==null&&Z&&Re.address&&k?.coins){let Of=`${Z}:${String(Re.address).toLowerCase()}`,oo=k.coins[Of],io=Number(oo?.price);Number.isFinite(io)&&io>0&&(K=io)}let we=$r(Re.amount),In=we!=null&&K!=null?ac(we*K):null;return{...Re,priceUsd:K,usdValue:In}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});y.native&&(y.native=Tp(y.native,b)),w.native&&(w.native=Tp(w.native,b));let P=0,_=0,C=0;for(let L of[...E,y,w]){L.native?.status==="ok"&&fn(L.native.amount)&&(L.native.usdValue!=null?(P+=L.native.usdValue,_+=1):C+=1);for(let F of L.fungibleTokens?.assets||[])!fn(F.amount)&&!fn(F.amountRaw)||(F.usdValue!=null?(P+=F.usdValue,_+=1):C+=1)}let $=eS(b,"HYPE");for(let L of x.spot?.balances||[]){let F=String(L.coin||"").toUpperCase(),Z=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?$.priceUsd||$r(x.mids?.HYPE):$r(x.mids?.[L.coin]),me=$r(L.total);L.priceUsd=Z,L.usdValue=me!=null&&Z!=null?ac(me*Z):null,fn(L.total)&&(L.usdValue!=null?(P+=L.usdValue,_+=1):C+=1)}let D=$r(x.perps?.accountValueUsd);D!=null&&D!==0&&(P+=D,_+=1);let H=[...y.fungibleTokens?.assets||[],...y.collectibles?.assets||[]].filter(L=>fn(L.amount)).length,R=(w.fungibleTokens?.assets||[]).length+(w.collectibles?.assets||[]).length;C+=H+R;let j=[...E,y,w,x],B=L=>j.filter(F=>F.status===L).length,W=[],pe=E.filter(L=>L.fungibleTokens?.status==="unavailable"),Ie=E.filter(L=>L.fungibleTokens?.status==="ok");pe.length&&!Ie.length?W.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):pe.length&&W.push(`EVM token discovery partial: Blockscout covered ${Ie.length} chain(s); ${pe.length} chain(s) still native-only.`),(y.fungibleTokens?.assets?.length||y.collectibles?.assets?.length)&&W.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),w.collectibles?.unknownNotEmpty&&W.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),g.ok||W.push(`Price provider unavailable: ${g.error}`);let Nt=[Pp("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Pp("sui","Sui balance adapter is not installed"),Pp("aptos","Aptos balance adapter is not installed")],Gt=j.some(L=>["unavailable","partial","not-configured"].includes(L.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(L.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:j.length,ok:B("ok"),unavailable:B("unavailable"),notConfigured:B("not-configured"),unsupported:B("unsupported")+Nt.length,evmChainsRequested:c.length,evmChainsOk:E.filter(L=>L.status==="ok").length},valuation:{knownUsd:ac(P),label:"known priced value, not a complete portfolio total",pricedItems:_,unpricedNonzeroItems:C,complete:C===0&&!Gt&&B("unavailable")===0&&B("not-configured")===0&&Nt.length===0,priceSource:o?"DefiLlama":null,priceStatus:g.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,y,w,x],unsupportedFamilies:Nt,warnings:W}}import{constants as lc}from"node:fs";import{chmod as RB,mkdir as LB,open as $B,readFile as BB}from"node:fs/promises";import{createHash as MB,randomUUID as FB}from"node:crypto";import UB from"node:os";import Mr from"node:path";O();O();var uB=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"]),dB=new Set(["image/jpeg","image/png","image/webp"]);function pB(e){let t=String(e||"").toLowerCase();return uB.some(n=>t===n||t.endsWith(`.${n}`))}function mB(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 nS(e){let t=mB(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!pB(n.hostname)?null:n}async function fB(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=nS(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 Se(()=>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=nS(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(!dB.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 Cp(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function hB(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function rS(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 g of a){if(c>=l){s.push({item:g,image:null,error:"gallery page byte cap reached"});continue}try{let b=await fB(g.imageUrl||g.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=b.bytes,s.push({item:g,image:b,error:null})}catch(b){s.push({item:g,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,y=m+f*p,w=s.map(({item:g,image:b,error:S},I)=>{let k=I%u,E=Math.floor(I/u),P=k*d,_=m+E*p,C=b?`<image x="${P+14}" y="${_+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${b.mimeType};base64,${b.data}"/>`:`<rect x="${P+14}" y="${_+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${P+170}" y="${_+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,$=Cp(hB(g,I).slice(0,34)),D=Cp(g.chain||"unknown chain");return`${C}<text x="${P+16}" y="${_+350}" fill="#f3f5f7" font-size="17" font-weight="600">${$}</text><text x="${P+16}" y="${_+376}" fill="#8d98a8" font-size="13">${D}${S?" \xB7 placeholder":""}</text>`}).join(""),x=`<svg xmlns="http://www.w3.org/2000/svg" width="${h}" height="${y}" viewBox="0 0 ${h} ${y}"><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 ${Cp(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(g=>g.image).length,placeholders:s.filter(g=>!g.image).map(g=>({assetKey:g.item.assetKey||null,name:g.item.name||null,sourceUrl:g.item.imageUrl||null,error:g.error})),rasterOnly:!0,externalScripts:!1}}var yB=[/\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],gB=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,bB=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function wB(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;gB.test(n)&&t.push("url-in-name");let i=yB.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),bB.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 oS(e={}){let t=wB(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}X();var vB=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"}]),xB=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 Wn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function Di(e,t){let n=await Se(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function SB(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 kB(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 IB(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 sS(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function EB(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 AB(e,t){let n=sS(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 _B(e){let t=new Map;for(let n of e){let r=sS(n);t.has(r)||t.set(r,n)}return[...t.values()]}function PB(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 cS(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Br(e={},t={}){let n=new Date().toISOString(),r=Vn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(b=>String(b).toLowerCase())):null,i=vB.filter(b=>!o||o.has(b.chain)),a=[],s=[],c=Wn(t,"opensea"),l=r.evm?i.filter(b=>b.family!=="solana"):[],u=await be(l,4,async b=>({row:b,result:await Di(`opensea-${b.chain}`,()=>Io({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(k=>({...k,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 Di("opensea-solana",()=>Io({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 Di("satflow-wallet-contents",()=>ts({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Wn(t,"satflow")),t.timeoutMs??35e3);if(b.ok){let S=SB(b.data.contents).map(k=>kB(k,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 Di("bitcoin-meta-inscriptions",()=>mr({address:r.bitcoin},Wn(t,"bitcoinMeta")),t.timeoutMs??35e3),I=S.ok&&S.data?.ok&&Array.isArray(S.data.inscriptions)?S.data.inscriptions:[];s.push(...I.map(k=>IB(k,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 Di(`opensea-pnl-${b}`,()=>Ia({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=EB(e.costBasis),m=_B(s).map(b=>AB(b,p)).map(b=>oS(b)),f=m.filter(b=>!b.spam),h=m.filter(b=>b.spam),y=f.filter(b=>b.estimatedValueUsd!=null&&Number.isFinite(Number(b.estimatedValueUsd))),w=Math.round(y.reduce((b,S)=>b+Number(S.estimatedValueUsd),0)*100)/100,x=f.length-y.length,g=a.filter(b=>b.status!=="ok"||b.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:xB,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:w,valuedItems:y.length,unvaluedItems:x,complete:x===0&&g.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:PB(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 iS(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 TB(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 lS(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 Ca(e,Wn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=iS(e.expiry??e.endTime,"Solana NFT listing expiry");return Bs({...e,expiry:r},Wn(t,"magiceden"))}if(n==="satflow"){let r=iS(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return ns({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:TB(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Wn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Np(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 Op(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function cc(e){return String(e??"").trim().toLowerCase()}function CB(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=cc(t),i=cc(n);return!o||!i?!1:r.some(a=>cc(a.trait_type??a.traitType??a.type)===o&&cc(a.value??a.trait_value??a.traitValue)===i)}function NB(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function aS(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 Rp(e){return Math.round(Number(e)*1e6)/1e6}function hn(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 uS(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return hn(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(k=>e[k]==null||e[k]==="");if(o.length)return hn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Np(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Np(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Np(e.traitFloorEth,"traitFloorEth"),d=Op(e.collectionFloorEth),p=Op(e.maxListingAgeMs),m=Op(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return hn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return hn(e,"invalid-min-trait-sales");if(u<=0)return hn(e,"trait-floor-unavailable");let f=k=>CB(k,e.traitType,e.traitValue)&&NB(k,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(k=>{if(!m)return!0;let E=aS(k,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),y=Rp(h.reduce((k,E)=>k+Number(E.priceEth??E.price??0),0)),w={count:h.length,volumeEth:y,minSales:c,minVolumeEth:l};if(h.length<c||y<l)return hn(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(k=>{let E=Number(k.priceEth??k.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let P=aS(k,["listedAt","createdAt","timestamp"]);return P!=null&&i-P<=p}).map(k=>{let E=Number(k.priceEth??k.price),P=Math.round((u-E)/u*1e4);return{...k,priceEth:E,discountBps:P}}).filter(k=>k.discountBps>=s).sort((k,E)=>k.priceEth-E.priceEth||E.discountBps-k.discountBps),g={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 hn(e,"invalid-min-trait-listings",g);if(x.length<b)return hn(e,"trait-listing-depth-insufficient",g);let S=x[0],I=N({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:Rp(S.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:g,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:Rp(S.priceEth),discountBps:S.discountBps},evidence:g,prepareIntent:I}}async function dS(e={},t={}){let n=await Br({...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 pS(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Br({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await rS({...e,items:n},Wn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var mS=10*1024*1024,yS=1e3;function yn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Fr(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function fS(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 gS(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 DB(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function bS(e={}){return`portfolio_${MB("sha256").update(DB(e)).digest("hex").slice(0,20)}`}function wS(e={}){if(e.historyFile)return Mr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Mr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Mr.join(UB.homedir(),".hermes");return Mr.join(Mr.resolve(n),"state","oracle","portfolio-history.jsonl")}function qB(e){let t=yn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Fr(t):null}function HB(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=yn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Fr(t):null}function jB(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=yn(c.usdValue);return l==null?s:s+l},0),i=yn(n.perps?.accountValueUsd),a=Fr(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>yn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=yn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Fr(r)})}return t}function zB(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 VB(e,t){let n=wS(t),r=`${JSON.stringify(e)}
|
|
149
|
+
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await LB(Mr.dirname(n),{recursive:!0,mode:448});let o=lc.O_APPEND|lc.O_CREAT|lc.O_WRONLY|(lc.O_NOFOLLOW||0),i=await $B(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await RB(n,384),n}async function vS(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||sc,o=t.nftInventoryImpl||Br,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=qB(s),u=HB(c),d=[l,u].filter(S=>S!=null),p=d.length?Fr(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(),y=s?.addresses||Vn(e,t.env||process.env),w=bS(y),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 g={schemaVersion:1,id:`snapshot_${FB()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(S=>[S,!!y?.[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:jB(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:zB(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await VB(g,t),snapshot:g,balance:s,nfts:c}}async function WB(e){let t=wS(e);try{let n=await BB(t);if(n.byteLength>mS)throw new Error(`portfolio history exceeds ${mS} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
150
|
+
`))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 GB(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Vn(e,t.env||process.env);return Object.values(n).some(Boolean)?bS(n):null}async function Lp(e={},t={}){let n=gS(e.limit,100,1,yS,"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=fS(e.since,"portfolio history since"),i=fS(e.until,"portfolio history until"),a=GB(e,t),s=await WB(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=>yn(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 hS(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function uc(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function KB(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 YB(e,t){let c=e.map(g=>g.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let g=Math.max(1,Math.abs(l)*.05);l-=g,u+=g}else{let g=(u-l)*.1;l=Math.max(0,l-g),u+=g}let d=g=>e.length===1?1240/2:100+1040*g/(e.length-1),p=g=>570-(g-l)/(u-l)*470,m=e.map((g,b)=>`${b?"L":"M"}${d(b).toFixed(2)},${p(g.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(g,b)=>{let S=b/4,I=100+S*470,k=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">${hS(k)}</text>`}).join(""),h=e.map((g,b)=>`<circle cx="${d(b)}" cy="${p(g.value)}" r="5" fill="#b8f0ff"><title>${uc(g.recordedAt)}: ${hS(g.value)}</title></circle>`).join(""),y=uc(e[0].recordedAt.slice(0,10)),w=uc(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 ${uc(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">${y}</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 xS(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=gS(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Lp({...e,order:"asc",limit:e.limit??yS},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:yn(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=KB(o,n),a=i[0].value,s=i.at(-1).value,c=Fr(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=YB(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"}}}fe();var XB=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"}}),QB=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),ZB=`0x${"0".repeat(64)}`;function eM(e){return!e||e==="0x"||e===ZB}async function Gn(e={},t={}){let n=t.rpcCall||U,r=String(e.address||"").trim().toLowerCase(),o=Number(e.chainId);if(!/^0x[a-f0-9]{40}$/.test(r))return{status:"error",error:"address must be a 0x-prefixed EVM address",risk:"unknown-risk",findings:[],notes:[]};if(!Number.isInteger(o))return{status:"error",error:"chainId is required",risk:"unknown-risk",findings:[],notes:[]};let i;try{i=await n(o,"eth_getCode",[r,"latest"],t)}catch(h){return{address:r,chainId:o,status:"unavailable",error:h?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[h,y]of Object.entries(XB))c.includes(h)&&s.push({selector:`0x${h}`,...y});let l=!1,u=null,d=null,p=await Promise.all(QB.map(async({label:h,slot:y})=>{try{let w=await n(o,"eth_getStorageAt",[r,y,"latest"],t);return{label:h,word:w,error:null}}catch{return{label:h,word:null,error:`proxy slot (${h}) unreadable; proxy status uncertain`}}}));for(let h of p)h.error&&a.push(h.error),!l&&h.word&&!eM(h.word)&&(l=!0,u=h.label,d=`0x${String(h.word).slice(-40)}`);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 f=s.filter(h=>h.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return f==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:f,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function SS(e={}){let t=Date.now();try{let n=await Gn({address:"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",chainId:1},e),r=n.status==="ok";return{provider:"contract-risk",status:r?"ok":"degraded",latencyMs:Date.now()-t,detail:r?"bytecode reads reachable":n.error||"probe returned no code"}}catch(n){return{provider:"contract-risk",status:"down",latencyMs:Date.now()-t,detail:n?.message||"probe failed"}}}var nM=/^0x[0-9a-fA-F]{40}$/,kS=4663;function dc(e,t){let n=String(e||"").trim();if(!nM.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function $p(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:$p(e,t)}function rM({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=dc(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=$p(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 y=Number(l.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),x=bl({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:y,ttlMs:w,secret:l.routeAttestationSecret}),g=he(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:g.selectedBps,expiresAtMs:y+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:g.selectedBps,expiresAtMs:y+w,fee:{oracleFeeBps:5},autoSlippage:g,artifact:{chainId:e,owner:o,transactions:[b]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function oM(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}Hl();let n=o0(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function iM({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==Y.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!==Y.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 IS(e={},t={}){let n=Number(e.chainId??kS);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=dc(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?dc(e.tokenIn,"tokenIn"):null,i=e.recipient?dc(e.recipient,"recipient"):null,a=e.amountIn==null?null:$p(e.amountIn,"amountIn"),s=oM(n,t.scanner),c=t.scanContractRisk||Gn,[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},y=iM({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,g=null;if(e.prepare===!0&&y.length===0){w=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{x=rM({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){g=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:y,prepared:!!w,unsignedTx:w,localSignerEnvelope:x,localSignerBlockedReason:g,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function ES(){Hl();let e=i0();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:kS,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"}}fe();fe();var sM=5,Bp=[50,75,90],AS=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Kn(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 cM(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 pc(e={},t={}){let n=t.rpcCall||U,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=AS[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(AS).join(", ")}`};let i,a,s,c;try{i=Kn(e.maxFeePerGasWei,"maxFeePerGasWei"),a=Kn(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=Kn(e.gasLimit,"gasLimit"),c=Kn(e.maxTotalGasWei,"maxTotalGasWei")}catch(k){return{status:"error",viable:!1,error:k.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${sM.toString(16)}`,"pending",Bp],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(k){return{status:"unavailable",viable:!1,error:k?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Kn(u?.baseFeePerGas,"baseFeePerGas")??Kn(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(k=>{try{return Kn(k?.[o.percentile],"reward")}catch{return null}}).filter(k=>k!=null&&k>0n),f=cM(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let y=f??1000000000n,w=d*o.baseFeeMultiplier+y,x=[];a!=null&&y>a&&(x.push({field:"maxPriorityFeePerGas",wanted:y.toString(),capped:a.toString()}),y=a,w=d*o.baseFeeMultiplier+y),i!=null&&w>i&&(x.push({field:"maxFeePerGas",wanted:w.toString(),capped:i.toString()}),w=i,y>w&&(y=w));let g=s!=null?s*w:null;c!=null&&g!=null&&g>c&&x.push({field:"totalGas",wanted:g.toString(),capped:c.toString()});let b=f==null||y>=f,S=c==null||g==null||g<=c,I=b&&S;return b||h.push(`tip cap ${y} is below the observed ${Bp[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),S||h.push(`worst-case gas ${g} 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:Bp[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:y.toString(),worstCaseGasWei:g==null?null:g.toString(),clamps:x,notes:h}}fe();var uM="08c379a0",dM="4e487b71",pM=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 mM(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===uM)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===dM){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:pM[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 fM(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 hM(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 yM(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 Hi(e={},t={}){let n=t.rpcCall||U,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=yM(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=fM(f);if(!hM(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=mM(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 _S(e={}){let t=Date.now();try{let n=await Hi({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 bM=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 wM(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 vM(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 PS(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=vM(t);else if(o==="quantity")r+=wM(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function xM({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 mc(e={},t={}){let n=t.rpcCall||U,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=bM.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 TS(e={}){let t=Date.now();try{let n=await mc({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 Mp(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 mc({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(g=>g.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(g=>g.signature)};let c=a.found.length>1&&!e.signature,l=await Gn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await Hi({chainId:r,tx:{from:o,to:n,data:PS(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 pc({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=PS(s,{minter:o,quantity:i})}catch(g){return{status:"error",error:g.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=Nl({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 y=[];c&&y.push(`contract exposes ${a.found.length} mint entrypoints (${a.found.map(g=>g.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&y.push(`contract risk HIGH: ${l.findings.map(g=>g.name).join(", ")}`),p.viable||y.push(p.notes[0]),h.skipped&&y.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let w=null,x=null;try{w=xM({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(g){x=String(g?.message||g).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(g=>g.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:y}}X();import{createHash as bF}from"node:crypto";import{createHash as kM}from"node:crypto";var IM=1,EM=8,Oe=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},AM=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),_M=new Set(["family","id"]),PM=new Set(["id","startsAt","endsAt","eligibility"]),TM=new Set(["kind","proofFormat","proofDigest"]),CM=new Set(["amount","unit"]),NM=new Set(["value","unit"]);function Ur(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 Dr(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 mt(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 OM(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Oe(`${t} must be a positive safe integer`);return e}function Fp(e,t){if(e=Ur(e,t),Dr(e,CM,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Oe(`${t} requires amount and unit`,"ambiguous-unit");let n=mt(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:mt(e.unit,`${t}.unit`)}}function Up(e,t){if(e=Ur(e,t),Dr(e,NM,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 RM(e,t){e=Ur(e,t),Dr(e,TM,t);let n=mt(e.kind,`${t}.kind`),r=mt(e.proofFormat,`${t}.proofFormat`),o=mt(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 LM(e,t){let n=`stages[${t}]`;e=Ur(e,n),Dr(e,PM,n);let r=Up(e.startsAt,`${n}.startsAt`),o=Up(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Oe(`${n} must end after it starts`,"invalid-stage-range");return{id:mt(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:RM(e.eligibility,`${n}.eligibility`)}}function Dp(e){if(e=Ur(e,"input"),Dr(e,AM,"input"),e.version!==IM)throw new Oe("version must be 1");let t=Ur(e.chain,"chain");Dr(t,_M,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>EM)throw new Oe("stages must contain 1 through 8 entries","stage-count");let r=n.map(LM).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:mt(t.family,"chain.family"),id:mt(t.id,"chain.id")},marketplace:mt(e.marketplace,"marketplace"),mechanism:mt(e.mechanism,"mechanism"),collection:mt(e.collection,"collection"),recipient:mt(e.recipient,"recipient"),quantity:OM(e.quantity,"quantity"),stages:r,mintValueCap:Fp(e.mintValueCap,"mintValueCap"),networkFeeCap:Fp(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:Fp(e.priorityFeeCap,"priorityFeeCap"),expiry:Up(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 $M(e){return JSON.stringify(Dp(e))}function CS(e){return`sha256:${kM("sha256").update($M(e),"utf8").digest("hex")}`}var qp=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Yn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Hp=Object.freeze(Object.values(Yn)),NS=new Set(Hp),OS=Object.freeze(Hp.slice(0,4)),BM=Hp,MM=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Ue=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function fc(e,t){if(!Array.isArray(e)||e.length===0)throw new Ue(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Ue(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Ue(`${t} contains duplicates`);return[...n].sort()}function FM(e){if(!Array.isArray(e))throw new Ue("capabilities must be an array");let t=new Set(e);for(let n of t)if(!NS.has(n))throw new Ue(`unknown capability ${n}`,"unknown-capability");return BM.every(n=>t.has(n))?qp.AUTOMINT_READY:OS.every(n=>t.has(n))?qp.PREPARE_READY:qp.RESEARCH_ONLY}function jp(e=[]){if(!Array.isArray(e))throw new Ue("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Ue("entry must be an object");for(let i of Object.keys(n))if(!MM.has(i))throw new Ue(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Ue("entry id must be an exact string");if(t.has(n.id))throw new Ue(`duplicate entry id ${n.id}`,"duplicate-entry");let r=fc(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(fc(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(fc(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(fc(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:FM(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=OS){let o=t.get(n);if(!o)throw new Ue(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!NS.has(i))throw new Ue(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Ue(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var iz=jp([]);X();import{getAddress as UM,Interface as zp,keccak256 as DM}from"ethers";var gn=Object.freeze({manifold:new zp(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new zp(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new zp(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Wp=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"})}),lz=Object.freeze(Object.fromEntries(Object.entries(Wp).map(([e,t])=>[gn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function oe(e){throw new Error(`evm-mint-launchpads: ${e}`)}function tt(e,t){try{return UM(String(e||""))}catch{return oe(`invalid ${t}`)}}function De(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&oe(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return oe(`${t} must be an unsigned integer`)}}function Vp(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&oe(`invalid ${t}`),e.map(String)}function qM(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&oe("invalid chainId");let o=tt(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&&tt(u.contract,"reviewed contract")===o);a||oe("unsupported contract or wrong chain");let s=tt(a.mintTarget||a.contract,"reviewed mint target"),c=gn[e].getFunction(Wp[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))&&oe("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function HM(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);oe("runtime bytecode verification required")}function jM(e,t){let n=e.stage;if(!n)return null;let r=De(n.startTime,"stage startTime"),o=De(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&oe("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function zM(e,t){let n=Wp[e];String(t).slice(0,10).toLowerCase()!==gn[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=gn[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=gn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=gn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=gn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&oe("calldata must be canonical with no suffix"),r}async function RS(e,t={},n={}){gn[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=qM(e,t,n),s=tt(t.recipient||t.minter,"recipient"),c=De(t.quantity,"quantity",{positive:!0}),l=De(t.priceWei,"priceWei"),u=De(t.maxValueWei,"maxValueWei"),d=De(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&oe("transaction chain mismatch"),tt(p.to,"transaction target")!==i&&oe("transaction target mismatch");let m=await HM(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||DM(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let f=zM(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),y=jM(t,h),w,x,g,b=null,S=[];if(e==="manifold")tt(f[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||De(f[1],"instanceId")!==De(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||De(f[2],"mintIndex")!==De(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),S=Vp([...f[3]]),w=tt(f[4],"calldata recipient"),x=1n,g=l;else if(e==="zora")w=tt(f[0],"calldata recipient"),x=BigInt(f[1]),g=l,t.comment!=null&&f[2]!==String(t.comment)&&oe("comment mismatch"),t.mintReferral!=null&&tt(f[3],"mint referral")!==tt(t.mintReferral,"expected mint referral")&&oe("mint referral mismatch");else{w=tt(f[0],"calldata recipient"),x=BigInt(f[1]),g=BigInt(f[3]);let _=f[4];S=Vp([..._.proof]),b=BigInt(_.quantityLimitPerWallet),b<c&&oe("wallet allowance below quantity"),(BigInt(_.pricePerToken)!==l||tt(_.currency,"allowlist currency")!==tt(f[2],"currency"))&&oe("allowlist terms mismatch")}w!==s&&oe("recipient mismatch"),x!==c&&oe("quantity mismatch"),g!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(S.map(_=>_.toLowerCase()))!==JSON.stringify(Vp(t.proof).map(_=>_.toLowerCase()))&&oe("proof mismatch");let I=De(p.value??0,"transaction value"),k=l*c;(I<k||I-k>d||I>u)&&oe("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:De(p.gasLimit,"gasLimit"),P=p.maxFeePerGas==null?null:De(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>De(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>De(t.maxFeePerGasWei,"maxFeePerGasWei"))&&oe("gas fee cap exceeded"),N({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-k).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...y?{stage:y}:{},...b==null?{}:{walletAllowance:b.toString()},proof:S,transaction:{chainId:r,to:i,data:p.data,value:I.toString(),...E==null?{}:{gasLimit:E.toString()},...P==null?{}:{maxFeePerGas:P.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var VM="RESEARCH_ONLY";var WM="canonical serialized-message decoding and program-specific instruction validation are not implemented",hc=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),dz=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function GM(){throw new Error(`solana-mint: ${VM}; disabled until ${WM}`)}function LS(){GM()}X();import{Address as KM,CompactSize as YM,NETWORK as JM,OutScript as VS,Script as XM,TEST_NETWORK as $S,Transaction as QM,utils as ZM}from"@scure/btc-signer";import{createHash as ji}from"node:crypto";var BS="universal-ordinals-mint",MS="bitcoin-ordinals-mint-plan",eF=1800*1e3,tF=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),FS=new Set,nF=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function vt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function bn(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 Gp(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 WS(e,t){let n=vt(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 rF(e){return e==="bitcoin"||e==="mainnet"?JM:e==="regtest"?{...$S,bech32:"bcrt"}:$S}function US(e,t){try{let n=VS.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 oF(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function iF(e){let t=ji("sha256").update(e.unsignedTx).digest();return ji("sha256").update(t).digest().reverse().toString("hex")}function DS(e,...t){let n=ji("sha256").update(e,"ascii").digest();return ji("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function aF(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=DS("TapLeaf",Buffer.from([a]),Buffer.from(YM.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=DS("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=ZM.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 qS(e,t){let n=vt(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=QM.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(oF(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=US(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)=>aF(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 US(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:iF(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 sF(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 cF(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 lF=new Set([1,3]);function uF(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=cF(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!lF.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 dF(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=XM.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(uF(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||sF(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 HS(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 pF(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 GS(e,t="parentId"){let n=vt(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 KS(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=vt(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=bn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function mF(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:vt(a.role,`revealOutputs[${s}].role`),address:vt(a.address,`revealOutputs[${s}].address`),valueSats:bn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:WS(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:GS(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 fF(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:vt(n?.role,`commitOutputs[${r}].role`),valueSats:bn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:WS(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 jS(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 zS(e,t,n){try{return Buffer.from(VS.encode(KM(rF(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 hF(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)=>KS({...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 yF(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");pF(e);for(let C of["content","contentBytes","body","file","path","url","contentUrl"])if(e[C]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let C of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[C]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=vt(e.network,"network").toLowerCase();if(!tF.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=vt(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=vt(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=GS(e.parentId??e.parentInscriptionId),a=vt(e.recipient??e.destination,"recipient"),s=bn(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(KS);if(new Set(c.map(C=>C.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");hF(e,c);let l=qS(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=qS(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=fF(e.commitOutputs),p=mF(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((C,$)=>C.txid!==c[$].txid||C.vout!==c[$].vout||C.valueSats!==c[$].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");jS(l.outputs,d,"commit PSBT"),jS(u.outputs,p,"reveal PSBT");let m=zS(a,n,"recipient");if(p.find(C=>C.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[C,$]of p.entries())if($.scriptHex!==zS($.address,n,`revealOutputs[${C}].address`))throw new Error(`ordinals mint: reveal output ${C} script does not pay its bound address`);let f=d.findIndex(C=>C.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(C=>C.txid===l.txid&&C.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");dF(u,{contentHash:r,contentType:o,parentId:i});let y=Gp(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Gp(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Gp(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||y>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let g=bn(e.commitFeeSats,"commitFeeSats"),b=bn(e.revealFeeSats,"revealFeeSats"),S=bn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(g+b>S)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==g.toString()||u.feeSats!==b.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(g)/l.vsizeLowerBound>y||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(C=>C.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:bn(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(C=>C.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let P=Number(t.nowMs??Date.now()),_=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(_)||_<=P||_-P>eF)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(HS),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(HS),revealPsbt:u.encoded,revealOutputs:p,commitRate:y,revealRate:w,maxRate:x,commitFee:g.toString(),revealFee:b.toString(),maxTotalFee:S.toString(),rbf:e.rbf,cpfp:E,expiresAt:_}}function gF(e={},t={}){let n=yF(e,t),r=n.commitInputs.find(s=>FS.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:BS,kind:MS,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...nF},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=N(i,{provider:BS,kind:MS,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)FS.add(s.outpoint);return a}var YS=gF;var wF=Object.freeze([Yn.DISCOVERY,Yn.ELIGIBILITY,Yn.PREPARATION,Yn.SIMULATION]),JS=[["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",hc.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",hc.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",hc.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],XS=Object.freeze(JS.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([Yn.DISCOVERY]):wF,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),Ez=jp(XS.map(({family:e,tier:t,enabled:n,...r})=>r)),QS=new Map(JS.map(e=>[e[0],e])),vF=new Set(["intent","adapterId","input"]),xF=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,yc=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ue(e,t,n){throw new yc(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function Ce(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function ZS(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))xF.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),ZS(r,`${t}.${n}`)}function SF(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function kF(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ue("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ue("intent-mismatch","stageId does not match canonical intent"),M(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${bF("sha256").update(JSON.stringify(SF(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))&&ue("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)&&ue("expired-intent","canonical mint stage is not active at authoritative now"),o}function IF(e,t){let n=QS.get(t);n||ue("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))&&ue("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function EF(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,Ce(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Ce(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Ce(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,Ce(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Ce(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Ce(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,Ce(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ce(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ce(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function AF(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==_n(e))&&ue("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ue("custody-refused","leaf artifact is not strictly prepare-only")}function _F(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=Ce(e,"mintValueCap","wei"),o=Ce(e,"networkFeeCap","wei"),i=Ce(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||ue("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)&&ue("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)&&ue("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&&ue("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function PF(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,Ce(e,"mintValueCap","lamports"),"mint-value cap");let r=Ce(e,"networkFeeCap","lamports"),o=Ce(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)&&ue("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function TF(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,Ce(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ce(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ce(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 Kp(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:XS})}async function ek(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Kp()}}async function tk(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ue("invalid-request","request must be a plain object");for(let u of Object.keys(e))vF.has(u)||ue("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ue("invalid-request","explicit adapterId is required; adapter inference is refused"),QS.has(e.adapterId)||ue("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ue("invalid-request","family-specific decoded input is required"),ZS(n);let r;try{r=Dp(e.intent)}catch(u){ue("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ue("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ue("expired-intent","canonical mint intent has expired");let i=IF(r,e.adapterId);i[1]==="solana"&&ue("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=kF(r,n,r.chain.family,o);EF(r,n);let s;try{i[4]==="evm"?s=await RS(i[5],n,t):i[4]==="opensea"?s=await Ta(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await LS(n,t)):s=await YS(n,t)}catch(u){if(u instanceof yc)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}AF(s);let c=i[4]==="bitcoin"?TF(r,n,s):i[4]==="solana"?PF(r,n,s):_F(r,n,s),l=Object.freeze({intentHash:CS(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 N({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 Yp="ROUTE_ONLY",Jp=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),rk=new Set(Object.values(Jp)),NF=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),OF=new Set(["amount","currency"]),RF=new Set(["value","unit"]),LF=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),$F=new Set(["provider","operations"]),se=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function jr(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new se(`${t} must be a plain object`);return e}function zi(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new se(`${n} has unknown field ${r}`,"unknown-field")}function ye(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new se(`${t} must be an exact non-empty string`);return e}function ok(e,t,{positive:n=!1}={}){if(e=ye(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new se(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function qr(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new se(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>ye(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new se(`${t} contains duplicates`);return r}function ik(e,t){return e=jr(e,t),zi(e,OF,t),{amount:ok(e.amount,`${t}.amount`),currency:ye(e.currency,`${t}.currency`)}}function nk(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>ik(n,`${t}[${r}]`))}function BF(e){if(e=jr(e,"expiry"),zi(e,RF,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new se("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function MF(e,t,n){Object.hasOwn(e,n)&&(t[n]=ye(e[n],n))}function ak(e){e=jr(e,"intent"),zi(e,NF,"intent");let t=ye(e.action,"action");if(!rk.has(t))throw new se(`unsupported action ${t}`,"invalid-action");let n={action:t,family:ye(e.family,"family"),network:ye(e.network,"network"),standard:ye(e.standard,"standard"),collection:ye(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])MF(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 se("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new se("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new se("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=ye(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new se("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=ye(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=ye(e.sender,"sender"))}else n.owner=ye(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=ye(e.recipient,"recipient")),n.quantity=ok(e.quantity,"quantity",{positive:!0}),n.marketplace=ye(e.marketplace,"marketplace"),n.protocol=ye(e.protocol,"protocol"),n.artifactKind=ye(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new se(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=ik(e.price,"price"),n.expiry=BF(e.expiry),n.fees=nk(e.fees,"fees"),n.royalties=nk(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ye(e.listingId,"listingId")),n}function FF(e){e=jr(e,"adapter"),zi(e,LF,"adapter");let t=qr(e.actions,"adapter.actions");for(let o of t)if(!rk.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=jr(e.surface,"adapter.surface");zi(n,$F,"adapter.surface");let r=jr(n.operations,"adapter.surface.operations");for(let o of t)ye(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new se(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:ye(e.id,"adapter.id"),family:ye(e.family,"adapter.family"),networks:Object.freeze(qr(e.networks,"adapter.networks")),standards:Object.freeze(qr(e.standards,"adapter.standards")),marketplaces:Object.freeze(qr(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(qr(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(qr(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Yp,custody:"user",surface:Object.freeze({provider:ye(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function UF(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(FF);if(new Set(t.map(r=>r.id)).size!==t.length)throw new se("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:Yp,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=ak(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new se("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new se(`adapter lacks ${o.action}`,"unsupported-operation"):new se("no exact adapter route","unsupported-operation")}})}var Hr=(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}}),Xp=UF([Hr("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"}),Hr("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"}),Hr("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"}),Hr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Hr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Hr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function sk(e,{access:t="public",feeProfile:n="default",registry:r=Xp,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new se("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new se("nowMs must be a non-negative safe integer","invalid-expiry");let i=ak(e);if(i.expiry&&o>=i.expiry.value)throw new se("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Yp,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:ye(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 bc="universal-evm-nft-transfer",ck="evm-nft-safe-transfer",qF=1800*1e3,HF=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),jF=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function lk(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(jF.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);lk(r,t)}}}function Qp(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 Jn(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 Vi=e=>e.toString(16).padStart(64,"0"),gc=e=>e.slice(2).padStart(64,"0");function zF(e,t,n,r,o){return e==="erc721"?`0x42842e0e${gc(t)}${gc(n)}${Vi(r)}`:`0xf242432a${gc(t)}${gc(n)}${Vi(r)}${Vi(o)}${Vi(160n)}${Vi(0n)}`}function VF(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(lk(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=Jn(e.chainId,"chainId",{positive:!0,safe:!0}),o=Qp(e.sender??e.from,"sender"),i=Qp(e.recipient??e.to,"recipient"),a=Qp(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Jn(e.tokenId,"tokenId"),c=Jn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Jn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Jn(e.gasLimit,"gasLimit",{positive:!0}),u=Jn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Jn(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)>qF)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=zF(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 uk(e={},t={}){let n=VF(e,t),r={provider:bc,kind:ck,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...HF},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 N(r,{provider:bc,kind:ck,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}X();var wc="universal-solana-nft-transfer",dk="solana-verified-nft-transfer",mk="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Xn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),pk=new Set(Object.values(Xn)),GF=new Set([Xn.token,Xn.token2022]),KF=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),YF=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function te(e){throw new Error(`solana nft transfer: ${e}`)}function xt(e,t){let n=String(e??"").trim();return n||te(`${t} required`),n}function Ct(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||te(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&te(`${t} must be positive`),r}function ve(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function fk(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))YF.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),fk(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&te(`${r} refused; adapter is prepare-only`)}}function JF(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&te(`${t} must be decoded`),Array.isArray(e.accounts)||te(`${t} decoded accounts required`),e.decoded}function XF(e,t,n){for(let r of e.accounts){let o=xt(r.pubkey,"account pubkey");t.has(o)||te(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&te(`unexpected writable account ${o}`)}}function QF(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),fk(e),(e.network!=="mainnet-beta"||e.genesisHash!==mk)&&te("mainnet genesis/network mismatch"),e.reviewed!==!0&&te("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=xt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&te("standard must be metaplex or core");let n=xt(e.mint??e.asset,"mint/asset"),r=xt(e.collection,"collection");e.collectionVerified!==!0&&te("verified collection required");let o=xt(e.owner,"owner"),i=xt(e.recipient,"recipient"),a=Ct(e.quantity,"quantity",{positive:!0}),s=Ct(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&te("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&te("Core quantity must be exactly 1");let c=xt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==Xn.core:!GF.has(c))&&te("reviewed transfer program mismatch");let l=t==="metaplex"?xt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?xt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&ve(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Ct(e.decimals??0,"decimals")):null,p=Ct(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Ct(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Ct(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&te("priority fee exceeds reviewed cap");let y=Ct(e.networkFeeLamports,"networkFeeLamports"),w=Ct(e.networkFeeCapLamports,"networkFeeCapLamports");y>w&&te("network fee cap exceeded");let x=e.transaction;(!x||typeof x!="object"||Array.isArray(x))&&te("transaction object required"),x.version!==0&&x.version!=="legacy"&&te("transaction version must be 0 or legacy");let g=xt(x.recentBlockhash,"recentBlockhash");ve(g,e.approvedBlockhash,"blockhash mutation after approval");let b=Ct(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),S=Ct(e.currentBlockHeight,"currentBlockHeight");S>b&&te("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&te("canonical instructions required");let I=new Set([o,n,l,u].filter(Boolean)),k=new Set([o,i,n,r,l,u,...pk].filter(Boolean)),E=0,P=0,_=0,C=0;for(let[$,D]of x.instructions.entries()){let H=xt(D.programId,`instructions[${$}].programId`);pk.has(H)||te(`unknown program ${H}`);let R=JF(D,`instructions[${$}]`);XF(D,k,I);let j=String(R.type??R.instruction??"").toLowerCase();H===Xn.computeBudget?j.includes("limit")?(ve(R.units??R.computeUnitLimit,p,"compute-unit limit"),E++):j.includes("price")?(ve(R.microLamports??R.computeUnitPriceMicroLamports,m,"compute-unit price"),P++):te("unsupported compute budget instruction"):H===Xn.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),ve(R.payer,o,"ATA payer"),ve(R.owner,i,"ATA recipient"),ve(R.mint,n,"ATA mint"),ve(R.tokenAccount,u,"recipient ATA"),ve(R.tokenProgramId,c,"ATA token program"),C++):t==="metaplex"&&H===c?(j!=="transferchecked"&&te("only canonical transferChecked is allowed"),ve(R.mint,n,"mint"),ve(R.owner,o,"owner"),ve(R.recipient,i,"recipient"),ve(R.sourceTokenAccount,l,"source token account"),ve(R.destinationTokenAccount,u,"recipient ATA"),ve(R.amount,a,"quantity"),ve(R.decimals,d,"decimals"),_++):t==="core"&&H===Xn.core?(j!=="transfer"&&te("only canonical Core transfer is allowed"),ve(R.asset,n,"mint/asset"),ve(R.collection,r,"collection"),R.collectionVerified!==!0&&te("verified collection required in Core instruction"),ve(R.owner,o,"owner"),ve(R.newOwner,i,"recipient"),ve(R.amount??1,1,"quantity"),_++):te(`program ${H} is not valid for ${t} transfer`)}return(E!==1||P!==1)&&te("exactly one compute-unit limit and price instruction required"),_!==1&&te("exactly one canonical transfer instruction required"),t==="metaplex"&&C>1&&te("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:g,lastValidBlockHeight:b.toString(),currentBlockHeight:S.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:y.toString(),networkFeeCapLamports:w.toString(),transaction:x}}function hk(e={},t={}){let n=QF(e),r=Number(t.nowMs??Date.now()),o={provider:wc,kind:dk,chain:"solana-mainnet-beta",genesisHash:mk,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...KF},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 N(o,{provider:wc,kind:dk,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}X();var vc="universal-ordinals-transfer",yk="bitcoin-ordinals-transfer-plan",gk=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),e4=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function vn(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function wn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||ie(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&ie(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&ie(`${t} out of range`),o}function bk(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function Sk(e,t){let n=vn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function kk(e,t="inscriptionId"){let n=vn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function Ik(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&&ie(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),Ik(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ie(`${r} bypass refused; adapter is prepare-only`)}function Ek(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&ie(`${t}.${n} arbitrary script refused; use a bound address`)}function wk(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Ek(e,t);let n=Sk(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&ie(`${t}.vout invalid`),{txid:n,vout:r,valueSats:wn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:vn(e.address,`${t}.address`),sequence:Number(wn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function vk(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),Ek(e,t),{role:vn(e.role,`${t}.role`),address:vn(e.address,`${t}.address`),valueSats:wn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:kk(e.inscriptionId,`${t}.inscriptionId`)}}}function xk(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function t4(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),Ik(e);let t=vn(e.network,"network").toLowerCase(),n=Sk(e.genesisHash,"genesisHash");(!gk[t]||n!==gk[t])&&ie("network/genesis mismatch");let r=kk(e.inscriptionId),o=wk(e.ownerInput,"ownerInput");vn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=vn(e.destination,"destination"),a=wn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:vk(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=bk(e.feeRateSatVb,"feeRateSatVb"),l=bk(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=wn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=wn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(wn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(wn(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&ie("RBF sequence refused"),o.sequence!==m&&ie("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&ie("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&ie("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&ie("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&ie("exactly one PSBT input required; extra inputs refused"),xk(wk(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((g,b)=>vk(g,`psbt.outputs[${b}]`)):ie("PSBT outputs required"),y={role:"inscription",address:i,valueSats:a,inscriptionId:r};xk(h,s?[y,s]:[y],"exact PSBT outputs"),h.filter(g=>g.role==="inscription"&&g.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let x=h.reduce((g,b)=>g+BigInt(b.valueSats),0n);return BigInt(o.valueSats)!==x+u&&ie("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 Ak(e={},t={}){let n=t4(e);return N({provider:vc,kind:yk,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...e4},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:vc,kind:yk,env:t.env})}fe();function r4(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(!Qu(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=r4(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 Pk(e={},t={}){let n=t.rpcCall||U,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 i4=1440*60*1e3;function a4(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>i4&&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 Tk="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",s4=4663,c4="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",Ck="a22cb465",l4="a0712d68";function Zp(e){return String(e||"").trim().toLowerCase()}function zr(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function u4(e){let t=zr(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${Ck}${t.padStart(64,"0")}${"0".repeat(64)}`}function d4(e){return zr(e).includes(zr(Tk))}function p4(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>zr(n?.data).startsWith(Ck))}function m4(e={},t){let n=zr(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return Zp(i[0])!==c4?!1:zr(i[2])===n})}function f4(e=1){return`0x${l4}${BigInt(e).toString(16).padStart(64,"0")}`}function Nk(e={},t={}){let n=Zp(e.contract),r=Zp(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!==s4&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),d4(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"),p4(s)&&a.push("simulation sets approval / setApprovalForAll"),m4(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:f4(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:u4(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!_g(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=a4(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:Tk.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"]}}O();X();Wa();var y4="https://api.paraswap.io",em=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||y4).replace(/\/$/,"");function Vr(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 tm(e={},t={}){let n=Number(e.chainId||1);return v(`${em(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Vr(e.srcToken,"srcToken"),destToken:Vr(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 Va({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(U0(o)))r.set(s,c);let i=await v(`${em(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...re(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 Ok(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=Vr(e.userAddress,"userAddress"),o=await Wr(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Vr(e.srcToken,"srcToken"),destToken:Vr(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=Vr(e.receiver,"receiver"));let c=await v(`${em(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 N({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:he(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function Rk(e={}){let t=await tm({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 b4}from"node:crypto";import{getAddress as Uk,isAddress as nm}from"ethers";var Lk="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",w4=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),v4=Object.freeze(["lifi"]),$k=/^0x[0-9a-fA-F]{64}$/,x4=/^\d+$/;function ge(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function Bk(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ge(t,"must be a positive chainId"),n}function xc(e,t){let n=String(e??"").trim();return(!x4.test(n)||BigInt(n)<=0n)&&ge(t,"must be a positive integer string"),n}function S4(e,t){return e==null||e===""?null:xc(e,t)}function Mk(e,t){let n=String(e??"").trim();return n.toLowerCase()===Lk.toLowerCase()?Lk:(nm(n)||ge(t,"must be an EVM address or native token sentinel"),Uk(n))}function Dk(e,t){let n=String(e??"").trim();return nm(n)||ge(t,"must be an EVM address"),Uk(n)}function k4(e,t){return e==null||e===""?null:Dk(e,t)}function Fk(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||ge(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function I4(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||ge(r,"must be a finite millisecond timestamp"),o<=t&&ge(r,"expired"),o>t+n&&ge(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Gr(e){if(Array.isArray(e))return e.map(Gr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Gr(e[n]));return t}return e}function E4(e){return JSON.stringify(Gr(e))}function Sc(e){return`0x${b4("sha256").update(E4(e)).digest("hex")}`}function qk(e,t){let n={...e};for(let r of t)delete n[r];return n}function A4(e){return Sc(qk(e,["intentHash"]))}function _4(e){return Sc(qk(e,["firmQuoteHash"]))}function rm(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&ge("time","is invalid");let o=Bk(e.fromChainId??e.fromChain,"fromChainId"),i=Bk(e.toChainId??e.toChain,"toChainId"),s=o===i?w4:v4,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Mk(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Mk(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:xc(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Dk(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:I4(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:S4(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Fk(e.allowedSources,"allowedSources",s),allowedRouters:Fk(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)?Gr(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&ge("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):Sc({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=A4(c),Object.freeze(c)}function P4(e){return(!e||typeof e!="object"||Array.isArray(e))&&ge("artifact","required"),e.typedDataHash!=null&&!$k.test(String(e.typedDataHash))&&ge("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!$k.test(String(e.calldataHash))&&ge("artifact.calldataHash","must be bytes32"),e.to!=null&&!nm(String(e.to))&&ge("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&ge("artifact.data","must be hex"),Gr(e)}function Hk(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&ge("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||ge("quote expiry","required"),o<=r&&ge("quote","expired"),o>e.deadlineMs&&ge("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||ge("source","required"),e.allowedSources.includes(i)||ge("source","not allowed by intent");let a=xc(t.amountOut??t.buyAmount,"amountOut"),s=xc(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ge("minBuyAmount","exceeds amountOut");let c=P4(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||ge("quotedAtMs","must be finite");let u=k4(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)?Gr(t.metadata):{}};return d.quoteId||(d.quoteId=Sc({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=_4(d),Object.freeze(d)}function Wi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function jk(e,t){return String(e?.[t]??"").trim()}function Gi(e,t){return Object.freeze({source:e,run:t})}function T4(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??Je,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return Wi(e,"lifi")&&a.push(Gi("lifi",async()=>{let c=await(r.lifiQuote??Wo)({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 C4(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(Wi(e,"paraswap")&&a.push(Gi("paraswap",async()=>{let c=await(r.paraswapPrice??Wr)({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}}})),Wi(e,"0x")&&(jk(n,"ZEROX_API_KEY")||jk(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(Gi("0x",async()=>{let c=await(r.zeroxQuote??Ko)({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}}})),Wi(e,"cow")&&a.push(Gi("cow",async()=>{let c=await(r.cowQuote??fr)({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}}})),Wi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(Gi("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??nr)({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 C4(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function N4(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function O4(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>N4(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(Hk(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 R4(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 zk(e,t={}){let n=T4(e,t),{quotes:r,failed:o}=await O4(e,n,t),i=R4(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 Vk(e={},t={}){return rm(e,t)}async function Wk(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:rm(e,t);return zk(n,t)}async function Gk(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}O();var $4="https://app.across.to";function om(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||$4).replace(/\/$/,"")}async function Kk(e={}){try{let t=await v(`${om(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 Yk(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return v(`${om(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Jk(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)),v(`${om(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}O();var M4="https://api.beefy.finance";function im(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||M4).replace(/\/$/,"")}async function Xk(e={}){try{let t=await v(`${im(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 Qk(e={},t={}){let n=await v(`${im(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 Zk(e={}){return v(`${im(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}O();var U4="https://public-api.birdeye.so";function eI(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||U4).replace(/\/$/,"")}async function tI(e={}){try{let t=await v(`${eI(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 nI(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 v(`${eI(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}O();var q4="https://api.celenium.io";function am(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||q4).replace(/\/$/,"")}async function rI(e={}){try{let t=await v(`${am(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 oI(e={}){return v(`${am(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function iI(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 v(`${am(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}O();var j4="https://api.mainnet-beta.solana.com";function z4(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||j4).replace(/\/$/,"")}async function kc(e,t,n={}){let r=z4(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 aI(e={}){try{let t=await kc("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 sI(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 kc("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function cI(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)),kc("searchAssets",o,t)}async function lI(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return kc("getAssetProof",{id:n},t)}O();var W4="https://api.l2beat.com";function sm(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||W4).replace(/\/$/,"")}async function uI(e={}){try{let t=await v(`${sm(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 dI(e={},t={}){let n=await v(`${sm(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 pI(e={},t={}){return v(`${sm(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}O();var K4="https://api.spark.fi";function cm(e={}){return(e.baseUrl||process.env.SPARK_API_URL||K4).replace(/\/$/,"")}async function mI(e={}){try{return{ok:(await v(`${cm(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 fI(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?v(`${cm(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):v(`${cm(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}O();var J4="https://api.symbiotic.fi";function lm(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||J4).replace(/\/$/,"")}async function hI(e={}){try{let t=await v(`${lm(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 yI(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await v(`${lm(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 gI(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return v(`${lm(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}O();var Q4="https://staking-api.polygon.technology/api/v2",Z4=18,eU=200,tU=50,nU=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function dm(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||Q4).replace(/\/$/,"")}function rU(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 oU(e,t=tU){let n=Number(e??t);return Number.isFinite(n)?Math.min(eU,Math.max(1,Math.trunc(n))):t}function um(e){let t=Number(e);return Number.isFinite(t)?t/10**Z4:null}async function pm(e,t={}){let n=await v(`${dm(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 bI(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:um(e.totalStaked),selfStakePolApprox:um(e.selfStake),delegatedStakePolApprox:um(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function wI(e={},t={}){let n=await pm("/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=nU.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=oU(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(bI)}}async function vI(e={},t={}){let n=rU(e.id??e.validatorId,"id"),o=(await pm(`/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:{...bI(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 xI(e={}){try{let t=await pm("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:dm(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:dm(e),error:String(t?.message||t),exec:!1}}}O();var aU="https://api.v3.aave.com/graphql",aV=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),sU=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||aU;async function Ic(e,t,n={}){let r=await v(sU(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 cU=`query Markets($request: MarketsRequest!) {
|
|
151
151
|
markets(request: $request) {
|
|
152
152
|
name
|
|
153
153
|
address
|
|
@@ -155,7 +155,7 @@ anchor-lang = "0.31.1"
|
|
|
155
155
|
totalMarketSize
|
|
156
156
|
totalAvailableLiquidity
|
|
157
157
|
}
|
|
158
|
-
}`,
|
|
158
|
+
}`,lU=`query Market($request: MarketRequest!) {
|
|
159
159
|
market(request: $request) {
|
|
160
160
|
name
|
|
161
161
|
address
|
|
@@ -188,6 +188,46 @@ anchor-lang = "0.31.1"
|
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
|
-
}`,
|
|
191
|
+
}`,uU=`query Chains($filter: ChainsFilter!) {
|
|
192
192
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
193
|
-
}`;function uM(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 LS(e={},t={}){let n={chainIds:uM(e)};return e.user&&(n.user=String(e.user)),{markets:(await Us(sM,{request:n},t))?.data?.markets??[]}}async function $S(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 Us(cM,{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 BS(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 Us(lM,{filter:r},t))?.data?.chains??[]}}async function MS(e={}){return{ok:(await Us("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}$();var pM="https://staking-api.babylonlabs.io";function dp(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||pM).replace(/\/$/,"")}function qs(e,t={}){return k(`${dp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function FS(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 DS(e={}){try{let n=(await qs("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:dp(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:dp(e),error:String(t?.message||t),exec:!1}}}async function US(e={},t={}){let r=(await qs("/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 qS(e={},t={}){let n=await qs("/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=FS(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 HS(e={},t={}){let n=FS(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 qs(`/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}}$();var fM="https://markets.bisq.network";function pp(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||fM).replace(/\/$/,"")}function jS(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 Hs(e,t={}){return k(`${pp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function zS(e={}){try{let t=await Hs("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:pp(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:pp(e),error:String(t?.message||t),exec:!1}}}async function VS(e={},t={}){let n=await Hs("/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 WS(e={},t={}){let n=jS(e.market||e.pair||"btc_usd","market"),r=await Hs(`/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 GS(e={},t={}){let n=jS(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 Hs(`/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}))}}import{readFileSync as gM,existsSync as yM}from"node:fs";import{homedir as bM}from"node:os";import wM from"node:path";var ft="social-intel",xM=120;function vM(e={}){return String(e.storePath||process.env.ORACLE_SOCIAL_INTEL_STORE||wM.join(bM(),".config","oracle","social-intel","store.json"))}function KS(){let e=Number(process.env.ORACLE_SOCIAL_INTEL_STALE_MIN);return Number.isFinite(e)&&e>0?e:xM}function Fr(e={}){return Number.isFinite(e.nowMs)?Number(e.nowMs):Date.now()}function Dr(e={}){let t=vM(e);if(!yM(t))return{storePath:t,missing:!0};let n;try{n=JSON.parse(gM(t,"utf8"))}catch(i){return{storePath:t,error:`store unparseable: ${String(i?.message||i)}`}}if(!n||typeof n!="object"||Array.isArray(n))return{storePath:t,error:"store root must be a JSON object"};let r=Array.isArray(n.mentions)?n.mentions.filter(i=>i&&typeof i=="object"):[],o=n.accounts&&typeof n.accounts=="object"&&!Array.isArray(n.accounts)?n.accounts:{};return{storePath:t,store:{updatedAt:typeof n.updatedAt=="string"?n.updatedAt:null,windowHours:Number.isFinite(Number(n.windowHours))?Number(n.windowHours):24,sources:n.sources&&typeof n.sources=="object"?n.sources:{},mentions:r,accounts:o}}}function YS(e,t){if(!e)return null;let n=Date.parse(e);return Number.isFinite(n)?Math.max(0,Math.round((t-n)/6e4*10)/10):null}function Mr(e,t){let n=YS(e.updatedAt,t);return{sample:"curated-accounts",accounts:Object.keys(e.accounts).length,updatedAt:e.updatedAt,stale:n==null?!0:n>KS()}}function Ei(e){return{provider:ft,unavailable:!0,reason:e.missing?`store missing at ${e.storePath}`:e.error,rows:[]}}function mp(e){let t=String(e??"24h").trim().match(/^(\d+(?:\.\d+)?)\s*([mhd])$/i);if(!t)return 24*36e5;let n=Number(t[1]),r=t[2].toLowerCase();return n*(r==="m"?6e4:r==="h"?36e5:864e5)}function Si(e){let t=Date.parse(e.ts||"");return Number.isFinite(t)?t:null}function fp(e,t,n){let r=Si(e);return r!=null&&t-r<n}function ki(e){return(Array.isArray(e.tickers)?e.tickers:[]).map(t=>String(t||"").replace(/^\$/,"").toUpperCase()).filter(Boolean)}function hp(e){return(Array.isArray(e.cas)?e.cas:[]).filter(t=>t&&typeof t=="object"&&t.address).map(t=>({chain:String(t.chain||"").toLowerCase()||null,address:String(t.address).toLowerCase()}))}function gp(e,t){let n=e.accounts[t];return n&&typeof n=="object"?n.grade??null:null}function Ii(e,t,n=200){let r=Number(e);return Number.isFinite(r)&&r>=1?Math.min(n,Math.floor(r)):t}function JS(e,t=280){let n=String(e??"");return n.length>t?`${n.slice(0,t-1)}\u2026`:n}async function XS(e={},t={}){try{let n=Fr(t),r=Dr(t);if(r.missing)return{ok:!0,provider:ft,configured:!1,storePath:r.storePath,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0,note:"store absent \u2014 run the social-intel ingester to populate it; absence is not an error"};if(r.error)return{ok:!1,provider:ft,configured:!0,storePath:r.storePath,error:r.error,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0};let o=YS(r.store.updatedAt,n);return{ok:!0,provider:ft,configured:!0,storePath:r.storePath,updatedAt:r.store.updatedAt,ageMinutes:o,stale:o==null?!0:o>KS(),accounts:Object.keys(r.store.accounts).length,mentions:r.store.mentions.length}}catch(n){return{ok:!1,provider:ft,configured:!1,error:String(n?.message||n)}}}async function QS(e={},t={}){let n=Dr(t);if(!n.store)return Ei(n);let r=Fr(t),o=mp(e.timeWindow),i=Ii(e.limit,20),a=new Map;for(let c of n.store.mentions){if(!fp(c,r,o))continue;let l=gp(n.store,c.account),u=Si(c);for(let d of new Set(ki(c))){let p=a.get(d)||{ticker:d,mentions:0,accounts:new Set,smartMentions:0,firstSeen:null,lastSeen:null};p.mentions+=1,c.account&&p.accounts.add(c.account),l==="ELITE"&&(p.smartMentions+=1),u!=null&&((p.firstSeen==null||u<p.firstSeen)&&(p.firstSeen=u),(p.lastSeen==null||u>p.lastSeen)&&(p.lastSeen=u)),a.set(d,p)}}let s=[...a.values()].sort((c,l)=>l.mentions-c.mentions||l.smartMentions-c.smartMentions||c.ticker.localeCompare(l.ticker)).slice(0,i).map(c=>({ticker:c.ticker,mentions:c.mentions,uniqueAccounts:c.accounts.size,smartMentions:c.smartMentions,firstSeen:c.firstSeen==null?null:new Date(c.firstSeen).toISOString(),lastSeen:c.lastSeen==null?null:new Date(c.lastSeen).toISOString(),sampleNote:"curated caller sample, not market-wide volume"}));return{provider:ft,timeWindow:String(e.timeWindow??"24h"),count:s.length,rows:s,basis:Mr(n.store,r)}}async function ZS(e={},t={}){let n=Dr(t);if(!n.store)return Ei(n);let r=Fr(t),o=mp(e.timeWindow),i=Ii(e.limit,20),a=String(e.platform??"x").toLowerCase(),s=e.chain?String(e.chain).toLowerCase():null,c=new Map;for(let u of n.store.mentions){if(!fp(u,r,o)||String(u.source||"x").toLowerCase()!==a)continue;let d=gp(n.store,u.account),p=Si(u);for(let m of hp(u)){if(s&&m.chain!==s)continue;let f=`${m.chain}:${m.address}`,h=c.get(f)||{chain:m.chain,address:m.address,mentions:0,accounts:new Set,smartMentions:0,lastSeen:null};h.mentions+=1,u.account&&h.accounts.add(u.account),d==="ELITE"&&(h.smartMentions+=1),p!=null&&(h.lastSeen==null||p>h.lastSeen)&&(h.lastSeen=p),c.set(f,h)}}let l=[...c.values()].sort((u,d)=>d.mentions-u.mentions||d.smartMentions-u.smartMentions||u.address.localeCompare(d.address)).slice(0,i).map(u=>({chain:u.chain,address:u.address,mentions:u.mentions,uniqueAccounts:u.accounts.size,smartMentions:u.smartMentions,lastSeen:u.lastSeen==null?null:new Date(u.lastSeen).toISOString()}));return{provider:ft,platform:a,chain:s,count:l.length,rows:l,basis:Mr(n.store,r)}}async function ek(e={},t={}){let n=Dr(t);if(!n.store)return Ei(n);let r=Fr(t),o=Ii(e.limit,50),i=String(e.q??"").trim().toLowerCase();if(!i)return{provider:ft,q:"",count:0,rows:[],basis:Mr(n.store,r)};let a=i.replace(/^\$/,""),s=n.store.mentions.filter(c=>String(c.text??"").toLowerCase().includes(i)?!0:ki(c).some(u=>u.toLowerCase()===a)).sort((c,l)=>(Si(l)??0)-(Si(c)??0)).slice(0,o).map(c=>({id:c.id??null,account:c.account??null,grade:gp(n.store,c.account),ts:c.ts??null,text:JS(c.text),tickers:ki(c),cas:hp(c),engagement:c.engagement&&typeof c.engagement=="object"?c.engagement:null}));return{provider:ft,q:i,count:s.length,rows:s,basis:Mr(n.store,r)}}async function tk(e={},t={}){let n=Dr(t);if(!n.store)return Ei(n);let r=Fr(t),o=Ii(e.limit,50),i=Object.entries(n.store.accounts).map(([a,s])=>({handle:a,grade:s?.grade??null,pnlUsd:Number.isFinite(Number(s?.pnlUsd))?Number(s.pnlUsd):0,callHitRate:Number.isFinite(Number(s?.callHitRate))?Number(s.callHitRate):null,lastSeen:s?.lastSeen??null})).sort((a,s)=>s.pnlUsd-a.pnlUsd||a.handle.localeCompare(s.handle)).slice(0,o);return{provider:ft,count:i.length,rows:i,basis:Mr(n.store,r)}}async function nk(e={},t={}){let n=Dr(t);if(!n.store)return Ei(n);let r=Fr(t),o=mp(e.timeWindow),i=Ii(e.limit,10,50),a=n.store.mentions.filter(m=>fp(m,r,o)),s=new Map,c=m=>{let f=m;for(;s.get(f)!==f;)f=s.get(f);let h=m;for(;s.get(h)!==h;){let g=s.get(h);s.set(h,f),h=g}return f},l=(m,f)=>{s.has(m)||s.set(m,m),s.has(f)||s.set(f,f);let h=c(m),g=c(f);h!==g&&s.set(g,h)},u=a.map(m=>{let f=[...ki(m).map(h=>`ticker:${h}`),...hp(m).map(h=>`ca:${h.chain}:${h.address}`)];for(let h of f)s.has(h)||s.set(h,h),l(f[0],h);return f}),d=new Map;a.forEach((m,f)=>{let h=u[f];if(!h.length)return;let g=c(h[0]),w=d.get(g)||{tickers:new Map,mentions:0,accounts:new Set,sampleTexts:[]};w.mentions+=1,m.account&&w.accounts.add(m.account);for(let x of ki(m))w.tickers.set(x,(w.tickers.get(x)||0)+1);w.sampleTexts.length<3&&m.text&&w.sampleTexts.push(JS(m.text,140)),d.set(g,w)});let p=[...d.values()].map(m=>{let f=[...m.tickers.entries()].sort((h,g)=>g[1]-h[1]||h[0].localeCompare(g[0])).map(([h])=>h);return{label:f[0]??"(no ticker)",tickers:f,mentions:m.mentions,uniqueAccounts:m.accounts.size,sampleTexts:m.sampleTexts}}).sort((m,f)=>f.uniqueAccounts-m.uniqueAccounts||f.mentions-m.mentions||m.label.localeCompare(f.label)).slice(0,i);return{provider:ft,timeWindow:String(e.timeWindow??"24h"),count:p.length,rows:p,basis:Mr(n.store,r)}}$();var Mt=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"}}),kM=new Map([["bob",60808],["rootstock",30],["rsk",30]]),EM=60808;function Ai(e){if(e==null||e==="")return EM;let t=kM.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Mt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Mt).join(", ")} / bob, rootstock)`);return n}function yp(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Ai(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Mt[n].url).replace(/\/$/,"")}function rk(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 js(e,t,n={}){return k(`${yp(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function ok(e={},t={}){let n;try{n=Ai(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Mt[n];try{let o=await js(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:yp(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:yp(n,e),error:String(o?.message||o),exec:!1}}}async function bp(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Mt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await bp({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Mt[c].name,error:String(l?.message||l)}}}))}}let r=Ai(n),o=Mt[r],i=await js(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 ik(e={},t={}){let n=Ai(e.chainId??e.chain),r=rk(e.address||e.addr,"address"),o=Mt[n],i=await js(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 ak(e={},t={}){let n=Ai(e.chainId??e.chain),r=rk(e.address||e.addr,"address"),o=await js(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:Mt[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}))}}$();var AM="https://insights.braiins.com/api/v1.0";function wp(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||AM).replace(/\/$/,"")}function xp(e,t={}){return k(`${wp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function sk(e={}){try{let t=await xp("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:wp(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:wp(e),error:String(t?.message||t),exec:!1}}}async function ck(e={},t={}){let n=await xp("/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 lk(e={},t={}){let n=await xp("/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)}}$();var PM="https://api.cow.fi",uk=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function dk(e={}){return(e.baseUrl||process.env.COW_API_URL||PM).replace(/\/$/,"")}function CM(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=uk[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(uk).join(", ")})`);return n}function vp(e,t,n){return`${dk(n)}/${CM(e)}/api/v1${t}`}function pk(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 mk(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function fk(e={},t={}){return k(vp(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function hk(e={},t={}){let n=pk(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(mk(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await k(`${vp(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 gk(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",pk(e.owner||e.address||e.user,"owner"));let r=await k(`${vp(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,mk(e))}}async function yk(e={}){let t=await k(`${dk(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}$();var NM="https://api.hiro.so",OM=20;function Sp(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||NM).replace(/\/$/,"")}function RM(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function _i(e,t={}){return k(`${Sp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:RM(t)})}async function bk(e={}){try{let t=await _i("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Sp(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:OM,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Sp(e),error:String(t?.message||t),exec:!1}}}async function wk(e={},t={}){let n=await _i("/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 xk(e={},t={}){let n=await _i("/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 vk(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await _i(`/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 Sk(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await _i(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}$();var $M="https://bundles.jito.wtf",Ek=1e9;function kp(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||$M).replace(/\/$/,"")}function BM(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function kk(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*Ek):null}function MM(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/Ek:null,raw:e}}async function Ik(e={}){try{let t=await k(`${kp(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 Ak(e={},t={}){let n=BM(e.limit,5,100),r=new URL(`${kp(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(MM),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 _k(e={}){let t=await k(`${kp(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,kk(i)])),suggestedTipLamports:kk(r.p75||r.p50),raw:n}}$();var DM="https://api.kamino.finance";function UM(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||DM).replace(/\/$/,"")}function Je(e){let t=Number(e);return Number.isFinite(t)?t:null}function Pk(e={}){let t=Je(e.totalValueLocked)??0,n=Je(e.apy?.totalApy)??0,r=Je(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:Je(e.sharePrice),sharesIssued:Je(e.sharesIssued),profitAndLoss:Je(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:Je(e.apy?.vault?.totalApr),apy24h:Je(e.kaminoApy?.vault?.apy24h),apy7d:Je(e.kaminoApy?.vault?.apy7d),apy30d:Je(e.kaminoApy?.vault?.apy30d),poolPrice:Je(e.apy?.vault?.poolPrice),priceLower:Je(e.apy?.vault?.priceLower),priceUpper:Je(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Ep(e={},t={}){let n=new URL(`${UM(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 Ck(e={}){try{let t=await Ep({},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 Tk(e={},t={}){let r=(await Ep(e,t)).map(Pk),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 Nk(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Ep({...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",...Pk(o),raw:o}}$();var HM="https://blockstream.info/liquid/api",Ok="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function zs(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||HM).replace(/\/$/,"")}function jM(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 zM(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 Rk(e,t={}){let n=`${zs(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 Lk(e,t={}){return k(`${zs(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function $k(e={}){try{let t=await Rk("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:zs(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:zs(e),error:String(t?.message||t),exec:!1}}}async function Bk(e={},t={}){let n=await Rk("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function Mk(e={},t={}){let n=jM(e.address||e.addr,"address"),r=await Lk(`/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 Fk(e={},t={}){let n=zM(e.assetId||e.asset||Ok,"assetId"),r=await Lk(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===Ok,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}$();var WM="https://api-mainnet.magiceden.dev/v2/ord/btc",GM=600;function Ip(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||WM).replace(/\/$/,"")}function KM(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function Dk(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 Uk(e,t={}){return k(`${Ip(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:KM(t),retries:t.retries??1})}async function qk(e={}){let t=Dk(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await Uk(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Ip(e),probeCollection:t,rateLimitRpm:GM,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Ip(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 Hk(e={},t={}){let n=Dk(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await Uk(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}$();var JM="https://mempool.space/api",XM=7;function Ap(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||JM).replace(/\/$/,"")}function Vs(e,t={}){return k(`${Ap(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function jk(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>XM}}async function zk(e={}){try{let n=(await Vs("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=jk(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Ap(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:Ap(e),error:String(t?.message||t),exec:!1}}}async function Vk(e={},t={}){let r=(await Vs("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=jk(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 Wk(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 Vs(`/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 Gk(e={},t={}){let n=await Vs("/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)}))}}$();var ZM="https://mempool.space/api",Kk=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function _p(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||ZM).replace(/\/$/,"")}function Yk(e,t){let n=String(e||t).trim().toLowerCase();if(!Kk.has(n))throw new Error(`mempool-mining: window must be one of ${[...Kk].join(", ")}`);return n}function Pi(e,t={}){return k(`${_p(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Jk(e={}){try{let t=await Pi("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:_p(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:_p(e),error:String(t?.message||t),exec:!1}}}async function Xk(e={},t={}){let n=await Pi("/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 Qk(e={},t={}){let n=Yk(e.window||e.timeframe,"1w"),r=await Pi(`/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 Zk(e={},t={}){let n=Yk(e.window||e.timeframe,"3d"),r=await Pi(`/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 eE(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await Pi(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}$();var tF="https://amm-v2.meteora.ag",tE=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),nE=new Set(["dynamic","multitoken","lst","farms"]),nF=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function rF(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||tF).replace(/\/$/,"")}function Me(e){let t=Number(e);return Number.isFinite(t)?t:null}function oF(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:Me(e.pool_lp_price_in_usd),tvlUsd:Me(e.pool_tvl),farmTvlUsd:Me(e.farm_tvl),volume24hUsd:Me(e.trading_volume),volume7dUsd:Me(e.weekly_trading_volume),fee24hUsd:Me(e.fee_volume),fee7dUsd:Me(e.weekly_fee_volume),tradeApyPct:Me(e.trade_apy),weeklyTradeApyPct:Me(e.weekly_trade_apy),baseApyPct:Me(e.daily_base_apy),farmingApyPct:Me(e.farming_apy),totalApyPct:(Me(e.trade_apy)??0)+(Me(e.farming_apy)??0),aprPct:Me(e.apr),feePct:Me(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 iF(e={},t={}){let n=new URL(`${rF(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(!tE.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...tE].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(!nE.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...nE].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(!nF.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 Pp(e={},t={}){let{url:n,page:r,size:o}=iF(e,t),i=await k(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(oF),totalCount:i?.total_count??null,page:r,size:o}}async function rE(e={}){try{let{pools:t,totalCount:n}=await Pp({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 oE(e={},t={}){let n=await Pp({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 iE(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 Pp({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}$();var sF="https://ordinals.com";function Ws(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||sF).replace(/\/$/,"")}function cF(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 aE(e,t={}){let n=`${Ws(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 Cp(e,t={}){return k(`${Ws(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function sE(e={}){try{let t=await aE("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Ws(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Ws(e),error:String(t?.message||t),exec:!1}}}async function cE(e={},t={}){let n=await aE("/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 lE(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 Cp(`/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 uE(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 Cp(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 dE(e={},t={}){let n=cF(e.name||e.rune||e.runeName,"name"),r=await Cp(`/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}}$();var uF="https://hermes.pyth.network",Np={"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"},dF=/^[0-9a-fA-F]{64}$/;function pE(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||uF).replace(/\/$/,"")}function mE(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=Np[n.toUpperCase()]||Np[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!dF.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 Tp(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Op(e={}){let t=Tp({price:Number(e.price?.conf),expo:e.price?.expo}),n=Tp(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Tp(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 Rp(e,t={}){let n=new URL(`${pE(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 fE(e={}){try{let t=await Rp([Np["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Op):[])[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 hE(e={},t={}){let n=mE(e.feedId||e.id||e.symbol,"feedId"),r=await Rp([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Op):[],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 gE(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>mE(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 s=(await be(i,3,l=>Rp(l,t))).flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Op):[]),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 yE(e={},t={}){let n=new URL(`${pE(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}))}}$();var mF="https://relayscan.io",bE=new Set(["1h","12h","24h","7d"]);function Lp(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||mF).replace(/\/$/,"")}function wE(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!bE.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...bE].join(", ")}`);return t}function fF(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 $p(e={},t={}){return k(`${Lp(t)}/overview/json?t=${wE(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function xE(e={},t={}){return k(`${Lp(t)}/builder-profit/json?t=${wE(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function vE(e={},t={}){let n=fF(e);return k(`${Lp(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function SE(e={}){let t=await $p({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}$();var gF="https://extra-api.sanctum.so",yF=30,bF=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Bp(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||gF).replace(/\/$/,"")}function kE(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 wF(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function zn(e,t,n={}){let r={},o={},i=await be(wF(t,yF),3,async a=>{let s=new URL(`${Bp(n)}/v1/${e}`);for(let c of a)s.searchParams.append("lst",c);return k(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})});for(let a of i){let s=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,s),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function EE(e={}){try{let[t,n]=await Promise.all([k(`${Bp(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),zn("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 Mp(e={},t={}){let n=await k(`${Bp(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 IE(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Mp({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=bF);let r=[...new Set(n.map(s=>kE(s,"lsts[]")))],[o,i]=await Promise.all([zn("apy/latest",r,t),zn("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 AE(e={},t={}){let n=kE(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([zn("apy/latest",[n],t),zn("apy/inception",[n],t),zn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),zn("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}}$();var vF="https://api.save.finance",SF="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",_E="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",kF=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Fp(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||vF).replace(/\/$/,"")}function PE(e,t="address"){let n=String(e??"").trim();if(!kF.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function CE(e){let t=Number(e);return Number.isFinite(t)?t:null}function EF(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 IF(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:CE(e.rates?.supplyInterest),borrowApyPct:CE(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 TE(e={}){try{let t=await k(`${Fp(e)}/v1/reserves?ids=${_E}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:_E,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function Dp(e={},t={}){let n=new URL(`${Fp(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(EF);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 NE(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=>PE(String(s).trim(),"reserve"));else{let a=PE(e.market||e.marketAddress||SF,"market"),c=(await Dp({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(`${Fp(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...IF(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 Up(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 Vn(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 Ci(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:Up(e.amount,"amount")}}function qp(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 Ti(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 Hp(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 _F(e={},t={}){let n=Ci(e),r=Vn(e.slices??10,"slices",2,100),o=Vn(e.durationSec??3600,"durationSec",r,604800),i=qp(n.total,Array(r).fill(1));return Ti(n,"TWAP",Hp(i,o,t.nowMs),{durationSec:o})}function PF(e={},t={}){let n=Ci(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=Vn(e.durationSec??3600,"durationSec",r.length,604800),i=qp(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Hp(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return Ti(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function CF(e={}){let t=Ci(e),n=Vn(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=Up(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 Ti(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function TF(e={}){let t=Ci(e),n=Up(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 Ti(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function NF(e={},t={}){let n=Ci(e),r=Vn(e.slices??10,"slices",2,100),o=Vn(e.durationSec??3600,"durationSec",r,604800),i=Vn(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=qp(n.total,a);return Ti(n,"IS",Hp(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function OE(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return _F(e,t);if(n==="VWAP")return PF(e,t);if(n==="POV")return CF(e,t);if(n==="ICEBERG")return TF(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return NF(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function RE(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}X();import{TypedDataEncoder as GF,getAddress as KF,isAddress as YF}from"ethers";var FE=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Vp=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]}),DE=/^(?:0|[1-9][0-9]*)$/;function Ys(e,t){let n=String(e||"").trim();if(!YF(n))throw new Error(`limit-order: ${t} must be an address`);return KF(n)}function Wp(e,t){let n=String(e??"").trim();if(!DE.test(n))throw new Error(`limit-order: ${t} must be a canonical integer`);if(n==="0")throw new Error(`limit-order: ${t} must be positive`);return n}function UE(){return{ok:!0,provider:"limit-order",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["evm-order"],note:"capability only \u2014 1inch LOP v4 posts after owner Allow on the loopback signer"}}function JF(e){let t=Number(e),n=FE[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function XF(e){let t=Number(e);if(!FE[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function QF(e={}){let t=Ys(e.maker,"maker"),n=e.receiver?Ys(e.receiver,"receiver"):t,r=Ys(e.makerAsset,"makerAsset"),o=Ys(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=Wp(e.makingAmount,"makingAmount"),a=Wp(e.takingAmount,"takingAmount"),s=Wp(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!DE.test(c))throw new Error("limit-order: makerTraits must be a canonical integer");return Object.freeze({salt:s,maker:t,receiver:n,makerAsset:r,takerAsset:o,makingAmount:i,takingAmount:a,makerTraits:c})}function qE(e={},t={}){let n=Number(e.chainId),r=JF(n),o=QF(e),i={types:Vp,domain:r,primaryType:"Order",message:o},a=GF.hash(r,Vp,o),s=Number(t.nowMs??Date.now()),c=Number(e.expiresAtMs??s+15*6e4);return Object.freeze({tradeId:`1inch:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:o.maker,destination:"1inch-lop",chainId:n,expiresAtMs:c,slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"1inch-limit",chainId:n,submitTo:XF(n),domain:r,types:Vp,message:o,typedData:i,digest:a})})}function HE(e={},t={}){let n=qE(e,t);return N({provider:"limit-order",kind:"typed-data-order",chainId:n.chainId,artifactKind:"TYPED_DATA_ORDER",venue:"1inch-lop-v4",typedData:n.artifact.typedData,digest:n.artifact.digest,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["evm-order"],envelope:n},{nowMs:t.nowMs,env:t.env})}async function jE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(zp(),jp)),r=qE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}X();var e4=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,t4=/^(?:0|[1-9][0-9]*)$/;function Gp(e,t){let n=String(e||"").trim();if(!e4.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function n4(e,t){let n=String(e??"").trim();if(!t4.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function zE(){return{ok:!0,provider:"jupiter-dca",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["sol"],note:"capability only \u2014 one-shot Jupiter tx submits after owner Allow"}}function VE(e={}){let t=Gp(e.owner,"owner"),n=Gp(e.inputMint,"inputMint"),r=Gp(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=n4(e.inAmount,"inAmount"),i=Number(e.slices??1);if(!Number.isInteger(i)||i<1||i>365)throw new Error("jupiter-dca: slices must be 1-365");let a=Number(e.intervalSeconds??86400);if(!Number.isInteger(a)||a<60||a>720*3600)throw new Error("jupiter-dca: intervalSeconds out of range");let s=(BigInt(o)/BigInt(i)).toString();if(s==="0")throw new Error("jupiter-dca: inAmount too small for slice count");return Object.freeze({kind:i===1?"limit":"dca",owner:t,inputMint:n,outputMint:r,inAmount:o,slices:i,intervalSeconds:a,perSlice:s})}function WE(e={},t={}){let n=VE(e);if(!e.unsignedTx)throw new Error("jupiter-dca: unsignedTx required to arm");if(n.slices!==1)throw new Error("jupiter-dca: armed submit is one-shot (slices=1)");let r=Number(t.nowMs??Date.now()),o=To({inputMint:n.inputMint,outputMint:n.outputMint,inAmount:n.inAmount,outAmount:e.outAmount,otherAmountThreshold:e.otherAmountThreshold,slippageBps:e.slippageBps??50},{quotedAtMs:r,ttlMs:e.ttlMs});return Yl({userPublicKey:n.owner,guard:o,swapTransaction:e.unsignedTx,args:{cluster:e.cluster||"mainnet",jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports,tradeId:e.tradeId},response:{prioritizationFeeLamports:0,jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports}})}function GE(e={},t={}){let n=VE(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=WE(e,t)),N({provider:"jupiter-dca",kind:n.kind==="limit"?"solana-limit":"solana-dca",chain:"solana",artifactKind:"SOLANA_VERSIONED_TX",plan:n,unsignedTx:e.unsignedTx||null,envelope:r,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["sol"],note:r?"sol envelope ready \u2014 queue and Allow to submit":"plan only; attach unsignedTx + outAmount with slices=1 to arm"},{nowMs:t.nowMs,env:t.env})}async function KE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(zp(),jp)),r=WE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}$();var o4="protective-monitors",i4="read-only",a4=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),s4="https://hermes.pyth.network",c4="https://coins.llama.fi",l4="https://api.llama.fi/hacks",u4="https://api.gopluslabs.io/api/v1/token_security",d4="https://api.v3.aave.com/user",p4=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),m4=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),f4=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),YE=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),h4=/^0x[0-9a-fA-F]{40}$/,g4=/^[0-9a-fA-F]{64}$/;function Hr(e,t={}){return{ok:!0,provider:o4,op:e,alertOnly:!0,execution:i4,exec:!1,...t}}function Fe(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function Ni(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):k(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function Js(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function y4(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return g4.test(r)||Fe("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=Js(e.symbol),n=p4[t];return n||Fe("unknown symbol",t),n}function b4(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=Js(e.symbol);return m4[t]||`coingecko:${t.toLowerCase()}`}function JE(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&Fe("thresholdBps must be a non-negative number"),n}function w4(e){let t=Array.isArray(e?.parsed)?e.parsed[0]:e?.price?e:null,n=Number(t?.price?.price),r=Number(t?.price?.expo);return(!Number.isFinite(n)||!Number.isFinite(r))&&Fe("no pyth price returned"),r<0?n/10**-r:n*10**r}function x4(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function v4(e,t={}){let n=String(t.pythBaseUrl||s4).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function S4(e,t={}){return`${String(t.llamaCoinsBaseUrl||c4).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function XE(e,t){let n=y4(e),r=await Ni(v4(n,t),t),o=w4(r);return o>0||Fe("pyth price must be positive"),{id:n,price:o}}async function QE(e,t){let n=b4(e),r=await Ni(S4(n,t),t);return{coin:n,price:x4(r,n)}}function ZE(){return Hr("health",{ok:!0,ops:[...a4],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function Kp(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&Fe("peg must be a positive number");let r=JE(e,50),o=await XE(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await QE(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return Hr("depeg",{symbol:Js(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function Yp(e={},t={}){let n=JE(e,100),r=await XE(e,t),o=await QE(e,t);o.price>0||Fe("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return Hr("oracleDeviation",{symbol:Js(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function k4(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function E4(e,t){return{id:k4(e,t),name:String(e.name||e.protocol||"unknown"),classification:e.classification?String(e.classification):null,technique:e.technique?String(e.technique):null,amount:Number.isFinite(Number(e.amount))?Number(e.amount):null,chain:Array.isArray(e.chain)?e.chain.map(String):e.chain?[String(e.chain)]:[],source:e.source?String(e.source):null}}function I4(e){return(String(e).match(/<item\b[\s\S]*?<\/item>/gi)||[]).map((n,r)=>{let o=i=>{let a=n.match(new RegExp(`<${i}[^>]*>([\\s\\S]*?)</${i}>`,"i"));return a?a[1].replace(/<!\[CDATA\[|\]\]>/g,"").trim():""};return{id:o("guid")||o("link")||o("title")||`rss-${r}`,name:o("title")||"unknown",classification:"rss",technique:null,amount:null,chain:[],source:o("link")||null}})}function eI(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return I4(t);try{return eI(JSON.parse(t))}catch{Fe("exploitFeed payload is not JSON or RSS")}}return Array.isArray(e)?e:Array.isArray(e?.hacks)?e.hacks:Array.isArray(e?.items)?e.items:[]}function A4(e){return e.map((t,n)=>({item:t,index:n})).sort((t,n)=>{let r=String(t.item.id).localeCompare(String(n.item.id));return r!==0?r:t.index-n.index}).map(t=>t.item)}async function Jp(e={},t={}){let n=String(e.url||t.hacksUrl||l4),r=e.payload??await Ni(n,t),o=A4(eI(r).map(E4));return Hr("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function _4(e){return e===!0||e===1||e==="1"}function P4(e,t){let n=e?.result&&typeof e.result=="object"?e.result:e,r=String(t).toLowerCase();if(n&&typeof n=="object"){for(let[o,i]of Object.entries(n))if(String(o).toLowerCase()===r&&i&&typeof i=="object")return{address:o,token:i}}return null}async function Xp(e={},t={}){e.asSoleGate===!0&&Fe("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();h4.test(n)||Fe("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&Fe("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||u4).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await Ni(i,t),s=P4(a,n);s||Fe("goplus returned no result for",n);let c=f4.filter(l=>_4(s.token[l]));return Hr("goplus",{chainId:r,address:n.toLowerCase(),role:"second-opinion",secondOpinion:!0,soleGate:!1,neverSoleGate:!0,token:{address:s.address,name:s.token.token_name||null,symbol:s.token.token_symbol||null},findings:c,alert:c.length>0,note:"second opinion only \u2014 never the sole gate"})}function C4(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&Fe("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function T4(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||Fe("position healthFactor required");let r=C4(n);return{id:String(e.id||e.protocol||`pos-${t}`),protocol:String(e.protocol||"unknown"),healthFactor:n,collateralUsd:e.collateralUsd!=null?Number(e.collateralUsd):null,debtUsd:e.debtUsd!=null?Number(e.debtUsd):null,rung:r}}async function Qp(e={},t={}){let n=null;if(Array.isArray(e.positions))n=e;else if(Array.isArray(e))n={positions:e};else{let a=String(e.user||"").trim();a||Fe("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${d4}/${a}`);n=await Ni(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(T4),i=o.reduce((a,s)=>a?YE[s.rung]<YE[a]?s.rung:a:s.rung,null);return Hr("liquidationLadder",{user:n?.user||e.user||null,chainId:n?.chainId??e.chainId??null,ladder:o,worstRung:i,alert:o.some(a=>a.rung!=="healthy")})}var Y9=Object.freeze({depeg:Kp,oracleDeviation:Yp,exploitFeed:Jp,goplus:Xp,liquidationLadder:Qp});import{existsSync as O4,readFileSync as R4}from"node:fs";import{dirname as L4,join as tI}from"node:path";import{fileURLToPath as $4}from"node:url";var Xs=Object.freeze({OK:"OK",FAILED:"FAILED"}),B4=Object.freeze({hl:9,dydx:10,binance:8}),nI=Object.freeze(["hl","dydx","binance"]),M4=tI(L4($4(import.meta.url)),"../../../fixtures/funding-scanner");function rI(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...nI],note:"Public payload/fixture scan. CEX legs never live-call. Missing venue is FAILED, never 0-funding."}}function ht(e){if(e==null||e==="")return null;let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function F4(e){let t=ht(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function D4(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=ht(t[e]);if(n!=null&&n>=0)return n}return ht(B4[e])}function em(e){let t=String(e||"").trim().toUpperCase();return t?(t=t.replace(/[-_]/g,""),t.endsWith("USDT")||t.endsWith("USDC")?t.slice(0,-4):t.endsWith("USD")?t.slice(0,-3):t):""}function U4({venue:e,coin:t,hourly:n,feeDragBps:r}){let o=ht(n),i=ht(r);if(!e||!t||o==null||i==null||i<0)throw new Error("funding-scanner: unified row requires venue, coin, hourly, feeDragBps");let a=F4(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:Xs.OK})}function Zp(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:ht(n),netAnnualizedPct:null,quality:Xs.FAILED,error:String(t||"missing venue")})}function q4(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=em(t[o]?.name),a=ht(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function H4(e){let t=e?.markets,n=Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[],r=[];for(let o of n){let i=em(o?.ticker||o?.market||o?.symbol),a=ht(o?.nextFundingRate??o?.fundingRate);!i||a==null||o?.status&&String(o.status).toUpperCase()!=="ACTIVE"||r.push({venue:"dydx",coin:i,hourly:a})}return r}function j4(e){if(Array.isArray(e))return{intervalHours:null,entries:e};if(e&&typeof e=="object"){let t=Array.isArray(e.premiumIndex)?e.premiumIndex:Array.isArray(e.data)?e.data:[];return{intervalHours:ht(e.fundingIntervalHours),entries:t}}return{intervalHours:null,entries:[]}}function z4(e){let{intervalHours:t,entries:n}=j4(e),r=[];for(let o of n){let i=em(o?.symbol||o?.pair),a=ht(o?.fundingIntervalHours)??t,s=ht(o?.lastFundingRate??o?.lastFundingRatePeriod??o?.fundingRate);!i||s==null||!(a>0)||r.push({venue:"binance",coin:i,hourly:s/a})}return r}var V4=Object.freeze({hl:q4,dydx:H4,binance:z4});function W4(e,t){let n=tI(e,`${t}.json`);if(!O4(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(R4(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function G4(e,t,n){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];return r==null?{missing:!0,error:`missing venue payload: ${e}`}:{payload:r}}return W4(n,e)}function K4(e,t){let n=V4[e];if(!n)return{error:`no public parser for venue ${e}`};try{return{parsed:n(t)}}catch(r){return{error:String(r.message||r)}}}function Y4(e,t){let n=e.quality===Xs.FAILED||e.netAnnualizedPct==null,r=t.quality===Xs.FAILED||t.netAnnualizedPct==null;if(n!==r)return n?1:-1;if(!n&&e.netAnnualizedPct!==t.netAnnualizedPct)return t.netAnnualizedPct-e.netAnnualizedPct;let o=String(e.venue).localeCompare(String(t.venue));return o||String(e.coin||"").localeCompare(String(t.coin||""))}function oI(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:nI).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||M4,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=D4(s,i),l=G4(s,r,o);if(l.missing){a.push(Zp(s,l.error,c));continue}let u=K4(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(Zp(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(U4({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(Zp(s,p.message,c))}}return a.sort(Y4),Object.freeze({ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",live:!1,rankedOn:"net-after-fees",count:a.length,rows:Object.freeze(a)})}X();Eo();$();var X4="https://indexer.dydx.trade";function Oi(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Q4(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function iI(e=50,t={}){try{let n=await k(`${X4}/v4/perpetualMarkets?limit=${e}`,t);return Q4(n).map(o=>{let i=Oi(o?.nextFundingRate),a=Oi(o?.oraclePrice),s=Oi(o?.openInterest),c=Oi(o?.volume24H),l=Oi(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:a,oraclePx:a,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:s,dayNtlVolumeUsd:c,change24hPct:a&&l!=null?l/a*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}$();var Z4="https://dlob.drift.trade",aI="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified.";async function sI(e={}){try{let n=(await k(`${Z4}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:aI,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${aI} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}$();var e6="https://gateway.prod.vertexprotocol.com/v2",cI="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function lI(e={}){try{let n=(await k(`${e6}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:cI,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${cI} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}$();var t6="https://api.aevo.xyz";async function uI(e={}){try{return(await k(`${t6}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}var dI=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function pI(){return{ok:!0,provider:"perp-universal",execution:"prepare-only",exec:!1,signed:!1,broadcast:!1,venues:[...dI],note:"fundingAll ranks LIVE rows by |APR|. FAILED venues stay in failed[]. prepareOrder is unsigned."}}function Qs(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function dn(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function Ri({venue:e,coin:t,markPx:n,fundingRateAprPct:r,dayNtlVolumeUsd:o,extra:i={}}){let a=String(t||"").replace(/[-_]/g,"").replace(/USDT$|USDC$|USD$/,"");return Object.freeze({venue:e,coin:a,markPx:Qs(n),fundingRateAprPct:Qs(r),dayNtlVolumeUsd:Qs(o),quality:"LIVE",...i})}async function n6(e,t){try{let n=await t();return n&&n.quality==="FAILED"?dn(e,n.error||"FAILED"):n}catch(n){return dn(e,n.message||n)}}async function r6(e={}){return{venue:"hl",quality:"LIVE",markets:((await yr({},e)).markets||[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Ri({venue:"hl",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd,extra:{openInterestUsd:r.openInterestUsd??null,change24hPct:r.change24hPct??null}}))}}async function o6(e={}){let t=await iI(50,e);return t?.quality==="FAILED"||t?.error?dn("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Ri({venue:"dydx",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd}))}}async function i6(e={}){let t=await en({chainId:42161},e);return!Array.isArray(t)||t.length===0?dn("gmx","gmx tickers empty or not an array"):{venue:"gmx",quality:"LIVE",markets:t.map(r=>{let o=r.tokenSymbol||r.symbol||r.tokenAddress||"",i=Qs(r.fundingRate??r.funding??r.borrowingRateLong);return Ri({venue:"gmx",coin:o,markPx:r.maxPrice??r.minPrice??r.price,fundingRateAprPct:i==null?null:Math.abs(i)<1?i*24*365*100:i,dayNtlVolumeUsd:null,extra:{quality:i==null?"PARTIAL":"LIVE",note:i==null?"price live; funding not on ticker":void 0}})}).filter(r=>r.coin)}}async function a6(e={}){let t=await sI(e);return t?.quality==="FAILED"||t?.error?dn("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function s6(e={}){let t=await lI(e);return t?.quality==="FAILED"||t?.error?dn("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function c6(e={}){let t=await Dh(e);return t?.error?dn("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(r=>Ri({venue:"lighter",coin:r.coin||r.symbol,markPx:r.markPx,fundingRateAprPct:r.fundingAprPct,dayNtlVolumeUsd:null,extra:{marketIndex:r.marketIndex??null}})).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}async function l6(e={}){let t=await uI(e);return t?.error?dn("aevo",t.error):{venue:"aevo",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>String(r.type||"").toLowerCase()==="perpetual"&&r.instrument).map(r=>{let o=String(r.instrument).split("-")[0],i=r.fundingRate==null?null:Number(String(r.fundingRate).replace("%",""));return Ri({venue:"aevo",coin:o,markPx:r.markPrice,fundingRateAprPct:Number.isFinite(i)?i*24*365:null,dayNtlVolumeUsd:r.volume24h})}).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}var tm={hl:r6,lighter:c6,gmx:i6,dydx:o6,aevo:l6,drift:a6,vertex:s6};async function mI(e={},t={}){let n=Array.isArray(e.venues)&&e.venues.length?e.venues.map(l=>String(l).toLowerCase()).filter(l=>tm[l]):[...dI],r=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),i=t.readers||tm,a=await Promise.all(n.map(l=>n6(l,()=>(i[l]||tm[l])(t)))),s=a.filter(l=>l.quality==="FAILED"),c=a.filter(l=>l.quality!=="FAILED").flatMap(l=>l.markets||[]).filter(l=>l.fundingRateAprPct!=null);return r&&(c=c.filter(l=>l.coin===r)),c.sort((l,u)=>Math.abs(u.fundingRateAprPct)-Math.abs(l.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:c.slice(0,o),failed:s,venuesTried:n,sourcesAnswered:a.filter(l=>l.quality!=="FAILED").length,sourcesTried:n.length,custody:"prepare-only"})}async function fI(e={},t={}){let n=String(e.venue||"hl").toLowerCase(),r=String(e.coin||e.symbol||"").toUpperCase(),o=String(e.side||"").toLowerCase(),i=o==="long"||o==="buy"?"buy":o==="short"||o==="sell"?"sell":null;if(!r)return{ok:!1,failureKind:"missing-coin",venue:n,unsigned:!0,broadcast:!1};if(!i)return{ok:!1,failureKind:"missing-side",venue:n,coin:r,unsigned:!0,broadcast:!1,note:"side must be long|short|buy|sell"};if(n==="dydx"||n==="drift"||n==="vertex")return{ok:!1,failureKind:"read-only-venue",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:`${n} is read-only until a grant-bound decoder exists. Use venue=hl for an unsigned ticket.`};if(n==="gmx"){if(!e.account&&!e.recipient)return{ok:!1,failureKind:"missing-account",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"gmx prepare needs account"};let c=await ns({...e,coin:r,side:i},t);return N({ok:!0,venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,artifact:c},{provider:"perp-universal",kind:"perp-order"})}if(n!=="hl")return{ok:!1,failureKind:"unknown-venue",venue:n,coin:r,unsigned:!0,broadcast:!1};let a=e.size??e.sz;if(a==null||Number(a)<=0)return{ok:!1,failureKind:"missing-size",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"HL prepare needs a positive size (coin units). Reply: arm long|short COIN <size>"};let s=await Wt({coin:r,side:i,size:String(a),type:e.type||"market",maxSlippageBps:e.maxSlippageBps??50,reduceOnly:e.reduceOnly===!0},t);return N({ok:!0,venue:"hl",coin:r,side:i,unsigned:!0,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,artifact:s,note:"Unsigned. Allow/Deny still required. Nothing broadcast."},{provider:"perp-universal",kind:"perp-order"})}var d6=Math.sqrt(2*Math.PI);function Zs(e){return Math.exp(-.5*e*e)/d6}function p6(e){let t=.254829592,n=-.284496736,r=1.421413741,o=-1.453152027,i=1.061405429,a=.3275911,s=e<0?-1:1,c=1/(1+a*Math.abs(e)),l=1-((((i*c+o)*c+r)*c+n)*c+t)*c*Math.exp(-e*e);return s*l}function pn(e){return .5*(1+p6(e/Math.SQRT2))}function hI({spot:e,strike:t,rate:n=0,vol:r,years:o,kind:i="call"}){let a=Number(e),s=Number(t),c=Number(n),l=Number(r),u=Number(o);if(!(a>0)||!(s>0)||!(l>0)||!(u>0))throw new Error("greeks: spot, strike, vol, years must be > 0");let d=Math.sqrt(u),p=(Math.log(a/s)+(c+.5*l*l)*u)/(l*d),m=p-l*d,f=Math.exp(-c*u),h=a*pn(p)-s*f*pn(m),g=s*f*pn(-m)-a*pn(-p),w=i==="put"?g:h,x=i==="put"?pn(p)-1:pn(p),y=Zs(p)/(a*l*d),b=a*Zs(p)*d/100,v=i==="put"?(-(a*Zs(p)*l)/(2*d)+c*s*f*pn(-m))/365:(-(a*Zs(p)*l)/(2*d)-c*s*f*pn(m))/365;return Object.freeze({kind:i,price:w,delta:x,gamma:y,vega:b,theta:v,d1:p,d2:m})}var b7=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function ec(){return{ok:!0,provider:"onchain-options",exec:!1,execution:"read-only",note:"Ranks listed options with local Black-Scholes. No arm until official Derive/Lyra domain is pinned."}}function tc(e=[],{spot:t,rate:n=0,nowMs:r=Date.now()}={}){if(!(Number(t)>0))throw new Error("onchain-options: spot required");let o=[];for(let i of Array.isArray(e)?e:[]){let a=Number(i.strike),s=Number(i.expiryMs),c=Number(i.mark),l=i.kind==="put"?"put":"call";if(!(a>0)||!(s>r)||!(c>0))continue;let u=(s-r)/(365.25*24*3600*1e3),d=Number(i.iv);d>0||(d=.5);let p=hI({spot:t,strike:a,rate:n,vol:d,years:u,kind:l});o.push(Object.freeze({venue:String(i.venue||"unknown"),instrument:String(i.instrument||`${l}-${a}`),kind:l,strike:a,expiryMs:s,mark:c,model:p.price,edgeBps:Math.round((p.price-c)/c*1e4),delta:p.delta,gamma:p.gamma,vega:p.vega}))}return o.sort((i,a)=>a.edgeBps-i.edgeBps),Object.freeze({ok:!0,execution:"read-only",exec:!1,spot:Number(t),count:o.length,rows:Object.freeze(o)})}function gI(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function Li(e){return String(e||"").trim().toLowerCase()}function f6(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function yI({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=Li(d.from),m=Li(d.to),f=Number(d.amount);!(f>0)||!p||!m||(r.set(p,(r.get(p)||0)-f),r.set(m,(r.get(m)||0)+f))}let o=[...r.entries()].filter(([,d])=>d>0).sort((d,p)=>p[1]-d[1]),i=Number(n)>0?Number(n):o.reduce((d,[,p])=>d+p,0),a=i>0?o.map(([,d])=>d/i):[],s=f6(a),c=new Map;for(let d of t){let p=Li(d.funder),m=Li(d.wallet);!p||!m||(c.has(p)||c.set(p,new Set),c.get(p).add(m))}let l=[...c.entries()].map(([d,p])=>({funder:d,size:p.size,wallets:[...p].sort()})).filter(d=>d.size>=2).sort((d,p)=>p.size-d.size),u=t[0]?Li(t[0].funder):null;return Object.freeze({ok:!0,execution:"read-only",exec:!1,holderCount:o.length,topShare:a[0]??0,hhi:s,concentrated:s>=.15,clusterCount:l.length,largestCluster:l[0]?.size??0,firstFunder:u,clusters:Object.freeze(l.slice(0,20))})}function bI(){return{ok:!0,provider:"kalshi",exec:!1,execution:"read-only",restricted:!0,note:"Read-only market catalog. Trading may be US-restricted. Prepare refused."}}function wI(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.ticker||r.id||"").trim(),i=Number(r.yes_bid??r.yesPrice??r.last_price);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"kalshi",ticker:o,title:String(r.title||r.subtitle||o),yes:i,no:Number.isFinite(Number(r.no_bid??r.noPrice))?Number(r.no_bid??r.noPrice):1-i,closeTime:r.close_time||r.closeTime||null}))}return n.sort((r,o)=>r.ticker.localeCompare(o.ticker)),Object.freeze({ok:!0,execution:"read-only",exec:!1,restricted:!0,count:n.length,markets:Object.freeze(n)})}function xI(){return{...ec(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function vI(e,t){return tc(e,t)}function SI(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function kI(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.id||r.slug||"").trim(),i=Number(r.yes??r.yesPrice??r.last);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"limitless",id:o,title:String(r.title||o),yes:i,closeTime:r.closeTime||r.close_time||null}))}return Object.freeze({ok:!0,execution:"read-only",exec:!1,count:n.length,markets:Object.freeze(n)})}var w6=Object.freeze([]);function EI(){return{ok:!0,provider:"dov-vaults",exec:!1,execution:"read-only",registry:0,note:"No reviewed vault code-hash is pinned. Reads refuse unknown vaults."}}function II(e={}){let t=String(e.address||"").toLowerCase(),n=w6.find(r=>r.address===t);if(!n)throw new Error("dov-vaults: unknown vault \u2014 registry empty until code-hash is pinned");return Object.freeze({ok:!0,execution:"read-only",exec:!1,vault:n})}function AI(e={},t={}){let n=[];String(e.resolutionSource||"")!==String(t.resolutionSource||"")&&n.push("resolution-source"),String(e.outcomeYes||"")!==String(t.outcomeYes||"")&&n.push("outcome-semantics"),String(e.denomination||"")!==String(t.denomination||"")&&n.push("denomination"),String(e.voidRule||"")!==String(t.voidRule||"")&&n.push("void-rule");let r=Number(e.closeMs),o=Number(t.closeMs);return(!(r>0)||!(o>0)||Math.abs(r-o)>6*3600*1e3)&&n.push("close-window"),Object.freeze({ok:n.length===0,matched:n.length===0,reasons:Object.freeze(n),execution:"read-only",exec:!1,note:n.length?"not comparable":"windows and resolution match"})}function _I(){return{ok:!0,provider:"tee-attestation",exec:!1,execution:"read-only",hardware:"unavailable",status:"unavailable",note:"Schema+stub only. No vendor trust root is installed."}}function PI(e={}){if(!e||typeof e!="object")return Object.freeze({ok:!1,status:"unverified",reason:"missing-report"});if(e.synthetic===!0)return Object.freeze({ok:!1,status:"unverified",reason:"synthetic-report"});let t=["verifierType","instancePublicKey","measurement","issuedAtMs","expiresAtMs"];for(let n of t)if(!e[n])return Object.freeze({ok:!1,status:"unverified",reason:`missing-${n}`});return Number(e.expiresAtMs)<=Number(e.nowMs||Date.now())?Object.freeze({ok:!1,status:"unverified",reason:"expired"}):Object.freeze({ok:!1,status:"unavailable",reason:"no-verified-trust-root",hardware:"unavailable"})}function v6(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function CI(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:v6(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var S6=/^0x[0-9a-fA-F]{8}$/,TI=/^0x[0-9a-fA-F]{40}$/;function NI(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!TI.test(n))throw new Error("erc7715: account required");let r=Array.isArray(e.targets)?e.targets:[],o=Array.isArray(e.selectors)?e.selectors:[];if(r.length===0)throw new Error("erc7715: targets required");if(o.length===0)throw new Error("erc7715: selectors required");if(r.includes("*")||o.includes("*"))throw new Error("erc7715: wildcards refused");for(let c of r)if(!TI.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!S6.test(c))throw new Error("erc7715: selector must be 4 bytes");let i=String(e.perCallCap??""),a=String(e.aggregateCap??"");if(!/^[1-9][0-9]*$/.test(i)||!/^[1-9][0-9]*$/.test(a))throw new Error("erc7715: caps required");let s=Number(e.expiresAtMs);if(!Number.isSafeInteger(s)||s<=Date.now())throw new Error("erc7715: expiry required");return Object.freeze({kind:"erc7715-v1",chainId:t,account:n,targets:Object.freeze(r.map(c=>c.toLowerCase())),selectors:Object.freeze(o.map(c=>c.toLowerCase())),perCallCap:i,aggregateCap:a,expiresAtMs:s,execution:"read-only",exec:!1,note:"Normalized only. aa surface allowlist is empty \u2014 cannot arm."})}var nm=/^0x[0-9a-fA-F]{40}$/;function OI(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7710: chainId required");let n=String(e.delegator||""),r=String(e.delegate||"");if(!nm.test(n)||!nm.test(r))throw new Error("erc7710: parties required");if(!e.revocation)throw new Error("erc7710: revocation route required");let o=Number(e.expiresAtMs);if(!Number.isSafeInteger(o)||o<=Date.now())throw new Error("erc7710: expiry required");if(!e.target||!nm.test(String(e.target)))throw new Error("erc7710: target required");return Object.freeze({kind:"erc7710-v1",chainId:t,delegator:n.toLowerCase(),delegate:r.toLowerCase(),target:String(e.target).toLowerCase(),expiresAtMs:o,revocation:String(e.revocation),execution:"read-only",exec:!1,note:"Inspected only. aa surface allowlist is empty \u2014 cannot arm."})}var FI=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 BI(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Kd,adapters:Object.freeze(Yd.adapters.map(e=>{let t=FI[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function F6(e,t={}){let n=wv(e,t),r=FI[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new se(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var rm=new Map;function rc(e={}){let t=e.filePath||void 0,n=t||"__default__";return rm.has(n)||rm.set(n,zg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),rm.get(n)}var om=new Map;function im(e={}){let t=e.filePath||void 0,n=t||"__default__";return om.has(n)||om.set(n,Yg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),om.get(n)}var am=new Map;function $i(e={}){let t=e.filePath||void 0,n=t||"__default__";return am.has(n)||am.set(n,Ug(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),am.get(n)}var D6={"hl-info":{health:e=>zf(e),allMids:e=>It(e),l2Book:(e,t={})=>Xn(t.coin,e),outcomeMeta:e=>fo(e),clearinghouse:(e,t={})=>aa(t.user,e),userFills:(e,t={})=>Vf(t.user,e),meta:e=>Wf(e),metaAndAssetCtxs:e=>Qe(e),candleSnapshot:(e,t={})=>sa(t,e),openOrders:(e,t={})=>Kf(t.user,e),frontendOpenOrders:(e,t={})=>Yf(t.user,e),userState:(e,t={})=>Qn(t.user,e),spotMeta:e=>ca(e)},"hl-vaults":{health:e=>Qf(e),summaries:(e,t={})=>Qc(t,e),details:(e,t={})=>la(t,e),userEquities:(e,t={})=>Zc(t,e),tracker:(e,t={})=>el(t,e)},"hl-precompiles":{health:e=>eh(e),read:(e,t={})=>Zf(t,e),l1BlockNumber:e=>ua(e),markPx:(e,t={})=>rl(t,e),oraclePx:(e,t={})=>ol(t,e),spotPx:(e,t={})=>il(t,e),position:(e,t={})=>al(t,e),spotBalance:(e,t={})=>sl(t,e),vaultEquity:(e,t={})=>cl(t,e),withdrawable:(e,t={})=>ll(t,e)},"hl-delta-neutral":{health:()=>Sh(),scan:(e,t={})=>Pl(t,e),quote:(e,t={})=>Cl(t,e),prepare:(e,t={})=>Tl(t,e),loop:(e,t={})=>Ch(t,e)},"lighter-delta-neutral":{health:()=>Bh(),scan:(e,t={})=>Ll(t,e),quote:(e,t={})=>$l(t,e),prepare:(e,t={})=>Bl(t,e),loop:(e,t={})=>jh(t,e)},"poly-public":{health:e=>Vh(e),time:e=>Ml(e),markets:(e,t={})=>Wh(t,e),book:(e,t={})=>Gh(t.tokenId,e),midpoint:(e,t={})=>Kh(t.tokenId,e),spread:(e,t={})=>Yh(t.tokenId,e),price:(e,t={})=>Jh(t.tokenId,{side:t.side},e),events:(e,t={})=>Xh(t,e)},"evm-rpc":{health:(e,t={})=>Wn(t.chainId??1,e),healthAll:(e,t={})=>bc({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Kr(t.chainId??1,e),chainId:(e,t={})=>gc(t.chainId??1,e),getBalance:(e,t={})=>gn(t.chainId??1,t.address,e),call:(e,t={})=>D(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>yc(t,e),erc20Balance:(e,t={})=>Yr(t,e),transactionReceipt:(e,t={})=>Jr(t,e)},portfolio:{health:e=>mx(e),balances:(e,t={})=>ks(t,e),snapshot:(e,t={})=>Ox(t,e),history:(e,t={})=>Od(t,e),valueGraph:(e,t={})=>Rx(t,e)},"nft-portfolio":{health:e=>xx(e),inventory:(e,t={})=>Ir(t,e),gallery:(e,t={})=>Ex(t,e),pnl:(e,t={})=>kx(t,e),prepareList:(e,t={})=>vx(t,e),traitSnipe:(e,t={})=>Sx(t,e)},"contract-risk":{health:e=>Lx(e),scan:(e,t={})=>Dn(t,e)},"evm-token-sniper":{health:e=>Mx(e),scan:(e,t={})=>Bx(t,e)},"evm-simulate":{health:e=>Dx(e),simulate:(e,t={})=>gi(t,e)},"nft-mint":{health:e=>qx(e),discover:(e,t={})=>Cs(t,e),prepare:(e,t={})=>$d(t,e),priceGas:(e,t={})=>Ps(t,e),createTrigger:(e,t={})=>Dv(t,e),checkOpen:(e,t={})=>Uv(t,e),evaluateMancerOs:(e,t={})=>jv(t,e)},"universal-mint-router":{health:()=>pv(),capabilities:()=>Wd(),prepare:(e,t={})=>mv(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:BI()}),capabilities:()=>BI(),route:(e,t={})=>F6(t,e)},"erc8004-identity":{health:()=>Fy(),prepareIdentityRegistration:(e,t={})=>qy(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Hy(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>zy(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:Ls,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Sv(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:$s,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>_v(t,e)},"universal-ordinals-transfer":{health:()=>({provider:Bs,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Fv(t,e)},"solana-rpc":{health:e=>Zh(e),latestBlockhash:(e,t={})=>Dl(t,e),getBalance:(e,t={})=>va(t,e),tokenAccounts:(e,t={})=>Po(t,e),simulate:(e,t={})=>e0(t,e)},"bitcoin-esplora":{health:e=>t0(e),tipHeight:e=>n0(e),fees:e=>r0(e),address:(e,t={})=>ka(t,e),utxos:(e,t={})=>o0(t,e),tx:(e,t={})=>i0(t,e),decode:(e,t={})=>a0(t,e)},"bitcoin-meta":{health:e=>c0(e),runeBalances:(e,t={})=>Ia(t,e),inscriptions:(e,t={})=>or(t,e),inscriptionInfo:(e,t={})=>l0(t,e),inscriptionChildren:(e,t={})=>u0(t,e),ordBlockInfo:(e,t={})=>d0(t,e)},satflow:{health:e=>m0(e),collectionFloors:(e,t={})=>f0(t,e),collectionStats:(e,t={})=>h0(t,e),item:(e,t={})=>g0(t,e),walletContents:(e,t={})=>_a(t,e),floorListings:(e,t={})=>y0(t,e),preparePurchase:(e,t={})=>w0(t,e),prepareList:(e,t={})=>Pa(t,e)},jupiter:{health:e=>_0(e),venues:(e,t={})=>A0(t,e),quote:(e,t={})=>Na(t,e),prepare:(e,t={})=>P0(t,e)},defillama:{health:e=>T0(e),prices:(e,t={})=>An(t.coins||[],e),pricesBySymbol:(e,t={})=>L0(t.symbols,e),protocols:e=>N0(e),yields:(e,t={})=>O0(t,e),stablecoins:(e,t={})=>Oa(t,e),dexVolumes:(e,t={})=>R0(t,e)},lifi:{health:e=>B0(e),quote:(e,t={})=>No(t,e),prepare:(e,t={})=>M0(t,e),chains:e=>F0(e)},dexscreener:{health:e=>Tm(e),token:(e,t={})=>yn(t.address||t.tokenAddress,e),search:(e,t={})=>Xr(t.q||t.query,e),pair:(e,t={})=>Nm(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Gm({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Gn(t,e),prepare:(e,t={})=>Wm(t,e),quotePath:(e,t={})=>Vm(t,e),ethUsdc:(e,t={})=>Pc(t,e),chains:()=>Km()},"uniswap-v4":{health:(e,t={})=>rf({...e,chainId:t.chainId??8453}),quote:(e,t={})=>oo(t,e),inspectHook:(e,t={})=>Qm(t,e),prepare:(e,t={})=>tf(t,e),chains:()=>nf()},x402:{health:()=>vg(),inspect:(e,t={})=>wg(t),prepare:(e,t={})=>xg(t,e)},bankr:{health:e=>_g(e),wallet:e=>mu(e),portfolio:e=>Ig(e),swapQuote:(e,t={})=>Ag(t,e)},aerodrome:{health:(e,t={})=>W0({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ra(t,e),prepare:(e,t={})=>V0(t,e),chains:()=>G0()},zerox:{health:e=>X0(e),price:(e,t={})=>Zl(t,e),quote:(e,t={})=>Ro(t,e),prepare:(e,t={})=>Q0(t,e)},across:{health:e=>Z0(e),suggestedFees:(e,t={})=>eu(t,e)},hop:{health:e=>eg(e),quote:(e,t={})=>tu(t,e)},relay:{health:e=>tg(e),quote:(e,t={})=>$a(t,e),prepare:(e,t={})=>ng(t,e)},cowswap:{health:e=>sg(e),quote:(e,t={})=>ir(t,e),prepareOrder:(e,t={})=>cg(t,e),order:(e,t={})=>ug(t,e),status:(e,t={})=>lg(t,e),chains:()=>dg()},oneinch:{health:e=>mg(e),quote:(e,t={})=>lu(t,e),prepare:(e,t={})=>fg(t,e),approveSpender:(e,t={})=>uu(t,e)},"hl-ws":{health:e=>Pg(e),allMids:e=>Cg(e),l2Book:(e,t={})=>Tg(t.coin,e),snapshot:(e,t={})=>Fo(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>Ng({...e,assetId:t.assetId}),book:(e,t={})=>Og(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Ba(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>yf(e),collection:(e,t={})=>so(t.slug,e),floor:(e,t={})=>bf(t.slug,e),bestListings:(e,t={})=>Fc(t,e),bestListing:(e,t={})=>Qi(t,e),bestOffer:(e,t={})=>Zi(t,e),accountNfts:(e,t={})=>co(t,e),accountPnl:(e,t={})=>Ji(t,e),prepareBuy:(e,t={})=>Tf(t,e),prepareSweep:(e,t={})=>Nf(t,e),prepareMint:(e,t={})=>ta(t,e),prepareList:(e,t={})=>na(t,e),prepareCancel:(e,t={})=>Of(t,e)},"local-marketplace":{health:()=>({provider:"local-marketplace",status:"ok",armed:!0,execution:"armed-local",existingMarketplacesUnchanged:!0,refusesSignHash:!0,signed:!1,broadcast:!1}),createListing:(e,t={})=>$i(e).createListing(t),listListings:(e,t={})=>$i(e).listListings(t),cancelListing:(e,t={})=>$i(e).cancelListing(t),createOffer:(e,t={})=>$i(e).createOffer(t),armFill:(e,t={})=>$i(e).armFill(t)},"local-x402":{health:()=>({provider:"local-x402",status:"ok",armed:!0,execution:"armed-local",telegram:!1,refusesSignHash:!0,signed:!1,broadcast:!1}),createIntent:(e,t={})=>rc(e).createIntent(t),listIntents:(e,t={})=>rc(e).listIntents(t),cancelIntent:(e,t={})=>rc(e).cancelIntent(t),armPayment:(e,t={})=>rc(e).armPayment(t)},"local-pack-registry":{health:()=>({provider:"local-pack-registry",status:"ok",pluginExecution:!1,loaded:!1,telegram:!1,execution:"read-only"}),registerPack:(e,t={})=>im(e).registerPack(t),listPacks:(e,t={})=>im(e).listPacks(t),revokePack:(e,t={})=>im(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>Ry(t,e),markets:(e,t={})=>lr(t,e),quoteSpecificBuy:(e,t={})=>Wo(t,e),quoteSell:(e,t={})=>Wa(t,e),scanCollection:(e,t={})=>Ga(t,e),scanAllMarkets:(e,t={})=>Iy(t,e),scanCrossVenueArb:(e,t={})=>Ru(t,e),scanAllMarketsArb:(e,t={})=>Ay(t,e),prepareSpecificBuy:(e,t={})=>by(t,e),prepareSell:(e,t={})=>wy(t,e)},stonkbrokers:{health:(e,t={})=>Ly(t,e),quoteBrokerBuy:(e,t={})=>Ka(t,e),scanBrokerLoot:(e,t={})=>Cy(t,e),prepareBrokerBuy:(e,t={})=>Ty(t,e),brokerDesk:(e,t={})=>Oy(t,e),clockInStatus:(e,t={})=>Go(t,e),prepareClockIn:(e,t={})=>Ny(t,e)},"hl-outcome":{list:e=>$b(e),prepareOrder:(e,t={})=>Bb(t,e),prepareCancel:(e,t={})=>Mb(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:ps().map(e=>e.id),nativeTemplates:ci().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>ps(),listNative:()=>ci(),gate:(e,t={})=>ai(t.templateId||t.id,e),prepareDeploy:(e,t={})=>lw(t,e),buildNative:(e,t={})=>li(t),eval:async()=>(await Promise.resolve().then(()=>($I(),LI))).runContractsEval()},"poly-clob":{health:()=>Xb(),prepareOrder:(e,t={})=>Qb(t||{},e)},"hl-perps":{health:e=>Ku(e),assetInfo:(e,t={})=>Vt(t,e),prepareOrder:(e,t={})=>Wt(t,e),prepareCancel:(e,t={})=>ko(t,e),prepareLeverage:(e,t={})=>El(t,e),prepareIsolatedMargin:(e,t={})=>Il(t,e),prepareBracket:(e,t={})=>Al(t,e),prepareBuilderApproval:(e,t={})=>kl(t,e)},"hl-markets":{health:e=>Ku(e),markets:(e,t={})=>yr(t,e),leaderboards:(e,t={})=>ub(t,e),coin:(e,t={})=>db(t,e),spot:(e,t={})=>pb(t,e)},"hl-entry-state":{health:e=>Nb(e),see:(e,t={})=>ti(t,e),qualify:(e,t={})=>Ob(t,e),lock:(e,t={})=>Rb(t,e),list:e=>Xu(e),watch:(e,t={})=>Lb(t,e)},"magiceden-sol":{health:e=>Jy(e),stats:(e,t={})=>Uu(t,e),listings:(e,t={})=>Qy(t,e),tokenListings:(e,t={})=>Zy(t,e),prepareBuy:(e,t={})=>eb(t,e),prepareList:(e,t={})=>Qa(t,e),prepareMint:(e,t={})=>tb(t,e)},"hl-staking":{health:e=>rb(e),validators:e=>ju(e),delegatorSummary:(e,t={})=>zu(t,e),delegations:(e,t={})=>Vu(t,e),rewards:(e,t={})=>ob(t,e),history:(e,t={})=>ib(t,e),preflight:(e,t={})=>lb(t,e),prepareStakeDeposit:(e,t={})=>ab(t,e),prepareStakeWithdraw:(e,t={})=>sb(t,e),prepareDelegate:(e,t={})=>cb(t,e)},"hyperevm-dex":{health:e=>Wy(e),search:(e,t={})=>Gy(t.q||t.query||"HYPE",e),token:(e,t={})=>Ky(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>xw(e),networks:(e,t={})=>cd(t,e),pool:(e,t={})=>yw(t,e),token:(e,t={})=>bw(t,e),ohlcv:(e,t={})=>ww(t,e)},curve:{health:e=>Rw(e),openapi:e=>Ow(e),pools:(e,t={})=>ud(t,e),quote:(e,t={})=>dd(t,e),prepare:(e,t={})=>Lw(t,e)},gmx:{health:e=>kb(e),tickers:(e,t={})=>en(t,e),markets:(e,t={})=>vb(t,e),marketsInfo:(e,t={})=>Ju(t,e),tokens:(e,t={})=>Sb(t,e),prepareOrder:(e,t={})=>ns(t,e),positions:(e,t={})=>Eb(t,e),orderStatus:(e,t={})=>Ib(t,e),verifyOrder:(e,t={})=>Ab(t,e)},morpho:{health:e=>Fw(e),markets:(e,t={})=>Mw(t,e),vaults:(e,t={})=>fd(t,e),prepareVault:(e,t={})=>Dw(t,e)},balancer:{health:e=>Gw(e),pools:(e,t={})=>Ww(t,e),quote:(e,t={})=>yd(t,e),prepare:(e,t={})=>Kw(t,e)},pendle:{health:e=>Jw(e),markets:(e,t={})=>wd(t,e),quote:(e,t={})=>Xw(t,e),prepare:(e,t={})=>xd(t,e)},odos:{health:e=>tx(e),chains:e=>Sd(e),quote:(e,t={})=>Zw(t,e),prepare:(e,t={})=>ex(t,e)},blockscout:{health:e=>lx(e),stats:(e,t={})=>Id(t,e),address:(e,t={})=>ix(t,e),token:(e,t={})=>ax(t,e)},paraswap:{health:e=>Vv(e),tokens:(e,t={})=>Zd(t,e),price:(e,t={})=>$r(t,e),quote:(e,t={})=>$r(t,e),prepare:(e,t={})=>zv(t,e)},rfq:{health:e=>iS(e),intent:(e,t={})=>rS(t,e),quote:(e,t={})=>oS(t,e)},"polygon-staking":{health:e=>RS(e),validators:(e,t={})=>NS(t,e),validatorDetail:(e,t={})=>OS(t,e)},"aave-v3":{health:e=>MS(e),markets:(e,t={})=>LS(t,e),marketReserves:(e,t={})=>$S(t,e),chains:e=>BS(e)},"babylon-staking":{health:e=>DS(e),stats:e=>US(e),finalityProviders:e=>qS(e),delegations:(e,t={})=>HS(t,e)},"bisq-markets":{health:e=>zS(e),markets:e=>VS(e),ticker:(e,t={})=>WS(t,e),trades:(e,t={})=>GS(t,e)},"social-intel":{health:(e,t={})=>XS(t,e),trendingTokens:(e,t={})=>QS(t,e),trendingCas:(e,t={})=>ZS(t,e),keywordMentions:(e,t={})=>ek(t,e),smartAccounts:(e,t={})=>tk(t,e),narratives:(e,t={})=>nk(t,e)},"bob-rootstock":{health:(e,t={})=>ok(t.chainId,e),stats:(e,t={})=>bp(t,e),addressInfo:(e,t={})=>ik(t,e),tokenBalances:(e,t={})=>ak(t,e)},"braiins-insights":{health:e=>sk(e),priceStats:e=>ck(e),poolStats:e=>lk(e)},"cow-protocol":{health:e=>yk(e),auction:e=>fk(e),openOrders:(e,t={})=>hk(t,e),recentTrades:(e,t={})=>gk(t,e)},"hiro-stacks":{health:e=>bk(e),networkInfo:e=>wk(e),stackingInfo:e=>xk(e),poxCycles:e=>vk(e),blocks:(e,t={})=>Sk(t,e)},"jito-mev":{health:e=>Ik(e),recentBundles:(e,t={})=>Ak(t,e),tipFloor:e=>_k(e)},"kamino-strategies":{health:e=>Ck(e),strategies:(e,t={})=>Tk(t,e),strategyMetrics:(e,t={})=>Nk(t,e)},"liquid-esplora":{health:e=>$k(e),tipHeight:e=>Bk(e),addressInfo:(e,t={})=>Mk(t,e),assetInfo:(e,t={})=>Fk(t,e)},"magiceden-ordinals":{health:e=>qk(e),collectionStat:(e,t={})=>Hk(t,e)},"mempool-lightning":{health:e=>zk(e),statistics:e=>Vk(e),nodeRankings:(e,t={})=>Wk(t,e),nodeCountries:e=>Gk(e)},"mempool-mining":{health:e=>Jk(e),difficulty:e=>Xk(e),poolShare:(e,t={})=>Qk(t,e),hashrate:(e,t={})=>Zk(t,e),rewardStats:(e,t={})=>eE(t,e)},"meteora-dlmm":{health:e=>rE(e),pools:(e,t={})=>oE(t,e),poolSearch:(e,t={})=>iE(t,e)},"ordinals-runes":{health:e=>sE(e),blockHeight:e=>cE(e),blockInfo:(e,t={})=>lE(t,e),satInfo:(e,t={})=>uE(t,e),runeInfo:(e,t={})=>dE(t,e)},"pyth-price-feeds":{health:e=>fE(e),latestPrice:(e,t={})=>hE(t,e),latestPrices:(e,t={})=>gE(t,e),feedDirectory:e=>yE(e)},"relayscan-mev":{health:e=>SE(e),overview:(e,t={})=>$p(t,e),builderProfit:(e,t={})=>xE(t,e),dailyStats:(e,t={})=>vE(t,e)},"sanctum-lst":{health:e=>EE(e),lstList:e=>Mp(e),apyAll:e=>IE(e),apyIndividual:(e,t={})=>AE(t,e)},"solend-lending":{health:e=>TE(e),markets:e=>Dp(e),reserves:(e,t={})=>NE(t,e)},"execution-strategies":{health:()=>RE(),plan:(e,t={})=>OE(t)},"across-bridge":{health:e=>aS(e),pools:(e,t={})=>sS(t,e),suggestedFees:(e,t={})=>cS(t,e)},"beefy-yields":{health:e=>lS(e),apy:(e,t={})=>uS(t,e),apyBreakdown:e=>dS(e)},"birdeye-tokens":{health:e=>mS(e),tokenList:(e,t={})=>fS(t,e)},"celestia-da":{health:e=>hS(e),stats:e=>gS(e),blockStats:(e,t={})=>yS(t,e)},"das-assets":{health:e=>bS(e),assetsByOwner:(e,t={})=>wS(t,e),searchAssets:(e,t={})=>xS(t,e),assetProof:(e,t={})=>vS(t,e)},"l2beat-tvl":{health:e=>SS(e),tvl:(e,t={})=>kS(t,e),activity:(e,t={})=>ES(t,e)},"spark-lend":{health:e=>IS(e),markets:(e,t={})=>AS(t,e)},"symbiotic-restaking":{health:e=>_S(e),vaults:(e,t={})=>PS(t,e),vaultDetail:(e,t={})=>CS(t,e)},"limit-order":{health:()=>UE(),prepare:(e,t={})=>HE(t,e),arm:(e,t={})=>jE(t,e)},"jupiter-dca":{health:()=>zE(),prepare:(e,t={})=>GE(t,e),arm:(e,t={})=>KE(t,e)},"protective-monitors":{health:()=>ZE(),depeg:(e,t={})=>Kp(t,e),oracleDeviation:(e,t={})=>Yp(t,e),exploitFeed:(e,t={})=>Jp(t,e),goplus:(e,t={})=>Xp(t,e),liquidationLadder:(e,t={})=>Qp(t,e)},"funding-scanner":{health:()=>rI(),scan:(e,t={})=>oI(t,e)},"perp-universal":{health:()=>pI(),fundingAll:(e,t={})=>mI(t,e),prepareOrder:(e,t={})=>fI(t,e)},"onchain-options":{health:()=>ec(),rank:(e,t={})=>tc(t.listings||t,t)},"holder-clusters":{health:()=>gI(),score:(e,t={})=>yI(t)},kalshi:{health:()=>bI(),markets:(e,t={})=>wI(t)},"derive-options":{health:()=>xI(),rank:(e,t={})=>vI(t.listings||t,t)},limitless:{health:()=>SI(),markets:(e,t={})=>kI(t)},"dov-vaults":{health:()=>EI(),read:(e,t={})=>II(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>AI(t.left||{},t.right||{})},"tee-attestation":{health:()=>_I(),verify:(e,t={})=>PI(t)},"keeper-mirror":{health:e=>CI(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>NI(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>OI(t)}},MI=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),DI=new Set(["hl-exec"]);function U6(e){return DI.has(String(e||""))}function q6(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(DI.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=ia().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!MI.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(MI.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 A(e,t,n={},r={}){if(U6(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.`);q6(e,t,n);let o=Kc(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=D6[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function H6({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||ia().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)=>A(d,"health",p,m),u={};return await be(s,i??8,async d=>{if(!Kc(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await Se(()=>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 UI(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function j6(e){return e.execution==="prepare"&&UI(e).length?"armed-local":e.execution||"read-only"}function z6(){return ia().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:j6(e),localSignerSurfaces:UI(e),description:e.description}))}var W7={catalog:z6,health:H6,call:A,hl:{health:e=>A("hl-info","health",{},e),allMids:e=>A("hl-info","allMids",{},e),l2Book:(e,t)=>A("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>A("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>A("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>A("hl-info","userFills",{user:e},t),meta:e=>A("hl-info","meta",{},e),metaAndAssetCtxs:e=>A("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>A("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>A("hl-info","openOrders",{user:e},t),userState:(e,t)=>A("hl-info","userState",{user:e},t),spotMeta:e=>A("hl-info","spotMeta",{},e),vaults:{health:e=>A("hl-vaults","health",{},e),summaries:(e,t)=>A("hl-vaults","summaries",e||{},t),details:(e,t)=>A("hl-vaults","details",e||{},t),mine:(e,t)=>A("hl-vaults","userEquities",{user:e},t),track:(e,t)=>A("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>A("hl-entry-state","see",e||{},t),qualify:(e,t)=>A("hl-entry-state","qualify",e||{},t),lock:(e,t)=>A("hl-entry-state","lock",e||{},t),list:e=>A("hl-entry-state","list",{},e),watch:(e,t)=>A("hl-entry-state","watch",e||{},t)},staking:{health:e=>A("hl-staking","health",{},e),validators:e=>A("hl-staking","validators",{},e),summary:(e,t)=>A("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>A("hl-staking","delegations",{user:e},t),rewards:(e,t)=>A("hl-staking","rewards",{user:e},t),history:(e,t)=>A("hl-staking","history",{user:e},t),preflight:(e,t)=>A("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>A("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>A("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>A("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>A("poly-public","health",{},e),time:e=>A("poly-public","time",{},e),markets:(e,t)=>A("poly-public","markets",e||{},t),book:(e,t)=>A("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>A("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>A("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>A("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>A("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>A("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>A("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>A("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>A("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>A("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>A("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>A("evm-token-sniper","health",{},e),scan:(e,t)=>A("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>A("portfolio","balances",e||{},t),snapshot:(e,t)=>A("portfolio","snapshot",e||{},t),history:(e,t)=>A("portfolio","history",e||{},t),valueGraph:(e,t)=>A("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>A("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>A("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>A("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>A("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>A("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>A("opensea-nft","floor",{slug:e},t),collection:(e,t)=>A("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>A("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>A("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>A("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>A("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>A("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>A("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>A("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>A("universal-mint-router","health",{},e),capabilities:e=>A("universal-mint-router","capabilities",{},e),prepare:(e,t)=>A("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>A("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>A("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>A("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>A("solana-rpc","health",{},e),latestBlockhash:(e,t)=>A("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>A("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>A("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>A("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>A("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>A("jupiter","prepare",e||{},t),nftStats:(e,t)=>A("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>A("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>A("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>A("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>A("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>A("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>A("bitcoin-esplora","health",{},e),tipHeight:e=>A("bitcoin-esplora","tipHeight",{},e),fees:e=>A("bitcoin-esplora","fees",{},e),address:(e,t)=>A("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>A("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>A("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>A("bitcoin-esplora","decode",e||{},t),metaHealth:e=>A("bitcoin-meta","health",{},e),runeBalances:(e,t)=>A("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>A("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>A("satflow","health",{},e),satflowFloors:(e,t)=>A("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>A("satflow","walletContents",{address:e},t)},prices:{health:e=>A("defillama","health",{},e),current:(e,t)=>A("defillama","prices",{coins:e},t),bySymbol:(e,t)=>A("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>A("defillama","protocols",{},e)},lifi:{health:e=>A("lifi","health",{},e),quote:(e,t)=>A("lifi","quote",e||{},t),chains:e=>A("lifi","chains",{},e)},dex:{health:e=>A("dexscreener","health",{},e),token:(e,t)=>A("dexscreener","token",{address:e},t),search:(e,t)=>A("dexscreener","search",{q:e},t),pair:(e,t,n)=>A("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>A("uniswap-v3","health",e||{},t),quote:(e,t)=>A("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>A("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>A("uniswap-v3","ethUsdc",e||{},t),chains:e=>A("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>A("uniswap-v4","health",e||{},t),quote:(e,t)=>A("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>A("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>A("uniswap-v4","prepare",e||{},t),chains:e=>A("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>A("x402","inspect",e||{},t),prepare:(e,t)=>A("x402","prepare",e||{},t)},bankr:{wallet:e=>A("bankr","wallet",{},e),portfolio:e=>A("bankr","portfolio",{},e),swapQuote:(e,t)=>A("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>A("across","suggestedFees",e||{},t),hop:(e,t)=>A("hop","quote",e||{},t),relay:(e,t)=>A("relay","quote",e||{},t)},cow:{quote:(e,t)=>A("cowswap","quote",e||{},t)},hlWs:{allMids:e=>A("hl-ws","allMids",{},e),l2Book:(e,t)=>A("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>A("poly-ws","book",{assetId:e},t)}};export{DI as EXECUTION_PROVIDERS,q6 as assertDataOpAllowed,W7 as data,A as dataCall,z6 as dataCatalog,H6 as dataHealth,U6 as isExecutionProvider,F6 as routeUniversalNftLifecycle,BI as universalNftLifecycleCapabilities};
|
|
193
|
+
}`;function dU(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 SI(e={},t={}){let n={chainIds:dU(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ic(cU,{request:n},t))?.data?.markets??[]}}async function kI(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 Ic(lU,{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 II(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 Ic(uU,{filter:r},t))?.data?.chains??[]}}async function EI(e={}){return{ok:(await Ic("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}O();var mU="https://staking-api.babylonlabs.io";function mm(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||mU).replace(/\/$/,"")}function Ec(e,t={}){return v(`${mm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function AI(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 _I(e={}){try{let n=(await Ec("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:mm(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:mm(e),error:String(t?.message||t),exec:!1}}}async function PI(e={},t={}){let r=(await Ec("/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 TI(e={},t={}){let n=await Ec("/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=AI(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 CI(e={},t={}){let n=AI(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 Ec(`/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}}O();var hU="https://markets.bisq.network";function fm(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||hU).replace(/\/$/,"")}function NI(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 Ac(e,t={}){return v(`${fm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function OI(e={}){try{let t=await Ac("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:fm(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:fm(e),error:String(t?.message||t),exec:!1}}}async function RI(e={},t={}){let n=await Ac("/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 LI(e={},t={}){let n=NI(e.market||e.pair||"btc_usd","market"),r=await Ac(`/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 $I(e={},t={}){let n=NI(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 Ac(`/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}))}}import{readFileSync as gU,existsSync as bU}from"node:fs";import{homedir as wU}from"node:os";import vU from"node:path";var St="social-intel",xU=120;function SU(e={}){return String(e.storePath||process.env.ORACLE_SOCIAL_INTEL_STORE||vU.join(wU(),".config","oracle","social-intel","store.json"))}function BI(){let e=Number(process.env.ORACLE_SOCIAL_INTEL_STALE_MIN);return Number.isFinite(e)&&e>0?e:xU}function Yr(e={}){return Number.isFinite(e.nowMs)?Number(e.nowMs):Date.now()}function Jr(e={}){let t=SU(e);if(!bU(t))return{storePath:t,missing:!0};let n;try{n=JSON.parse(gU(t,"utf8"))}catch(i){return{storePath:t,error:`store unparseable: ${String(i?.message||i)}`}}if(!n||typeof n!="object"||Array.isArray(n))return{storePath:t,error:"store root must be a JSON object"};let r=Array.isArray(n.mentions)?n.mentions.filter(i=>i&&typeof i=="object"):[],o=n.accounts&&typeof n.accounts=="object"&&!Array.isArray(n.accounts)?n.accounts:{};return{storePath:t,store:{updatedAt:typeof n.updatedAt=="string"?n.updatedAt:null,windowHours:Number.isFinite(Number(n.windowHours))?Number(n.windowHours):24,sources:n.sources&&typeof n.sources=="object"?n.sources:{},mentions:r,accounts:o}}}function MI(e,t){if(!e)return null;let n=Date.parse(e);return Number.isFinite(n)?Math.max(0,Math.round((t-n)/6e4*10)/10):null}function Kr(e,t){let n=MI(e.updatedAt,t);return{sample:"curated-accounts",accounts:Object.keys(e.accounts).length,updatedAt:e.updatedAt,stale:n==null?!0:n>BI()}}function Ji(e){return{provider:St,unavailable:!0,reason:e.missing?`store missing at ${e.storePath}`:e.error,rows:[]}}function hm(e){let t=String(e??"24h").trim().match(/^(\d+(?:\.\d+)?)\s*([mhd])$/i);if(!t)return 24*36e5;let n=Number(t[1]),r=t[2].toLowerCase();return n*(r==="m"?6e4:r==="h"?36e5:864e5)}function Ki(e){let t=Date.parse(e.ts||"");return Number.isFinite(t)?t:null}function ym(e,t,n){let r=Ki(e);return r!=null&&t-r<n}function Yi(e){return(Array.isArray(e.tickers)?e.tickers:[]).map(t=>String(t||"").replace(/^\$/,"").toUpperCase()).filter(Boolean)}function gm(e){return(Array.isArray(e.cas)?e.cas:[]).filter(t=>t&&typeof t=="object"&&t.address).map(t=>({chain:String(t.chain||"").toLowerCase()||null,address:String(t.address).toLowerCase()}))}function bm(e,t){let n=e.accounts[t];return n&&typeof n=="object"?n.grade??null:null}function Xi(e,t,n=200){let r=Number(e);return Number.isFinite(r)&&r>=1?Math.min(n,Math.floor(r)):t}function FI(e,t=280){let n=String(e??"");return n.length>t?`${n.slice(0,t-1)}\u2026`:n}async function UI(e={},t={}){try{let n=Yr(t),r=Jr(t);if(r.missing)return{ok:!0,provider:St,configured:!1,storePath:r.storePath,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0,note:"store absent \u2014 run the social-intel ingester to populate it; absence is not an error"};if(r.error)return{ok:!1,provider:St,configured:!0,storePath:r.storePath,error:r.error,updatedAt:null,ageMinutes:null,stale:!0,accounts:0,mentions:0};let o=MI(r.store.updatedAt,n);return{ok:!0,provider:St,configured:!0,storePath:r.storePath,updatedAt:r.store.updatedAt,ageMinutes:o,stale:o==null?!0:o>BI(),accounts:Object.keys(r.store.accounts).length,mentions:r.store.mentions.length}}catch(n){return{ok:!1,provider:St,configured:!1,error:String(n?.message||n)}}}async function DI(e={},t={}){let n=Jr(t);if(!n.store)return Ji(n);let r=Yr(t),o=hm(e.timeWindow),i=Xi(e.limit,20),a=new Map;for(let c of n.store.mentions){if(!ym(c,r,o))continue;let l=bm(n.store,c.account),u=Ki(c);for(let d of new Set(Yi(c))){let p=a.get(d)||{ticker:d,mentions:0,accounts:new Set,smartMentions:0,firstSeen:null,lastSeen:null};p.mentions+=1,c.account&&p.accounts.add(c.account),l==="ELITE"&&(p.smartMentions+=1),u!=null&&((p.firstSeen==null||u<p.firstSeen)&&(p.firstSeen=u),(p.lastSeen==null||u>p.lastSeen)&&(p.lastSeen=u)),a.set(d,p)}}let s=[...a.values()].sort((c,l)=>l.mentions-c.mentions||l.smartMentions-c.smartMentions||c.ticker.localeCompare(l.ticker)).slice(0,i).map(c=>({ticker:c.ticker,mentions:c.mentions,uniqueAccounts:c.accounts.size,smartMentions:c.smartMentions,firstSeen:c.firstSeen==null?null:new Date(c.firstSeen).toISOString(),lastSeen:c.lastSeen==null?null:new Date(c.lastSeen).toISOString(),sampleNote:"curated caller sample, not market-wide volume"}));return{provider:St,timeWindow:String(e.timeWindow??"24h"),count:s.length,rows:s,basis:Kr(n.store,r)}}async function qI(e={},t={}){let n=Jr(t);if(!n.store)return Ji(n);let r=Yr(t),o=hm(e.timeWindow),i=Xi(e.limit,20),a=String(e.platform??"x").toLowerCase(),s=e.chain?String(e.chain).toLowerCase():null,c=new Map;for(let u of n.store.mentions){if(!ym(u,r,o)||String(u.source||"x").toLowerCase()!==a)continue;let d=bm(n.store,u.account),p=Ki(u);for(let m of gm(u)){if(s&&m.chain!==s)continue;let f=`${m.chain}:${m.address}`,h=c.get(f)||{chain:m.chain,address:m.address,mentions:0,accounts:new Set,smartMentions:0,lastSeen:null};h.mentions+=1,u.account&&h.accounts.add(u.account),d==="ELITE"&&(h.smartMentions+=1),p!=null&&(h.lastSeen==null||p>h.lastSeen)&&(h.lastSeen=p),c.set(f,h)}}let l=[...c.values()].sort((u,d)=>d.mentions-u.mentions||d.smartMentions-u.smartMentions||u.address.localeCompare(d.address)).slice(0,i).map(u=>({chain:u.chain,address:u.address,mentions:u.mentions,uniqueAccounts:u.accounts.size,smartMentions:u.smartMentions,lastSeen:u.lastSeen==null?null:new Date(u.lastSeen).toISOString()}));return{provider:St,platform:a,chain:s,count:l.length,rows:l,basis:Kr(n.store,r)}}async function HI(e={},t={}){let n=Jr(t);if(!n.store)return Ji(n);let r=Yr(t),o=Xi(e.limit,50),i=String(e.q??"").trim().toLowerCase();if(!i)return{provider:St,q:"",count:0,rows:[],basis:Kr(n.store,r)};let a=i.replace(/^\$/,""),s=n.store.mentions.filter(c=>String(c.text??"").toLowerCase().includes(i)?!0:Yi(c).some(u=>u.toLowerCase()===a)).sort((c,l)=>(Ki(l)??0)-(Ki(c)??0)).slice(0,o).map(c=>({id:c.id??null,account:c.account??null,grade:bm(n.store,c.account),ts:c.ts??null,text:FI(c.text),tickers:Yi(c),cas:gm(c),engagement:c.engagement&&typeof c.engagement=="object"?c.engagement:null}));return{provider:St,q:i,count:s.length,rows:s,basis:Kr(n.store,r)}}async function jI(e={},t={}){let n=Jr(t);if(!n.store)return Ji(n);let r=Yr(t),o=Xi(e.limit,50),i=Object.entries(n.store.accounts).map(([a,s])=>({handle:a,grade:s?.grade??null,pnlUsd:Number.isFinite(Number(s?.pnlUsd))?Number(s.pnlUsd):0,callHitRate:Number.isFinite(Number(s?.callHitRate))?Number(s.callHitRate):null,lastSeen:s?.lastSeen??null})).sort((a,s)=>s.pnlUsd-a.pnlUsd||a.handle.localeCompare(s.handle)).slice(0,o);return{provider:St,count:i.length,rows:i,basis:Kr(n.store,r)}}async function zI(e={},t={}){let n=Jr(t);if(!n.store)return Ji(n);let r=Yr(t),o=hm(e.timeWindow),i=Xi(e.limit,10,50),a=n.store.mentions.filter(m=>ym(m,r,o)),s=new Map,c=m=>{let f=m;for(;s.get(f)!==f;)f=s.get(f);let h=m;for(;s.get(h)!==h;){let y=s.get(h);s.set(h,f),h=y}return f},l=(m,f)=>{s.has(m)||s.set(m,m),s.has(f)||s.set(f,f);let h=c(m),y=c(f);h!==y&&s.set(y,h)},u=a.map(m=>{let f=[...Yi(m).map(h=>`ticker:${h}`),...gm(m).map(h=>`ca:${h.chain}:${h.address}`)];for(let h of f)s.has(h)||s.set(h,h),l(f[0],h);return f}),d=new Map;a.forEach((m,f)=>{let h=u[f];if(!h.length)return;let y=c(h[0]),w=d.get(y)||{tickers:new Map,mentions:0,accounts:new Set,sampleTexts:[]};w.mentions+=1,m.account&&w.accounts.add(m.account);for(let x of Yi(m))w.tickers.set(x,(w.tickers.get(x)||0)+1);w.sampleTexts.length<3&&m.text&&w.sampleTexts.push(FI(m.text,140)),d.set(y,w)});let p=[...d.values()].map(m=>{let f=[...m.tickers.entries()].sort((h,y)=>y[1]-h[1]||h[0].localeCompare(y[0])).map(([h])=>h);return{label:f[0]??"(no ticker)",tickers:f,mentions:m.mentions,uniqueAccounts:m.accounts.size,sampleTexts:m.sampleTexts}}).sort((m,f)=>f.uniqueAccounts-m.uniqueAccounts||f.mentions-m.mentions||m.label.localeCompare(f.label)).slice(0,i);return{provider:St,timeWindow:String(e.timeWindow??"24h"),count:p.length,rows:p,basis:Kr(n.store,r)}}O();var Wt=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"}}),IU=new Map([["bob",60808],["rootstock",30],["rsk",30]]),EU=60808;function Qi(e){if(e==null||e==="")return EU;let t=IU.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Wt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Wt).join(", ")} / bob, rootstock)`);return n}function wm(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Qi(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Wt[n].url).replace(/\/$/,"")}function VI(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 _c(e,t,n={}){return v(`${wm(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function WI(e={},t={}){let n;try{n=Qi(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Wt[n];try{let o=await _c(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:wm(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:wm(n,e),error:String(o?.message||o),exec:!1}}}async function vm(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Wt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await vm({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Wt[c].name,error:String(l?.message||l)}}}))}}let r=Qi(n),o=Wt[r],i=await _c(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 GI(e={},t={}){let n=Qi(e.chainId??e.chain),r=VI(e.address||e.addr,"address"),o=Wt[n],i=await _c(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 KI(e={},t={}){let n=Qi(e.chainId??e.chain),r=VI(e.address||e.addr,"address"),o=await _c(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:Wt[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}))}}O();var _U="https://insights.braiins.com/api/v1.0";function xm(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||_U).replace(/\/$/,"")}function Sm(e,t={}){return v(`${xm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function YI(e={}){try{let t=await Sm("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:xm(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:xm(e),error:String(t?.message||t),exec:!1}}}async function JI(e={},t={}){let n=await Sm("/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 XI(e={},t={}){let n=await Sm("/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)}}O();var TU="https://api.cow.fi",QI=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function ZI(e={}){return(e.baseUrl||process.env.COW_API_URL||TU).replace(/\/$/,"")}function CU(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=QI[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(QI).join(", ")})`);return n}function km(e,t,n){return`${ZI(n)}/${CU(e)}/api/v1${t}`}function eE(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 tE(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function nE(e={},t={}){return v(km(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rE(e={},t={}){let n=eE(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(tE(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await v(`${km(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 oE(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",eE(e.owner||e.address||e.user,"owner"));let r=await v(`${km(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,tE(e))}}async function iE(e={}){let t=await v(`${ZI(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}}O();var OU="https://api.hiro.so",RU=20;function Im(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||OU).replace(/\/$/,"")}function LU(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Zi(e,t={}){return v(`${Im(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:LU(t)})}async function aE(e={}){try{let t=await Zi("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:Im(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:RU,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:Im(e),error:String(t?.message||t),exec:!1}}}async function sE(e={},t={}){let n=await Zi("/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 cE(e={},t={}){let n=await Zi("/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 lE(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Zi(`/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 uE(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Zi(`/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}))}}O();var BU="https://api.trongrid.io",MU=["api.trongrid.io","api.shasta.trongrid.io","nile.trongrid.io"],Em="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",FU=6;function dE(e={}){return Ee({provider:"tron-public",defaultUrl:BU,hosts:MU,url:e.baseUrl||process.env.TRON_API_URL||""})}function UU(e,t={}){let n=t.apiKey||process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||"";return ke({Accept:"application/json"},{"TRON-PRO-API-KEY":n},e)}async function ea(e,t={}){let n=dE(t);return v(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:UU(n.trusted,t)})}function Pc(e,t="address"){let n=String(e??"").trim();if(!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(n))throw new Error(`tron-public: ${t} must be a base58 Tron address (T\u2026)`);return n}function Tc(e){return{error:String(e?.message||e).slice(0,200)}}function Am(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),a=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return a?`${i}.${a}`:i}async function pE(e={}){try{let t=dE(e),n=await ea("/wallet/getnowblock",e),r=Number(n?.block_header?.raw_data?.number??0);return{ok:Number.isFinite(r)&&r>0,provider:"tron-public",baseUrl:t.baseUrl,blockHeight:Number.isFinite(r)&&r>0?r:null,blockId:n?.blockID??null,keyed:t.trusted&&!!(process.env.TRONGRID_API_KEY||process.env.TRON_PRO_API_KEY||e.apiKey),exec:!1}}catch(t){return{ok:!1,provider:"tron-public",error:String(t?.message||t).slice(0,160),exec:!1}}}async function mE(e={},t={}){try{let n=Pc(e.address||e.account,"address"),r=await ea(`/v1/accounts/${n}`,t),o=Array.isArray(r?.data)?r.data[0]:null;if(!o)return{provider:"tron-public",address:n,found:!1,balanceSun:"0",trx:"0",note:"address not seen on chain (never funded)"};let i=String(o.balance??0);return{provider:"tron-public",address:n,found:!0,balanceSun:i,trx:Am(i,FU),createTime:o.create_time??null,latestOpTime:o.latest_opration_time??null,accountResource:o.account_resource??null,freeNetUsed:o.free_net_usage??null,freeNetLimit:o.free_net_limit??null,trc20Count:Array.isArray(o.trc20)?o.trc20.length:0}}catch(n){return Tc(n)}}async function fE(e={},t={}){try{let n=Pc(e.address||e.owner,"address"),r=await ea(`/v1/accounts/${n}`,t),o=Array.isArray(r?.data)?r.data[0]:null,i=Array.isArray(o?.trc20)?o.trc20:[],a=[];for(let c of i)if(!(!c||typeof c!="object"))for(let[l,u]of Object.entries(c)){let d=l===Em;a.push({contract:l,raw:String(u??"0"),symbol:d?"USDT":null,decimals:d?6:null,amount:d?Am(u,6):null})}let s=e.contract?String(e.contract).trim():"";return s&&(a=a.filter(c=>c.contract===s)),{provider:"tron-public",address:n,count:a.length,usdtContract:Em,tokens:a}}catch(n){return Tc(n)}}async function hE(e={},t={}){try{let n=Pc(e.address||e.account,"address"),r=Math.min(200,Math.max(1,Number(e.limit||20))),o=new URLSearchParams({limit:String(r)}),i=e.contract===void 0?Em:e.contract;i&&String(i).toLowerCase()!=="all"&&o.set("contract_address",Pc(i,"contract")),e.onlyConfirmed!==!1&&o.set("only_confirmed","true"),e.minTimestamp&&o.set("min_timestamp",String(Number(e.minTimestamp))),e.maxTimestamp&&o.set("max_timestamp",String(Number(e.maxTimestamp)));let a=await ea(`/v1/accounts/${n}/transactions/trc20?${o.toString()}`,t),s=Array.isArray(a?.data)?a.data:[];return{provider:"tron-public",address:n,contract:i&&String(i).toLowerCase()!=="all"?String(i):null,limit:r,count:s.length,transfers:s.map(c=>({txId:c.transaction_id??null,from:c.from??null,to:c.to??null,direction:c.from===n?"out":c.to===n?"in":null,raw:String(c.value??"0"),amount:Am(c.value,c.token_info?.decimals),symbol:c.token_info?.symbol??null,decimals:c.token_info?.decimals??null,tokenAddress:c.token_info?.address??null,blockTimestamp:c.block_timestamp??null,type:c.type??null}))}}catch(n){return Tc(n)}}async function yE(e={},t={}){try{let n=await ea("/wallet/getchainparameters",t),r=Array.isArray(n?.chainParameter)?n.chainParameter:[],o={};for(let a of r)a&&typeof a.key=="string"&&(o[a.key]=a.value??null);let i=e.key?String(e.key):"";return{provider:"tron-public",count:r.length,energyFee:o.getEnergyFee??null,transactionFee:o.getTransactionFee??null,createAccountFee:o.getCreateAccountFee??null,...i?{key:i,value:o[i]??null}:{},params:o}}catch(n){return Tc(n)}}O();var qU="https://toncenter.com/api",HU=["toncenter.com","testnet.toncenter.com"],jU=9;function gE(e={}){return Ee({provider:"ton-public",defaultUrl:qU,hosts:HU,url:e.baseUrl||process.env.TON_API_URL||""})}function zU(e,t={}){let n=t.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY||"";return ke({Accept:"application/json"},{"X-API-Key":n},e)}async function Cc(e,t={}){let n=gE(t);return v(`${n.baseUrl}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:zU(n.trusted,t)})}function _m(e,t="address"){let n=String(e??"").trim();if(/^-?\d+:[0-9a-fA-F]{64}$/.test(n)||/^[A-Za-z0-9_-]{48}$/.test(n))return n;throw new Error(`ton-public: ${t} must be a raw (0:hex) or base64url TON address`)}function Pm(e){return{error:String(e?.message||e).slice(0,200)}}function bE(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),a=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return a?`${i}.${a}`:i}function Tm(e,t){if(e&&e.ok===!1)throw new Error(`ton-public: ${t} failed \u2014 ${String(e.error||"toncenter rejected the request").slice(0,120)}`);return e?.result??null}async function wE(e={}){try{let t=gE(e),n=Tm(await Cc("/v2/getMasterchainInfo",e),"getMasterchainInfo"),r=Number(n?.last?.seqno??0);return{ok:Number.isFinite(r)&&r>0,provider:"ton-public",baseUrl:t.baseUrl,masterchainSeqno:Number.isFinite(r)&&r>0?r:null,workchain:n?.last?.workchain??null,keyed:t.trusted&&!!(e.apiKey||process.env.TONCENTER_API_KEY||process.env.TON_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"ton-public",error:String(t?.message||t).slice(0,160),exec:!1}}}async function vE(e={},t={}){try{let n=_m(e.address||e.account,"address"),r=Tm(await Cc(`/v2/getAddressInformation?address=${encodeURIComponent(n)}`,t),"getAddressInformation"),o=String(r?.balance??"0");return{provider:"ton-public",address:n,state:r?.state??null,balanceNano:o,ton:bE(o,jU),hasCode:!!r?.code,lastTransactionLt:r?.last_transaction_id?.lt??null,lastTransactionHash:r?.last_transaction_id?.hash??null,blockSeqno:r?.block_id?.seqno??null}}catch(n){return Pm(n)}}async function xE(e={},t={}){try{let n=_m(e.owner||e.address,"owner"),r=Math.min(200,Math.max(1,Number(e.limit||50))),o=new URLSearchParams({owner_address:n,limit:String(r)});e.jettonMaster&&o.set("jetton_address",String(e.jettonMaster).trim());let i=await Cc(`/v3/jetton/wallets?${o.toString()}`,t),a=Array.isArray(i?.jetton_wallets)?i.jetton_wallets:[],s=i?.metadata&&typeof i.metadata=="object"?i.metadata:{};return{provider:"ton-public",owner:n,limit:r,count:a.length,jettons:a.map(c=>{let l=c.jetton??null,u=l&&s[l]?.token_info?.[0]||null,d=u?.extra?.decimals!=null?Number(u.extra.decimals):null;return{walletAddress:c.address??null,jettonMaster:l,raw:String(c.balance??"0"),symbol:u?.symbol??null,name:u?.name??null,decimals:d,amount:d==null?null:bE(c.balance,d),lastTransactionLt:c.last_transaction_lt??null}})}}catch(n){return Pm(n)}}async function SE(e={},t={}){try{let n=_m(e.address||e.account,"address"),r=Math.min(100,Math.max(1,Number(e.limit||10))),o=new URLSearchParams({address:n,limit:String(r)});e.lt&&o.set("lt",String(e.lt)),e.hash&&o.set("hash",String(e.hash));let i=Tm(await Cc(`/v2/getTransactions?${o.toString()}`,t),"getTransactions"),a=Array.isArray(i)?i:[];return{provider:"ton-public",address:n,limit:r,count:a.length,transactions:a.map(s=>({hash:s.transaction_id?.hash??null,lt:s.transaction_id?.lt??null,utime:s.utime??null,feeNano:s.fee==null?null:String(s.fee),inMessageValueNano:s.in_msg?.value==null?null:String(s.in_msg.value),inMessageSource:s.in_msg?.source||null,outMessageCount:Array.isArray(s.out_msgs)?s.out_msgs.length:0,outMessageValueNano:Array.isArray(s.out_msgs)?String(s.out_msgs.reduce((c,l)=>c+BigInt(String(l?.value??"0")),0n)):null}))}}catch(n){return Pm(n)}}O();var Nc={cosmoshub:{lcd:"https://cosmos-rest.publicnode.com",denom:"uatom",symbol:"ATOM",decimals:6,prefix:"cosmos"},osmosis:{lcd:"https://osmosis-rest.publicnode.com",denom:"uosmo",symbol:"OSMO",decimals:6,prefix:"osmo"},celestia:{lcd:"https://celestia-rest.publicnode.com",denom:"utia",symbol:"TIA",decimals:6,prefix:"celestia"},injective:{lcd:"https://injective-rest.publicnode.com",denom:"inj",symbol:"INJ",decimals:18,prefix:"inj"},neutron:{lcd:"https://neutron-rest.publicnode.com",denom:"untrn",symbol:"NTRN",decimals:6,prefix:"neutron"},dydx:{lcd:"https://dydx-rest.publicnode.com",denom:"adydx",symbol:"DYDX",decimals:18,prefix:"dydx"},noble:{lcd:"https://noble-rest.publicnode.com",denom:"uusdc",symbol:"USDC",decimals:6,prefix:"noble"},kava:{lcd:"https://kava-rest.publicnode.com",denom:"ukava",symbol:"KAVA",decimals:6,prefix:"kava"}},Cm="cosmoshub";function WU(e){let t=String(e||"").toUpperCase().replace(/[^A-Z0-9]/g,"_");return process.env[`COSMOS_LCD_URL_${t}`]||""}function Oc(e={},t={}){let n=String(e.chain||t.chain||process.env.COSMOS_CHAIN||Cm).trim().toLowerCase(),r=Nc[n]||null,o=String(e.lcdUrl||t.baseUrl||t.lcdUrl||"").trim(),i=WU(n)||n===Cm&&process.env.COSMOS_LCD_URL||"",a=(o||i||r?.lcd||"").replace(/\/$/,"");if(!a)throw new Error(`cosmos-lcd: unknown chain '${n}' \u2014 pass lcdUrl or set COSMOS_LCD_URL_${n.toUpperCase()} (known: ${Object.keys(Nc).join(", ")})`);return{chain:n,lcd:a,nativeDenom:r?.denom??null,symbol:r?.symbol??null,decimals:r?.decimals??null,prefix:r?.prefix??null,known:!!r}}async function Qn(e,t,n={}){return v(`${e.lcd}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,headers:{Accept:"application/json"}})}function kE(e,t="address"){let n=String(e??"").trim();if(!/^[a-z][a-z0-9]{1,15}1[02-9ac-hj-np-z]{6,90}$/.test(n))throw new Error(`cosmos-lcd: ${t} must be a bech32 Cosmos address`);return n}function Om(e){return{error:String(e?.message||e).slice(0,200)}}function Nm(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),a=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return a?`${i}.${a}`:i}function IE(e){let t=/^ibc\/([0-9A-Fa-f]{64})$/.exec(String(e||""));return t?t[1].toUpperCase():null}function GU(e,t){let n=e?.denom??null,r=String(e?.amount??"0"),o=n!=null&&n===t.nativeDenom;return{denom:n,amount:r,ibcHash:IE(n),native:o,symbol:o?t.symbol:null,decimals:o?t.decimals:null,display:o?Nm(r,t.decimals):null}}async function EE(e={}){let t=null;try{t=Oc(e.args||{},e);let n=await Qn(t,"/cosmos/base/tendermint/v1beta1/blocks/latest",e),r=Number(n?.block?.header?.height??0);return{ok:Number.isFinite(r)&&r>0,provider:"cosmos-lcd",chain:t.chain,lcd:t.lcd,chainId:n?.block?.header?.chain_id??null,height:Number.isFinite(r)&&r>0?String(r):null,blockTime:n?.block?.header?.time??null,exec:!1}}catch(n){return{ok:!1,provider:"cosmos-lcd",chain:t?.chain??null,error:String(n?.message||n).slice(0,160),exec:!1}}}async function AE(e={},t={}){return{provider:"cosmos-lcd",default:Cm,count:Object.keys(Nc).length,chains:Object.entries(Nc).map(([n,r])=>({chain:n,lcd:r.lcd,nativeDenom:r.denom,symbol:r.symbol,decimals:r.decimals,prefix:r.prefix,envOverride:`COSMOS_LCD_URL_${n.toUpperCase()}`}))}}async function _E(e={},t={}){try{let n=Oc(e,t),r=kE(e.address||e.account,"address"),o=Math.min(500,Math.max(1,Number(e.limit||100))),i=await Qn(n,`/cosmos/bank/v1beta1/balances/${r}?pagination.limit=${o}`,t),s=(Array.isArray(i?.balances)?i.balances:[]).map(l=>GU(l,n)),c=s.find(l=>l.native)||null;return{provider:"cosmos-lcd",chain:n.chain,lcd:n.lcd,address:r,count:s.length,nativeDenom:n.nativeDenom,nativeAmount:c?.amount??"0",native:c?.display??null,ibcDenomCount:s.filter(l=>l.ibcHash).length,balances:s,nextKey:i?.pagination?.next_key??null}}catch(n){return Om(n)}}async function PE(e={},t={}){try{let n=Oc(e,t),r=kE(e.address||e.delegator,"address"),[o,i,a]=await Promise.all([Qn(n,`/cosmos/staking/v1beta1/delegations/${r}`,t),Qn(n,`/cosmos/staking/v1beta1/delegators/${r}/unbonding_delegations`,t).catch(()=>null),e.includeRewards===!1?Promise.resolve(null):Qn(n,`/cosmos/distribution/v1beta1/delegators/${r}/rewards`,t).catch(()=>null)]),s=Array.isArray(o?.delegation_responses)?o.delegation_responses:[],c=0n;for(let u of s){let d=String(u?.balance?.amount??"0");/^\d+$/.test(d)&&(c+=BigInt(d))}let l=Array.isArray(i?.unbonding_responses)?i.unbonding_responses:[];return{provider:"cosmos-lcd",chain:n.chain,address:r,count:s.length,nativeDenom:n.nativeDenom,totalStaked:c.toString(),totalStakedDisplay:Nm(c.toString(),n.decimals),delegations:s.map(u=>({validator:u?.delegation?.validator_address??null,shares:u?.delegation?.shares??null,denom:u?.balance?.denom??null,amount:String(u?.balance?.amount??"0"),display:Nm(u?.balance?.amount,n.decimals)})),unbonding:l.map(u=>({validator:u?.validator_address??null,entries:(Array.isArray(u?.entries)?u.entries:[]).map(d=>({balance:String(d?.balance??"0"),completionTime:d?.completion_time??null}))})),rewards:a==null?null:{total:(Array.isArray(a?.total)?a.total:[]).map(u=>({denom:u?.denom??null,amount:String(u?.amount??"0")})),byValidator:(Array.isArray(a?.rewards)?a.rewards:[]).map(u=>({validator:u?.validator_address??null,reward:(Array.isArray(u?.reward)?u.reward:[]).map(d=>({denom:d?.denom??null,amount:String(d?.amount??"0")}))}))}}}catch(n){return Om(n)}}async function TE(e={},t={}){try{let n=Oc(e,t),r=String(e.hash||e.denom||"").trim();if(r){let s=IE(r)||(/^[0-9A-Fa-f]{64}$/.test(r)?r.toUpperCase():null);if(!s)throw new Error("cosmos-lcd: hash must be an ibc/<64-hex> denom or a bare 64-hex hash");let l=(await Qn(n,`/ibc/apps/transfer/v1/denom_traces/${s}`,t))?.denom_trace||null;return{provider:"cosmos-lcd",chain:n.chain,hash:s,denom:`ibc/${s}`,path:l?.path??null,baseDenom:l?.base_denom??null,resolved:!!l?.base_denom}}let o=Math.min(500,Math.max(1,Number(e.limit||100))),i=await Qn(n,`/ibc/apps/transfer/v1/denom_traces?pagination.limit=${o}`,t),a=Array.isArray(i?.denom_traces)?i.denom_traces:[];return{provider:"cosmos-lcd",chain:n.chain,limit:o,count:a.length,traces:a.map(s=>({path:s?.path??null,baseDenom:s?.base_denom??null})),nextKey:i?.pagination?.next_key??null}}catch(n){return Om(n)}}O();var YU="https://fullnode.mainnet.sui.io:443",Lc="0x2::sui::SUI",Rc=9,JU=/execute|sign|broadcast|submit|dryRun|dry_run|devInspect|faucet/i;function NE(e={}){return String(e.rpcUrl||e.baseUrl||process.env.SUI_RPC_URL||YU).trim().replace(/\/$/,"")}function Rm(e){return{error:String(e?.message||e).slice(0,200)}}function CE(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),a=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return a?`${i}.${a}`:i}function OE(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`sui-public: ${t} must be a 0x-prefixed Sui address`);return`0x${n.slice(2).padStart(64,"0")}`}async function ta(e,t=[],n={}){let r=String(e||"");if(!r)throw new Error("sui-public: method required");if(JU.test(r))throw new Error(`sui-public: ${r} refused \u2014 this provider is read-only (no sign, no submit, no dry-run)`);let o=await v(NE(n),{method:"POST",body:{jsonrpc:"2.0",id:n.id||1,method:r,params:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3,headers:{Accept:"application/json"}});if(o?.error)throw new Error(`sui-public ${r}: ${String(o.error.message||JSON.stringify(o.error)).slice(0,140)}`);return o?.result}async function RE(e={}){try{let t=await ta("sui_getLatestCheckpointSequenceNumber",[],e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"sui-public",rpcUrl:NE(e),checkpoint:t==null?null:String(t),exec:!1}}catch(t){return{ok:!1,provider:"sui-public",error:String(t?.message||t).slice(0,160),exec:!1}}}async function LE(e={},t={}){try{let n=OE(e.owner||e.address,"owner");if(e.coinType){let s=String(e.coinType).trim(),c=await ta("suix_getBalance",[n,s],t),l=String(c?.totalBalance??"0"),u=s===Lc;return{provider:"sui-public",owner:n,count:1,balances:[{coinType:s,totalBalance:l,coinObjectCount:c?.coinObjectCount??null,decimals:u?Rc:null,symbol:u?"SUI":null,amount:u?CE(l,Rc):null}]}}let r=await ta("suix_getAllBalances",[n],t),i=(Array.isArray(r)?r:[]).map(s=>{let c=s?.coinType??null,l=String(s?.totalBalance??"0"),u=c===Lc;return{coinType:c,totalBalance:l,coinObjectCount:s?.coinObjectCount??null,decimals:u?Rc:null,symbol:u?"SUI":null,amount:u?CE(l,Rc):null}}),a=i.find(s=>s.coinType===Lc)||null;return{provider:"sui-public",owner:n,count:i.length,suiBalance:a?.totalBalance??"0",sui:a?.amount??"0",balances:i}}catch(n){return Rm(n)}}async function $E(e={},t={}){try{let n=OE(e.owner||e.address,"owner"),r=Math.min(50,Math.max(1,Number(e.limit||25))),o={options:{showType:!0,showOwner:!0,showDisplay:!0,showContent:!1}};e.structType&&(o.filter={StructType:String(e.structType)});let i=[n,o,e.cursor??null,r],a=await ta("suix_getOwnedObjects",i,t),s=Array.isArray(a?.data)?a.data:[];return{provider:"sui-public",owner:n,limit:r,count:s.length,hasNextPage:!!a?.hasNextPage,nextCursor:a?.nextCursor??null,objects:s.map(c=>{let l=c?.data||{},u=l.display?.data||null;return{objectId:l.objectId??null,version:l.version==null?null:String(l.version),digest:l.digest??null,type:l.type??null,owner:l.owner??null,name:u?.name??null,description:u?.description??null,imageUrl:u?.image_url??null}})}}catch(n){return Rm(n)}}async function BE(e={},t={}){try{let n=String(e.coinType||Lc).trim();if(!n)throw new Error("sui-public: coinType required");let r=await ta("suix_getCoinMetadata",[n],t);return r?{provider:"sui-public",coinType:n,found:!0,decimals:r.decimals??null,symbol:r.symbol??null,name:r.name??null,description:r.description??null,iconUrl:r.iconUrl??null,id:r.id??null}:{provider:"sui-public",coinType:n,found:!1,note:"no registered CoinMetadata for this type"}}catch(n){return Rm(n)}}O();var QU="https://fullnode.mainnet.aptoslabs.com",Lm="0x1::aptos_coin::AptosCoin",$c=8;function $m(e={}){return String(e.baseUrl||process.env.APTOS_FULLNODE_URL||process.env.APTOS_API_URL||QU).trim().replace(/\/$/,"")}function FE(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.APTOS_API_KEY||"";return n&&(t.Authorization=`Bearer ${n}`),t}async function Xr(e,t={}){return v(`${$m(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:FE(t)})}function Bm(e,t="address"){let n=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{1,64}$/.test(n))throw new Error(`aptos-public: ${t} must be a 0x-prefixed Aptos address`);return`0x${n.slice(2).padStart(64,"0")}`}function Mm(e){return{error:String(e?.message||e).slice(0,200)}}function ME(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0||n>30)return null;let r=String(e??"0");if(!/^\d+$/.test(r))return null;let o=r.padStart(n+1,"0"),i=o.slice(0,o.length-n),a=n===0?"":o.slice(o.length-n).replace(/0+$/,"");return a?`${i}.${a}`:i}function UE(e){let t=/^0x1::coin::CoinStore<(.+)>$/.exec(String(e||""));return t?t[1]:null}async function DE(e={}){try{let t=await Xr("/v1",e),n=Number(t?.ledger_version??0);return{ok:Number.isFinite(n)&&n>0,provider:"aptos-public",baseUrl:$m(e),chainId:t?.chain_id??null,ledgerVersion:t?.ledger_version==null?null:String(t.ledger_version),blockHeight:t?.block_height==null?null:String(t.block_height),nodeRole:t?.node_role??null,exec:!1}}catch(t){return{ok:!1,provider:"aptos-public",error:String(t?.message||t).slice(0,160),exec:!1}}}async function qE(e={},t={}){try{let n=Bm(e.address||e.account,"address"),r=await Xr(`/v1/accounts/${n}`,t);return{provider:"aptos-public",address:n,sequenceNumber:r?.sequence_number==null?null:String(r.sequence_number),authenticationKey:r?.authentication_key??null}}catch(n){return Mm(n)}}async function HE(e={},t={}){try{let n=Bm(e.address||e.account,"address"),r=e.resourceType?String(e.resourceType).trim():"";if(r){let c=await Xr(`/v1/accounts/${n}/resource/${encodeURIComponent(r)}`,t);return{provider:"aptos-public",address:n,count:c?1:0,resources:c?[{type:c.type??r,data:c.data??null}]:[]}}let o=Math.min(200,Math.max(1,Number(e.limit||100))),i=new URLSearchParams({limit:String(o)});e.start&&i.set("start",String(e.start)),e.ledgerVersion&&i.set("ledger_version",String(e.ledgerVersion));let a=await Xr(`/v1/accounts/${n}/resources?${i.toString()}`,t),s=Array.isArray(a)?a:[];return{provider:"aptos-public",address:n,limit:o,count:s.length,coinStoreCount:s.filter(c=>UE(c?.type)).length,resources:s.map(c=>({type:c?.type??null,data:c?.data??null}))}}catch(n){return Mm(n)}}async function jE(e={},t={}){try{let n=Bm(e.address||e.owner,"address"),r=e.coinType?String(e.coinType).trim():"";if(r){let c=null,l="view";try{let d=await v(`${$m(t)}/v1/view`,{method:"POST",body:{function:"0x1::coin::balance",type_arguments:[r],arguments:[n]},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:FE(t)});c=Array.isArray(d)?String(d[0]??"0"):null}catch{l="coinstore";let d=await Xr(`/v1/accounts/${n}/resource/${encodeURIComponent(`0x1::coin::CoinStore<${r}>`)}`,t);c=String(d?.data?.coin?.value??"0")}let u=r===Lm;return{provider:"aptos-public",address:n,source:l,count:1,balances:[{coinType:r,raw:c??"0",decimals:u?$c:null,symbol:u?"APT":null,amount:u?ME(c??"0",$c):null}]}}let o=await Xr(`/v1/accounts/${n}/resources?limit=200`,t),i=Array.isArray(o)?o:[],a=[];for(let c of i){let l=UE(c?.type);if(!l)continue;let u=String(c?.data?.coin?.value??"0"),d=l===Lm;a.push({coinType:l,raw:u,decimals:d?$c:null,symbol:d?"APT":null,amount:d?ME(u,$c):null,frozen:c?.data?.frozen??null})}let s=a.find(c=>c.coinType===Lm)||null;return{provider:"aptos-public",address:n,source:"coinstore",count:a.length,aptRaw:s?.raw??"0",apt:s?.amount??"0",balances:a}}catch(n){return Mm(n)}}O();var e6="https://hub.snapshot.org/graphql",zE=Object.freeze(["pending","active","closed"]),t6=/^0x[0-9a-fA-F]{40}$/,n6=200;function r6(e={}){return String(e.baseUrl||process.env.SNAPSHOT_API_URL||e6).replace(/\/$/,"")}function Fm(e,t=20){let n=Number(e??t);return Number.isFinite(n)?Math.min(Math.max(Math.trunc(n),1),n6):t}function Um(e){let t=Number(e??0);return!Number.isFinite(t)||t<0?0:Math.min(Math.trunc(t),1e4)}async function Qr(e,t,n={}){let r=await v(r6(n),{method:"POST",body:{query:e,variables:t},headers:{"Content-Type":"application/json"},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4,signal:n.signal});if(Array.isArray(r?.errors)&&r.errors.length)throw new Error(`snapshot: ${String(r.errors[0]?.message||"graphql error").slice(0,160)}`);return r?.data??{}}var VE=`query Spaces($first: Int!, $skip: Int!, $where: SpaceWhere) {
|
|
194
|
+
spaces(first: $first, skip: $skip, where: $where, orderBy: "followersCount", orderDirection: desc) {
|
|
195
|
+
id name about network symbol followersCount proposalsCount
|
|
196
|
+
admins members
|
|
197
|
+
strategies { name network }
|
|
198
|
+
}
|
|
199
|
+
}`,o6=`query Proposals($first: Int!, $skip: Int!, $where: ProposalWhere) {
|
|
200
|
+
proposals(first: $first, skip: $skip, where: $where, orderBy: "created", orderDirection: desc) {
|
|
201
|
+
id title body choices start end snapshot state author created type quorum
|
|
202
|
+
scores scores_total scores_state link
|
|
203
|
+
space { id name }
|
|
204
|
+
}
|
|
205
|
+
}`,i6=`query Proposal($id: String!) {
|
|
206
|
+
proposal(id: $id) {
|
|
207
|
+
id title body discussion choices start end snapshot state author created type quorum
|
|
208
|
+
scores scores_by_strategy scores_total scores_updated scores_state link privacy
|
|
209
|
+
strategies { name network }
|
|
210
|
+
space { id name network symbol }
|
|
211
|
+
}
|
|
212
|
+
}`,a6=`query Votes($first: Int!, $skip: Int!, $where: VoteWhere) {
|
|
213
|
+
votes(first: $first, skip: $skip, where: $where, orderBy: "created", orderDirection: desc) {
|
|
214
|
+
id voter created choice vp vp_by_strategy vp_state reason
|
|
215
|
+
proposal { id title state choices end }
|
|
216
|
+
space { id name }
|
|
217
|
+
}
|
|
218
|
+
}`,s6=`query Vp($voter: String!, $space: String!, $proposal: String) {
|
|
219
|
+
vp(voter: $voter, space: $space, proposal: $proposal) { vp vp_by_strategy vp_state }
|
|
220
|
+
}`;function Bc(e,t="space"){let n=String(e??"").trim().toLowerCase();if(!n)throw new Error(`snapshot: ${t} is required`);if(!/^[a-z0-9][a-z0-9._-]{0,62}$/.test(n))throw new Error(`snapshot: ${t} must be a snapshot space id (e.g. aave.eth)`);return n}function Dm(e,t="voter"){let n=String(e??"").trim();if(!t6.test(n))throw new Error(`snapshot: ${t} must be a 0x EVM address`);return n.toLowerCase()}function WE(e){if(!e)return null;let t=Array.isArray(e.choices)?e.choices:[],n=Array.isArray(e.scores)?e.scores:[];return{id:e.id,title:e.title,state:e.state,type:e.type,author:e.author,space:e.space?.id??null,spaceName:e.space?.name??null,createdMs:e.created==null?null:Number(e.created)*1e3,startMs:e.start==null?null:Number(e.start)*1e3,endMs:e.end==null?null:Number(e.end)*1e3,snapshotBlock:e.snapshot??null,quorum:e.quorum??null,scoresTotal:e.scores_total??null,scoresState:e.scores_state??null,quorumMet:e.quorum==null||Number(e.quorum)===0?null:Number(e.scores_total??0)>=Number(e.quorum),link:e.link??null,choices:t,tally:t.map((r,o)=>({choice:r,index:o+1,score:n[o]??null})),leadingChoice:n.length===0?null:t[n.indexOf(Math.max(...n.map(r=>Number(r)||0)))]??null,...e.body?{body:String(e.body).slice(0,4e3)}:{},...e.discussion?{discussion:e.discussion}:{},...Array.isArray(e.strategies)?{strategies:e.strategies}:{}}}async function GE(e={},t={}){try{let n={};if(e.ids||e.space){let i=(Array.isArray(e.ids)?e.ids:[e.ids??e.space]).filter(Boolean).map(a=>Bc(a,"space id"));i.length&&(n.id_in=i)}let o=((await Qr(VE,{first:Fm(e.first??e.limit,20),skip:Um(e.skip),where:n},t)).spaces||[]).map(i=>({id:i.id,name:i.name,network:i.network,symbol:i.symbol,followersCount:i.followersCount??null,proposalsCount:i.proposalsCount??null,adminCount:Array.isArray(i.admins)?i.admins.length:null,memberCount:Array.isArray(i.members)?i.members.length:null,strategies:Array.isArray(i.strategies)?i.strategies.map(a=>a?.name).filter(Boolean):[],about:i.about?String(i.about).slice(0,500):null}));return{ok:!0,provider:"snapshot-governance",execution:"read-only",count:o.length,spaces:o}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function qm(e={},t={}){try{let n={},r=e.spaces??e.space;if(r){let s=(Array.isArray(r)?r:[r]).filter(Boolean).map(c=>Bc(c));s.length===1?n.space=s[0]:s.length>1&&(n.space_in=s)}let o=e.state==null?"active":String(e.state).trim().toLowerCase();if(o&&o!=="all"){if(!zE.includes(o))throw new Error(`state must be one of ${zE.join(", ")}, or all`);n.state=o}e.author&&(n.author=Dm(e.author,"author"));let a=((await Qr(o6,{first:Fm(e.first??e.limit,20),skip:Um(e.skip),where:n},t)).proposals||[]).map(WE);return{ok:!0,provider:"snapshot-governance",execution:"read-only",state:o||"all",count:a.length,proposals:a}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function KE(e={},t={}){return qm({...e,state:"active"},t)}async function YE(e={},t={}){try{let n=String(e.id??e.proposal??"").trim();if(!n)throw new Error("snapshot: proposal id is required");if(!/^[0-9a-zA-Z._-]{1,120}$/.test(n))throw new Error("snapshot: proposal id has an unexpected shape");let r=await Qr(i6,{id:n},t),o=WE(r.proposal);return o?{ok:!0,provider:"snapshot-governance",execution:"read-only",proposal:o}:{ok:!1,provider:"snapshot-governance",error:`proposal not found: ${n}`}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function JE(e={},t={}){try{let n={};if((e.voter||e.address)&&(n.voter=Dm(e.voter??e.address)),e.space&&(n.space=Bc(e.space)),e.proposal&&(n.proposal=String(e.proposal).trim()),!n.voter&&!n.space&&!n.proposal)throw new Error("snapshot: votes requires voter, space, or proposal");let o=((await Qr(a6,{first:Fm(e.first??e.limit,25),skip:Um(e.skip),where:n},t)).votes||[]).map(i=>{let a=Array.isArray(i.proposal?.choices)?i.proposal.choices:[],s=typeof i.choice=="number"?a[i.choice-1]??null:null;return{id:i.id,voter:i.voter,createdMs:i.created==null?null:Number(i.created)*1e3,choice:i.choice,choiceLabel:s,votingPower:i.vp??null,vpState:i.vp_state??null,reason:i.reason?String(i.reason).slice(0,500):null,proposalId:i.proposal?.id??null,proposalTitle:i.proposal?.title??null,proposalState:i.proposal?.state??null,space:i.space?.id??null}});return{ok:!0,provider:"snapshot-governance",execution:"read-only",count:o.length,totalVotingPower:o.reduce((i,a)=>i+(Number(a.votingPower)||0),0),votes:o}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function XE(e={},t={}){try{let n=Dm(e.voter??e.address),r=Bc(e.space),o=e.proposal?String(e.proposal).trim():null,a=(await Qr(s6,{voter:n,space:r,proposal:o},t)).vp||null;return{ok:!0,provider:"snapshot-governance",execution:"read-only",voter:n,space:r,proposal:o,votingPower:a?.vp??0,byStrategy:Array.isArray(a?.vp_by_strategy)?a.vp_by_strategy:[],state:a?.vp_state??null}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"snapshot-governance"}}}async function QE(e={}){try{let t=await Qr(VE,{first:1,skip:0,where:{}},{...e,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.spaces),provider:"snapshot-governance",execution:"read-only"}}catch(t){return{ok:!1,provider:"snapshot-governance",error:String(t.message||t).slice(0,160)}}}O();import{Interface as l6,getAddress as eA,isAddress as jm}from"ethers";fe();var u6="https://api.tally.xyz/query",d6=Object.freeze(["api.tally.xyz"]),tA=Object.freeze(["Pending","Active","Canceled","Defeated","Succeeded","Queued","Expired","Executed"]),Zr=Object.freeze({compound:{chainId:1,address:"0xc0Da02939E1441F497fd74F78cE7Decb17B66529",kind:"bravo",token:"COMP",name:"Compound"},uniswap:{chainId:1,address:"0x408ED6354d4973f66138C91495F2f2FCbd8724C3",kind:"bravo",token:"UNI",name:"Uniswap"},ens:{chainId:1,address:"0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",kind:"oz",token:"ENS",name:"ENS"},aave:{chainId:1,address:"0x9AEE0B04504CeF83A65AC3f0e838D0593BCb2BC7",kind:"oz",token:"AAVE",name:"Aave Governance v3"},gitcoin:{chainId:1,address:"0xDbD27635A534A3d3169Ef0498beB56Fb9c937489",kind:"bravo",token:"GTC",name:"Gitcoin"},arbitrum:{chainId:42161,address:"0xf07DeD9dC292157749B6Fd268E37DF6EA38395B9",kind:"oz",token:"ARB",name:"Arbitrum Core"},optimism:{chainId:10,address:"0xcDF27F107725988f2261Ce2256bDfCdE8B382B10",kind:"oz",token:"OP",name:"Optimism"}}),ZE=new l6(["function state(uint256 proposalId) view returns (uint8)","function proposalCount() view returns (uint256)","function quorumVotes() view returns (uint256)","function proposalThreshold() view returns (uint256)","function votingDelay() view returns (uint256)","function votingPeriod() view returns (uint256)","function proposalSnapshot(uint256 proposalId) view returns (uint256)","function proposalDeadline(uint256 proposalId) view returns (uint256)","function proposalVotes(uint256 proposalId) view returns (uint256 againstVotes,uint256 forVotes,uint256 abstainVotes)","function proposals(uint256 proposalId) view returns (uint256 id,address proposer,uint256 eta,uint256 startBlock,uint256 endBlock,uint256 forVotes,uint256 againstVotes,uint256 abstainVotes,bool canceled,bool executed)","function hasVoted(uint256 proposalId,address account) view returns (bool)","function getVotes(address account,uint256 blockNumber) view returns (uint256)"]);function Mc(e={}){let t=String(e.dao??e.governorKey??"").trim().toLowerCase();if(t){let i=Zr[t];if(!i)throw new Error(`tally: unknown dao ${JSON.stringify(t)} \u2014 known: ${Object.keys(Zr).join(", ")}`);return{...i,key:t}}let n=String(e.governor??e.address??"").trim();if(!jm(n))throw new Error("tally: dao or governor address is required");let r=Number(e.chainId??1);if(!Number.isSafeInteger(r)||r<=0)throw new Error("tally: chainId must be a positive integer");let o=String(e.kind??"bravo").toLowerCase();if(o!=="bravo"&&o!=="oz")throw new Error("tally: kind must be bravo or oz");return{chainId:r,address:eA(n),kind:o,key:null,name:null,token:null}}function Hm(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("tally: proposalId must be a decimal integer string");return BigInt(t)}async function rt(e,t,n,r={}){let o=r.rpcCall||U,i=ZE.encodeFunctionData(t,n),a=await o(e.chainId,"eth_call",[{to:e.address,data:i},r.blockTag||"latest"],r);return ZE.decodeFunctionResult(t,a)}function nt(e){return e==null?null:String(e)}async function zm(e={},t={}){try{let n=Mc(e),r=await Promise.allSettled([rt(n,"proposalCount",[],t),rt(n,"votingDelay",[],t),rt(n,"votingPeriod",[],t),rt(n,"proposalThreshold",[],t),rt(n,"quorumVotes",[],t)]),o=i=>r[i].status==="fulfilled"?nt(r[i].value[0]):null;return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,name:n.name,chainId:n.chainId,governor:n.address,kind:n.kind,token:n.token,proposalCount:o(0),votingDelay:o(1),votingPeriod:o(2),proposalThreshold:o(3),quorumVotes:o(4)}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function Vm(e={},t={}){try{let n=Mc(e),r=Hm(e.proposalId??e.id),o=await rt(n,"state",[r],t),i=Number(o[0]),a=tA[i]??"Unknown",s=null,c=null;if(n.kind==="bravo"){let[m]=[await rt(n,"proposals",[r],t)];s={forVotes:nt(m.forVotes),againstVotes:nt(m.againstVotes),abstainVotes:nt(m.abstainVotes)},c={proposer:m.proposer,eta:nt(m.eta),startBlock:nt(m.startBlock),endBlock:nt(m.endBlock),canceled:m.canceled===!0,executed:m.executed===!0}}else{let[m,f,h]=await Promise.all([rt(n,"proposalVotes",[r],t),rt(n,"proposalSnapshot",[r],t).catch(()=>null),rt(n,"proposalDeadline",[r],t).catch(()=>null)]);s={forVotes:nt(m.forVotes),againstVotes:nt(m.againstVotes),abstainVotes:nt(m.abstainVotes)},c={startBlock:f?nt(f[0]):null,endBlock:h?nt(h[0]):null}}let l=BigInt(s.forVotes??"0"),u=BigInt(s.againstVotes??"0"),d=BigInt(s.abstainVotes??"0"),p=l+u+d;return{ok:!0,provider:"tally-governance",execution:"read-only",source:"onchain",dao:n.key,chainId:n.chainId,governor:n.address,kind:n.kind,proposalId:r.toString(),state:a,stateIndex:i,votes:s,totalVotes:p.toString(),leading:p===0n?null:l>u?"for":l<u?"against":"tied",...c}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function nA(e={},t={}){try{let n=Mc(e),r=Number(e.limit??e.first??5),o=Number.isFinite(r)?Math.min(Math.max(Math.trunc(r),1),25):5,i=await rt(n,"proposalCount",[],t),a=BigInt(i[0]);if(a===0n)return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,count:"0",proposals:[]};let s=[];for(let u=0n;u<BigInt(o)&&a-u>0n;u++)s.push(a-u);let l=(await Promise.allSettled(s.map(u=>Vm({...e,proposalId:u.toString()},t)))).map((u,d)=>u.status==="fulfilled"&&!u.value.error?u.value:{proposalId:s[d].toString(),error:u.status==="rejected"?String(u.reason?.message||u.reason).slice(0,200):u.value.error});return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,chainId:n.chainId,governor:n.address,proposalCount:a.toString(),count:l.length,proposals:l}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function rA(e={},t={}){try{let n=Mc(e),r=Hm(e.proposalId??e.id),o=String(e.account??e.voter??e.address??"").trim();if(!jm(o))throw new Error("tally: account must be a 0x EVM address");let i=eA(o),a=await rt(n,"hasVoted",[r,i],t),s=null;if(e.snapshotBlock!=null){let c=Hm(e.snapshotBlock),l=await rt(n,"getVotes",[i,c],t).catch(()=>null);s=l?nt(l[0]):null}return{ok:!0,provider:"tally-governance",execution:"read-only",dao:n.key,chainId:n.chainId,governor:n.address,proposalId:r.toString(),account:i,hasVoted:a[0]===!0,votingWeight:s}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}function oA(){return{ok:!0,provider:"tally-governance",execution:"read-only",governors:Object.entries(Zr).map(([e,t])=>({key:e,...t})),states:tA}}var p6=`query Proposals($input: ProposalsInput!) {
|
|
221
|
+
proposals(input: $input) {
|
|
222
|
+
nodes {
|
|
223
|
+
... on Proposal {
|
|
224
|
+
id onchainId status
|
|
225
|
+
metadata { title description }
|
|
226
|
+
governor { id name chainId }
|
|
227
|
+
voteStats { type votesCount votersCount percent }
|
|
228
|
+
start { ... on Block { timestamp } }
|
|
229
|
+
end { ... on Block { timestamp } }
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}`;function m6(e={}){return Ee({provider:"tally-governance",defaultUrl:u6,hosts:d6,url:e.baseUrl||process.env.TALLY_API_URL})}async function iA(e={},t={}){try{let n=String(t.apiKey||process.env.TALLY_API_KEY||"").trim();if(!n)return{ok:!1,configured:!1,provider:"tally-governance",execution:"read-only",error:"TALLY_API_KEY is not set \u2014 use governorProposals for keyless on-chain reads"};let r=m6(t),o=e.organizationId?String(e.organizationId):null,i=e.governorId?String(e.governorId):null;if(!o&&!i)throw new Error("tally: organizationId or governorId is required");let a=Number(e.limit??10),s=Number.isFinite(a)?Math.min(Math.max(Math.trunc(a),1),50):10,c=await v(r.baseUrl,{method:"POST",headers:ke({"Content-Type":"application/json"},{"Api-Key":n},r.trusted),body:{query:p6,variables:{input:{filters:o?{organizationId:o}:{governorId:i},page:{limit:s},sort:{isDescending:!0,sortBy:"id"}}}},fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,signal:t.signal});if(Array.isArray(c?.errors)&&c.errors.length)throw new Error(String(c.errors[0]?.message||"graphql error").slice(0,160));let l=c?.data?.proposals?.nodes||[];return{ok:!0,configured:!0,provider:"tally-governance",execution:"read-only",source:"tally",credentialed:r.trusted,count:l.length,proposals:l.map(u=>({id:u.id,onchainId:u.onchainId??null,status:u.status??null,title:u.metadata?.title??null,governor:u.governor?.id??null,governorName:u.governor?.name??null,chainId:u.governor?.chainId??null,startTs:u.start?.timestamp??null,endTs:u.end?.timestamp??null,voteStats:Array.isArray(u.voteStats)?u.voteStats:[]}))}}catch(n){return{error:String(n.message||n).slice(0,200),provider:"tally-governance"}}}async function aA(e={}){try{let t=Object.keys(Zr).length>0&&Object.values(Zr).every(r=>jm(r.address)&&Number.isSafeInteger(r.chainId)),n=null;return(e.rpcCall||e.probeOnchain)&&(n=(await zm({dao:"compound"},e))?.ok===!0),{ok:t&&n!==!1,provider:"tally-governance",execution:"read-only",governors:Object.keys(Zr).length,tallyConfigured:!!String(process.env.TALLY_API_KEY||"").trim(),...n==null?{}:{onchain:n}}}catch(t){return{ok:!1,provider:"tally-governance",error:String(t.message||t).slice(0,160)}}}O();var h6="https://hermes.pyth.network",eo={"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"},y6=/^[0-9a-fA-F]{64}$/;function sA(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||h6).replace(/\/$/,"")}function cA(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=eo[n.toUpperCase()]||eo[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!y6.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 Wm(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Gm(e={}){let t=Wm({price:Number(e.price?.conf),expo:e.price?.expo}),n=Wm(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Wm(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 Km(e,t={}){let n=new URL(`${sA(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"),v(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function lA(e={}){try{let t=await Km([eo["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Gm):[])[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 uA(e={},t={}){let n=cA(e.feedId||e.id||e.symbol,"feedId"),r=await Km([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Gm):[],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 Fc(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>cA(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 s=(await be(i,3,l=>Km(l,t))).flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Gm):[]),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 dA(e={},t={}){let n=new URL(`${sA(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 v(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}var pA=Object.freeze({watchBps:25,warnBps:50,depegBps:200}),OV=Object.freeze(["normal","watch","warn","depeg"]),Ym=Object.freeze([{symbol:"USDT",name:"Tether",llamaKey:"coingecko:tether",pythSymbol:"USDT/USD",pegMechanism:"fiat-backed"},{symbol:"USDC",name:"USD Coin",llamaKey:"coingecko:usd-coin",pythSymbol:"USDC/USD",pegMechanism:"fiat-backed"},{symbol:"DAI",name:"Dai",llamaKey:"coingecko:dai",pegMechanism:"crypto-backed"},{symbol:"USDS",name:"Sky Dollar",llamaKey:"coingecko:usds",pegMechanism:"crypto-backed"},{symbol:"USDe",name:"Ethena USDe",llamaKey:"coingecko:ethena-usde",pegMechanism:"crypto-backed"},{symbol:"FRAX",name:"Frax",llamaKey:"coingecko:frax",pegMechanism:"crypto-backed"},{symbol:"crvUSD",name:"Curve USD",llamaKey:"coingecko:crvusd",pegMechanism:"crypto-backed"},{symbol:"USDT0",name:"USDT0 (LayerZero OFT)",llamaKey:"coingecko:usdt0",hyperliquid:!0,pegMechanism:"fiat-backed",dex:{chain:"hyperevm",address:"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb"}},{symbol:"feUSD",name:"Felix feUSD",llamaKey:"coingecko:felix-feusd",hyperliquid:!0,pegMechanism:"crypto-backed",dex:{chain:"hyperevm",address:"0x02c6a2fA58cC01A18B8D9E00eA48d65E4dF26c70"}},{symbol:"USDXL",name:"Last USD (USDXL)",llamaKey:"coingecko:last-usd",hyperliquid:!0,pegMechanism:"crypto-backed",dex:{chain:"hyperevm",address:"0xca79db4b49f608ef54a5cb813fbed3a6387bc645"}},{symbol:"USDHL",name:"USDHL",llamaKey:"hyperliquid:0xb50A96253aBDF803D85efcDce07Ad8becBc52BD5",hyperliquid:!0,pegMechanism:"fiat-backed",dex:{chain:"hyperevm",address:"0xb50A96253aBDF803D85efcDce07Ad8becBc52BD5"}},{symbol:"USDH",name:"Hyperliquid USDH",llamaKey:"coingecko:usdh",hyperliquid:!0,pegMechanism:"fiat-backed"}]),Uc=1;function Ke(e){let t=Number(e);return Number.isFinite(t)?t:null}function b6(e,t=Uc){let n=Ke(e);return n==null||n<=0?null:Math.round((n-t)/t*1e4*100)/100}function w6(e,t=pA){let n=mA(t),r=Ke(e);return r==null?"unknown":r>=n.depegBps?"depeg":r>=n.warnBps?"warn":r>=n.watchBps?"watch":"normal"}function mA(e={}){let t=e&&typeof e=="object"?e:{},n=a=>{let s=Ke(t[a]);return s!=null&&s>=0?s:pA[a]},r=n("watchBps"),o=Math.max(r,n("warnBps")),i=Math.max(o,n("depegBps"));return{watchBps:r,warnBps:o,depegBps:i}}function v6(e){if(!Array.isArray(e)||!e.length)return Ym;let t=new Set(e.map(r=>String(r).toUpperCase())),n=Ym.filter(r=>t.has(r.symbol.toUpperCase()));return n.length?n:Ym}async function x6(e,t){let n=[...new Set(e.map(r=>r.llamaKey).filter(Boolean))];if(!n.length)return{prices:{},error:null};try{let o=(await Ft(n,t))?.coins||{},i={};for(let a of n){let s=Ke(o[a]?.price);s!=null&&(i[a]={price:s,confidence:Ke(o[a]?.confidence),timestamp:o[a]?.timestamp??null})}return{prices:i,error:null}}catch(r){return{prices:{},error:String(r.message||r).slice(0,200)}}}async function S6(e,t){let n=[...new Set(e.map(r=>r.pythSymbol).filter(r=>r&&eo[r]))];if(!n.length)return{prices:{},error:null};try{let o=(await Fc({symbols:n},t))?.byId||{},i={};for(let a of n){let s=String(eo[a]).toLowerCase(),c=o[s],l=Ke(c?.price);l!=null&&(i[a]={price:l,confidenceBps:Ke(c?.confidenceBps),ageSeconds:Ke(c?.ageSeconds)})}return{prices:i,error:null}}catch(r){return{prices:{},error:String(r.message||r).slice(0,200)}}}async function k6(e,t){if(!e.dex?.address)return null;try{let n=await Ot(e.dex.address,t),r=Array.isArray(n?.pairs)?n.pairs:[],o=r.filter(s=>String(s?.chainId||"").toLowerCase()===String(e.dex.chain).toLowerCase()),a=(o.length?o:r).filter(s=>String(s?.baseToken?.address||"").toLowerCase()===String(e.dex.address).toLowerCase()).filter(s=>Ke(s?.priceUsd)!=null).sort((s,c)=>(Ke(c?.liquidity?.usd)??0)-(Ke(s?.liquidity?.usd)??0))[0];return a?{price:Ke(a.priceUsd),liquidityUsd:Ke(a?.liquidity?.usd),pairAddress:a?.pairAddress||null,dexId:a?.dexId||null,chain:a?.chainId||null}:null}catch{return null}}function I6(e,{llama:t,pyth:n,dex:r},o){let i=[];t?.price!=null&&i.push({source:"defillama",price:t.price,confidence:t.confidence??null}),n?.price!=null&&i.push({source:"pyth",price:n.price,confidenceBps:n.confidenceBps??null,ageSeconds:n.ageSeconds??null}),r?.price!=null&&i.push({source:"dexscreener",price:r.price,liquidityUsd:r.liquidityUsd??null,pair:r.pairAddress??null,dexId:r.dexId??null});let a=i.find(p=>p.source==="defillama")||i.find(p=>p.source==="pyth")||i[0]||null,s=a?.price??null,c=b6(s),l=c==null?null:Math.abs(c),u=null,d=i.map(p=>p.price).filter(p=>Ke(p)!=null);if(d.length>1){let p=Math.min(...d),m=Math.max(...d);u=Math.round((m-p)/Uc*1e4*100)/100}return{symbol:e.symbol,name:e.name,hyperliquid:e.hyperliquid===!0,pegMechanism:e.pegMechanism||null,pegTargetUsd:Uc,priceUsd:s,deviationBps:c,absDeviationBps:l,direction:c==null?null:c<0?"below":c>0?"above":"at-peg",severity:s==null?"unknown":w6(l,o),primarySource:a?.source||null,sourceSpreadBps:u,sources:i,priced:s!=null}}async function Jm(e={},t={}){try{let n=mA(e.thresholds),r=v6(e.symbols),o=e.usePyth!==!1,i=e.useDex!==!1,[a,s]=await Promise.all([x6(r,t),o?S6(r,t):Promise.resolve({prices:{},error:null})]),c=r.filter(y=>i&&y.dex?.address&&(e.forceDex===!0||a.prices[y.llamaKey]?.price==null)),l=await Promise.all(c.map(y=>k6(y,t))),u=new Map(c.map((y,w)=>[y.symbol,l[w]])),d=r.map(y=>I6(y,{llama:a.prices[y.llamaKey]||null,pyth:y.pythSymbol&&s.prices[y.pythSymbol]||null,dex:u.get(y.symbol)||null},n)),p=d.filter(y=>y.priced),m=d.filter(y=>!y.priced);p.sort((y,w)=>(w.absDeviationBps??0)-(y.absDeviationBps??0));let f={normal:0,watch:0,warn:0,depeg:0,unknown:m.length};for(let y of p)f[y.severity]=(f[y.severity]||0)+1;let h=p.filter(y=>y.severity!=="normal");return{provider:"stablecoin-peg",execution:"read-only",generatedAt:new Date().toISOString(),pegTargetUsd:Uc,thresholds:n,counts:f,scanned:d.length,priced:p.length,worst:p[0]||null,alerting:h,stables:[...p,...m],upstreamErrors:[...a.error?[{source:"defillama",error:a.error}]:[],...s.error?[{source:"pyth",error:s.error}]:[]]}}catch(n){return{error:String(n.message||n).slice(0,200)}}}async function fA(e={}){try{let t=await Jm({symbols:["USDT","USDC"],useDex:!1},e);return t?.error?{ok:!1,provider:"stablecoin-peg",error:String(t.error).slice(0,160)}:{ok:Number(t?.priced||0)>0,provider:"stablecoin-peg",priced:t?.priced??0,worstBps:t?.worst?.absDeviationBps??null,exec:!1}}catch(t){return{ok:!1,provider:"stablecoin-peg",error:String(t.message||t).slice(0,160)}}}O();var A6="https://bundles.jito.wtf",yA=1e9;function Xm(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||A6).replace(/\/$/,"")}function _6(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function hA(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*yA):null}function P6(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/yA:null,raw:e}}async function gA(e={}){try{let t=await v(`${Xm(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 bA(e={},t={}){let n=_6(e.limit,5,100),r=new URL(`${Xm(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 v(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(P6),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 wA(e={}){let t=await v(`${Xm(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,hA(i)])),suggestedTipLamports:hA(r.p75||r.p50),raw:n}}O();var C6="https://api.kamino.finance";function N6(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||C6).replace(/\/$/,"")}function ot(e){let t=Number(e);return Number.isFinite(t)?t:null}function vA(e={}){let t=ot(e.totalValueLocked)??0,n=ot(e.apy?.totalApy)??0,r=ot(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:ot(e.sharePrice),sharesIssued:ot(e.sharesIssued),profitAndLoss:ot(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:ot(e.apy?.vault?.totalApr),apy24h:ot(e.kaminoApy?.vault?.apy24h),apy7d:ot(e.kaminoApy?.vault?.apy7d),apy30d:ot(e.kaminoApy?.vault?.apy30d),poolPrice:ot(e.apy?.vault?.poolPrice),priceLower:ot(e.apy?.vault?.priceLower),priceUpper:ot(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Qm(e={},t={}){let n=new URL(`${N6(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await v(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function xA(e={}){try{let t=await Qm({},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 SA(e={},t={}){let r=(await Qm(e,t)).map(vA),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 kA(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Qm({...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",...vA(o),raw:o}}O();var R6="https://blockstream.info/liquid/api",IA="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Dc(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||R6).replace(/\/$/,"")}function L6(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 $6(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 EA(e,t={}){let n=`${Dc(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 AA(e,t={}){return v(`${Dc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function _A(e={}){try{let t=await EA("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Dc(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Dc(e),error:String(t?.message||t),exec:!1}}}async function PA(e={},t={}){let n=await EA("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function TA(e={},t={}){let n=L6(e.address||e.addr,"address"),r=await AA(`/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 CA(e={},t={}){let n=$6(e.assetId||e.asset||IA,"assetId"),r=await AA(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===IA,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}}O();var M6="https://api-mainnet.magiceden.dev/v2/ord/btc",F6=600;function Zm(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||M6).replace(/\/$/,"")}function U6(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function NA(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 OA(e,t={}){return v(`${Zm(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:U6(t),retries:t.retries??1})}async function RA(e={}){let t=NA(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await OA(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Zm(e),probeCollection:t,rateLimitRpm:F6,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Zm(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 LA(e={},t={}){let n=NA(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await OA(`/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."}}}O();var q6="https://mempool.space/api",H6=7;function ef(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||q6).replace(/\/$/,"")}function qc(e,t={}){return v(`${ef(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function $A(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>H6}}async function BA(e={}){try{let n=(await qc("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=$A(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:ef(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:ef(e),error:String(t?.message||t),exec:!1}}}async function MA(e={},t={}){let r=(await qc("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=$A(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 FA(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 qc(`/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 UA(e={},t={}){let n=await qc("/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)}))}}O();var z6="https://mempool.space/api",DA=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function tf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||z6).replace(/\/$/,"")}function qA(e,t){let n=String(e||t).trim().toLowerCase();if(!DA.has(n))throw new Error(`mempool-mining: window must be one of ${[...DA].join(", ")}`);return n}function na(e,t={}){return v(`${tf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function HA(e={}){try{let t=await na("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:tf(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:tf(e),error:String(t?.message||t),exec:!1}}}async function jA(e={},t={}){let n=await na("/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 zA(e={},t={}){let n=qA(e.window||e.timeframe,"1w"),r=await na(`/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 VA(e={},t={}){let n=qA(e.window||e.timeframe,"3d"),r=await na(`/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 WA(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await na(`/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}}O();var W6="https://amm-v2.meteora.ag",GA=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),KA=new Set(["dynamic","multitoken","lst","farms"]),G6=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function K6(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||W6).replace(/\/$/,"")}function qe(e){let t=Number(e);return Number.isFinite(t)?t:null}function Y6(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:qe(e.pool_lp_price_in_usd),tvlUsd:qe(e.pool_tvl),farmTvlUsd:qe(e.farm_tvl),volume24hUsd:qe(e.trading_volume),volume7dUsd:qe(e.weekly_trading_volume),fee24hUsd:qe(e.fee_volume),fee7dUsd:qe(e.weekly_fee_volume),tradeApyPct:qe(e.trade_apy),weeklyTradeApyPct:qe(e.weekly_trade_apy),baseApyPct:qe(e.daily_base_apy),farmingApyPct:qe(e.farming_apy),totalApyPct:(qe(e.trade_apy)??0)+(qe(e.farming_apy)??0),aprPct:qe(e.apr),feePct:qe(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 J6(e={},t={}){let n=new URL(`${K6(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(!GA.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...GA].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(!KA.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...KA].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(!G6.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 nf(e={},t={}){let{url:n,page:r,size:o}=J6(e,t),i=await v(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(Y6),totalCount:i?.total_count??null,page:r,size:o}}async function YA(e={}){try{let{pools:t,totalCount:n}=await nf({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 JA(e={},t={}){let n=await nf({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 XA(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 nf({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}}O();var Q6="https://ordinals.com";function Hc(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||Q6).replace(/\/$/,"")}function Z6(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 QA(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(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function rf(e,t={}){return v(`${Hc(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function ZA(e={}){try{let t=await QA("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Hc(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Hc(e),error:String(t?.message||t),exec:!1}}}async function e1(e={},t={}){let n=await QA("/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 t1(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 rf(`/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 n1(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 rf(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 r1(e={},t={}){let n=Z6(e.name||e.rune||e.runeName,"name"),r=await rf(`/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}}O();var t5="https://relayscan.io",o1=new Set(["1h","12h","24h","7d"]);function of(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||t5).replace(/\/$/,"")}function i1(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!o1.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...o1].join(", ")}`);return t}function n5(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 af(e={},t={}){return v(`${of(t)}/overview/json?t=${i1(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function a1(e={},t={}){return v(`${of(t)}/builder-profit/json?t=${i1(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function s1(e={},t={}){let n=n5(e);return v(`${of(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function c1(e={}){let t=await af({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}}O();var o5="https://extra-api.sanctum.so",i5=30,a5=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function sf(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||o5).replace(/\/$/,"")}function l1(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 s5(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Zn(e,t,n={}){let r={},o={},i=await be(s5(t,i5),3,async a=>{let s=new URL(`${sf(n)}/v1/${e}`);for(let c of a)s.searchParams.append("lst",c);return v(s.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})});for(let a of i){let s=a?.apys||a?.tvls||a?.solValues||{};Object.assign(r,s),Object.assign(o,a?.errs||{})}return{values:r,errs:o}}async function u1(e={}){try{let[t,n]=await Promise.all([v(`${sf(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Zn("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 cf(e={},t={}){let n=await v(`${sf(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 d1(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await cf({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=a5);let r=[...new Set(n.map(s=>l1(s,"lsts[]")))],[o,i]=await Promise.all([Zn("apy/latest",r,t),Zn("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 p1(e={},t={}){let n=l1(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Zn("apy/latest",[n],t),Zn("apy/inception",[n],t),Zn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Zn("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}}O();var l5="https://api.save.finance",u5="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",m1="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",d5=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function lf(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||l5).replace(/\/$/,"")}function f1(e,t="address"){let n=String(e??"").trim();if(!d5.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function h1(e){let t=Number(e);return Number.isFinite(t)?t:null}function p5(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 m5(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:h1(e.rates?.supplyInterest),borrowApyPct:h1(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 y1(e={}){try{let t=await v(`${lf(e)}/v1/reserves?ids=${m1}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:m1,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function uf(e={},t={}){let n=new URL(`${lf(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 v(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(p5);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 g1(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=>f1(String(s).trim(),"reserve"));else{let a=f1(e.market||e.marketAddress||u5,"market"),c=(await uf({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 v(`${lf(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...m5(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 df(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 er(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 ra(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:df(e.amount,"amount")}}function pf(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 oa(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 mf(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 h5(e={},t={}){let n=ra(e),r=er(e.slices??10,"slices",2,100),o=er(e.durationSec??3600,"durationSec",r,604800),i=pf(n.total,Array(r).fill(1));return oa(n,"TWAP",mf(i,o,t.nowMs),{durationSec:o})}function y5(e={},t={}){let n=ra(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=er(e.durationSec??3600,"durationSec",r.length,604800),i=pf(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=mf(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return oa(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function g5(e={}){let t=ra(e),n=er(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=df(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 oa(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function b5(e={}){let t=ra(e),n=df(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 oa(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function w5(e={},t={}){let n=ra(e),r=er(e.slices??10,"slices",2,100),o=er(e.durationSec??3600,"durationSec",r,604800),i=er(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=pf(n.total,a);return oa(n,"IS",mf(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function b1(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return h5(e,t);if(n==="VWAP")return y5(e,t);if(n==="POV")return g5(e,t);if(n==="ICEBERG")return b5(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return w5(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function w1(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}X();import{TypedDataEncoder as $5,getAddress as B5,isAddress as M5}from"ethers";var I1=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),yf=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]}),E1=/^(?:0|[1-9][0-9]*)$/;function Vc(e,t){let n=String(e||"").trim();if(!M5(n))throw new Error(`limit-order: ${t} must be an address`);return B5(n)}function gf(e,t){let n=String(e??"").trim();if(!E1.test(n))throw new Error(`limit-order: ${t} must be a canonical integer`);if(n==="0")throw new Error(`limit-order: ${t} must be positive`);return n}function A1(){return{ok:!0,provider:"limit-order",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["evm-order"],note:"capability only \u2014 1inch LOP v4 posts after owner Allow on the loopback signer"}}function F5(e){let t=Number(e),n=I1[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function U5(e){let t=Number(e);if(!I1[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function D5(e={}){let t=Vc(e.maker,"maker"),n=e.receiver?Vc(e.receiver,"receiver"):t,r=Vc(e.makerAsset,"makerAsset"),o=Vc(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=gf(e.makingAmount,"makingAmount"),a=gf(e.takingAmount,"takingAmount"),s=gf(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!E1.test(c))throw new Error("limit-order: makerTraits must be a canonical integer");return Object.freeze({salt:s,maker:t,receiver:n,makerAsset:r,takerAsset:o,makingAmount:i,takingAmount:a,makerTraits:c})}function _1(e={},t={}){let n=Number(e.chainId),r=F5(n),o=D5(e),i={types:yf,domain:r,primaryType:"Order",message:o},a=$5.hash(r,yf,o),s=Number(t.nowMs??Date.now()),c=Number(e.expiresAtMs??s+15*6e4);return Object.freeze({tradeId:`1inch:${n}:${a.slice(2)}`,version:1,surface:"evm-order",action:"order",owner:o.maker,destination:"1inch-lop",chainId:n,expiresAtMs:c,slippageBps:0,fee:{oracleFeeBps:0},artifact:Object.freeze({kind:"1inch-limit",chainId:n,submitTo:U5(n),domain:r,types:yf,message:o,typedData:i,digest:a})})}function P1(e={},t={}){let n=_1(e,t);return N({provider:"limit-order",kind:"typed-data-order",chainId:n.chainId,artifactKind:"TYPED_DATA_ORDER",venue:"1inch-lop-v4",typedData:n.artifact.typedData,digest:n.artifact.digest,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["evm-order"],envelope:n},{nowMs:t.nowMs,env:t.env})}async function T1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(hf(),ff)),r=_1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}X();var H5=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,j5=/^(?:0|[1-9][0-9]*)$/;function bf(e,t){let n=String(e||"").trim();if(!H5.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function z5(e,t){let n=String(e??"").trim();if(!j5.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function C1(){return{ok:!0,provider:"jupiter-dca",exec:!1,execution:"armed-local",signing:"local-signer",broadcasting:"local-signer",armed:!1,signed:!1,broadcast:!1,localSignerSurfaces:["sol"],note:"capability only \u2014 one-shot Jupiter tx submits after owner Allow"}}function N1(e={}){let t=bf(e.owner,"owner"),n=bf(e.inputMint,"inputMint"),r=bf(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=z5(e.inAmount,"inAmount"),i=Number(e.slices??1);if(!Number.isInteger(i)||i<1||i>365)throw new Error("jupiter-dca: slices must be 1-365");let a=Number(e.intervalSeconds??86400);if(!Number.isInteger(a)||a<60||a>720*3600)throw new Error("jupiter-dca: intervalSeconds out of range");let s=(BigInt(o)/BigInt(i)).toString();if(s==="0")throw new Error("jupiter-dca: inAmount too small for slice count");return Object.freeze({kind:i===1?"limit":"dca",owner:t,inputMint:n,outputMint:r,inAmount:o,slices:i,intervalSeconds:a,perSlice:s})}function O1(e={},t={}){let n=N1(e);if(!e.unsignedTx)throw new Error("jupiter-dca: unsignedTx required to arm");if(n.slices!==1)throw new Error("jupiter-dca: armed submit is one-shot (slices=1)");let r=Number(t.nowMs??Date.now()),o=Vo({inputMint:n.inputMint,outputMint:n.outputMint,inAmount:n.inAmount,outAmount:e.outAmount,otherAmountThreshold:e.otherAmountThreshold,slippageBps:e.slippageBps??50},{quotedAtMs:r,ttlMs:e.ttlMs});return Vu({userPublicKey:n.owner,guard:o,swapTransaction:e.unsignedTx,args:{cluster:e.cluster||"mainnet",jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports,tradeId:e.tradeId},response:{prioritizationFeeLamports:0,jupiterProgram:e.jupiterProgram,exactFeeLamports:e.exactFeeLamports}})}function R1(e={},t={}){let n=N1(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=O1(e,t)),N({provider:"jupiter-dca",kind:n.kind==="limit"?"solana-limit":"solana-dca",chain:"solana",artifactKind:"SOLANA_VERSIONED_TX",plan:n,unsignedTx:e.unsignedTx||null,envelope:r,execution:"armed-local",exec:!1,requiresUserSignature:!0,localSignerSurfaces:["sol"],note:r?"sol envelope ready \u2014 queue and Allow to submit":"plan only; attach unsignedTx + outAmount with slices=1 to arm"},{nowMs:t.nowMs,env:t.env})}async function L1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(hf(),ff)),r=O1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}O();var W5="protective-monitors",G5="read-only",K5=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),Y5="https://hermes.pyth.network",J5="https://coins.llama.fi",X5="https://api.llama.fi/hacks",Q5="https://api.gopluslabs.io/api/v1/token_security",Z5="https://api.v3.aave.com/user",eD=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),tD=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),nD=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),$1=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),rD=/^0x[0-9a-fA-F]{40}$/,oD=/^[0-9a-fA-F]{64}$/;function ro(e,t={}){return{ok:!0,provider:W5,op:e,alertOnly:!0,execution:G5,exec:!1,...t}}function He(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function ia(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):v(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function Wc(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function iD(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return oD.test(r)||He("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=Wc(e.symbol),n=eD[t];return n||He("unknown symbol",t),n}function aD(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=Wc(e.symbol);return tD[t]||`coingecko:${t.toLowerCase()}`}function B1(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&He("thresholdBps must be a non-negative number"),n}function sD(e){let t=Array.isArray(e?.parsed)?e.parsed[0]:e?.price?e:null,n=Number(t?.price?.price),r=Number(t?.price?.expo);return(!Number.isFinite(n)||!Number.isFinite(r))&&He("no pyth price returned"),r<0?n/10**-r:n*10**r}function cD(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function lD(e,t={}){let n=String(t.pythBaseUrl||Y5).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function uD(e,t={}){return`${String(t.llamaCoinsBaseUrl||J5).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function M1(e,t){let n=iD(e),r=await ia(lD(n,t),t),o=sD(r);return o>0||He("pyth price must be positive"),{id:n,price:o}}async function F1(e,t){let n=aD(e),r=await ia(uD(n,t),t);return{coin:n,price:cD(r,n)}}function U1(){return ro("health",{ok:!0,ops:[...K5],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function wf(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&He("peg must be a positive number");let r=B1(e,50),o=await M1(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await F1(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return ro("depeg",{symbol:Wc(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function vf(e={},t={}){let n=B1(e,100),r=await M1(e,t),o=await F1(e,t);o.price>0||He("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return ro("oracleDeviation",{symbol:Wc(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function dD(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function pD(e,t){return{id:dD(e,t),name:String(e.name||e.protocol||"unknown"),classification:e.classification?String(e.classification):null,technique:e.technique?String(e.technique):null,amount:Number.isFinite(Number(e.amount))?Number(e.amount):null,chain:Array.isArray(e.chain)?e.chain.map(String):e.chain?[String(e.chain)]:[],source:e.source?String(e.source):null}}function mD(e){return(String(e).match(/<item\b[\s\S]*?<\/item>/gi)||[]).map((n,r)=>{let o=i=>{let a=n.match(new RegExp(`<${i}[^>]*>([\\s\\S]*?)</${i}>`,"i"));return a?a[1].replace(/<!\[CDATA\[|\]\]>/g,"").trim():""};return{id:o("guid")||o("link")||o("title")||`rss-${r}`,name:o("title")||"unknown",classification:"rss",technique:null,amount:null,chain:[],source:o("link")||null}})}function D1(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return mD(t);try{return D1(JSON.parse(t))}catch{He("exploitFeed payload is not JSON or RSS")}}return Array.isArray(e)?e:Array.isArray(e?.hacks)?e.hacks:Array.isArray(e?.items)?e.items:[]}function fD(e){return e.map((t,n)=>({item:t,index:n})).sort((t,n)=>{let r=String(t.item.id).localeCompare(String(n.item.id));return r!==0?r:t.index-n.index}).map(t=>t.item)}async function xf(e={},t={}){let n=String(e.url||t.hacksUrl||X5),r=e.payload??await ia(n,t),o=fD(D1(r).map(pD));return ro("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function hD(e){return e===!0||e===1||e==="1"}function yD(e,t){let n=e?.result&&typeof e.result=="object"?e.result:e,r=String(t).toLowerCase();if(n&&typeof n=="object"){for(let[o,i]of Object.entries(n))if(String(o).toLowerCase()===r&&i&&typeof i=="object")return{address:o,token:i}}return null}async function Sf(e={},t={}){e.asSoleGate===!0&&He("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();rD.test(n)||He("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&He("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||Q5).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await ia(i,t),s=yD(a,n);s||He("goplus returned no result for",n);let c=nD.filter(l=>hD(s.token[l]));return ro("goplus",{chainId:r,address:n.toLowerCase(),role:"second-opinion",secondOpinion:!0,soleGate:!1,neverSoleGate:!0,token:{address:s.address,name:s.token.token_name||null,symbol:s.token.token_symbol||null},findings:c,alert:c.length>0,note:"second opinion only \u2014 never the sole gate"})}function gD(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&He("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function bD(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||He("position healthFactor required");let r=gD(n);return{id:String(e.id||e.protocol||`pos-${t}`),protocol:String(e.protocol||"unknown"),healthFactor:n,collateralUsd:e.collateralUsd!=null?Number(e.collateralUsd):null,debtUsd:e.debtUsd!=null?Number(e.debtUsd):null,rung:r}}async function kf(e={},t={}){let n=null;if(Array.isArray(e.positions))n=e;else if(Array.isArray(e))n={positions:e};else{let a=String(e.user||"").trim();a||He("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${Z5}/${a}`);n=await ia(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(bD),i=o.reduce((a,s)=>a?$1[s.rung]<$1[a]?s.rung:a:s.rung,null);return ro("liquidationLadder",{user:n?.user||e.user||null,chainId:n?.chainId??e.chainId??null,ladder:o,worstRung:i,alert:o.some(a=>a.rung!=="healthy")})}var iW=Object.freeze({depeg:wf,oracleDeviation:vf,exploitFeed:xf,goplus:Sf,liquidationLadder:kf});import{existsSync as vD,readFileSync as xD}from"node:fs";import{dirname as SD,join as q1}from"node:path";import{fileURLToPath as kD}from"node:url";var Gc=Object.freeze({OK:"OK",FAILED:"FAILED"}),ID=Object.freeze({hl:9,dydx:10,binance:8}),H1=Object.freeze(["hl","dydx","binance"]),ED=q1(SD(kD(import.meta.url)),"../../../fixtures/funding-scanner");function j1(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...H1],note:"Public payload/fixture scan. CEX legs never live-call. Missing venue is FAILED, never 0-funding."}}function kt(e){if(e==null||e==="")return null;let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function AD(e){let t=kt(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function _D(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=kt(t[e]);if(n!=null&&n>=0)return n}return kt(ID[e])}function Ef(e){let t=String(e||"").trim().toUpperCase();return t?(t=t.replace(/[-_]/g,""),t.endsWith("USDT")||t.endsWith("USDC")?t.slice(0,-4):t.endsWith("USD")?t.slice(0,-3):t):""}function PD({venue:e,coin:t,hourly:n,feeDragBps:r}){let o=kt(n),i=kt(r);if(!e||!t||o==null||i==null||i<0)throw new Error("funding-scanner: unified row requires venue, coin, hourly, feeDragBps");let a=AD(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:Gc.OK})}function If(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:kt(n),netAnnualizedPct:null,quality:Gc.FAILED,error:String(t||"missing venue")})}function TD(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=Ef(t[o]?.name),a=kt(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function CD(e){let t=e?.markets,n=Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[],r=[];for(let o of n){let i=Ef(o?.ticker||o?.market||o?.symbol),a=kt(o?.nextFundingRate??o?.fundingRate);!i||a==null||o?.status&&String(o.status).toUpperCase()!=="ACTIVE"||r.push({venue:"dydx",coin:i,hourly:a})}return r}function ND(e){if(Array.isArray(e))return{intervalHours:null,entries:e};if(e&&typeof e=="object"){let t=Array.isArray(e.premiumIndex)?e.premiumIndex:Array.isArray(e.data)?e.data:[];return{intervalHours:kt(e.fundingIntervalHours),entries:t}}return{intervalHours:null,entries:[]}}function OD(e){let{intervalHours:t,entries:n}=ND(e),r=[];for(let o of n){let i=Ef(o?.symbol||o?.pair),a=kt(o?.fundingIntervalHours)??t,s=kt(o?.lastFundingRate??o?.lastFundingRatePeriod??o?.fundingRate);!i||s==null||!(a>0)||r.push({venue:"binance",coin:i,hourly:s/a})}return r}var RD=Object.freeze({hl:TD,dydx:CD,binance:OD});function LD(e,t){let n=q1(e,`${t}.json`);if(!vD(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(xD(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function $D(e,t,n){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];return r==null?{missing:!0,error:`missing venue payload: ${e}`}:{payload:r}}return LD(n,e)}function BD(e,t){let n=RD[e];if(!n)return{error:`no public parser for venue ${e}`};try{return{parsed:n(t)}}catch(r){return{error:String(r.message||r)}}}function MD(e,t){let n=e.quality===Gc.FAILED||e.netAnnualizedPct==null,r=t.quality===Gc.FAILED||t.netAnnualizedPct==null;if(n!==r)return n?1:-1;if(!n&&e.netAnnualizedPct!==t.netAnnualizedPct)return t.netAnnualizedPct-e.netAnnualizedPct;let o=String(e.venue).localeCompare(String(t.venue));return o||String(e.coin||"").localeCompare(String(t.coin||""))}function z1(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:H1).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||ED,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=_D(s,i),l=$D(s,r,o);if(l.missing){a.push(If(s,l.error,c));continue}let u=BD(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(If(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(PD({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(If(s,p.message,c))}}return a.sort(MD),Object.freeze({ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",live:!1,rankedOn:"net-after-fees",count:a.length,rows:Object.freeze(a)})}X();Uo();O();var UD="https://indexer.dydx.trade";function aa(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function DD(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function V1(e=50,t={}){try{let n=await v(`${UD}/v4/perpetualMarkets?limit=${e}`,t);return DD(n).map(o=>{let i=aa(o?.nextFundingRate),a=aa(o?.oraclePrice),s=aa(o?.openInterest),c=aa(o?.volume24H),l=aa(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:a,oraclePx:a,fundingRate:i,fundingRateAprPct:i==null?null:i*24*365*100,openInterest:s,dayNtlVolumeUsd:c,change24hPct:a&&l!=null?l/a*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:i==null?null:`${(i*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(n){return{error:String(n.message||n).slice(0,200),venue:"dydx",quality:"FAILED"}}}O();var qD="https://dlob.drift.trade",W1="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified.";async function G1(e={}){try{let n=(await v(`${qD}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:W1,venue:"drift",quality:"FAILED"}:n.map(r=>({symbol:r?.symbol||r?.marketIndex,coin:r?.symbol,oraclePrice:r?.amm?.oraclePrice,markPrice:r?.amm?.markPrice,fundingRate:r?.amm?.lastFundingRate?`${(Number(r.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:r?.amm?.longFunding,short:r?.amm?.shortFunding},volume24h:r?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${W1} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}O();var HD="https://gateway.prod.vertexprotocol.com/v2",K1="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function Y1(e={}){try{let n=(await v(`${HD}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(n)||n.length===0?{error:K1,venue:"vertex",quality:"FAILED"}:n.map(r=>({market:r?.market,type:r?.type,oraclePrice:r?.oracle_price_x18?(Number(BigInt(r.oracle_price_x18))/1e18).toFixed(4):null,minSize:r?.min_size,productId:r?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${K1} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}O();var jD="https://api.aevo.xyz";async function J1(e={}){try{return(await v(`${jD}/markets`,e)||[]).map(n=>({instrument:n?.instrument_name,type:n?.instrument_type,markPrice:n?.mark_price,indexPrice:n?.index_price,fundingRate:n?.funding_rate?`${(Number(n.funding_rate)*100).toFixed(4)}%`:null,openInterest:n?.open_interest,volume24h:n?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}var X1=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function Q1(){return{ok:!0,provider:"perp-universal",execution:"prepare-only",exec:!1,signed:!1,broadcast:!1,venues:[...X1],note:"fundingAll ranks LIVE rows by |APR|. FAILED venues stay in failed[]. prepareOrder is unsigned."}}function Kc(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function xn(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function sa({venue:e,coin:t,markPx:n,fundingRateAprPct:r,dayNtlVolumeUsd:o,extra:i={}}){let a=String(t||"").replace(/[-_]/g,"").replace(/USDT$|USDC$|USD$/,"");return Object.freeze({venue:e,coin:a,markPx:Kc(n),fundingRateAprPct:Kc(r),dayNtlVolumeUsd:Kc(o),quality:"LIVE",...i})}async function zD(e,t){try{let n=await t();return n&&n.quality==="FAILED"?xn(e,n.error||"FAILED"):n}catch(n){return xn(e,n.message||n)}}async function VD(e={}){return{venue:"hl",quality:"LIVE",markets:((await Pr({},e)).markets||[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>sa({venue:"hl",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd,extra:{openInterestUsd:r.openInterestUsd??null,change24hPct:r.change24hPct??null}}))}}async function WD(e={}){let t=await V1(50,e);return t?.quality==="FAILED"||t?.error?xn("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>sa({venue:"dydx",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd}))}}async function GD(e={}){let t=await dn({chainId:42161},e);return!Array.isArray(t)||t.length===0?xn("gmx","gmx tickers empty or not an array"):{venue:"gmx",quality:"LIVE",markets:t.map(r=>{let o=r.tokenSymbol||r.symbol||r.tokenAddress||"",i=Kc(r.fundingRate??r.funding??r.borrowingRateLong);return sa({venue:"gmx",coin:o,markPx:r.maxPrice??r.minPrice??r.price,fundingRateAprPct:i==null?null:Math.abs(i)<1?i*24*365*100:i,dayNtlVolumeUsd:null,extra:{quality:i==null?"PARTIAL":"LIVE",note:i==null?"price live; funding not on ticker":void 0}})}).filter(r=>r.coin)}}async function KD(e={}){let t=await G1(e);return t?.quality==="FAILED"||t?.error?xn("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function YD(e={}){let t=await Y1(e);return t?.quality==="FAILED"||t?.error?xn("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function JD(e={}){let t=await ly(e);return t?.error?xn("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(r=>sa({venue:"lighter",coin:r.coin||r.symbol,markPx:r.markPx,fundingRateAprPct:r.fundingAprPct,dayNtlVolumeUsd:null,extra:{marketIndex:r.marketIndex??null}})).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}async function XD(e={}){let t=await J1(e);return t?.error?xn("aevo",t.error):{venue:"aevo",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>String(r.type||"").toLowerCase()==="perpetual"&&r.instrument).map(r=>{let o=String(r.instrument).split("-")[0],i=r.fundingRate==null?null:Number(String(r.fundingRate).replace("%",""));return sa({venue:"aevo",coin:o,markPx:r.markPrice,fundingRateAprPct:Number.isFinite(i)?i*24*365:null,dayNtlVolumeUsd:r.volume24h})}).filter(r=>r.coin&&r.fundingRateAprPct!=null)}}var Af={hl:VD,lighter:JD,gmx:GD,dydx:WD,aevo:XD,drift:KD,vertex:YD};async function Z1(e={},t={}){let n=Array.isArray(e.venues)&&e.venues.length?e.venues.map(l=>String(l).toLowerCase()).filter(l=>Af[l]):[...X1],r=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),i=t.readers||Af,a=await Promise.all(n.map(l=>zD(l,()=>(i[l]||Af[l])(t)))),s=a.filter(l=>l.quality==="FAILED"),c=a.filter(l=>l.quality!=="FAILED").flatMap(l=>l.markets||[]).filter(l=>l.fundingRateAprPct!=null);return r&&(c=c.filter(l=>l.coin===r)),c.sort((l,u)=>Math.abs(u.fundingRateAprPct)-Math.abs(l.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:c.slice(0,o),failed:s,venuesTried:n,sourcesAnswered:a.filter(l=>l.quality!=="FAILED").length,sourcesTried:n.length,custody:"prepare-only"})}async function e_(e={},t={}){let n=String(e.venue||"hl").toLowerCase(),r=String(e.coin||e.symbol||"").toUpperCase(),o=String(e.side||"").toLowerCase(),i=o==="long"||o==="buy"?"buy":o==="short"||o==="sell"?"sell":null;if(!r)return{ok:!1,failureKind:"missing-coin",venue:n,unsigned:!0,broadcast:!1};if(!i)return{ok:!1,failureKind:"missing-side",venue:n,coin:r,unsigned:!0,broadcast:!1,note:"side must be long|short|buy|sell"};if(n==="dydx"||n==="drift"||n==="vertex")return{ok:!1,failureKind:"read-only-venue",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:`${n} is read-only until a grant-bound decoder exists. Use venue=hl for an unsigned ticket.`};if(n==="gmx"){if(!e.account&&!e.recipient)return{ok:!1,failureKind:"missing-account",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"gmx prepare needs account"};let c=await Ds({...e,coin:r,side:i},t);return N({ok:!0,venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,artifact:c},{provider:"perp-universal",kind:"perp-order"})}if(n!=="hl")return{ok:!1,failureKind:"unknown-venue",venue:n,coin:r,unsigned:!0,broadcast:!1};let a=e.size??e.sz;if(a==null||Number(a)<=0)return{ok:!1,failureKind:"missing-size",venue:n,coin:r,side:i,unsigned:!0,broadcast:!1,note:"HL prepare needs a positive size (coin units). Reply: arm long|short COIN <size>"};let s=await tn({coin:r,side:i,size:String(a),type:e.type||"market",maxSlippageBps:e.maxSlippageBps??50,reduceOnly:e.reduceOnly===!0},t);return N({ok:!0,venue:"hl",coin:r,side:i,unsigned:!0,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,artifact:s,note:"Unsigned. Allow/Deny still required. Nothing broadcast."},{provider:"perp-universal",kind:"perp-order"})}var ZD=Math.sqrt(2*Math.PI);function Yc(e){return Math.exp(-.5*e*e)/ZD}function eq(e){let t=.254829592,n=-.284496736,r=1.421413741,o=-1.453152027,i=1.061405429,a=.3275911,s=e<0?-1:1,c=1/(1+a*Math.abs(e)),l=1-((((i*c+o)*c+r)*c+n)*c+t)*c*Math.exp(-e*e);return s*l}function Sn(e){return .5*(1+eq(e/Math.SQRT2))}function t_({spot:e,strike:t,rate:n=0,vol:r,years:o,kind:i="call"}){let a=Number(e),s=Number(t),c=Number(n),l=Number(r),u=Number(o);if(!(a>0)||!(s>0)||!(l>0)||!(u>0))throw new Error("greeks: spot, strike, vol, years must be > 0");let d=Math.sqrt(u),p=(Math.log(a/s)+(c+.5*l*l)*u)/(l*d),m=p-l*d,f=Math.exp(-c*u),h=a*Sn(p)-s*f*Sn(m),y=s*f*Sn(-m)-a*Sn(-p),w=i==="put"?y:h,x=i==="put"?Sn(p)-1:Sn(p),g=Yc(p)/(a*l*d),b=a*Yc(p)*d/100,S=i==="put"?(-(a*Yc(p)*l)/(2*d)+c*s*f*Sn(-m))/365:(-(a*Yc(p)*l)/(2*d)-c*s*f*Sn(m))/365;return Object.freeze({kind:i,price:w,delta:x,gamma:g,vega:b,theta:S,d1:p,d2:m})}var PW=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function Jc(){return{ok:!0,provider:"onchain-options",exec:!1,execution:"read-only",note:"Ranks listed options with local Black-Scholes. No arm until official Derive/Lyra domain is pinned."}}function Xc(e=[],{spot:t,rate:n=0,nowMs:r=Date.now()}={}){if(!(Number(t)>0))throw new Error("onchain-options: spot required");let o=[];for(let i of Array.isArray(e)?e:[]){let a=Number(i.strike),s=Number(i.expiryMs),c=Number(i.mark),l=i.kind==="put"?"put":"call";if(!(a>0)||!(s>r)||!(c>0))continue;let u=(s-r)/(365.25*24*3600*1e3),d=Number(i.iv);d>0||(d=.5);let p=t_({spot:t,strike:a,rate:n,vol:d,years:u,kind:l});o.push(Object.freeze({venue:String(i.venue||"unknown"),instrument:String(i.instrument||`${l}-${a}`),kind:l,strike:a,expiryMs:s,mark:c,model:p.price,edgeBps:Math.round((p.price-c)/c*1e4),delta:p.delta,gamma:p.gamma,vega:p.vega}))}return o.sort((i,a)=>a.edgeBps-i.edgeBps),Object.freeze({ok:!0,execution:"read-only",exec:!1,spot:Number(t),count:o.length,rows:Object.freeze(o)})}function n_(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function ca(e){return String(e||"").trim().toLowerCase()}function nq(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function r_({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=ca(d.from),m=ca(d.to),f=Number(d.amount);!(f>0)||!p||!m||(r.set(p,(r.get(p)||0)-f),r.set(m,(r.get(m)||0)+f))}let o=[...r.entries()].filter(([,d])=>d>0).sort((d,p)=>p[1]-d[1]),i=Number(n)>0?Number(n):o.reduce((d,[,p])=>d+p,0),a=i>0?o.map(([,d])=>d/i):[],s=nq(a),c=new Map;for(let d of t){let p=ca(d.funder),m=ca(d.wallet);!p||!m||(c.has(p)||c.set(p,new Set),c.get(p).add(m))}let l=[...c.entries()].map(([d,p])=>({funder:d,size:p.size,wallets:[...p].sort()})).filter(d=>d.size>=2).sort((d,p)=>p.size-d.size),u=t[0]?ca(t[0].funder):null;return Object.freeze({ok:!0,execution:"read-only",exec:!1,holderCount:o.length,topShare:a[0]??0,hhi:s,concentrated:s>=.15,clusterCount:l.length,largestCluster:l[0]?.size??0,firstFunder:u,clusters:Object.freeze(l.slice(0,20))})}function o_(){return{ok:!0,provider:"kalshi",exec:!1,execution:"read-only",restricted:!0,note:"Read-only market catalog. Trading may be US-restricted. Prepare refused."}}function i_(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.ticker||r.id||"").trim(),i=Number(r.yes_bid??r.yesPrice??r.last_price);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"kalshi",ticker:o,title:String(r.title||r.subtitle||o),yes:i,no:Number.isFinite(Number(r.no_bid??r.noPrice))?Number(r.no_bid??r.noPrice):1-i,closeTime:r.close_time||r.closeTime||null}))}return n.sort((r,o)=>r.ticker.localeCompare(o.ticker)),Object.freeze({ok:!0,execution:"read-only",exec:!1,restricted:!0,count:n.length,markets:Object.freeze(n)})}function a_(){return{...Jc(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function s_(e,t){return Xc(e,t)}function c_(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function l_(e={}){let t=Array.isArray(e.markets)?e.markets:Array.isArray(e)?e:[],n=[];for(let r of t){let o=String(r.id||r.slug||"").trim(),i=Number(r.yes??r.yesPrice??r.last);!o||!(i>=0)||!(i<=1)||n.push(Object.freeze({venue:"limitless",id:o,title:String(r.title||o),yes:i,closeTime:r.closeTime||r.close_time||null}))}return Object.freeze({ok:!0,execution:"read-only",exec:!1,count:n.length,markets:Object.freeze(n)})}var sq=Object.freeze([]);function u_(){return{ok:!0,provider:"dov-vaults",exec:!1,execution:"read-only",registry:0,note:"No reviewed vault code-hash is pinned. Reads refuse unknown vaults."}}function d_(e={}){let t=String(e.address||"").toLowerCase(),n=sq.find(r=>r.address===t);if(!n)throw new Error("dov-vaults: unknown vault \u2014 registry empty until code-hash is pinned");return Object.freeze({ok:!0,execution:"read-only",exec:!1,vault:n})}function p_(e={},t={}){let n=[];String(e.resolutionSource||"")!==String(t.resolutionSource||"")&&n.push("resolution-source"),String(e.outcomeYes||"")!==String(t.outcomeYes||"")&&n.push("outcome-semantics"),String(e.denomination||"")!==String(t.denomination||"")&&n.push("denomination"),String(e.voidRule||"")!==String(t.voidRule||"")&&n.push("void-rule");let r=Number(e.closeMs),o=Number(t.closeMs);return(!(r>0)||!(o>0)||Math.abs(r-o)>6*3600*1e3)&&n.push("close-window"),Object.freeze({ok:n.length===0,matched:n.length===0,reasons:Object.freeze(n),execution:"read-only",exec:!1,note:n.length?"not comparable":"windows and resolution match"})}function m_(){return{ok:!0,provider:"tee-attestation",exec:!1,execution:"read-only",hardware:"unavailable",status:"unavailable",note:"Schema+stub only. No vendor trust root is installed."}}function f_(e={}){if(!e||typeof e!="object")return Object.freeze({ok:!1,status:"unverified",reason:"missing-report"});if(e.synthetic===!0)return Object.freeze({ok:!1,status:"unverified",reason:"synthetic-report"});let t=["verifierType","instancePublicKey","measurement","issuedAtMs","expiresAtMs"];for(let n of t)if(!e[n])return Object.freeze({ok:!1,status:"unverified",reason:`missing-${n}`});return Number(e.expiresAtMs)<=Number(e.nowMs||Date.now())?Object.freeze({ok:!1,status:"unverified",reason:"expired"}):Object.freeze({ok:!1,status:"unavailable",reason:"no-verified-trust-root",hardware:"unavailable"})}function lq(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function h_(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:lq(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var uq=/^0x[0-9a-fA-F]{8}$/,y_=/^0x[0-9a-fA-F]{40}$/;function g_(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!y_.test(n))throw new Error("erc7715: account required");let r=Array.isArray(e.targets)?e.targets:[],o=Array.isArray(e.selectors)?e.selectors:[];if(r.length===0)throw new Error("erc7715: targets required");if(o.length===0)throw new Error("erc7715: selectors required");if(r.includes("*")||o.includes("*"))throw new Error("erc7715: wildcards refused");for(let c of r)if(!y_.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!uq.test(c))throw new Error("erc7715: selector must be 4 bytes");let i=String(e.perCallCap??""),a=String(e.aggregateCap??"");if(!/^[1-9][0-9]*$/.test(i)||!/^[1-9][0-9]*$/.test(a))throw new Error("erc7715: caps required");let s=Number(e.expiresAtMs);if(!Number.isSafeInteger(s)||s<=Date.now())throw new Error("erc7715: expiry required");return Object.freeze({kind:"erc7715-v1",chainId:t,account:n,targets:Object.freeze(r.map(c=>c.toLowerCase())),selectors:Object.freeze(o.map(c=>c.toLowerCase())),perCallCap:i,aggregateCap:a,expiresAtMs:s,execution:"read-only",exec:!1,note:"Normalized only. aa surface allowlist is empty \u2014 cannot arm."})}var _f=/^0x[0-9a-fA-F]{40}$/;function b_(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7710: chainId required");let n=String(e.delegator||""),r=String(e.delegate||"");if(!_f.test(n)||!_f.test(r))throw new Error("erc7710: parties required");if(!e.revocation)throw new Error("erc7710: revocation route required");let o=Number(e.expiresAtMs);if(!Number.isSafeInteger(o)||o<=Date.now())throw new Error("erc7710: expiry required");if(!e.target||!_f.test(String(e.target)))throw new Error("erc7710: target required");return Object.freeze({kind:"erc7710-v1",chainId:t,delegator:n.toLowerCase(),delegate:r.toLowerCase(),target:String(e.target).toLowerCase(),expiresAtMs:o,revocation:String(e.revocation),execution:"read-only",exec:!1,note:"Inspected only. aa surface allowlist is empty \u2014 cannot arm."})}var I_=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 S_(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Jp,adapters:Object.freeze(Xp.adapters.map(e=>{let t=I_[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function Aq(e,t={}){let n=sk(e,t),r=I_[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new se(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var Pf=new Map;function Zc(e={}){let t=e.filePath||void 0,n=t||"__default__";return Pf.has(n)||Pf.set(n,Ob(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Pf.get(n)}var Tf=new Map;function Cf(e={}){let t=e.filePath||void 0,n=t||"__default__";return Tf.has(n)||Tf.set(n,Mb(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Tf.get(n)}var Nf=new Map;function la(e={}){let t=e.filePath||void 0,n=t||"__default__";return Nf.has(n)||Nf.set(n,Pb(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Nf.get(n)}var _q={"hl-info":{health:e=>f0(e),allMids:e=>ht(e),l2Book:(e,t={})=>ar(t.coin,e),outcomeMeta:e=>To(e),clearinghouse:(e,t={})=>La(t.user,e),userFills:(e,t={})=>h0(t.user,e),meta:e=>y0(e),metaAndAssetCtxs:e=>Ve(e),candleSnapshot:(e,t={})=>$a(t,e),openOrders:(e,t={})=>b0(t.user,e),frontendOpenOrders:(e,t={})=>w0(t.user,e),userState:(e,t={})=>sr(t.user,e),spotMeta:e=>Ba(e)},"hl-vaults":{health:e=>S0(e),summaries:(e,t={})=>Kl(t,e),details:(e,t={})=>Ma(t,e),userEquities:(e,t={})=>Yl(t,e),tracker:(e,t={})=>Jl(t,e)},"hl-precompiles":{health:e=>I0(e),read:(e,t={})=>k0(t,e),l1BlockNumber:e=>Fa(e),markPx:(e,t={})=>Zl(t,e),oraclePx:(e,t={})=>eu(t,e),spotPx:(e,t={})=>tu(t,e),position:(e,t={})=>nu(t,e),spotBalance:(e,t={})=>ru(t,e),vaultEquity:(e,t={})=>ou(t,e),withdrawable:(e,t={})=>iu(t,e)},"hl-delta-neutral":{health:()=>W0(),scan:(e,t={})=>Iu(t,e),quote:(e,t={})=>Eu(t,e),prepare:(e,t={})=>Au(t,e),loop:(e,t={})=>Z0(t,e)},"lighter-delta-neutral":{health:()=>ay(),scan:(e,t={})=>Cu(t,e),quote:(e,t={})=>Nu(t,e),prepare:(e,t={})=>Ou(t,e),loop:(e,t={})=>my(t,e)},"poly-public":{health:e=>hy(e),time:e=>Ru(e),markets:(e,t={})=>yy(t,e),book:(e,t={})=>gy(t.tokenId,e),midpoint:(e,t={})=>by(t.tokenId,e),spread:(e,t={})=>wy(t.tokenId,e),price:(e,t={})=>vy(t.tokenId,{side:t.side},e),events:(e,t={})=>xy(t,e)},"evm-rpc":{health:(e,t={})=>tr(t.chainId??1,e),healthAll:(e,t={})=>fl({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>lo(t.chainId??1,e),chainId:(e,t={})=>pl(t.chainId??1,e),getBalance:(e,t={})=>An(t.chainId??1,t.address,e),call:(e,t={})=>U(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>ml(t,e),erc20Balance:(e,t={})=>uo(t,e),transactionReceipt:(e,t={})=>po(t,e)},portfolio:{health:e=>tS(e),balances:(e,t={})=>sc(t,e),snapshot:(e,t={})=>vS(t,e),history:(e,t={})=>Lp(t,e),valueGraph:(e,t={})=>xS(t,e)},"nft-portfolio":{health:e=>cS(e),inventory:(e,t={})=>Br(t,e),gallery:(e,t={})=>pS(t,e),pnl:(e,t={})=>dS(t,e),prepareList:(e,t={})=>lS(t,e),traitSnipe:(e,t={})=>uS(t,e)},"contract-risk":{health:e=>SS(e),scan:(e,t={})=>Gn(t,e)},"evm-token-sniper":{health:e=>ES(e),scan:(e,t={})=>IS(t,e)},"evm-simulate":{health:e=>_S(e),simulate:(e,t={})=>Hi(t,e)},"nft-mint":{health:e=>TS(e),discover:(e,t={})=>mc(t,e),prepare:(e,t={})=>Mp(t,e),priceGas:(e,t={})=>pc(t,e),createTrigger:(e,t={})=>_k(t,e),checkOpen:(e,t={})=>Pk(t,e),evaluateMancerOs:(e,t={})=>Nk(t,e)},"universal-mint-router":{health:()=>ek(),capabilities:()=>Kp(),prepare:(e,t={})=>tk(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:S_()}),capabilities:()=>S_(),route:(e,t={})=>Aq(t,e)},"erc8004-identity":{health:()=>Aw(),prepareIdentityRegistration:(e,t={})=>Tw(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Cw(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Ow(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:bc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>uk(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:wc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>hk(t,e)},"universal-ordinals-transfer":{health:()=>({provider:vc,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Ak(t,e)},"solana-rpc":{health:e=>ky(e),latestBlockhash:(e,t={})=>$u(t,e),getBalance:(e,t={})=>Ya(t,e),tokenAccounts:(e,t={})=>jo(t,e),simulate:(e,t={})=>Iy(t,e)},"bitcoin-esplora":{health:e=>Ey(e),tipHeight:e=>Ay(e),fees:e=>_y(e),address:(e,t={})=>Xa(t,e),utxos:(e,t={})=>Py(t,e),tx:(e,t={})=>Ty(t,e),decode:(e,t={})=>Cy(t,e)},"bitcoin-meta":{health:e=>Oy(e),runeBalances:(e,t={})=>Za(t,e),inscriptions:(e,t={})=>mr(t,e),inscriptionInfo:(e,t={})=>Ry(t,e),inscriptionChildren:(e,t={})=>Ly(t,e),ordBlockInfo:(e,t={})=>$y(t,e)},satflow:{health:e=>My(e),collectionFloors:(e,t={})=>Fy(t,e),collectionStats:(e,t={})=>Uy(t,e),item:(e,t={})=>Dy(t,e),walletContents:(e,t={})=>ts(t,e),floorListings:(e,t={})=>qy(t,e),preparePurchase:(e,t={})=>jy(t,e),prepareList:(e,t={})=>ns(t,e)},jupiter:{health:e=>Xy(e),venues:(e,t={})=>Jy(t,e),quote:(e,t={})=>is(t,e),prepare:(e,t={})=>Qy(t,e)},defillama:{health:e=>eg(e),prices:(e,t={})=>Ft(t.coins||[],e),pricesBySymbol:(e,t={})=>og(t.symbols,e),protocols:e=>tg(e),yields:(e,t={})=>ng(t,e),stablecoins:(e,t={})=>as(t,e),dexVolumes:(e,t={})=>rg(t,e)},lifi:{health:e=>ag(e),quote:(e,t={})=>Wo(t,e),prepare:(e,t={})=>sg(t,e),chains:e=>cg(e)},dexscreener:{health:e=>th(e),token:(e,t={})=>Ot(t.address||t.tokenAddress,e),search:(e,t={})=>mo(t.q||t.query,e),pair:(e,t={})=>nh(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>bh({...e,chainId:t.chainId??8453}),quote:(e,t={})=>nr(t,e),prepare:(e,t={})=>gh(t,e),quotePath:(e,t={})=>yh(t,e),ethUsdc:(e,t={})=>Il(t,e),chains:()=>wh()},"uniswap-v4":{health:(e,t={})=>Ph({...e,chainId:t.chainId??8453}),quote:(e,t={})=>vo(t,e),inspectHook:(e,t={})=>kh(t,e),prepare:(e,t={})=>Ah(t,e),chains:()=>_h()},x402:{health:()=>Vg(),inspect:(e,t={})=>jg(t),prepare:(e,t={})=>zg(t,e)},bankr:{health:e=>Xg(e),wallet:e=>ld(e),portfolio:e=>Yg(e),swapQuote:(e,t={})=>Jg(t,e)},aerodrome:{health:(e,t={})=>yg({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ss(t,e),prepare:(e,t={})=>hg(t,e),chains:()=>gg()},zerox:{health:e=>xg(e),price:(e,t={})=>Yu(t,e),quote:(e,t={})=>Ko(t,e),prepare:(e,t={})=>Sg(t,e)},across:{health:e=>kg(e),suggestedFees:(e,t={})=>Ju(t,e)},hop:{health:e=>Ig(e),quote:(e,t={})=>Xu(t,e)},relay:{health:e=>Eg(e),quote:(e,t={})=>ls(t,e),prepare:(e,t={})=>Ag(t,e)},cowswap:{health:e=>Ng(e),quote:(e,t={})=>fr(t,e),prepareOrder:(e,t={})=>Og(t,e),order:(e,t={})=>Lg(t,e),status:(e,t={})=>Rg(t,e),chains:()=>$g()},oneinch:{health:e=>Mg(e),quote:(e,t={})=>id(t,e),prepare:(e,t={})=>Fg(t,e),approveSpender:(e,t={})=>ad(t,e)},"hl-ws":{health:e=>Qg(e),allMids:e=>Zg(e),l2Book:(e,t={})=>eb(t.coin,e),snapshot:(e,t={})=>Zo(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>tb({...e,assetId:t.assetId}),book:(e,t={})=>nb(t.assetId||t.tokenId,e),snapshot:(e,t={})=>us(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>qh(e),collection:(e,t={})=>ko(t.slug,e),floor:(e,t={})=>Hh(t.slug,e),bestListings:(e,t={})=>Ll(t,e),bestListing:(e,t={})=>Aa(t,e),bestOffer:(e,t={})=>_a(t,e),accountNfts:(e,t={})=>Io(t,e),accountPnl:(e,t={})=>Ia(t,e),prepareBuy:(e,t={})=>e0(t,e),prepareSweep:(e,t={})=>t0(t,e),prepareMint:(e,t={})=>Ta(t,e),prepareList:(e,t={})=>Ca(t,e),prepareCancel:(e,t={})=>n0(t,e)},"local-marketplace":{health:()=>({provider:"local-marketplace",status:"ok",armed:!0,execution:"armed-local",existingMarketplacesUnchanged:!0,refusesSignHash:!0,signed:!1,broadcast:!1}),createListing:(e,t={})=>la(e).createListing(t),listListings:(e,t={})=>la(e).listListings(t),cancelListing:(e,t={})=>la(e).cancelListing(t),createOffer:(e,t={})=>la(e).createOffer(t),armFill:(e,t={})=>la(e).armFill(t)},"local-x402":{health:()=>({provider:"local-x402",status:"ok",armed:!0,execution:"armed-local",telegram:!1,refusesSignHash:!0,signed:!1,broadcast:!1}),createIntent:(e,t={})=>Zc(e).createIntent(t),listIntents:(e,t={})=>Zc(e).listIntents(t),cancelIntent:(e,t={})=>Zc(e).cancelIntent(t),armPayment:(e,t={})=>Zc(e).armPayment(t)},"local-pack-registry":{health:()=>({provider:"local-pack-registry",status:"ok",pluginExecution:!1,loaded:!1,telegram:!1,execution:"read-only"}),registerPack:(e,t={})=>Cf(e).registerPack(t),listPacks:(e,t={})=>Cf(e).listPacks(t),revokePack:(e,t={})=>Cf(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>xw(t,e),markets:(e,t={})=>vr(t,e),quoteSpecificBuy:(e,t={})=>bi(t,e),quoteSell:(e,t={})=>Cs(t,e),scanCollection:(e,t={})=>Ns(t,e),scanAllMarkets:(e,t={})=>mw(t,e),scanCrossVenueArb:(e,t={})=>$d(t,e),scanAllMarketsArb:(e,t={})=>fw(t,e),prepareSpecificBuy:(e,t={})=>aw(t,e),prepareSell:(e,t={})=>sw(t,e)},stonkbrokers:{health:(e,t={})=>Sw(t,e),quoteBrokerBuy:(e,t={})=>Os(t,e),scanBrokerLoot:(e,t={})=>gw(t,e),prepareBrokerBuy:(e,t={})=>bw(t,e),brokerDesk:(e,t={})=>vw(t,e),clockInStatus:(e,t={})=>wi(t,e),prepareClockIn:(e,t={})=>ww(t,e)},"hl-outcome":{list:e=>kv(e),prepareOrder:(e,t={})=>Iv(t,e),prepareCancel:(e,t={})=>Ev(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Js().map(e=>e.id),nativeTemplates:Li().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Js(),listNative:()=>Li(),gate:(e,t={})=>Oi(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Xv(t,e),buildNative:(e,t={})=>$i(t),eval:async()=>(await Promise.resolve().then(()=>(x_(),v_))).runContractsEval()},"poly-clob":{health:()=>Uv(),prepareOrder:(e,t={})=>Dv(t||{},e)},"hl-perps":{health:e=>Jd(e),assetInfo:(e,t={})=>en(t,e),prepareOrder:(e,t={})=>tn(t,e),prepareCancel:(e,t={})=>Fo(t,e),prepareLeverage:(e,t={})=>vu(t,e),prepareIsolatedMargin:(e,t={})=>xu(t,e),prepareBracket:(e,t={})=>Su(t,e),prepareBuilderApproval:(e,t={})=>wu(t,e)},"hl-markets":{health:e=>Jd(e),markets:(e,t={})=>Pr(t,e),leaderboards:(e,t={})=>Qw(t,e),coin:(e,t={})=>Zw(t,e),spot:(e,t={})=>ev(t,e)},"hl-entry-state":{health:e=>wv(e),see:(e,t={})=>_i(t,e),qualify:(e,t={})=>vv(t,e),lock:(e,t={})=>xv(t,e),list:e=>Zd(e),watch:(e,t={})=>Sv(t,e)},"magiceden-sol":{health:e=>Fw(e),stats:(e,t={})=>Hd(t,e),listings:(e,t={})=>Dw(t,e),tokenListings:(e,t={})=>qw(t,e),prepareBuy:(e,t={})=>Hw(t,e),prepareList:(e,t={})=>Bs(t,e),prepareMint:(e,t={})=>jw(t,e)},"hl-staking":{health:e=>Vw(e),validators:e=>Vd(e),delegatorSummary:(e,t={})=>Wd(t,e),delegations:(e,t={})=>Gd(t,e),rewards:(e,t={})=>Ww(t,e),history:(e,t={})=>Gw(t,e),preflight:(e,t={})=>Xw(t,e),prepareStakeDeposit:(e,t={})=>Kw(t,e),prepareStakeWithdraw:(e,t={})=>Yw(t,e),prepareDelegate:(e,t={})=>Jw(t,e)},"hyperevm-dex":{health:e=>Lw(e),search:(e,t={})=>$w(t.q||t.query||"HYPE",e),token:(e,t={})=>Bw(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>cx(e),networks:(e,t={})=>up(t,e),pool:(e,t={})=>ix(t,e),token:(e,t={})=>ax(t,e),ohlcv:(e,t={})=>sx(t,e)},curve:{health:e=>xx(e),openapi:e=>vx(e),pools:(e,t={})=>pp(t,e),quote:(e,t={})=>mp(t,e),prepare:(e,t={})=>Sx(t,e)},gmx:{health:e=>dv(e),tickers:(e,t={})=>dn(t,e),markets:(e,t={})=>lv(t,e),marketsInfo:(e,t={})=>Qd(t,e),tokens:(e,t={})=>uv(t,e),prepareOrder:(e,t={})=>Ds(t,e),positions:(e,t={})=>pv(t,e),orderStatus:(e,t={})=>mv(t,e),verifyOrder:(e,t={})=>fv(t,e)},morpho:{health:e=>Ax(e),markets:(e,t={})=>Ex(t,e),vaults:(e,t={})=>yp(t,e),prepareVault:(e,t={})=>_x(t,e)},balancer:{health:e=>$x(e),pools:(e,t={})=>Lx(t,e),quote:(e,t={})=>wp(t,e),prepare:(e,t={})=>Bx(t,e)},pendle:{health:e=>Fx(e),markets:(e,t={})=>xp(t,e),quote:(e,t={})=>Ux(t,e),prepare:(e,t={})=>Sp(t,e)},odos:{health:e=>jx(e),chains:e=>Ip(e),quote:(e,t={})=>qx(t,e),prepare:(e,t={})=>Hx(t,e)},blockscout:{health:e=>Xx(e),stats:(e,t={})=>_p(t,e),address:(e,t={})=>Gx(t,e),token:(e,t={})=>Kx(t,e)},paraswap:{health:e=>Rk(e),tokens:(e,t={})=>tm(t,e),price:(e,t={})=>Wr(t,e),quote:(e,t={})=>Wr(t,e),prepare:(e,t={})=>Ok(t,e)},rfq:{health:e=>Gk(e),intent:(e,t={})=>Vk(t,e),quote:(e,t={})=>Wk(t,e)},"polygon-staking":{health:e=>xI(e),validators:(e,t={})=>wI(t,e),validatorDetail:(e,t={})=>vI(t,e)},"aave-v3":{health:e=>EI(e),markets:(e,t={})=>SI(t,e),marketReserves:(e,t={})=>kI(t,e),chains:e=>II(e)},"babylon-staking":{health:e=>_I(e),stats:e=>PI(e),finalityProviders:e=>TI(e),delegations:(e,t={})=>CI(t,e)},"bisq-markets":{health:e=>OI(e),markets:e=>RI(e),ticker:(e,t={})=>LI(t,e),trades:(e,t={})=>$I(t,e)},"social-intel":{health:(e,t={})=>UI(t,e),trendingTokens:(e,t={})=>DI(t,e),trendingCas:(e,t={})=>qI(t,e),keywordMentions:(e,t={})=>HI(t,e),smartAccounts:(e,t={})=>jI(t,e),narratives:(e,t={})=>zI(t,e)},"bob-rootstock":{health:(e,t={})=>WI(t.chainId,e),stats:(e,t={})=>vm(t,e),addressInfo:(e,t={})=>GI(t,e),tokenBalances:(e,t={})=>KI(t,e)},"braiins-insights":{health:e=>YI(e),priceStats:e=>JI(e),poolStats:e=>XI(e)},"cow-protocol":{health:e=>iE(e),auction:e=>nE(e),openOrders:(e,t={})=>rE(t,e),recentTrades:(e,t={})=>oE(t,e)},"hiro-stacks":{health:e=>aE(e),networkInfo:e=>sE(e),stackingInfo:e=>cE(e),poxCycles:e=>lE(e),blocks:(e,t={})=>uE(t,e)},"tron-public":{health:e=>pE(e),account:(e,t={})=>mE(t,e),trc20Balances:(e,t={})=>fE(t,e),trc20Transfers:(e,t={})=>hE(t,e),chainParameters:(e,t={})=>yE(t,e)},"ton-public":{health:e=>wE(e),accountState:(e,t={})=>vE(t,e),jettonBalances:(e,t={})=>xE(t,e),transactions:(e,t={})=>SE(t,e)},"cosmos-lcd":{health:(e,t={})=>EE({...e,args:t}),chains:(e,t={})=>AE(t,e),balances:(e,t={})=>_E(t,e),delegations:(e,t={})=>PE(t,e),denomTrace:(e,t={})=>TE(t,e)},"sui-public":{health:e=>RE(e),balances:(e,t={})=>LE(t,e),ownedObjects:(e,t={})=>$E(t,e),coinMetadata:(e,t={})=>BE(t,e)},"aptos-public":{health:e=>DE(e),account:(e,t={})=>qE(t,e),resources:(e,t={})=>HE(t,e),coinBalances:(e,t={})=>jE(t,e)},"snapshot-governance":{health:e=>QE(e),spaces:(e,t={})=>GE(t,e),proposals:(e,t={})=>qm(t,e),activeProposals:(e,t={})=>KE(t,e),proposal:(e,t={})=>YE(t,e),votes:(e,t={})=>JE(t,e),votingPower:(e,t={})=>XE(t,e)},"tally-governance":{health:e=>aA(e),governors:()=>oA(),info:(e,t={})=>zm(t,e),proposals:(e,t={})=>nA(t,e),proposal:(e,t={})=>Vm(t,e),voterStatus:(e,t={})=>rA(t,e),tallyProposals:(e,t={})=>iA(t,e)},"stablecoin-peg":{health:e=>fA(e),scan:(e,t={})=>Jm(t,e)},"jito-mev":{health:e=>gA(e),recentBundles:(e,t={})=>bA(t,e),tipFloor:e=>wA(e)},"kamino-strategies":{health:e=>xA(e),strategies:(e,t={})=>SA(t,e),strategyMetrics:(e,t={})=>kA(t,e)},"liquid-esplora":{health:e=>_A(e),tipHeight:e=>PA(e),addressInfo:(e,t={})=>TA(t,e),assetInfo:(e,t={})=>CA(t,e)},"magiceden-ordinals":{health:e=>RA(e),collectionStat:(e,t={})=>LA(t,e)},"mempool-lightning":{health:e=>BA(e),statistics:e=>MA(e),nodeRankings:(e,t={})=>FA(t,e),nodeCountries:e=>UA(e)},"mempool-mining":{health:e=>HA(e),difficulty:e=>jA(e),poolShare:(e,t={})=>zA(t,e),hashrate:(e,t={})=>VA(t,e),rewardStats:(e,t={})=>WA(t,e)},"meteora-dlmm":{health:e=>YA(e),pools:(e,t={})=>JA(t,e),poolSearch:(e,t={})=>XA(t,e)},"ordinals-runes":{health:e=>ZA(e),blockHeight:e=>e1(e),blockInfo:(e,t={})=>t1(t,e),satInfo:(e,t={})=>n1(t,e),runeInfo:(e,t={})=>r1(t,e)},"pyth-price-feeds":{health:e=>lA(e),latestPrice:(e,t={})=>uA(t,e),latestPrices:(e,t={})=>Fc(t,e),feedDirectory:e=>dA(e)},"relayscan-mev":{health:e=>c1(e),overview:(e,t={})=>af(t,e),builderProfit:(e,t={})=>a1(t,e),dailyStats:(e,t={})=>s1(t,e)},"sanctum-lst":{health:e=>u1(e),lstList:e=>cf(e),apyAll:e=>d1(e),apyIndividual:(e,t={})=>p1(t,e)},"solend-lending":{health:e=>y1(e),markets:e=>uf(e),reserves:(e,t={})=>g1(t,e)},"execution-strategies":{health:()=>w1(),plan:(e,t={})=>b1(t)},"across-bridge":{health:e=>Kk(e),pools:(e,t={})=>Yk(t,e),suggestedFees:(e,t={})=>Jk(t,e)},"beefy-yields":{health:e=>Xk(e),apy:(e,t={})=>Qk(t,e),apyBreakdown:e=>Zk(e)},"birdeye-tokens":{health:e=>tI(e),tokenList:(e,t={})=>nI(t,e)},"celestia-da":{health:e=>rI(e),stats:e=>oI(e),blockStats:(e,t={})=>iI(t,e)},"das-assets":{health:e=>aI(e),assetsByOwner:(e,t={})=>sI(t,e),searchAssets:(e,t={})=>cI(t,e),assetProof:(e,t={})=>lI(t,e)},"l2beat-tvl":{health:e=>uI(e),tvl:(e,t={})=>dI(t,e),activity:(e,t={})=>pI(t,e)},"spark-lend":{health:e=>mI(e),markets:(e,t={})=>fI(t,e)},"symbiotic-restaking":{health:e=>hI(e),vaults:(e,t={})=>yI(t,e),vaultDetail:(e,t={})=>gI(t,e)},"limit-order":{health:()=>A1(),prepare:(e,t={})=>P1(t,e),arm:(e,t={})=>T1(t,e)},"jupiter-dca":{health:()=>C1(),prepare:(e,t={})=>R1(t,e),arm:(e,t={})=>L1(t,e)},"protective-monitors":{health:()=>U1(),depeg:(e,t={})=>wf(t,e),oracleDeviation:(e,t={})=>vf(t,e),exploitFeed:(e,t={})=>xf(t,e),goplus:(e,t={})=>Sf(t,e),liquidationLadder:(e,t={})=>kf(t,e)},"funding-scanner":{health:()=>j1(),scan:(e,t={})=>z1(t,e)},"perp-universal":{health:()=>Q1(),fundingAll:(e,t={})=>Z1(t,e),prepareOrder:(e,t={})=>e_(t,e)},"onchain-options":{health:()=>Jc(),rank:(e,t={})=>Xc(t.listings||t,t)},"holder-clusters":{health:()=>n_(),score:(e,t={})=>r_(t)},kalshi:{health:()=>o_(),markets:(e,t={})=>i_(t)},"derive-options":{health:()=>a_(),rank:(e,t={})=>s_(t.listings||t,t)},limitless:{health:()=>c_(),markets:(e,t={})=>l_(t)},"dov-vaults":{health:()=>u_(),read:(e,t={})=>d_(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>p_(t.left||{},t.right||{})},"tee-attestation":{health:()=>m_(),verify:(e,t={})=>f_(t)},"keeper-mirror":{health:e=>h_(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>g_(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>b_(t)},"binance-public":{health:e=>ps(e),ticker:(e,t={})=>ms(t,e),orderbook:(e,t={})=>rb(t,e),funding:(e,t={})=>ni(t,e),markPrice:(e,t={})=>ob(t,e),openInterest:(e,t={})=>ib(t,e),fundingHistory:(e,t={})=>ab(t,e)},"okx-public":{health:e=>fs(e),ticker:(e,t={})=>hs(t,e),orderbook:(e,t={})=>cb(t,e),funding:(e,t={})=>ys(t,e),markPrice:(e,t={})=>gs(t,e),openInterest:(e,t={})=>lb(t,e)},"bybit-public":{health:e=>ws(e),ticker:(e,t={})=>vs(t,e),orderbook:(e,t={})=>pb(t,e),funding:(e,t={})=>li(t,e),markPrice:(e,t={})=>mb(t,e),openInterest:(e,t={})=>fb(t,e),fundingHistory:(e,t={})=>hb(t,e)},"cex-basis":{health:e=>vb(e),basis:(e,t={})=>hd(t,e),fundingSpread:(e,t={})=>wb(t,e),legs:(e,t={})=>fd(t,e)}},k_=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),E_=new Set(["hl-exec"]);function Pq(e){return E_.has(String(e||""))}function Tq(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(E_.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Ra().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!k_.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(k_.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 A(e,t,n={},r={}){if(Pq(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.`);Tq(e,t,n);let o=zl(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=_q[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function Cq({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||Ra().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)=>A(d,"health",p,m),u={};return await be(s,i??8,async d=>{if(!zl(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await Se(()=>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 A_(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function Nq(e){return e.execution==="prepare"&&A_(e).length?"armed-local":e.execution||"read-only"}function Oq(){return Ra().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:Nq(e),localSignerSurfaces:A_(e),description:e.description}))}var nG={catalog:Oq,health:Cq,call:A,hl:{health:e=>A("hl-info","health",{},e),allMids:e=>A("hl-info","allMids",{},e),l2Book:(e,t)=>A("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>A("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>A("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>A("hl-info","userFills",{user:e},t),meta:e=>A("hl-info","meta",{},e),metaAndAssetCtxs:e=>A("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>A("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>A("hl-info","openOrders",{user:e},t),userState:(e,t)=>A("hl-info","userState",{user:e},t),spotMeta:e=>A("hl-info","spotMeta",{},e),vaults:{health:e=>A("hl-vaults","health",{},e),summaries:(e,t)=>A("hl-vaults","summaries",e||{},t),details:(e,t)=>A("hl-vaults","details",e||{},t),mine:(e,t)=>A("hl-vaults","userEquities",{user:e},t),track:(e,t)=>A("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>A("hl-entry-state","see",e||{},t),qualify:(e,t)=>A("hl-entry-state","qualify",e||{},t),lock:(e,t)=>A("hl-entry-state","lock",e||{},t),list:e=>A("hl-entry-state","list",{},e),watch:(e,t)=>A("hl-entry-state","watch",e||{},t)},staking:{health:e=>A("hl-staking","health",{},e),validators:e=>A("hl-staking","validators",{},e),summary:(e,t)=>A("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>A("hl-staking","delegations",{user:e},t),rewards:(e,t)=>A("hl-staking","rewards",{user:e},t),history:(e,t)=>A("hl-staking","history",{user:e},t),preflight:(e,t)=>A("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>A("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>A("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>A("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>A("poly-public","health",{},e),time:e=>A("poly-public","time",{},e),markets:(e,t)=>A("poly-public","markets",e||{},t),book:(e,t)=>A("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>A("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>A("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>A("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>A("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>A("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>A("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>A("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>A("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>A("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>A("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>A("evm-token-sniper","health",{},e),scan:(e,t)=>A("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>A("portfolio","balances",e||{},t),snapshot:(e,t)=>A("portfolio","snapshot",e||{},t),history:(e,t)=>A("portfolio","history",e||{},t),valueGraph:(e,t)=>A("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>A("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>A("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>A("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>A("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>A("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>A("opensea-nft","floor",{slug:e},t),collection:(e,t)=>A("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>A("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>A("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>A("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>A("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>A("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>A("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>A("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>A("universal-mint-router","health",{},e),capabilities:e=>A("universal-mint-router","capabilities",{},e),prepare:(e,t)=>A("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>A("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>A("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>A("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>A("solana-rpc","health",{},e),latestBlockhash:(e,t)=>A("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>A("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>A("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>A("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>A("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>A("jupiter","prepare",e||{},t),nftStats:(e,t)=>A("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>A("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>A("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>A("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>A("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>A("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>A("bitcoin-esplora","health",{},e),tipHeight:e=>A("bitcoin-esplora","tipHeight",{},e),fees:e=>A("bitcoin-esplora","fees",{},e),address:(e,t)=>A("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>A("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>A("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>A("bitcoin-esplora","decode",e||{},t),metaHealth:e=>A("bitcoin-meta","health",{},e),runeBalances:(e,t)=>A("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>A("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>A("satflow","health",{},e),satflowFloors:(e,t)=>A("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>A("satflow","walletContents",{address:e},t)},tron:{health:e=>A("tron-public","health",{},e),account:(e,t)=>A("tron-public","account",{address:e},t),trc20Balances:(e,t)=>A("tron-public","trc20Balances",{address:e},t),usdtTransfers:(e,t)=>A("tron-public","trc20Transfers",e||{},t),chainParameters:e=>A("tron-public","chainParameters",{},e)},ton:{health:e=>A("ton-public","health",{},e),account:(e,t)=>A("ton-public","accountState",{address:e},t),jettons:(e,t)=>A("ton-public","jettonBalances",{owner:e},t),transactions:(e,t)=>A("ton-public","transactions",e||{},t)},cosmos:{health:(e,t)=>A("cosmos-lcd","health",e||{},t),chains:e=>A("cosmos-lcd","chains",{},e),balances:(e,t)=>A("cosmos-lcd","balances",e||{},t),delegations:(e,t)=>A("cosmos-lcd","delegations",e||{},t),denomTrace:(e,t)=>A("cosmos-lcd","denomTrace",e||{},t)},sui:{health:e=>A("sui-public","health",{},e),balances:(e,t)=>A("sui-public","balances",e||{},t),ownedObjects:(e,t)=>A("sui-public","ownedObjects",e||{},t),coinMetadata:(e,t)=>A("sui-public","coinMetadata",e||{},t)},aptos:{health:e=>A("aptos-public","health",{},e),account:(e,t)=>A("aptos-public","account",{address:e},t),resources:(e,t)=>A("aptos-public","resources",e||{},t),coinBalances:(e,t)=>A("aptos-public","coinBalances",e||{},t)},prices:{health:e=>A("defillama","health",{},e),current:(e,t)=>A("defillama","prices",{coins:e},t),bySymbol:(e,t)=>A("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>A("defillama","protocols",{},e)},lifi:{health:e=>A("lifi","health",{},e),quote:(e,t)=>A("lifi","quote",e||{},t),chains:e=>A("lifi","chains",{},e)},dex:{health:e=>A("dexscreener","health",{},e),token:(e,t)=>A("dexscreener","token",{address:e},t),search:(e,t)=>A("dexscreener","search",{q:e},t),pair:(e,t,n)=>A("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>A("uniswap-v3","health",e||{},t),quote:(e,t)=>A("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>A("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>A("uniswap-v3","ethUsdc",e||{},t),chains:e=>A("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>A("uniswap-v4","health",e||{},t),quote:(e,t)=>A("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>A("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>A("uniswap-v4","prepare",e||{},t),chains:e=>A("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>A("x402","inspect",e||{},t),prepare:(e,t)=>A("x402","prepare",e||{},t)},bankr:{wallet:e=>A("bankr","wallet",{},e),portfolio:e=>A("bankr","portfolio",{},e),swapQuote:(e,t)=>A("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>A("across","suggestedFees",e||{},t),hop:(e,t)=>A("hop","quote",e||{},t),relay:(e,t)=>A("relay","quote",e||{},t)},cow:{quote:(e,t)=>A("cowswap","quote",e||{},t)},hlWs:{allMids:e=>A("hl-ws","allMids",{},e),l2Book:(e,t)=>A("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>A("poly-ws","book",{assetId:e},t)}};export{E_ as EXECUTION_PROVIDERS,Tq as assertDataOpAllowed,nG as data,A as dataCall,Oq as dataCatalog,Cq as dataHealth,Pq as isExecutionProvider,Aq as routeUniversalNftLifecycle,S_ as universalNftLifecycleCapabilities};
|