@oracle-agent/oracle 0.35.0 → 0.35.2

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.
@@ -1,15 +1,15 @@
1
- var YE=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 Si=(e,t)=>{for(var n in t)YE(e,n,{get:t[n],enumerable:!0})};import dn from"node:net";import JE from"node:dns";function ki(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 Hs(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 js(e){if(dn.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(dn.isIPv6(e)){let t=ki(e);if(!t)return!1;let n=ki("::ffff:0:0");return Hs(t,n,96)?js([...t.slice(12)].join(".")):Hs(t,ki("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Hs(t,ki(o),i)):!1}return!1}function QE(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(XE.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=dn.isIP(n);return r!==0&&!js(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function zs(e,{lookupFn:t=JE.promises.lookup}={}){let n=QE(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:dn.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=>!js(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Vs({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||(dn.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(dn.isIP(p))return[{address:p,family:dn.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=ZE((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 ZE(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[Ws]=Object.freeze({pin:t}),e}function Gs(e){return typeof e=="function"&&typeof e[Ws]?.pin=="function"}function qp(e,t,n){if(!Gs(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ws].pin(t,n)}var XE,Ws,Hp=xe(()=>{XE=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ws=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as eI}from"node:crypto";function iI(e){let t=String(e||"").toLowerCase();return Kp.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function aI(e){let t={};for(let[n,r]of Object.entries(e||{}))iI(n)||(t[n]=r);return t}function sI(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 cI(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function lI(e,t,n,r={}){let o={};for(let[u,d]of Object.entries(n||{}))o[u.toLowerCase()]=d;let i=Object.keys(o).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...Kp,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
2
- `),c=eI("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function uI(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,zp):Math.min(250*2**e,zp)+Math.floor(Math.random()*100)}function Dr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ys(e,t,n){return Dr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ur(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function pI(e){return e?e.byteLength??e.length??0:0}async function Wp(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&&(Ur(e),!r))throw Ys(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 Ys(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+=pI(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 Ys(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function Gp(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function mI(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,g=null,w=t,x=a?{lookupFn:a}:{};if(c&&!s&&!Gs(w))throw Dr(`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 b=async(y,{status:v=null}={})=>{let k=await zs(y,x);if(!k.ok)throw Dr(v==null?`HTTP refused ${y}: ${k.error}`:`HTTP redirect to ${y} ${k.error}`,v==null?{}:{status:v});let S=new URL(y).hostname;if(s){if(g&&(await g.close(),g=null),!g)try{g=await Vs({requireUndici:!0,...u?{importUndici:u}:{}})}catch(I){throw Dr(v==null?`HTTP refused ${y}: ${I?.message||I}`:`HTTP redirect to ${y} refused: ${I?.message||I}`,v==null?{}:{status:v})}g.pin(S,k.addresses),w=g.fetch}else qp(w,S,k.addresses);return k};try{let y=String(e),v={...r||{}};c&&await b(y);for(let k=0;k<=Vp;k+=1){let S=await w(y,{method:n,headers:v,body:o,signal:h,redirect:"manual"});if(rI.has(S.status)){if(n!=="GET"&&n!=="HEAD"){let U=await Wp(S,l??oI,{url:y,truncate:!0}),H=new Error(`HTTP ${S.status} ${n} ${y} redirected non-idempotent request`);throw H.status=S.status,H.body=Gp(U)??U.slice(0,300),H}if(k===Vp)throw Ur(S),new Error(`HTTP redirect loop for ${e}`);let _=S.headers?.get?.("location"),T;try{T=sI(_,y)}catch(U){throw Ur(S),U}let $=!cI(T,y);if(Ur(S),$&&(v=aI(v)),c)await b(T,{status:S.status});else if($){let U=await zs(T,x);if(!U.ok){let H=new Error(`HTTP redirect from ${y} ${U.error}`);throw H.status=S.status,H.retryable=!1,H}s&&U.addresses?.length&&(g||(g=await Vs(u?{importUndici:u}:{})),g&&(g.pin(new URL(T).hostname,U.addresses),w=g.fetch))}y=T;continue}if(typeof d=="function")try{await d(S,{url:y})}catch(_){throw Ur(S),Dr(_?.message||String(_))}let I=await Wp(S,l,{url:y,onOversize:()=>m.abort()}),P=Gp(I);if(!S.ok){let _=new Error(`HTTP ${S.status} ${n} ${y}`);throw _.status=S.status,_.retryAfter=S.headers?.get?.("retry-after")??null,_.body=P??I.slice(0,300),_}return P??I}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),g&&await g.close()}}async function E(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):nI,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,g=async()=>{let v;for(let k=0;k<=s;k++){m?.throwIfAborted?.();try{return await mI(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(S){v=S;let I=S?.status,P=S?.name==="AbortError"||S?.name==="TimeoutError"||m?.aborted,_=new Set([408,425,429]),T=S?.retryable===!1?!1:I!=null?_.has(I)||tI.has(I)&&jp.has(o):!P&&jp.has(o);if(k===s||!T)throw S;let $=uI(k,S?.retryAfter);m?await new Promise((U,H)=>{let O=setTimeout(U,$);m.addEventListener("abort",()=>{clearTimeout(O),H(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await dI($)}}throw v};if(!(t.dedupe!==!1&&!m&&o==="GET"&&a==null))return g();let x=lI(o,e,i,{untrustedUrl:u,maxResponseBytes:h}),b=Ks.get(x);if(b)return b;let y=g().finally(()=>Ks.delete(x));return Ks.set(x,y),y}async function ve(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 Fe(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 tI,jp,nI,zp,Kp,rI,Vp,oI,Ks,dI,L=xe(()=>{Hp();tI=new Set([408,425,429,500,502,503,504]),jp=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),nI=2,zp=4e3,Kp=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],rI=new Set([301,302,303,307,308]),Vp=3,oI=64*1024;Ks=new Map;dI=e=>new Promise(t=>setTimeout(t,e))});function Xs(e){return Yp.get(Number(e))||null}function Jp(e,t=process.env){let n=Xs(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function Xp(e){return Yp.has(Number(e))}var Js,Yp,Qp=xe(()=>{Js={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}},Yp=new Map(Object.values(Js).map(e=>[e.chainId,e]))});var Ii={};Si(Ii,{PUBLIC_RPC_FALLBACKS:()=>Zs,erc20Allowance:()=>nc,erc20BalanceOf:()=>Hr,resolveRpcUrl:()=>ec,rpcBlockNumber:()=>qr,rpcCall:()=>D,rpcChainId:()=>tc,rpcGasPrice:()=>wI,rpcGetBalance:()=>pn,rpcHealth:()=>qn,rpcHealthAll:()=>rc,transactionReceipt:()=>jr});import{Interface as fI,getAddress as hI}from"ethers";function Ft(e,t){try{return hI(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function gI(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 Qs(e){return e==null?null:Number.parseInt(String(e),16)}function ec(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=Jp(e,n);return r||Zs[Number(e)]||null}function bI(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!yI.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function D(e,t,n=[],r={}){let o=String(t||"");bI(o);let i=ec(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await E(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function qn(e,t={}){let n=await D(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await D(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:Xs(e)?.name||null}}async function qr(e,t={}){let n=await D(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function tc(e,t={}){let n=await D(e,"eth_chainId",[],t);return parseInt(n,16)}async function wI(e,t={}){let n=await D(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function pn(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 nc(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Ft(e.token||e.tokenAddress,"token"),o=Ft(e.owner,"owner"),i=Ft(e.spender,"spender"),a=Ei.encodeFunctionData("allowance",[o,i]),s=await D(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ei.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 Hr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Ft(e.token||e.tokenAddress,"token"),o=Ft(e.account||e.owner||e.address,"account"),i=Ei.encodeFunctionData("balanceOf",[o]),a=await D(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ei.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=gI(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=Qs(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?Ft(e.expectedTo,"expectedTo"):null,u=o.to?Ft(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?Ft(o.from,"receipt.from"):null,blockNumber:Qs(o.blockNumber),transactionIndex:Qs(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function rc(e={}){let t=e.chainIds||Object.values(Js).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!Xp(r)&&!Zs[r]&&!ec(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await qn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ei,Zs,yI,he=xe(()=>{L();Qp();Ei=new fI(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Zs={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"};yI=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{createHash as BI,createHmac as MI,timingSafeEqual as Z4}from"node:crypto";function cc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(cc).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${cc(e[n])}`).join(",")}}`}function lm(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function um(e=process.env){return lm(process.env)||lm(e)}function UI(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function fn(e){let t=UI(e);return BI("sha256").update(cc(t)).digest("hex")}function qI(e,t=um()){return t?MI("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+lc:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>DI)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:FI},m=fn(p),f=um(r),h=f?qI(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var FI,lc,DI,Q=xe(()=>{FI=2,lc=300*1e3,DI=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function r1({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"?n1:t1}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=r1(t);return E(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function hf(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 Et(e={}){return ce({type:"allMids"},e)}async function Wn(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function ao(e={}){return ce({type:"outcomeMeta"},e)}async function Vi(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function gf(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function yf(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 Wi({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 bf({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 wf(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function xf(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function Gn(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function Gi(e={}){return ce({type:"spotMeta"},e)}var t1,n1,st=xe(()=>{L();t1="https://api.hyperliquid.xyz/info",n1="https://api.hyperliquid-testnet.xyz/info"});async function Pf(e={}){let t=Date.now();if(po.dexs&&t-po.at<6e4&&!e.fetchImpl)return po.dexs;let n=await ce({type:"perpDexs"},e);return po={at:t,dexs:Array.isArray(n)?n:[]},po.dexs}async function Cf(e="",t={}){let n=e||"",r=Date.now(),o=_f.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 _f.set(n,c),c}function Ht(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=Tf+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function qt(e,t){let n=Jc(e),r=Jc(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=Tf+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 Jc(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 Xc(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Ht(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:qt(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:m1(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=qt(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 Pf(t)).findIndex(y=>y&&y.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await Cf(l,t),g=f.findIndex(y=>y.name===n||y.name===`${l}:${d}`||y.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=p1+m*1e4+g,b=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:b.markPx??null}}let{universe:r,ctxs:o}=await Cf("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Pf(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 Xc({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 m1(e,t){let n=Jc(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Tf,p1,po,_f,Zi=xe(()=>{st();Tf=1e8,p1=1e5,po={at:0,dexs:null},_f=new Map});function Ie(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 xn(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=Ie(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=xn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function ke(e,t,n="amount"){let r=Ie(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 Kn=xe(()=>{});function b1(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 Nf(e,t){let n=Ie(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 yt(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=>yt(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)}:${yt(e[r],t)}`).join(",")}}`}function w1(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)||yt(n,"declared order type")!==yt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(yt(n,"declared order type")!==yt({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||yt(n,"declared order type")!==yt({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 x1(e,t,n){let r=Nf(e.s,"signed size"),o=Nf(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=ke(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=ke(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function v1(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=jt(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=xn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=ke(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function Of(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(Ie(e.s,"hl: signed size")!==Ie(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ie(e.p,"hl: signed price")!==Ie(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(yt(e.t,"signed order type")!==yt(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 Rf(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(Ie(e.s,"hl: bracket protection size")!==Ie(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ie(e.p,"hl: bracket protection price")!==Ie(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(Ie(i.triggerPx,"hl: triggerPx")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function S1(e){let t=String(e||"").replace(/\/$/,"");if(!f1.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Qc(e){return Ht(e)!=null}function k1(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(Qc(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 E1(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(Qc(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 Lf(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=jt(n.kind,"kind",48),o=g1[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=S1(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!==y1[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(h1.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=jt(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=Ht(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(k1(c,t),E1(c,l,t),r==="hip4-order"&&!Qc(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");w1(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");Of(u[0],n,l);let f=1;d!=null&&Rf(u[f++],n,l,d,"tp"),p!=null&&Rf(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");Of(u[0],n,l)}x1(u[0],n,t),v1(n,t),s=Ie(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=jt(n.usd,"margin usd",64),d=ke(u,6,"hl: margin usd");if(xn(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=ke(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=b1(f,6)}}if(r==="builder-fee-approval"){let c=jt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(jt(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=jt(n.maxFeeRate,"maxFeeRate",32);if(jt(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=ke(u.slice(0,-1),12,"hl: builder fee percent"),p=ke(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 f1,h1,g1,y1,jt,$f=xe(()=>{Kn();Zi();f1=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),h1=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),g1=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"}),y1=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"}),jt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function A1(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 ea(e,t={},n={}){let r=String(e?.kind||""),o=I1[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:A1(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 Lf(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 I1,Zc=xe(()=>{$f();I1=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 _1,JsonRpcProvider as P1}from"ethers";function L1(e){return R1.test(String(e||""))}async function ta(e,{contract:t=C1,rpc:n=N1,chainId:r=T1,balanceOf:o}={}){if(!L1(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new P1(n,r,{staticNetwork:!0}),a=new _1(t,O1,i);return BigInt(await a.balanceOf(e))}var C1,T1,N1,O1,R1,el=xe(()=>{C1="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",T1=999,N1="https://rpc.hyperliquid.xyz/evm",O1=["function balanceOf(address owner) view returns (uint256)"],R1=/^0x[a-fA-F0-9]{40}$/});import{existsSync as $1,readFileSync as B1,lstatSync as M1}from"node:fs";import{homedir as Bf}from"node:os";import{join as tl}from"node:path";function U1(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Mf,t)?Mf[t]:D1}function V1(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Ff])return String(e[Ff]);let t=e.ORACLE_CONFIG_DIR||tl(Bf(),".config","oracle");return tl(t,"fee-recipient")}return tl(Bf(),".config","oracle","fee-recipient")}function nl(e=process.env){try{let t=V1(e);if(!$1(t)||M1(t).isSymbolicLink())return"";let n=B1(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function W1(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),F1)}function G1({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[H1]||"").trim(),o=String(e[j1]||z1).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=U1(t),a=W1(e[q1],{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=nl(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 na({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=G1({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 ta(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Df(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Uf(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var F1,D1,Mf,q1,H1,j1,Ff,z1,ra=xe(()=>{el();F1=100,D1=5,Mf=Object.freeze({swap:5,bridge:5,perps:0,nft:0});q1="ORACLE_INTEGRATOR_FEE_BPS",H1="ORACLE_INTEGRATOR_FEE_RECIPIENT",j1="ORACLE_INTEGRATOR_ID",Ff="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",z1="oracle"});var ml={};Si(ml,{HL_BUILDER_ADDRESS_ENV:()=>oa,HL_BUILDER_DEFAULT_FEE_BPS:()=>K1,HL_BUILDER_FEE_ENV:()=>ol,HL_BUILDER_FEE_TIERS:()=>mo,HL_BUILDER_MAX_FEE_BPS:()=>rl,HL_PERP_MAX_SIG_FIGS:()=>qf,HL_PERP_PRICE_DECIMALS:()=>Hf,HL_SIGNATURE_CHAIN_ID:()=>al,MARGIN_MODE:()=>fo,ORDER_TYPES:()=>He,TIF:()=>ho,formatPerpPrice:()=>At,formatPerpSize:()=>Wf,hlBuilderFeeBpsForKind:()=>Vf,hlPerpAssetInfo:()=>zt,hlPrepareBracketOrder:()=>pl,hlPrepareBuilderApproval:()=>ll,hlPrepareCancelOrder:()=>go,hlPreparePerpOrder:()=>Xn,hlPrepareUpdateIsolatedMargin:()=>dl,hlPrepareUpdateLeverage:()=>ul,resolveBuilderFee:()=>sl});function jf(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 Y1(e,t){let n=jf(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function J1(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 zf(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 Vf(e="perp"){if(e==="perp"||e==="main")return mo.perp;if(e==="spot")return mo.spot;if(e==="hip3")return mo.hip3;if(e==="outcome"||e==="hip4")return mo.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function sl({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[oa]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${oa} must be an EVM address`);let o=nl(e);if(!o||o!==r)return null;let i=e?.[ol],a=Vf(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: ${ol} must be a positive number in 0.1 bps increments`);if(s>rl)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${rl} 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 X1(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 Q1(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||ta;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function cl(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 Z1(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 cl(r,a,n)}function At(e,t,n={}){let r=Hf-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return cl(Z1(e,qf,n),r,n)}function Wf(e,t){let n=cl(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 e_(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 zt(e={},t={}){let n=await Xc(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 il(e,{tif:t=ho.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case He.LIMIT:return{limit:{tif:t}};case He.MARKET:return{limit:{tif:ho.IOC}};case He.STOP_MARKET:case He.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:At(n,o),tpsl:e===He.STOP_MARKET?"sl":"tp"}};case He.STOP_LIMIT:case He.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:At(n,o),tpsl:e===He.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Yn(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:al,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 Jn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=ea(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 ll(e={},t={}){let n=sl({env:t.env});if(!n)throw new Error(`hl-perps: ${oa} 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:al,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Jn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Yn(o,r,t)},e,t)}async function Xn(e={},t={}){let n=await zt(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=zf(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=Wf(e.size??e.sz,n.szDecimals),s;if(r===He.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let k=await Et(t);x=Number(k?.[n.coin]??k?.[String(n.assetId)]??NaN)}if(!Number.isFinite(x))throw new Error("hl-perps: no mark price available for a market order");let b=Number(e.maxSlippageBps??50);if(!Number.isInteger(b)||b<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(b>100)throw new Error(`hl-perps: maxSlippageBps ${b} exceeds the hard 100 bps cap`);let y=o?x*(1+b/1e4):x*(1-b/1e4);s=At(y,n.szDecimals,{roundDown:o});let v=Math.abs(Number(s)/x-1)*1e4;if(v>b+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${b} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=At(e.price??e.limitPx,n.szDecimals)}let c=il(r,{tif:e.tif??(r===He.MARKET?ho.IOC:ho.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=sl({env:t.env,kind:n.kind}),p=await Q1(d,e,t),m=p.exempt?null:d,f=await X1(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=e_(a,s);return Jn({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,...Yn(u,g,t)},e,t)}async function go(e={},t={}){let n=await zt(J1(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=jf(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Jn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Yn(i,Number(e.nonce??Date.now()),t)},e,t)}async function ul(e={},t={}){let n=await zt(e,t),r=Y1(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||fo.CROSS).toLowerCase();if(o!==fo.CROSS&&o!==fo.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===fo.CROSS,leverage:r};return Jn({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,...Yn(i,Number(e.nonce??Date.now()),t)},e,t)}async function dl(e={},t={}){let n=await zt(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=ke(o,6,"hl-perps: usd"),a=zf(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Jn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Yn(s,Number(e.nonce??Date.now()),t)},e,t)}async function pl(e={},t={}){let n=await Xn(e,t),r=await zt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:At(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:il(He.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:At(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:il(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 Jn({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:At(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:At(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Yn(a,Number(e.nonce??Date.now()),t)},e,t)}var qf,Hf,al,K1,rl,oa,ol,mo,He,ho,fo,ia=xe(()=>{st();Zi();Kn();Q();Zc();el();ra();qf=5,Hf=6,al="0x66eee",K1=2,rl=10,oa="ORACLE_HL_BUILDER_ADDRESS",ol="ORACLE_HL_BUILDER_FEE_BPS",mo=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"}),ho=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),fo=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as _b,readFileSync as KN}from"node:fs";import{dirname as Ab,join as Fu}from"node:path";import{fileURLToPath as YN}from"node:url";function JN(e){let t=Ab(YN(e));for(let n=0;n<8;n+=1){let r=Fu(t,"package.json");if(_b(r))try{let i=JSON.parse(KN(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Ab(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Wa(e,t){let n=JN(t),r=Fu(n,e);return _b(r)?r:Fu(n,"dist","assets",e)}var Du=xe(()=>{});import{isAddress as XN}from"ethers";function ZN(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Pb,tag:`v${Pb}`}),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 Ga(e){let t=Tn[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Yo(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Jo(e,t){let n=String(e||"");if(!XN(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function Cb(e,t){let n=Ga(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");Yo(i,"safe-erc20: supply"),Jo(a,"safe-erc20: initialHolder"),Jo(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(Yo(i,"safe-erc721-drop: cap"),Jo(a,"safe-erc721-drop: treasury"),Yo(s,"safe-erc721-drop: mintPrice"),Yo(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Jo(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Jo(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`)}Yo(i,"safe-vesting: durationSeconds")}return n}function Tb(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Pb,QN,Tn,Ka=xe(()=>{Pb="5.0.2",QN={"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"]}};Tn=Object.freeze(Object.fromEntries(Object.entries(QN).map(([e,t])=>[e,ZN(e,t)])))});import{spawnSync as Uu}from"node:child_process";import{existsSync as Nn,readFileSync as Ya,readdirSync as Nb,statSync as Ob}from"node:fs";import{join as xt}from"node:path";import{createHash as eO}from"node:crypto";function Xa(){return Nn(Xo)?Nb(Xo).filter(e=>Tn[e]&&Ob(xt(Xo,e)).isDirectory()).map(e=>{let t=xt(Xo,e),n=xt(t,"SECURITY.md");return{id:e,path:t,metadata:Ga(e),securityNotice:Nn(n)?Ya(n,"utf8").slice(0,500):null,disclaimer:Ja}}):[]}function Rb(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",xt(e,".foundry/bin/forge")];for(let n of t)if(Uu(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function tO(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Uu("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function br(e,t,n){let r=Uu(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 nO(e){let t=eO("sha256");function n(r){let o=Ob(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Nb(r).sort())n(xt(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(Ya(r)))}return n(e),t.digest("hex")}function Qo(e,t={}){let n=Ga(e),r=t.allowSkipStatic!==!1,o=xt(Xo,e);if(!Nn(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=Rb();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(!Nn(xt(o,"lib","forge-std"))){let m=br(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
3
- ${m.stderr}`)}if(!Nn(xt(o,"lib","openzeppelin-contracts"))){let m=br(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
4
- ${m.stderr}`)}let a=xt(o,"lib","openzeppelin-contracts","package.json"),s=Nn(a)?JSON.parse(Ya(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=br(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
5
- ${c.stderr}`.slice(0,2e3));let l=br(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
1
+ var dI=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 _i=(e,t)=>{for(var n in t)dI(e,n,{get:t[n],enumerable:!0})};import fn from"node:net";import pI from"node:dns";function Pi(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 Ks(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 Ys(e){if(fn.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(fn.isIPv6(e)){let t=Pi(e);if(!t)return!1;let n=Pi("::ffff:0:0");return Ks(t,n,96)?Ys([...t.slice(12)].join(".")):Ks(t,Pi("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ks(t,Pi(o),i)):!1}return!1}function fI(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(mI.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=fn.isIP(n);return r!==0&&!Ys(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Js(e,{lookupFn:t=pI.promises.lookup}={}){let n=fI(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:fn.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=>!Ys(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Xs({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||(fn.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(fn.isIP(p))return[{address:p,family:fn.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=hI((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 hI(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[Qs]=Object.freeze({pin:t}),e}function Zs(e){return typeof e=="function"&&typeof e[Qs]?.pin=="function"}function Yp(e,t,n){if(!Zs(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Qs].pin(t,n)}var mI,Qs,Jp=xe(()=>{mI=new Set(["localhost","metadata.google.internal","metadata.goog"]);Qs=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as gI}from"node:crypto";function vI(e){let t=String(e||"").toLowerCase();return nm.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function kI(e){let t={};for(let[n,r]of Object.entries(e||{}))vI(n)||(t[n]=r);return t}function SI(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 EI(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function II(e,t,n,r={}){let o={};for(let[u,d]of Object.entries(n||{}))o[u.toLowerCase()]=d;let i=Object.keys(o).filter(u=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(u)),s=[...new Set([...nm,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
2
+ `),c=gI("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function AI(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Qp):Math.min(250*2**e,Qp)+Math.floor(Math.random()*100)}function qr(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function tc(e,t,n){return qr(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Hr(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function PI(e){return e?e.byteLength??e.length??0:0}async function em(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&&(Hr(e),!r))throw tc(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 tc(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+=PI(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 tc(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function tm(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function CI(e,{fetchImpl:t,method:n,headers:r,body:o,timeoutMs: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,g=null,w=t,x=a?{lookupFn:a}:{};if(c&&!s&&!Zs(w))throw qr(`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 b=async(y,{status:v=null}={})=>{let E=await Js(y,x);if(!E.ok)throw qr(v==null?`HTTP refused ${y}: ${E.error}`:`HTTP redirect to ${y} ${E.error}`,v==null?{}:{status:v});let k=new URL(y).hostname;if(s){if(g&&(await g.close(),g=null),!g)try{g=await Xs({requireUndici:!0,...u?{importUndici:u}:{}})}catch(I){throw qr(v==null?`HTTP refused ${y}: ${I?.message||I}`:`HTTP redirect to ${y} refused: ${I?.message||I}`,v==null?{}:{status:v})}g.pin(k,E.addresses),w=g.fetch}else Yp(w,k,E.addresses);return E};try{let y=String(e),v={...r||{}};c&&await b(y);for(let E=0;E<=Zp;E+=1){let k=await w(y,{method:n,headers:v,body:o,signal:h,redirect:"manual"});if(wI.has(k.status)){if(n!=="GET"&&n!=="HEAD"){let U=await em(k,l??xI,{url:y,truncate:!0}),H=new Error(`HTTP ${k.status} ${n} ${y} redirected non-idempotent request`);throw H.status=k.status,H.body=tm(U)??U.slice(0,300),H}if(E===Zp)throw Hr(k),new Error(`HTTP redirect loop for ${e}`);let _=k.headers?.get?.("location"),T;try{T=SI(_,y)}catch(U){throw Hr(k),U}let $=!EI(T,y);if(Hr(k),$&&(v=kI(v)),c)await b(T,{status:k.status});else if($){let U=await Js(T,x);if(!U.ok){let H=new Error(`HTTP redirect from ${y} ${U.error}`);throw H.status=k.status,H.retryable=!1,H}s&&U.addresses?.length&&(g||(g=await Xs(u?{importUndici:u}:{})),g&&(g.pin(new URL(T).hostname,U.addresses),w=g.fetch))}y=T;continue}if(typeof d=="function")try{await d(k,{url:y})}catch(_){throw Hr(k),qr(_?.message||String(_))}let I=await em(k,l,{url:y,onOversize:()=>m.abort()}),P=tm(I);if(!k.ok){let _=new Error(`HTTP ${k.status} ${n} ${y}`);throw _.status=k.status,_.retryAfter=k.headers?.get?.("retry-after")??null,_.body=P??I.slice(0,300),_}return P??I}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),g&&await g.close()}}async function S(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):bI,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,g=async()=>{let v;for(let E=0;E<=s;E++){m?.throwIfAborted?.();try{return await CI(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){v=k;let I=k?.status,P=k?.name==="AbortError"||k?.name==="TimeoutError"||m?.aborted,_=new Set([408,425,429]),T=k?.retryable===!1?!1:I!=null?_.has(I)||yI.has(I)&&Xp.has(o):!P&&Xp.has(o);if(E===s||!T)throw k;let $=AI(E,k?.retryAfter);m?await new Promise((U,H)=>{let O=setTimeout(U,$);m.addEventListener("abort",()=>{clearTimeout(O),H(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await _I($)}}throw v};if(!(t.dedupe!==!1&&!m&&o==="GET"&&a==null))return g();let x=II(o,e,i,{untrustedUrl:u,maxResponseBytes:h}),b=ec.get(x);if(b)return b;let y=g().finally(()=>ec.delete(x));return ec.set(x,y),y}async function ve(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 Fe(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 yI,Xp,bI,Qp,nm,wI,Zp,xI,ec,_I,L=xe(()=>{Jp();yI=new Set([408,425,429,500,502,503,504]),Xp=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),bI=2,Qp=4e3,nm=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],wI=new Set([301,302,303,307,308]),Zp=3,xI=64*1024;ec=new Map;_I=e=>new Promise(t=>setTimeout(t,e))});function rc(e){return rm.get(Number(e))||null}function om(e,t=process.env){let n=rc(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function im(e){return rm.has(Number(e))}var nc,rm,am=xe(()=>{nc={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}},rm=new Map(Object.values(nc).map(e=>[e.chainId,e]))});var Ti={};_i(Ti,{PUBLIC_RPC_FALLBACKS:()=>ic,erc20Allowance:()=>cc,erc20BalanceOf:()=>zr,resolveRpcUrl:()=>ac,rpcBlockNumber:()=>jr,rpcCall:()=>D,rpcChainId:()=>sc,rpcGasPrice:()=>$I,rpcGetBalance:()=>hn,rpcHealth:()=>Vn,rpcHealthAll:()=>lc,transactionReceipt:()=>Vr});import{Interface as TI,getAddress as NI}from"ethers";function Ft(e,t){try{return NI(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function OI(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 oc(e){return e==null?null:Number.parseInt(String(e),16)}function ac(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=om(e,n);return r||ic[Number(e)]||null}function LI(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!RI.test(n))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function D(e,t,n=[],r={}){let o=String(t||"");LI(o);let i=ac(e,r);if(!i)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);let s=await S(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:t,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal});if(s?.error){let c=new Error(s.error.message||JSON.stringify(s.error));throw c.code=s.error.code,c}return s.result}async function Vn(e,t={}){let n=await D(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await D(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:rc(e)?.name||null}}async function jr(e,t={}){let n=await D(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function sc(e,t={}){let n=await D(e,"eth_chainId",[],t);return parseInt(n,16)}async function $I(e,t={}){let n=await D(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function hn(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 cc(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Ft(e.token||e.tokenAddress,"token"),o=Ft(e.owner,"owner"),i=Ft(e.spender,"spender"),a=Ci.encodeFunctionData("allowance",[o,i]),s=await D(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ci.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 zr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=Ft(e.token||e.tokenAddress,"token"),o=Ft(e.account||e.owner||e.address,"account"),i=Ci.encodeFunctionData("balanceOf",[o]),a=await D(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ci.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 Vr(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=OI(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=oc(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?Ft(e.expectedTo,"expectedTo"):null,u=o.to?Ft(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?Ft(o.from,"receipt.from"):null,blockNumber:oc(o.blockNumber),transactionIndex:oc(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function lc(e={}){let t=e.chainIds||Object.values(nc).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!im(r)&&!ic[r]&&!ac(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Vn(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ci,ic,RI,he=xe(()=>{L();am();Ci=new TI(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);ic={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"};RI=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});import{createHash as QI,createHmac as ZI,timingSafeEqual as T6}from"node:crypto";function fc(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fc).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${fc(e[n])}`).join(",")}}`}function ym(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function bm(e=process.env){return ym(process.env)||ym(e)}function nA(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function yn(e){let t=nA(e);return QI("sha256").update(fc(t)).digest("hex")}function rA(e,t=bm()){return t?ZI("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+hc:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>tA)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:eA},m=yn(p),f=bm(r),h=f?rA(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var eA,hc,tA,X=xe(()=>{eA=2,hc=300*1e3,tA=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function w1({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"?b1:y1}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=w1(t);return S(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Sf(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 Et(e={}){return ce({type:"allMids"},e)}async function Jn(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return ce({type:"l2Book",coin:String(e)},t)}async function co(e={}){return ce({type:"outcomeMeta"},e)}async function Ji(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return ce({type:"spotClearinghouseState",user:e},t)}async function Ef(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return ce({type:"userFills",user:e},t)}async function If(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 Xi({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 Af({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 _f(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return ce({type:"openOrders",user:e},t)}async function Pf(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return ce({type:"frontendOpenOrders",user:e},t)}async function Xn(e,t={}){if(!e)throw new Error("hlUserState requires user");return ce({type:"clearinghouseState",user:e},t)}async function Qi(e={}){return ce({type:"spotMeta"},e)}var y1,b1,st=xe(()=>{L();y1="https://api.hyperliquid.xyz/info",b1="https://api.hyperliquid-testnet.xyz/info"});async function Bf(e={}){let t=Date.now();if(fo.dexs&&t-fo.at<6e4&&!e.fetchImpl)return fo.dexs;let n=await ce({type:"perpDexs"},e);return fo={at:t,dexs:Array.isArray(n)?n:[]},fo.dexs}async function Mf(e="",t={}){let n=e||"",r=Date.now(),o=$f.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 $f.set(n,c),c}function Ht(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=Ff+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function qt(e,t){let n=nl(e),r=nl(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=Ff+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 nl(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 rl(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:Ht(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:qt(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:C1(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=qt(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 Bf(t)).findIndex(y=>y&&y.name===l);if(m<1)throw new Error(`hl-assets: unknown builder dex "${l}"`);let{universe:f,ctxs:h}=await Mf(l,t),g=f.findIndex(y=>y.name===n||y.name===`${l}:${d}`||y.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=P1+m*1e4+g,b=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:b.markPx??null}}let{universe:r,ctxs:o}=await Mf("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Bf(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 rl({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 C1(e,t){let n=nl(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var Ff,P1,fo,$f,oa=xe(()=>{st();Ff=1e8,P1=1e5,fo={at:0,dexs:null},$f=new Map});function Ie(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 Sn(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=Ie(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=Sn(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Se(e,t,n="amount"){let r=Ie(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 Qn=xe(()=>{});function L1(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 Df(e,t){let n=Ie(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 yt(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=>yt(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)}:${yt(e[r],t)}`).join(",")}}`}function $1(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)||yt(n,"declared order type")!==yt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(yt(n,"declared order type")!==yt({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||yt(n,"declared order type")!==yt({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 B1(e,t,n){let r=Df(e.s,"signed size"),o=Df(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Se(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Se(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function M1(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=jt(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=Sn(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Se(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function Uf(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(Ie(e.s,"hl: signed size")!==Ie(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ie(e.p,"hl: signed price")!==Ie(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(yt(e.t,"signed order type")!==yt(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 qf(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(Ie(e.s,"hl: bracket protection size")!==Ie(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ie(e.p,"hl: bracket protection price")!==Ie(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(Ie(i.triggerPx,"hl: triggerPx")!==Ie(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function F1(e){let t=String(e||"").replace(/\/$/,"");if(!T1.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function ol(e){return Ht(e)!=null}function D1(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(ol(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 U1(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(ol(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 Hf(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=jt(n.kind,"kind",48),o=O1[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=F1(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!==R1[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(N1.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=jt(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=Ht(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(D1(c,t),U1(c,l,t),r==="hip4-order"&&!ol(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");$1(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");Uf(u[0],n,l);let f=1;d!=null&&qf(u[f++],n,l,d,"tp"),p!=null&&qf(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");Uf(u[0],n,l)}B1(u[0],n,t),M1(n,t),s=Ie(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=jt(n.usd,"margin usd",64),d=Se(u,6,"hl: margin usd");if(Sn(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=Se(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=L1(f,6)}}if(r==="builder-fee-approval"){let c=jt(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(jt(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=jt(n.maxFeeRate,"maxFeeRate",32);if(jt(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=Se(u.slice(0,-1),12,"hl: builder fee percent"),p=Se(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 T1,N1,O1,R1,jt,jf=xe(()=>{Qn();oa();T1=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),N1=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),O1=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"}),R1=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"}),jt=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function H1(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 ia(e,t={},n={}){let r=String(e?.kind||""),o=q1[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:H1(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 Hf(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 q1,il=xe(()=>{jf();q1=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 j1,JsonRpcProvider as z1}from"ethers";function J1(e){return Y1.test(String(e||""))}async function aa(e,{contract:t=V1,rpc:n=G1,chainId:r=W1,balanceOf:o}={}){if(!J1(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new z1(n,r,{staticNetwork:!0}),a=new j1(t,K1,i);return BigInt(await a.balanceOf(e))}var V1,W1,G1,K1,Y1,al=xe(()=>{V1="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",W1=999,G1="https://rpc.hyperliquid.xyz/evm",K1=["function balanceOf(address owner) view returns (uint256)"],Y1=/^0x[a-fA-F0-9]{40}$/});import{existsSync as X1,readFileSync as Q1,lstatSync as Z1}from"node:fs";import{homedir as zf}from"node:os";import{join as sl}from"node:path";function n_(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Vf,t)?Vf[t]:t_}function s_(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Wf])return String(e[Wf]);let t=e.ORACLE_CONFIG_DIR||sl(zf(),".config","oracle");return sl(t,"fee-recipient")}return sl(zf(),".config","oracle","fee-recipient")}function cl(e=process.env){try{let t=s_(e);if(!X1(t)||Z1(t).isSymbolicLink())return"";let n=Q1(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),e_)}function l_({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[o_]||"").trim(),o=String(e[i_]||a_).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=n_(t),a=c_(e[r_],{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=cl(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 sa({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=l_({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 aa(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Gf(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function Kf(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var e_,t_,Vf,r_,o_,i_,Wf,a_,ca=xe(()=>{al();e_=100,t_=5,Vf=Object.freeze({swap:5,bridge:5,perps:0,nft:0});r_="ORACLE_INTEGRATOR_FEE_BPS",o_="ORACLE_INTEGRATOR_FEE_RECIPIENT",i_="ORACLE_INTEGRATOR_ID",Wf="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",a_="oracle"});var bl={};_i(bl,{HL_BUILDER_ADDRESS_ENV:()=>la,HL_BUILDER_DEFAULT_FEE_BPS:()=>u_,HL_BUILDER_FEE_ENV:()=>ul,HL_BUILDER_FEE_TIERS:()=>ho,HL_BUILDER_MAX_FEE_BPS:()=>ll,HL_PERP_MAX_SIG_FIGS:()=>Yf,HL_PERP_PRICE_DECIMALS:()=>Jf,HL_SIGNATURE_CHAIN_ID:()=>ua,MARGIN_MODE:()=>go,ORDER_TYPES:()=>He,TIF:()=>yo,formatPerpPrice:()=>At,formatPerpSize:()=>eh,hlBuilderFeeBpsForKind:()=>Zf,hlPerpAssetInfo:()=>zt,hlPrepareApproveAgent:()=>y_,hlPrepareBracketOrder:()=>yl,hlPrepareBuilderApproval:()=>fl,hlPrepareCancelOrder:()=>bo,hlPreparePerpOrder:()=>Vt,hlPrepareUpdateIsolatedMargin:()=>gl,hlPrepareUpdateLeverage:()=>hl,resolveBuilderFee:()=>pl});function Xf(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 d_(e,t){let n=Xf(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function p_(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 Qf(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 Zf(e="perp"){if(e==="perp"||e==="main")return ho.perp;if(e==="spot")return ho.spot;if(e==="hip3")return ho.hip3;if(e==="outcome"||e==="hip4")return ho.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function pl({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[la]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${la} must be an EVM address`);let o=cl(e);if(!o||o!==r)return null;let i=e?.[ul],a=Zf(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: ${ul} must be a positive number in 0.1 bps increments`);if(s>ll)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${ll} 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 m_(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 f_(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||aa;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function ml(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 h_(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 ml(r,a,n)}function At(e,t,n={}){let r=Jf-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return ml(h_(e,Yf,n),r,n)}function eh(e,t){let n=ml(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 g_(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 zt(e={},t={}){let n=await rl(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 dl(e,{tif:t=yo.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case He.LIMIT:return{limit:{tif:t}};case He.MARKET:return{limit:{tif:yo.IOC}};case He.STOP_MARKET:case He.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:At(n,o),tpsl:e===He.STOP_MARKET?"sl":"tp"}};case He.STOP_LIMIT:case He.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:At(n,o),tpsl:e===He.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function En(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:ua,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 Zn(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=ia(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 fl(e={},t={}){let n=pl({env:t.env});if(!n)throw new Error(`hl-perps: ${la} 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:ua,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Zn({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...En(o,r,t)},e,t)}function y_(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:ua,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,...En(i,r,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function Vt(e={},t={}){let n=await zt(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=Qf(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=eh(e.size??e.sz,n.szDecimals),s;if(r===He.MARKET){let x=Number(n.markPx);if(!Number.isFinite(x)){let E=await Et(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 b=Number(e.maxSlippageBps??50);if(!Number.isInteger(b)||b<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(b>100)throw new Error(`hl-perps: maxSlippageBps ${b} exceeds the hard 100 bps cap`);let y=o?x*(1+b/1e4):x*(1-b/1e4);s=At(y,n.szDecimals,{roundDown:o});let v=Math.abs(Number(s)/x-1)*1e4;if(v>b+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${v.toFixed(2)} bps from mark, above the ${b} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=At(e.price??e.limitPx,n.szDecimals)}let c=dl(r,{tif:e.tif??(r===He.MARKET?yo.IOC:yo.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=pl({env:t.env,kind:n.kind}),p=await f_(d,e,t),m=p.exempt?null:d,f=await m_(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),w=g_(a,s);return Zn({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,...En(u,g,t)},e,t)}async function bo(e={},t={}){let n=await zt(p_(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=Xf(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Zn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...En(i,Number(e.nonce??Date.now()),t)},e,t)}async function hl(e={},t={}){let n=await zt(e,t),r=d_(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||go.CROSS).toLowerCase();if(o!==go.CROSS&&o!==go.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===go.CROSS,leverage:r};return Zn({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,...En(i,Number(e.nonce??Date.now()),t)},e,t)}async function gl(e={},t={}){let n=await zt(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=Se(o,6,"hl-perps: usd"),a=Qf(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Zn({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...En(s,Number(e.nonce??Date.now()),t)},e,t)}async function yl(e={},t={}){let n=await Vt(e,t),r=await zt(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:At(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:dl(He.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:At(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:dl(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 Zn({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:At(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:At(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...En(a,Number(e.nonce??Date.now()),t)},e,t)}var Yf,Jf,ua,u_,ll,la,ul,ho,He,yo,go,wo=xe(()=>{st();oa();Qn();X();il();al();ca();Yf=5,Jf=6,ua="0x66eee",u_=2,ll=10,la="ORACLE_HL_BUILDER_ADDRESS",ul="ORACLE_HL_BUILDER_FEE_BPS",ho=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"}),yo=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),go=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});import{existsSync as Rb,readFileSync as dO}from"node:fs";import{dirname as Ob,join as Vu}from"node:path";import{fileURLToPath as pO}from"node:url";function mO(e){let t=Ob(pO(e));for(let n=0;n<8;n+=1){let r=Vu(t,"package.json");if(Rb(r))try{let i=JSON.parse(dO(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Ob(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Xa(e,t){let n=mO(t),r=Vu(n,e);return Rb(r)?r:Vu(n,"dist","assets",e)}var Wu=xe(()=>{});import{isAddress as fO}from"ethers";function gO(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:Lb,tag:`v${Lb}`}),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 Qa(e){let t=Ln[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function Qo(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function Zo(e,t){let n=String(e||"");if(!fO(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function $b(e,t){let n=Qa(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");Qo(i,"safe-erc20: supply"),Zo(a,"safe-erc20: initialHolder"),Zo(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(Qo(i,"safe-erc721-drop: cap"),Zo(a,"safe-erc721-drop: treasury"),Qo(s,"safe-erc721-drop: mintPrice"),Qo(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");Zo(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;Zo(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`)}Qo(i,"safe-vesting: durationSeconds")}return n}function Bb(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var Lb,hO,Ln,Za=xe(()=>{Lb="5.0.2",hO={"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"]}};Ln=Object.freeze(Object.fromEntries(Object.entries(hO).map(([e,t])=>[e,gO(e,t)])))});import{spawnSync as Gu}from"node:child_process";import{existsSync as $n,readFileSync as es,readdirSync as Mb,statSync as Fb}from"node:fs";import{join as xt}from"node:path";import{createHash as yO}from"node:crypto";function ns(){return $n(ei)?Mb(ei).filter(e=>Ln[e]&&Fb(xt(ei,e)).isDirectory()).map(e=>{let t=xt(ei,e),n=xt(t,"SECURITY.md");return{id:e,path:t,metadata:Qa(e),securityNotice:$n(n)?es(n,"utf8").slice(0,500):null,disclaimer:ts}}):[]}function Db(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",xt(e,".foundry/bin/forge")];for(let n of t)if(Gu(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function bO(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:Gu("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function xr(e,t,n){let r=Gu(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 wO(e){let t=yO("sha256");function n(r){let o=Fb(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of Mb(r).sort())n(xt(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(es(r)))}return n(e),t.digest("hex")}function ti(e,t={}){let n=Qa(e),r=t.allowSkipStatic!==!1,o=xt(ei,e);if(!$n(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=Db();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(!$n(xt(o,"lib","forge-std"))){let m=xr(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
3
+ ${m.stderr}`)}if(!$n(xt(o,"lib","openzeppelin-contracts"))){let m=xr(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
4
+ ${m.stderr}`)}let a=xt(o,"lib","openzeppelin-contracts","package.json"),s=$n(a)?JSON.parse(es(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=xr(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
5
+ ${c.stderr}`.slice(0,2e3));let l=xr(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
6
6
  ${l.stdout}
7
- ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=tO();if(d){let m=br(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
7
+ ${l.stderr}`.slice(0,2e3));let u={tool:null,ok:!0,skipped:!0,reason:"slither not installed"},d=bO();if(d){let m=xr(d,[".","--filter-paths","lib","--exclude-dependencies"],o);if(u={tool:"slither",ok:m.ok,skipped:!1,stdout:(m.stdout||"").slice(0,1500),stderr:(m.stderr||"").slice(0,500)},!m.ok&&!t.allowStaticFail)throw new Error(`protocol-templates: slither FAILED for ${e}
8
8
  ${m.stdout}
9
- ${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=nO(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:Ja,firmAudit:!1}}function Lb(e,t={}){let n=Qo(e,t),r=Rb(),o=n.path,i=br(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
10
- ${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=xt(o,"out",`${a}.sol`,`${a}.json`);if(!Nn(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(Ya(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 Xo,Ja,Qa=xe(()=>{Du();Ka();Xo=Wa("protocols/templates",import.meta.url),Ja="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 qu}from"node:crypto";import{secp256k1 as Zo}from"@noble/curves/secp256k1.js";import{bech32m as Mb}from"@scure/base";function ot(e,t){throw new Error(`${e}: ${t}`)}function Hb(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||ot("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Hu(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{ot(t,`must be an integer from ${n} to ${r}`)}}function sO(e){let t=String(e||"");if(!t||[...t].some(o=>!Fb.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(Fb.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 Db(e,t){let n=String(e||"").trim(),r=sO(n);return(!r||r.length!==32)&&ot(t,"must be a 32-byte base58 Solana public key"),n}function Ub(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||ot(t,"must be a compressed secp256k1 public key");try{Zo.Point.fromHex(n)}catch{ot(t,"must encode a valid secp256k1 curve point")}return n}function cO(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}ot("bitcoin-tapscript-vault","script too large")}function zu(e,t){let n=qu("sha256").update(e).digest();return qu("sha256").update(n).update(n).update(t).digest()}function qb(e){return zu("TapLeaf",Buffer.concat([Buffer.from([192]),cO(e.length),e]))}function lO(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return zu("TapBranch",Buffer.concat([n,r]))}function Za(e){return Zo.Point.fromHex(e).x.toString(16).padStart(64,"0")}function jb(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function uO(e,t){let n=[];return e.forEach((r,o)=>n.push(jb(Za(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function dO(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 pO(e,t){return Buffer.concat([dO(t),Buffer.from([178,117]),jb(Za(e)),Buffer.from([172])])}function mO(e,t,n){let r=Zo.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${zu("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%Zo.Point.Fn.ORDER,s=o.add(Zo.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:Mb.encode(l,[1,...Mb.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function dt(e,t){return Object.freeze({path:e,content:t.endsWith(`
9
+ ${m.stderr}`.slice(0,2e3))}else if(!r)throw new Error("protocol-templates: slither required (allowSkipStatic=false) but not installed");let p=wO(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:ts,firmAudit:!1}}function Ub(e,t={}){let n=ti(e,t),r=Db(),o=n.path,i=xr(r,["build","-q"],o);if(!i.ok)throw new Error(`protocol-templates: forge build failed
10
+ ${i.stderr}`.slice(0,1500));let a=n.metadata.contractName;if(t.contractName&&t.contractName!==a)throw new Error(`protocol-templates: fixed contract name is ${a}`);let s=xt(o,"out",`${a}.sol`,`${a}.json`);if(!$n(s))throw new Error(`protocol-templates: artifact missing at ${s}`);let c=JSON.parse(es(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 ei,ts,rs=xe(()=>{Wu();Za();ei=Xa("protocols/templates",import.meta.url),ts="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 Ku}from"node:crypto";import{secp256k1 as ni}from"@noble/curves/secp256k1.js";import{bech32m as jb}from"@scure/base";function ot(e,t){throw new Error(`${e}: ${t}`)}function Kb(e){let t=String(e||"").trim();return/^[a-z][a-z0-9_]{1,47}$/.test(t)||ot("native protocol","projectName must be 2-48 lowercase snake_case characters"),t}function Yu(e,t,{min:n=0n,max:r=18446744073709551615n}={}){try{let o=BigInt(e);if(o<n||o>r)throw new Error;return o}catch{ot(t,`must be an integer from ${n} to ${r}`)}}function EO(e){let t=String(e||"");if(!t||[...t].some(o=>!zb.includes(o)))return null;let n=0n;for(let o of t)n=n*58n+BigInt(zb.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 Vb(e,t){let n=String(e||"").trim(),r=EO(n);return(!r||r.length!==32)&&ot(t,"must be a 32-byte base58 Solana public key"),n}function Wb(e,t){let n=String(e||"").trim().toLowerCase();/^(02|03)[0-9a-f]{64}$/.test(n)||ot(t,"must be a compressed secp256k1 public key");try{ni.Point.fromHex(n)}catch{ot(t,"must encode a valid secp256k1 curve point")}return n}function IO(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}ot("bitcoin-tapscript-vault","script too large")}function Xu(e,t){let n=Ku("sha256").update(e).digest();return Ku("sha256").update(n).update(n).update(t).digest()}function Gb(e){return Xu("TapLeaf",Buffer.concat([Buffer.from([192]),IO(e.length),e]))}function AO(e,t){let[n,r]=Buffer.compare(e,t)<=0?[e,t]:[t,e];return Xu("TapBranch",Buffer.concat([n,r]))}function os(e){return ni.Point.fromHex(e).x.toString(16).padStart(64,"0")}function Yb(e){return Buffer.concat([Buffer.from([32]),Buffer.from(e,"hex")])}function _O(e,t){let n=[];return e.forEach((r,o)=>n.push(Yb(os(r)),Buffer.from([o===0?172:186]))),n.push(Buffer.from([80+t,156])),Buffer.concat(n)}function PO(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 CO(e,t){return Buffer.concat([PO(t),Buffer.from([178,117]),Yb(os(e)),Buffer.from([172])])}function TO(e,t,n){let r=ni.Point.fromHex(e),o=r.y&1n?r.negate():r,i=Buffer.from(o.x.toString(16).padStart(64,"0"),"hex"),a=BigInt(`0x${Xu("TapTweak",Buffer.concat([i,t])).toString("hex")}`)%ni.Point.Fn.ORDER,s=o.add(ni.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:jb.encode(l,[1,...jb.toWords(c)],90),scriptPubKey:`5120${c.toString("hex")}`,outputKey:c.toString("hex"),internalKey:i.toString("hex")}}function dt(e,t){return Object.freeze({path:e,content:t.endsWith(`
11
11
  `)?t:`${t}
12
- `})}function fO(e){let t=qu("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 hO(e){let t=Hb(e.projectName),n=Db(e.authority,"solana-safe-vault authority"),r=Hu(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||ot("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=Db(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&ot("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
12
+ `})}function NO(e){let t=Ku("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 OO(e){let t=Kb(e.projectName),n=Vb(e.authority,"solana-safe-vault authority"),r=Yu(e.unlockDelaySlots,"solana-safe-vault unlockDelaySlots",{min:1n}),o=String(e.network||"devnet");["localnet","devnet","testnet","mainnet-beta"].includes(o)||ot("solana-safe-vault network","must be localnet, devnet, testnet, or mainnet-beta");let i=Vb(e.programId,"solana-safe-vault programId");i==="11111111111111111111111111111111"&&ot("solana-safe-vault programId","must not be the System Program placeholder");let a=`use anchor_lang::prelude::*;
13
13
  use anchor_lang::system_program::{transfer, Transfer};
14
14
 
15
15
  declare_id!("${i}");
@@ -131,21 +131,21 @@ anchor-lang = "0.31.1"
131
131
  - Unlock delay: ${r} slots after the most recent deposit
132
132
  - No upgrade authority is created by this source; deployment authority handling is external
133
133
  - Run \`anchor build\`, \`anchor test\`, program simulation, and independent review before deployment
134
- `)];return{family:"solana",network:o,projectName:t,protocolModel:es["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:ju},deploymentPrepared:!1}}function gO(e){let t=Hb(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||ot("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>Ub(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&ot("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Hu(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=Ub(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&ot("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=Hu(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(Za).join(",")})`,c=`and_v(v:older(${a}),pk(${Za(i)}))`,l=`taproot_tree(${s},${c})`,u=uO(r,o),d=pO(i,Number(a)),p=lO(qb(u),qb(d)),m=mO(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[dt("policy/miniscript.txt",l),dt("policy/descriptor.txt",f),dt("policy/manifest.json",JSON.stringify(h,null,2)),dt("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)),dt("SECURITY.md",`# Security model
134
+ `)];return{family:"solana",network:o,projectName:t,protocolModel:is["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:Ju},deploymentPrepared:!1}}function RO(e){let t=Kb(e.projectName),n=String(e.network||"testnet");["regtest","signet","testnet","mainnet"].includes(n)||ot("bitcoin-tapscript-vault network","must be regtest, signet, testnet, or mainnet");let r=Array.isArray(e.signerPubkeys)?e.signerPubkeys.map((w,x)=>Wb(w,`signerPubkeys[${x}]`)):[];(r.length<2||r.length>15||new Set(r).size!==r.length)&&ot("bitcoin-tapscript-vault signerPubkeys","must contain 2-15 unique compressed public keys");let o=Number(Yu(e.threshold,"bitcoin-tapscript-vault threshold",{min:1n,max:BigInt(r.length)})),i=Wb(e.recoveryPubkey,"bitcoin-tapscript-vault recoveryPubkey");r.includes(i)&&ot("bitcoin-tapscript-vault recoveryPubkey","must be distinct from signer keys");let a=Yu(e.recoveryDelayBlocks,"bitcoin-tapscript-vault recoveryDelayBlocks",{min:1n,max:65535n}),s=`multi_a(${o},${r.map(os).join(",")})`,c=`and_v(v:older(${a}),pk(${os(i)}))`,l=`taproot_tree(${s},${c})`,u=_O(r,o),d=CO(i,Number(a)),p=AO(Gb(u),Gb(d)),m=TO(r[0],p,n),f=`tr(${m.internalKey},{${s},${c}})`,h={version:1,name:t,network:n,descriptorType:"tr",threshold:o,signerPubkeys:r,recoveryPubkey:i,recoveryDelayBlocks:Number(a),miniscript:l,cooperativeMiniscript:s,recoveryMiniscript:c,descriptor:f,address:m.address,scriptPubKey:m.scriptPubKey},g=[dt("policy/miniscript.txt",l),dt("policy/descriptor.txt",f),dt("policy/manifest.json",JSON.stringify(h,null,2)),dt("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)),dt("SECURITY.md",`# Security model
135
135
 
136
136
  - Cooperative path: ${o}-of-${r.length}
137
137
  - Recovery path: ${i} after ${a} blocks (BIP68 relative locktime)
138
138
  - This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
139
139
  - Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
140
- `)];return{family:"bitcoin",network:n,projectName:t,protocolModel:es["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:ju},psbtPrepared:!1,fundingPrepared:!1}}function ei(){return Object.values(es).map(e=>({...e,disclaimer:ju}))}async function ti(e={}){let t=String(e.templateId||"").trim(),n=es[t];n||ot("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?hO(e):gO(e),o=fO(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 ju,Fb,es,Vu=xe(()=>{Q();ju="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",Fb="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",es=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 Os from"node:fs";import TM from"node:os";import $r from"node:path";import{fileURLToPath as NM}from"node:url";function Qk(){return process.env.ORACLE_FAKE_HOME||TM.homedir()}function RM(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Rs(){return RM()?process.env.ORACLE_CONFIG_DIR||$r.join(Qk(),".config","oracle"):$r.join(Qk(),".config","oracle")}function LM(){return $r.join(Rs(),"desk.json")}function $M(){return $r.join(Rs(),"env")}function Lr({force:e=!1}={}){if(Lr._done&&!e)return Lr._result||null;Lr._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=$M();if(Os.existsSync(o))for(let i of Os.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=LM();if(Os.existsSync(o)){let i=JSON.parse(Os.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)),Lr._result=Object.keys(t).length?t:null,Lr._result}var OM,y9,Zk=xe(()=>{OM=$r.dirname(NM(import.meta.url)),y9=$r.resolve(OM,"../..");try{Lr()}catch{}});var kp={};Si(kp,{armPreparedAction:()=>jM,callSigner:()=>eE,queueOwnerAction:()=>tE});import{existsSync as BM,readFileSync as MM}from"node:fs";import{request as FM}from"node:http";import DM from"node:path";function qM(e=process.env){let t=String(e.ORACLE_SIGNER_URL||UM).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 HM(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=DM.join(Rs(),"signer","signer-token");return BM(t)?MM(t,"utf8").trim():null}function eE(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=qM(r),a=HM(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=FM({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 tE(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return eE("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function jM(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 tE(n,t)}var UM,Ep=xe(()=>{Zk();UM="http://127.0.0.1:9462"});var HE={};Si(HE,{CONTRACTS_EVAL_HERE:()=>x4,runContractsEval:()=>w4});import Us from"node:fs";import ln from"node:path";import{spawnSync as a4}from"node:child_process";import{fileURLToPath as s4}from"node:url";function h4(){let e=process.env.HOME||"";for(let t of["forge",ln.join(e,".foundry/bin/forge")])if(a4(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function qE(e,t=[]){if(!Us.existsSync(e))return t;for(let n of Us.readdirSync(e)){let r=ln.join(e,n);if(Us.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;qE(r,t)}else n.endsWith(".sol")&&!r.includes(`${ln.sep}lib${ln.sep}`)&&t.push(r)}return t}function g4(){let e=[];for(let t of Object.keys(Tn)){let n=ln.join(c4,t),r=qE(ln.join(n,"src")),o=[];for(let i of r){let a=Us.readFileSync(i,"utf8");for(let s of l4)s.test(a)&&o.push(`${ln.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function y4(){return h4()?Object.keys(Tn).map(e=>{try{let t=Qo(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(Tn).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function b4(){let e=[],t=ei();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 ti({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:u4,programId:d4,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 ti({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[p4,m4],recoveryPubkey:f4,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 w4(){let e=g4(),t=y4(),n=await b4(),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 c4,l4,u4,d4,p4,m4,f4,x4,jE=xe(()=>{Ka();Qa();Vu();Du();c4=Wa("protocols/templates",import.meta.url),l4=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],u4="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",d4="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",p4="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",m4="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",f4="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";x4=ln.dirname(s4(import.meta.url))});he();import{Interface as pm,getAddress as Wr,isAddress as mm}from"ethers";L();var xI=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function Zp(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 oc(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=Zp(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)||xI.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 em(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&Zp(e,n[0]).address||null}var vI="https://api.dexscreener.com",SI=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(),kI=e=>Array.isArray(e)?e:e==null?[]:[e];function EI(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 II(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ai(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||vI).replace(/\/$/,"")}async function tm(e={}){let n=(await E(`${Ai(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function mn(e,t={}){if(!e)throw new Error("tokenAddress required");return E(`${Ai(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function zr(e,t={}){if(!e)throw new Error("query required");return E(`${Ai(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 E(`${Ai(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function rm({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Vr({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Vr({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(SI[Number(e)]||e),a=new Set(kI(r).filter(Boolean).map(at)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>mn(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=>EI(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:II(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}import{createHash as TI,createHmac as am,timingSafeEqual as NI}from"node:crypto";import{readFileSync as _I}from"node:fs";import{homedir as PI}from"node:os";import{join as _i}from"node:path";function CI(){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=PI();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||_i(t,".config","oracle")).trim();return[e,_i(n,"exec.env")].filter(Boolean)}return[e,_i(t,".config","oracle","exec.env"),_i(t,".config","mad-desk","exec.env")].filter(Boolean)}function om(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of CI())try{let i=_I(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 Pi=100,im=2e4;function Ci(e){return Array.isArray(e)?`[${e.map(Ci).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ci(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function sm(e,{required:t=!1}={}){try{return om(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function ac(e){let{signature:t,...n}=e;return n}function cm(e,{secret:t}={}){let n=sm(t);return n?{...e,signature:am("sha256",n).update(Ci(ac(e))).digest("hex")}:e}function OI(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 TI("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=sm(o);if(i){let m=am("sha256",i).update(Ci(ac(e))).digest("hex");if(!RI(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>Pi||!Number.isInteger(s)||s<0||s>Pi||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=$I(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 cm({...ac(e),calldataHash:OI(r)},{secret:o})}function RI(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:NI(n,r)}function ic(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function LI(e){let t=e==null?Pi: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,Pi)}function De({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=ic(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(ic(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,ic(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=LI(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=im,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)||im)),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 cm({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 $I(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}}Q();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"}},HI=[100,500,3e3,1e4],jI="0xddca3f43",Ti=new pm(["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)"]),dm=new pm(["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)"]),fm="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",hm="0x0000000000000000000000000000000000000000",uc=[100,500,2500,1e4],zI={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uc}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uc}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:uc}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function pc(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=zI[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 dc(e,t){let n=ze[Number(t)];if(!e||e===fm||e===hm||/^eth$/i.test(String(e)))return Wr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Wr(n.weth);if(/^usdc$/i.test(r))return Wr(n.usdc);if(!mm(r))throw new Error(`invalid token address: ${e}`);return Wr(r)}function VI(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 WI(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 Hn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=pc(e.chainId??8453,e.venue),a=dc(e.tokenIn||"WETH",n),s=dc(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:HI,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let k of u){let S=Ti.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:k,sqrtPriceLimitX96:0n}]);try{let I=await D(n,"eth_call",[{to:r,data:S},"latest"],t);if(!I||I==="0x"){d.push({fee:k,ok:!1,error:"empty result"});continue}let P=Ti.decodeFunctionResult("quoteExactInputSingle",I),_={fee:k,ok:!0,amountOut:P[0].toString(),sqrtPriceX96After:P[1].toString(),initializedTicksCrossed:Number(P[2]),gasEstimate:P[3].toString()};d.push(_),(!p||BigInt(_.amountOut)>BigInt(p.amountOut))&&(p=_)}catch(I){d.push({fee:k,ok:!1,error:String(I.message||I).slice(0,160)})}}if(!p){let k=d.map(S=>`${S.fee}:${S.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${k}`)}let m=e.liquidityUsd==null?await Vr({chainId:n,tokenA:a,tokenB:s,dexIds:VI(e.venue)},t).catch(()=>[]):[],f={};for(let k of m.slice(0,8))if(!(!k.pairAddress||!mm(k.pairAddress)))try{let S=await D(n,"eth_call",[{to:k.pairAddress,data:jI},"latest"],t),I=S&&S!=="0x"&&S.length<=66?Number.parseInt(S,16):NaN;if(!Number.isFinite(I)||I<=0||I>1e6)continue;(f[I]==null||k.liquidityUsd>f[I].liquidityUsd)&&(f[I]=k)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),I=d.filter(P=>P.ok&&Number((k-BigInt(P.amountOut))*10000n/k)<=h).filter(P=>f[P.fee]?.liquidityUsd!=null).sort((P,_)=>f[_.fee].liquidityUsd-f[P.fee].liquidityUsd)[0];I&&I.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:I.fee,chosenPoolUsd:f[I.fee].liquidityUsd,bandBps:h},p=I)}let w=f[p.fee]??null,x=m[0]??null,b=w??x,y=e.liquidityUsd??w?.liquidityUsd??x?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":w?"pool":x?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:ze[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:b,liquidityAttribution:v,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:y,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function gm(e={},t={}){let{chainId:n,quoter:r,router:o}=pc(e.chainId??8453),i=(e.tokens||[]).map(p=>dc(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=WI(i,a),l=Ti.encodeFunctionData("quoteExactInput",[c,s]),u=await D(n,"eth_call",[{to:r,data:l},"latest"],t),d=Ti.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 mc(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Hn({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 ym(e={},t={}){let n=Number(e.chainId??8453),r=pc(n,e.venue),o=Wr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===fm||i===hm||/^eth$/i.test(i),s=await Hn(e,t),c=dm.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=dm.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 bm(e={}){let t=Number(e.chainId??8453);try{let n=await mc({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 wm(){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 KI,Interface as fc,getAddress as ht,isAddress as hc,keccak256 as YI}from"ethers";Q();var Gr=KI.defaultAbiCoder(),Oe="0x0000000000000000000000000000000000000000",gt={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},vm=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Oi=new fc(["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)"]),JI=new fc(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Ni=new fc(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),xm=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"]]),XI=(1n<<14n)-1n,gc=8388608;function Sm(e){let t=Jr(e),n=Number(BigInt(t)&XI),r=Object.fromEntries(xm.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(xm.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var QI="0x10",ZI="0x060c0f",eA="0x000000000022D473030F116dDEE9F6B43aC78BA3",tA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Yr(e){let t=Number(e),n=gt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(gt).join(", ")})`);return{chainId:t,...n}}function Jr(e){if(e==null||e==="")return Oe;let t=String(e);if(!hc(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return ht(t)}function jn(e,t){let n=gt[Number(t)];if(Kr(e))return ht(n.weth);let r=String(e);if(/^weth$/i.test(r))return ht(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return ht(n.usdc);if(!hc(r))throw new Error(`invalid token address: ${e}`);return ht(r)}function Kr(e){let t=String(e||"").trim().toLowerCase();return!t||t===tA.toLowerCase()||t===Oe.toLowerCase()||t==="eth"}function yc({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=ht(e),a=ht(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=Jr(o);return YI(Gr.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function bc({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=ht(e),a=ht(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:Jr(o)},zeroForOne:l}}function nA({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Sm(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!==Oe&&(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===Oe&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Oe&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Oe&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Oe,returnsDelta:i,reasons:Object.freeze(s)})}async function km(e={},t={}){let n=Yr(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=jn(e.tokenIn||"WETH",n.chainId),o=jn(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=Jr(e.hooks),{poolKey:c}=bc({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=yc(c),u=t.rpcCall||D,d=Ni.encodeFunctionData("getSlot0",[l]),p=Ni.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===Oe?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=Ni.decodeFunctionResult("getSlot0",m),w=Ni.decodeFunctionResult("getLiquidity",f)[0],x=g[0],b=x>0n,y=s===Oe?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&gc),k=nA({hook:s,codePresent:y,initialized:b,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:b,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:y,codeBytes:y?(h.length-2)/2:0,permissions:Sm(s)}),risk:k})}var Em=["uniswap-v4","uniswapv4"];async function Xr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Yr(e.chainId??8453),a=jn(e.tokenIn||"WETH",n),s=jn(e.tokenOut||gt[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...vm],u=e.hooks||Oe,d=[],p=null;for(let S of l){let{poolKey:I,zeroForOne:P}=bc({tokenIn:a,tokenOut:s,fee:S.fee,tickSpacing:S.tickSpacing,hooks:u}),_=Oi.encodeFunctionData("quoteExactInputSingle",[{poolKey:I,zeroForOne:P,exactAmount:c,hookData:"0x"}]);try{let T=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:_},"latest"],t);if(!T||T==="0x"){d.push({...S,ok:!1,error:"empty result"});continue}let $=Oi.decodeFunctionResult("quoteExactInputSingle",T),U={fee:S.fee,tickSpacing:S.tickSpacing,ok:!0,amountOut:$[0].toString(),gasEstimate:$[1].toString(),poolKey:I,zeroForOne:P,poolId:yc({...I})};d.push(U),(!p||BigInt(U.amountOut)>BigInt(p.amountOut))&&(p=U)}catch(T){d.push({...S,ok:!1,error:String(T.message||T).slice(0,160)})}}if(!p){let S=d.map(I=>`${I.fee}/${I.tickSpacing}:${I.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${S}`)}let m=e.liquidityUsd==null?await Vr({chainId:n,tokenA:a,tokenB:s,dexIds:Em},t).catch(()=>[]):[],f=new Map;for(let S of m){let I=String(S.pairAddress||"").toLowerCase();I&&f.set(I,S)}let h=S=>f.get(String(S.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let S=BigInt(p.amountOut),P=d.filter(_=>_.ok&&Number((S-BigInt(_.amountOut))*10000n/S)<=g).filter(_=>h(_)?.liquidityUsd!=null).sort((_,T)=>h(T).liquidityUsd-h(_).liquidityUsd)[0];P&&P.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:P.fee,chosenPoolUsd:h(P).liquidityUsd,bandBps:g},p=P)}let x=h(p),b=m[0]??null,y=x??b,v=e.liquidityUsd??x?.liquidityUsd??b?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":x?"pool":b?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:v,liquiditySource:y,liquidityAttribution:k,liquidityPick:w,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&hc(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&&!Kr(e.tokenIn)&&!Kr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Oe&&!(p.fee&gc)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Im(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Yr(e.chainId??8453),a=jn(e.tokenIn||"WETH",n),s=jn(e.tokenOut||gt[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...vm],u=e.hooks||Oe,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=bc({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),w=Oi.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let b=Oi.decodeFunctionResult("quoteExactOutputSingle",x),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:b[0].toString(),gasEstimate:b[1].toString(),poolKey:h,zeroForOne:g,poolId:yc({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await rm({chainId:n,tokenA:a,tokenB:s,dexIds:Em},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Am(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(y=>Object.hasOwn(e,y)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=Yr(r);if(Jr(e.hooks)!==Oe)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&gc)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=ht(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(Kr(e.tokenIn)||Kr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Xr(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=Gr.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=Gr.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=Gr.encode(["address","uint256"],[l.tokenOut,u]),g=Gr.encode(["bytes","bytes[]"],[ZI,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,b=JI.encodeFunctionData("execute",[QI,[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:eA,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:b,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function _m(){return Object.entries(gt).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Pm(e={}){let t=Yr(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}}L();import{readFileSync as sA,existsSync as cA}from"node:fs";import{getAddress as lA,Interface as Li,TypedDataEncoder as Sc,parseUnits as uA}from"ethers";var Cm="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:Tm(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([Tm(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[Cm]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Cm}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Tm(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}Q();var oA=/^(0|[1-9][0-9]*)$/,wc=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function hn(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(!oA.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 iA(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function aA(e={}){return e.maxFeePerGas!=null?hn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?hn(e.gasPrice,"gasPrice"):null}function xc(e={}){try{let t=iA(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=hn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=hn(n.gasLimit??n.gas,"gasLimit"),s=aA(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=hn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=hn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:hn(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 Nm(e={}){let t=xc(e);if(!t.ok)throw new wc(t);return t}var dA="https://api.opensea.io/api/v2",pA="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)",mA=new Li([`function ${pA}`]),Ri=new Li(["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"]),fA=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"]),hA=new Set(fA),Mm=new Set(["solana","flow"]),Qr="0x0000000000000000000000000000000000000000";function gA(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!cA(e))return"";try{for(let t of sA(e,"utf8").split(`
141
- `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function kt(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||gA()}function Fm(e={}){return Ve({provider:"opensea",defaultUrl:dA,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function gn(e={}){return Fm(e).baseUrl}function yn(e={}){return Ue({accept:"application/json"},{"x-api-key":kt(e)},Fm(e).trusted)}function Dm(e){let t=String(e||"ethereum").trim().toLowerCase();if(!hA.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function X(e,t="address"){try{return lA(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Um(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Mm.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return X(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 yA(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 bA(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 Om(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 wA(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 qm(e={}){if(!kt(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await eo("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 eo(e,t={}){if(!e)throw new Error("collection slug required");if(!kt(t))throw new Error("OPENSEA_API_KEY required");return E(`${gn(t)}/collections/${encodeURIComponent(e)}`,{headers:yn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Hm(e,t={}){let n=await eo(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 to(e={},t={}){if(!kt(t))throw new Error("OPENSEA_API_KEY required");let n=Dm(e.chain),r=Um(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(`${gn(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 E(l.toString(),{headers:yn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(wA(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 $i(e={},t={}){if(!kt(t))throw new Error("OPENSEA_API_KEY required");let n=Um(e.address||e.owner),r=await E(`${gn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:yn(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 Bi=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 no(e){let t=String(e||"").trim().toLowerCase(),n=Bi[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 xA(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 Zr(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function jm(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 zm(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 vA(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function SA(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=X(e?.token,t);if(n===0&&r!==Qr)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===Qr)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function kA(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 vc(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(vA);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=SA(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+=kA(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var EA=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 Rm(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 Vm(e,t){return{itemType:Number(We(e?.itemType,`${t} itemType`)),token:X(e?.token,`${t} token`),identifierOrCriteria:We(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:We(e?.startAmount,`${t} startAmount`),endAmount:We(e?.endAmount,`${t} endAmount`)}}function IA(e,t){return{...Vm(e,t),recipient:X(e?.recipient,`${t} recipient`)}}function AA(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:X(e.offerer,`${t} offerer`),zone:X(e.zone,`${t} zone`),offer:n.map((o,i)=>Vm(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>IA(o,`${t} consideration[${i}]`)),orderType:Number(We(e.orderType,`${t} orderType`)),startTime:We(e.startTime,`${t} startTime`),endTime:We(e.endTime,`${t} endTime`),zoneHash:Rm(e.zoneHash,`${t} zoneHash`),salt:We(e.salt,`${t} salt`),conduitKey:Rm(e.conduitKey,`${t} conduitKey`),counter:We(e.counter,`${t} counter`)}}function Wm(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=AA(t,n);if(Sc.hashStruct("OrderComponents",EA,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function Gm(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=X(e?.token,`${t} contract`),o=Zr(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 _A(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 Gm(r[0],`${t} offer NFT`)}function PA(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=Gm(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 CA(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&X(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 TA(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 Km(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=zm(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&TA(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function NA(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(Bi[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=_A(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;CA(e.asset,s,c,"listing");let l=qe(e.price?.current?.value,"listing price",{positive:!0}),u=Wm(e,i,"listing"),d=vc(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:X(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:Km(e,i,n,"listing"),counter:We(i?.counter,"listing counter")}}async function kc(e={},t={}){if(!kt(t))throw new Error("OPENSEA_API_KEY required");let n=no(e.chain);n.contract=e.contract?X(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(`${gn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await E(i.toString(),{headers:yn(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=>NA(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Mi(e={},t={}){let n=Zr(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 kc({...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 OA(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=PA(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=vc(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=vc(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:Wm(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:X(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:Km(e,i,r,"offer"),counter:We(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function Fi(e={},t={}){if(!kt(t))throw new Error("OPENSEA_API_KEY required");let n=no(e.chain);n.contract=e.contract?X(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=Zr(e.tokenId),i=await E(`${gn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:yn(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 OA(a,n,o,s)}function RA(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 Ym(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"&&Ym(n))}function Jm(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function Xm(e){return!e||typeof e!="object"?!1:Jm(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&Xm(t))}function Qm(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"&&Qm(o,t,n);return t}function Lm(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function Zm(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(Jm(e))throw new Error("opensea: signed transaction material refused");if((e.from?X(Lm(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=X(Lm(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=mA.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=xA(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function Di(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 Ec(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=Di(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(he(),Ii)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(he(),Ii)),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 LA(e,t){if(Ym(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(Xm(e))throw new Error("opensea: signed transaction material refused");let n=Qm(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=>Zm(r,t))}function $A(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 ef(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function tf(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function BA(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=X(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function Ui(e={},t={}){if(!kt(t))throw new Error("OPENSEA_API_KEY required");RA(e);let{chain:n,chainId:r}=no(e.chain),o=X(e.buyer||e.minter||e.address,"buyer"),i=X(e.contract,"NFT contract"),a=jm(e.quantity),s=qe(e.priceWei,"priceWei"),c=qe(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=zm(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 eo(d,t),m=BA(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await E(`${gn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:yn(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=>X(O,"SeaDrop mint target"))),b=LA(h,{buyer:o,chainId:r,targets:x});if(b.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,v,k=null,S;try{y=Ri.decodeFunctionData("mintPublic",b[0].data),v="public",S=Ri.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Ri.decodeFunctionData("mintAllowList",b[0].data),v="allowlist";let O=y[4],j=[...y[5]].map(String);if(j.length<1||j.length>64||j.some(Se=>!/^0x[0-9a-fA-F]{64}$/.test(Se)))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=Ri.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,j]),k={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=X(y[0],"mint NFT contract"),P=X(y[1],"mint fee recipient"),_=X(y[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(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(S.toLowerCase()!==b[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=b.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 $=await Ec(b,r,{...t,provider:e.provider||t.provider});if($.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=Nm({chainId:r,tx:b[0],policy:U});return $A({action:"mint",mintType:v,...k?{stage:k}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:T.toString(),maxTotalWei:c.toString(),mintTarget:b[0].to,feeRecipient:P,expiry:u,transactions:b.map(Di),gasWar:H,...$},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+lc,Date.parse(u),k?Number(BigInt(k.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function MA(e={}){let t=Dm(e.chain);if(Mm.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Om(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Om(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:X(e.contract,"NFT contract"),token_id:o,quantity:bA(e.quantity??1,"quantity"),price:{amount:yA(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:X(e.price?.currency??e.currency??Qr,"price currency")},start_time:n.text,end_time:r.text}}var zn={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"}]},$m=new Li(["function setApprovalForAll(address operator,bool approved)"]),FA=new Li(["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 Bm(e,t){return e?.[t]||(e?.action===t?e:null)}function DA(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(b=>Bm(b,"createListingsAction")).find(Boolean)||o.find(b=>/createListings/i.test(String(b?.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=X(c.verifyingContract,"listing protocol"),u=s.message;if(X(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(X(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 b of u.consideration){if(Number(b.itemType)!==0||X(b.token,"listing payment token")!==Qr)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(b.startAmount),v=BigInt(b.endAmount);if(y<=0n||y!==v)throw new Error("opensea: listing consideration must be fixed and positive");X(b.recipient,"listing consideration recipient"),p+=y}let m=uA(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=Sc.hashStruct("OrderComponents",zn,u),w=o.map(b=>Bm(b,"itemApprovalAction")).find(Boolean)||o.find(b=>/setApprovalForAll/i.test(String(b?.action||""))),x=null;if(w){let b=w.transaction||w.itemApprovalAction?.transaction,y=Zm(b,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=$m.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let k=X(v[0],"listing approval operator");if(v[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if($m.encodeFunctionData("setApprovalForAll",[k,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:k}}return{protocolAddress:l,typedData:{domain:c,types:zn,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function qi(e={},t={}){if(!kt(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=X(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(MA);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=X(e.taker,"taker"));let c=await E(`${gn(t)}/listings/actions`,{method:"POST",headers:yn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=no(o[0].chain),u=DA(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await Ec(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(Di),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 nf(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=no(e.chain),o=X(e.seller||e.address||e.owner,"seller"),i=X(e.protocolAddress,"reviewed Seaport protocol address"),a=X(e.contract,"NFT contract"),s=Zr(e.tokenId),c=jm(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(zn)){let _=l.types?.[I];if(!Array.isArray(_)||_.length!==P.length||_.some((T,$)=>T?.name!==P[$].name||T?.type!==P[$].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(I=>I!=="EIP712Domain").sort().join(",")!==Object.keys(zn).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=X(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(X(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(X(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(Zr(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||X(I.token,"cancellation payment token")!==Qr)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");X(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 b=Sc.hashStruct("OrderComponents",zn,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==b.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=FA.encodeFunctionData("cancel",[[m]]),k=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],S=await Ec(k,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:b,typedData:{domain:d,types:zn,primaryType:"OrderComponents",message:m},transactions:k.map(Di),...S,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}he();var Hi=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"}),qA=/^0x[0-9a-fA-F]{40}$/;function HA(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}qA.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))Hi.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 jA(e){let{ok:t,errors:n,warnings:r}=HA(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
140
+ `)];return{family:"bitcoin",network:n,projectName:t,protocolModel:is["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:Ju},psbtPrepared:!1,fundingPrepared:!1}}function ri(){return Object.values(is).map(e=>({...e,disclaimer:Ju}))}async function oi(e={}){let t=String(e.templateId||"").trim(),n=is[t];n||ot("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?OO(e):RO(e),o=NO(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 Ju,zb,is,Qu=xe(()=>{X();Ju="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",zb="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",is=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 Ms from"node:fs";import GM from"node:os";import Mr from"node:path";import{fileURLToPath as KM}from"node:url";function oE(){return process.env.ORACLE_FAKE_HOME||GM.homedir()}function JM(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Fs(){return JM()?process.env.ORACLE_CONFIG_DIR||Mr.join(oE(),".config","oracle"):Mr.join(oE(),".config","oracle")}function XM(){return Mr.join(Fs(),"desk.json")}function QM(){return Mr.join(Fs(),"env")}function Br({force:e=!1}={}){if(Br._done&&!e)return Br._result||null;Br._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=QM();if(Ms.existsSync(o))for(let i of Ms.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=XM();if(Ms.existsSync(o)){let i=JSON.parse(Ms.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)),Br._result=Object.keys(t).length?t:null,Br._result}var YM,K9,iE=xe(()=>{YM=Mr.dirname(KM(import.meta.url)),K9=Mr.resolve(YM,"../..");try{Br()}catch{}});var Tp={};_i(Tp,{armPreparedAction:()=>aF,callSigner:()=>aE,queueOwnerAction:()=>sE});import{existsSync as ZM,readFileSync as eF}from"node:fs";import{request as tF}from"node:http";import nF from"node:path";function oF(e=process.env){let t=String(e.ORACLE_SIGNER_URL||rF).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 iF(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=nF.join(Fs(),"signer","signer-token");return ZM(t)?eF(t,"utf8").trim():null}function aE(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=oF(r),a=iF(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=tF({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 sE(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return aE("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function aF(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 sE(n,t)}var rF,Np=xe(()=>{iE();rF="http://127.0.0.1:9462"});var oI={};_i(oI,{CONTRACTS_EVAL_HERE:()=>X4,runContractsEval:()=>J4});import Ws from"node:fs";import pn from"node:path";import{spawnSync as M4}from"node:child_process";import{fileURLToPath as F4}from"node:url";function W4(){let e=process.env.HOME||"";for(let t of["forge",pn.join(e,".foundry/bin/forge")])if(M4(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function rI(e,t=[]){if(!Ws.existsSync(e))return t;for(let n of Ws.readdirSync(e)){let r=pn.join(e,n);if(Ws.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;rI(r,t)}else n.endsWith(".sol")&&!r.includes(`${pn.sep}lib${pn.sep}`)&&t.push(r)}return t}function G4(){let e=[];for(let t of Object.keys(Ln)){let n=pn.join(D4,t),r=rI(pn.join(n,"src")),o=[];for(let i of r){let a=Ws.readFileSync(i,"utf8");for(let s of U4)s.test(a)&&o.push(`${pn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function K4(){return W4()?Object.keys(Ln).map(e=>{try{let t=ti(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(Ln).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function Y4(){let e=[],t=ri();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 oi({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:q4,programId:H4,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 oi({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[j4,z4],recoveryPubkey:V4,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 J4(){let e=G4(),t=K4(),n=await Y4(),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 D4,U4,q4,H4,j4,z4,V4,X4,iI=xe(()=>{Za();rs();Qu();Wu();D4=Xa("protocols/templates",import.meta.url),U4=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],q4="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",H4="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",j4="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",z4="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",V4="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";X4=pn.dirname(F4(import.meta.url))});he();import{Interface as xm,getAddress as Kr,isAddress as vm}from"ethers";L();var BI=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"]);function sm(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 uc(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=sm(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)||BI.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&&sm(e,n[0]).address||null}var MI="https://api.dexscreener.com",FI=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(),DI=e=>Array.isArray(e)?e:e==null?[]:[e];function UI(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 qI(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Ni(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||MI).replace(/\/$/,"")}async function lm(e={}){let n=(await S(`${Ni(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function gn(e,t={}){if(!e)throw new Error("tokenAddress required");return S(`${Ni(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Wr(e,t={}){if(!e)throw new Error("query required");return S(`${Ni(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function um(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return S(`${Ni(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function dm({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Gr({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Gr({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(FI[Number(e)]||e),a=new Set(DI(r).filter(Boolean).map(at)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>gn(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=>UI(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:qI(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}import{createHash as WI,createHmac as fm,timingSafeEqual as GI}from"node:crypto";import{readFileSync as jI}from"node:fs";import{homedir as zI}from"node:os";import{join as Oi}from"node:path";function VI(){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=zI();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Oi(t,".config","oracle")).trim();return[e,Oi(n,"exec.env")].filter(Boolean)}return[e,Oi(t,".config","oracle","exec.env"),Oi(t,".config","mad-desk","exec.env")].filter(Boolean)}function pm(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of VI())try{let i=jI(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 Ri=100,mm=2e4;function Li(e){return Array.isArray(e)?`[${e.map(Li).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Li(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function hm(e,{required:t=!1}={}){try{return pm(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function pc(e){let{signature:t,...n}=e;return n}function gm(e,{secret:t}={}){let n=hm(t);return n?{...e,signature:fm("sha256",n).update(Li(pc(e))).digest("hex")}:e}function KI(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 WI("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=hm(o);if(i){let m=fm("sha256",i).update(Li(pc(e))).digest("hex");if(!YI(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>Ri||!Number.isInteger(s)||s<0||s>Ri||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=XI(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 gm({...pc(e),calldataHash:KI(r)},{secret:o})}function YI(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:GI(n,r)}function dc(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function JI(e){let t=e==null?Ri: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,Ri)}function De({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=dc(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(dc(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,dc(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=JI(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function mc({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=mm,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)||mm)),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 gm({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 XI(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=mc({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"}},oA=[100,500,3e3,1e4],iA="0xddca3f43",$i=new xm(["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)"]),wm=new xm(["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)"]),km="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",Sm="0x0000000000000000000000000000000000000000",gc=[100,500,2500,1e4],aA={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:gc}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:gc}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:gc}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}};function bc(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=aA[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 yc(e,t){let n=ze[Number(t)];if(!e||e===km||e===Sm||/^eth$/i.test(String(e)))return Kr(n.weth);let r=String(e);if(/^weth$/i.test(r))return Kr(n.weth);if(/^usdc$/i.test(r))return Kr(n.usdc);if(!vm(r))throw new Error(`invalid token address: ${e}`);return Kr(r)}function sA(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 cA(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 Wn(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=bc(e.chainId??8453,e.venue),a=yc(e.tokenIn||"WETH",n),s=yc(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:oA,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let E of u){let k=$i.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:E,sqrtPriceLimitX96:0n}]);try{let I=await D(n,"eth_call",[{to:r,data:k},"latest"],t);if(!I||I==="0x"){d.push({fee:E,ok:!1,error:"empty result"});continue}let P=$i.decodeFunctionResult("quoteExactInputSingle",I),_={fee:E,ok:!0,amountOut:P[0].toString(),sqrtPriceX96After:P[1].toString(),initializedTicksCrossed:Number(P[2]),gasEstimate:P[3].toString()};d.push(_),(!p||BigInt(_.amountOut)>BigInt(p.amountOut))&&(p=_)}catch(I){d.push({fee:E,ok:!1,error:String(I.message||I).slice(0,160)})}}if(!p){let E=d.map(k=>`${k.fee}:${k.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${E}`)}let m=e.liquidityUsd==null?await Gr({chainId:n,tokenA:a,tokenB:s,dexIds:sA(e.venue)},t).catch(()=>[]):[],f={};for(let E of m.slice(0,8))if(!(!E.pairAddress||!vm(E.pairAddress)))try{let k=await D(n,"eth_call",[{to:E.pairAddress,data:iA},"latest"],t),I=k&&k!=="0x"&&k.length<=66?Number.parseInt(k,16):NaN;if(!Number.isFinite(I)||I<=0||I>1e6)continue;(f[I]==null||E.liquidityUsd>f[I].liquidityUsd)&&(f[I]=E)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let E=BigInt(p.amountOut),I=d.filter(P=>P.ok&&Number((E-BigInt(P.amountOut))*10000n/E)<=h).filter(P=>f[P.fee]?.liquidityUsd!=null).sort((P,_)=>f[_.fee].liquidityUsd-f[P.fee].liquidityUsd)[0];I&&I.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:I.fee,chosenPoolUsd:f[I.fee].liquidityUsd,bandBps:h},p=I)}let w=f[p.fee]??null,x=m[0]??null,b=w??x,y=e.liquidityUsd??w?.liquidityUsd??x?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":w?"pool":x?"pair":null;return re({venue:"uniswap-v3",chainId:n,chain:ze[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:b,liquidityAttribution:v,liquidityPick:g,sqrtPriceX96After:p.sqrtPriceX96After,initializedTicksCrossed:p.initializedTicksCrossed,triedFees:d,best:!0},{chainId:n,venue:o,amountOut:p.amountOut,liquidityUsd:y,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Em(e={},t={}){let{chainId:n,quoter:r,router:o}=bc(e.chainId??8453),i=(e.tokens||[]).map(p=>yc(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=cA(i,a),l=$i.encodeFunctionData("quoteExactInput",[c,s]),u=await D(n,"eth_call",[{to:r,data:l},"latest"],t),d=$i.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 wc(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Wn({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 Im(e={},t={}){let n=Number(e.chainId??8453),r=bc(n,e.venue),o=Kr(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===km||i===Sm||/^eth$/i.test(i),s=await Wn(e,t),c=wm.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=wm.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 Am(e={}){let t=Number(e.chainId??8453);try{let n=await wc({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 _m(){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 uA,Interface as xc,getAddress as ht,isAddress as vc,keccak256 as dA}from"ethers";X();var Yr=uA.defaultAbiCoder(),Oe="0x0000000000000000000000000000000000000000",gt={1:{name:"ethereum",poolManager:"0x000000000004444c5dc75cB358380D2e3dE08A90",quoter:"0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203",stateView:"0x7ffe42c4a5deea5b0fec41c94c136cf115597227",universalRouter:"0x66a9893cc07d91d95644aedd05d03f95e1dba8af",weth:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",usdc:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},10:{name:"optimism",poolManager:"0x9a13f98cb987694c9f086b1f5eb990eea8264ec3",quoter:"0x1f3131a13296fb91c90870043742c3cdbff1a8d7",stateView:"0xc18a3169788f4f75a170290584eca6395c75ecdb",universalRouter:"0x851116d9223fabed8e56c0e6b8ad0c31d98b3507",weth:"0x4200000000000000000000000000000000000006",usdc:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"},56:{name:"bsc",poolManager:"0x28e2ea090877bf75740558f6bfb36a5ffee9e9df",quoter:"0x9f75dd27d6664c475b90e105573e550ff69437b0",stateView:"0xd13dd3d6e93f276fafc9db9e6bb47c1180aee0c4",universalRouter:"0x1906c1d672b88cd1b9ac7593301ca990f94eae07",weth:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",usdc:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d"},137:{name:"polygon",poolManager:"0x67366782805870060151383f4bbff9dab53e5cd6",quoter:"0xb3d5c3dfc3a7aebff71895a7191796bffc2c81b9",stateView:"0x5ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a",universalRouter:"0x1095692a6237d83c6a72f3f5efedb9a670c49223",weth:"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",usdc:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"},8453:{name:"base",poolManager:"0x498581fF718922c3f8e6A244956aF099B2652b2b",quoter:"0x0d5e0f971ed27fbff6c2837bf31316121532048d",stateView:"0xa3c0c9b65bad0b08107aa264b0f3db444b867a71",universalRouter:"0x6ff5693b99212da76ad316178a184ab56d299b43",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},42161:{name:"arbitrum",poolManager:"0x360e68faccca8ca495c1b759fd9eee466db9fb32",quoter:"0x3972c00f7ed4885e145823eb7c655375d275a1c5",stateView:"0x76fd297e2d437cd7f76d50f01afe6160f86e9990",universalRouter:"0xa51afafe0263b40edaef0df8781ea9aa03e381a3",weth:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",poolManager:"0x06380c0e0912312b5150364b9dc4542ba0dbbc85",quoter:"0xbe40675bb704506a3c2ccfb762dcfd1e979845c2",stateView:"0xc3c9e198c735a4b97e3e683f391ccbdd60b69286",universalRouter:"0x94b75331ae8d42c1b61065089b7d48fe14aa73b7",weth:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"},4663:{name:"robinhood",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",quoter:"0x8dc178efb8111bb0973dd9d722ebeff267c98f94",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",universalRouter:"0x8876789976dEcBfCbBbe364623C63652db8C0904",weth:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",usdc:"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"}},Cm=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],Mi=new xc(["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)"]),pA=new xc(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Bi=new xc(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Pm=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"]]),mA=(1n<<14n)-1n,kc=8388608;function Tm(e){let t=Qr(e),n=Number(BigInt(t)&mA),r=Object.fromEntries(Pm.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(Pm.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}var fA="0x10",hA="0x060c0f",gA="0x000000000022D473030F116dDEE9F6B43aC78BA3",yA="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";function Xr(e){let t=Number(e),n=gt[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(gt).join(", ")})`);return{chainId:t,...n}}function Qr(e){if(e==null||e==="")return Oe;let t=String(e);if(!vc(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return ht(t)}function Gn(e,t){let n=gt[Number(t)];if(Jr(e))return ht(n.weth);let r=String(e);if(/^weth$/i.test(r))return ht(n.weth);if(/^usdc$/i.test(r)||/^usdg$/i.test(r))return ht(n.usdc);if(!vc(r))throw new Error(`invalid token address: ${e}`);return ht(r)}function Jr(e){let t=String(e||"").trim().toLowerCase();return!t||t===yA.toLowerCase()||t===Oe.toLowerCase()||t==="eth"}function Sc({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=ht(e),a=ht(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=Qr(o);return dA(Yr.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function Ec({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Oe}){let i=ht(e),a=ht(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:Qr(o)},zeroForOne:l}}function bA({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Tm(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!==Oe&&(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===Oe&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Oe&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Oe&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Oe,returnsDelta:i,reasons:Object.freeze(s)})}async function Nm(e={},t={}){let n=Xr(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Gn(e.tokenIn||"WETH",n.chainId),o=Gn(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=Qr(e.hooks),{poolKey:c}=Ec({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=Sc(c),u=t.rpcCall||D,d=Bi.encodeFunctionData("getSlot0",[l]),p=Bi.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===Oe?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=Bi.decodeFunctionResult("getSlot0",m),w=Bi.decodeFunctionResult("getLiquidity",f)[0],x=g[0],b=x>0n,y=s===Oe?null:typeof h=="string"&&h!=="0x"&&h.length>4,v=!!(i&kc),E=bA({hook:s,codePresent:y,initialized:b,dynamicFee:v});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:b,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:y,codeBytes:y?(h.length-2)/2:0,permissions:Tm(s)}),risk:E})}var Om=["uniswap-v4","uniswapv4"];async function Zr(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Xr(e.chainId??8453),a=Gn(e.tokenIn||"WETH",n),s=Gn(e.tokenOut||gt[n].usdc,n),c=BigInt(e.amountIn??0);if(c<=0n)throw new Error("amountIn required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountIn exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Cm],u=e.hooks||Oe,d=[],p=null;for(let k of l){let{poolKey:I,zeroForOne:P}=Ec({tokenIn:a,tokenOut:s,fee:k.fee,tickSpacing:k.tickSpacing,hooks:u}),_=Mi.encodeFunctionData("quoteExactInputSingle",[{poolKey:I,zeroForOne:P,exactAmount:c,hookData:"0x"}]);try{let T=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:_},"latest"],t);if(!T||T==="0x"){d.push({...k,ok:!1,error:"empty result"});continue}let $=Mi.decodeFunctionResult("quoteExactInputSingle",T),U={fee:k.fee,tickSpacing:k.tickSpacing,ok:!0,amountOut:$[0].toString(),gasEstimate:$[1].toString(),poolKey:I,zeroForOne:P,poolId:Sc({...I})};d.push(U),(!p||BigInt(U.amountOut)>BigInt(p.amountOut))&&(p=U)}catch(T){d.push({...k,ok:!1,error:String(T.message||T).slice(0,160)})}}if(!p){let k=d.map(I=>`${I.fee}/${I.tickSpacing}:${I.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${k}`)}let m=e.liquidityUsd==null?await Gr({chainId:n,tokenA:a,tokenB:s,dexIds:Om},t).catch(()=>[]):[],f=new Map;for(let k of m){let I=String(k.pairAddress||"").toLowerCase();I&&f.set(I,k)}let h=k=>f.get(String(k.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),w=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let k=BigInt(p.amountOut),P=d.filter(_=>_.ok&&Number((k-BigInt(_.amountOut))*10000n/k)<=g).filter(_=>h(_)?.liquidityUsd!=null).sort((_,T)=>h(T).liquidityUsd-h(_).liquidityUsd)[0];P&&P.poolId!==p.poolId&&(w={priceBestFee:p.fee,chosenFee:P.fee,chosenPoolUsd:h(P).liquidityUsd,bandBps:g},p=P)}let x=h(p),b=m[0]??null,y=x??b,v=e.liquidityUsd??x?.liquidityUsd??b?.liquidityUsd??null,E=e.liquidityUsd!=null?"caller":x?"pool":b?"pair":null;return re({venue:"uniswap-v4",chainId:n,chain:gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:v,liquiditySource:y,liquidityAttribution:E,liquidityPick:w,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&vc(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&&!Jr(e.tokenIn)&&!Jr(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Oe&&!(p.fee&kc)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:v,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Rm(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=Xr(e.chainId??8453),a=Gn(e.tokenIn||"WETH",n),s=Gn(e.tokenOut||gt[n].usdc,n),c=BigInt(e.amountOut??0);if(c<=0n)throw new Error("amountOut required (raw base units)");if(c>0xffffffffffffffffffffffffffffffffn)throw new Error("amountOut exceeds uint128");let l=e.fee!=null&&e.tickSpacing!=null?[{fee:Number(e.fee),tickSpacing:Number(e.tickSpacing)}]:e.tryTiers===!1?[{fee:500,tickSpacing:10}]:[...Cm],u=e.hooks||Oe,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=Ec({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),w=Mi.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let x=await(t.rpcCall||D)(n,"eth_call",[{to:r,data:w},"latest"],t);if(!x||x==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let b=Mi.decodeFunctionResult("quoteExactOutputSingle",x),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:b[0].toString(),gasEstimate:b[1].toString(),poolKey:h,zeroForOne:g,poolId:Sc({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(x){d.push({...f,ok:!1,error:String(x.message||x).slice(0,160)})}}if(!p){let f=d.map(h=>`${h.fee}/${h.tickSpacing}:${h.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 exact-output quote failed chain=${n}: ${f}`)}let m=e.liquidityUsd==null?await dm({chainId:n,tokenA:a,tokenB:s,dexIds:Om},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:gt[n].name,poolManager:o,quoter:r,universalRouter:i||null,tokenIn:a,tokenOut:s,amountIn:p.amountIn,amountOut:c.toString(),gasEstimate:p.gasEstimate,fee:p.fee,tickSpacing:p.tickSpacing,hooks:p.poolKey.hooks,poolId:p.poolId,zeroForOne:p.zeroForOne,liquidityUsd:e.liquidityUsd??m?.liquidityUsd??null,liquiditySource:m,triedTiers:d,best:!0,executionReady:!1,prepareReady:!1}}async function Lm(e={},t={}){if(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"].some(y=>Object.hasOwn(e,y)))throw new Error("uniswap-v4 unsupported operation shape is inspect/quote-only");let r=Number(e.chainId??8453),o=Xr(r);if(Qr(e.hooks)!==Oe)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&kc)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=ht(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(Jr(e.tokenIn)||Jr(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Zr(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=Yr.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=Yr.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=Yr.encode(["address","uint256"],[l.tokenOut,u]),g=Yr.encode(["bytes","bytes[]"],[hA,[m,f,h]]),x=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,b=pA.encodeFunctionData("execute",[fA,[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:gA,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:b,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function $m(){return Object.entries(gt).map(([e,t])=>({chainId:Number(e),name:t.name,poolManager:t.poolManager,quoter:t.quoter,stateView:t.stateView||null,universalRouter:t.universalRouter||null,weth:t.weth,usdc:t.usdc}))}async function Bm(e={}){let t=Xr(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}}L();import{readFileSync as SA,existsSync as EA}from"node:fs";import{getAddress as IA,Interface as Di,TypedDataEncoder as Pc,parseUnits as AA}from"ethers";var Mm="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:Fm(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([Fm(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[Mm]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${Mm}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Fm(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 xA=/^(0|[1-9][0-9]*)$/,Ic=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function bn(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(!xA.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 vA(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function kA(e={}){return e.maxFeePerGas!=null?bn(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?bn(e.gasPrice,"gasPrice"):null}function Ac(e={}){try{let t=vA(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=bn(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=bn(n.gasLimit??n.gas,"gasLimit"),s=kA(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=bn(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=bn(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:bn(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 Dm(e={}){let t=Ac(e);if(!t.ok)throw new Ic(t);return t}var _A="https://api.opensea.io/api/v2",PA="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)",CA=new Di([`function ${PA}`]),Fi=new Di(["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"]),TA=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"]),NA=new Set(TA),Vm=new Set(["solana","flow"]),eo="0x0000000000000000000000000000000000000000";function OA(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!EA(e))return"";try{for(let t of SA(e,"utf8").split(`
141
+ `)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function St(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||OA()}function Wm(e={}){return Ve({provider:"opensea",defaultUrl:_A,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function wn(e={}){return Wm(e).baseUrl}function xn(e={}){return Ue({accept:"application/json"},{"x-api-key":St(e)},Wm(e).trusted)}function Gm(e){let t=String(e||"ethereum").trim().toLowerCase();if(!NA.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Q(e,t="address"){try{return IA(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function Km(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!Vm.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 RA(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 LA(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 Um(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 $A(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 Ym(e={}){if(!St(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await no("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 no(e,t={}){if(!e)throw new Error("collection slug required");if(!St(t))throw new Error("OPENSEA_API_KEY required");return S(`${wn(t)}/collections/${encodeURIComponent(e)}`,{headers:xn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Jm(e,t={}){let n=await no(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 ro(e={},t={}){if(!St(t))throw new Error("OPENSEA_API_KEY required");let n=Gm(e.chain),r=Km(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(`${wn(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 S(l.toString(),{headers:xn(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push($A(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 Ui(e={},t={}){if(!St(t))throw new Error("OPENSEA_API_KEY required");let n=Km(e.address||e.owner),r=await S(`${wn(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:xn(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 qi=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 oo(e){let t=String(e||"").trim().toLowerCase(),n=qi[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 BA(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 to(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function Xm(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 Qm(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 MA(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function FA(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!==eo)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===eo)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function DA(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 _c(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(MA);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=FA(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+=DA(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var UA=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 qm(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 Zm(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 qA(e,t){return{...Zm(e,t),recipient:Q(e?.recipient,`${t} recipient`)}}function HA(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)=>Zm(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>qA(o,`${t} consideration[${i}]`)),orderType:Number(We(e.orderType,`${t} orderType`)),startTime:We(e.startTime,`${t} startTime`),endTime:We(e.endTime,`${t} endTime`),zoneHash:qm(e.zoneHash,`${t} zoneHash`),salt:We(e.salt,`${t} salt`),conduitKey:qm(e.conduitKey,`${t} conduitKey`),counter:We(e.counter,`${t} counter`)}}function ef(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=HA(t,n);if(Pc.hashStruct("OrderComponents",UA,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function tf(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=to(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 jA(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 tf(r[0],`${t} offer NFT`)}function zA(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=tf(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 VA(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 WA(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 nf(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=Qm(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&WA(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function GA(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(qi[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=jA(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;VA(e.asset,s,c,"listing");let l=qe(e.price?.current?.value,"listing price",{positive:!0}),u=ef(e,i,"listing"),d=_c(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:nf(e,i,n,"listing"),counter:We(i?.counter,"listing counter")}}async function Cc(e={},t={}){if(!St(t))throw new Error("OPENSEA_API_KEY required");let n=oo(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(`${wn(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await S(i.toString(),{headers:xn(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=>GA(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function Hi(e={},t={}){let n=to(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 Cc({...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 KA(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=zA(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=_c(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=_c(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:ef(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:nf(e,i,r,"offer"),counter:We(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function ji(e={},t={}){if(!St(t))throw new Error("OPENSEA_API_KEY required");let n=oo(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=to(e.tokenId),i=await S(`${wn(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:xn(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 KA(a,n,o,s)}function YA(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 rf(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"&&rf(n))}function of(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function af(e){return!e||typeof e!="object"?!1:of(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&af(t))}function sf(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"&&sf(o,t,n);return t}function Hm(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(of(e))throw new Error("opensea: signed transaction material refused");if((e.from?Q(Hm(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=Q(Hm(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=CA.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=BA(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function zi(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 Tc(e,t,n){let r=n.provider,o=!!n.rpcUrl;if(!r&&!o)return{simulated:!1,gasEstimates:[]};let i=[];for(let c of e){let{chainId:l,...u}=zi(c);if(r){if(typeof r.call!="function"||typeof r.estimateGas!="function")throw new Error("opensea: supplied provider must implement call and estimateGas");await r.call(u);let d=await r.estimateGas(u);i.push(BigInt(d).toString())}else{let{rpcCall:d}=await Promise.resolve().then(()=>(he(),Ti)),p={...n,fetchImpl:n.rpcFetchImpl||n.fetchImpl};await d(t,"eth_call",[u,"pending"],p);let m=await d(t,"eth_estimateGas",[u],p);i.push(BigInt(m).toString())}}let a=null,s=null;if(r&&typeof r.getFeeData=="function"){let c=await r.getFeeData();s=c?.maxPriorityFeePerGas==null?0n:BigInt(c.maxPriorityFeePerGas),a=c?.maxFeePerGas==null?c?.gasPrice==null?null:BigInt(c.gasPrice):BigInt(c.maxFeePerGas)}else if(o){let{rpcCall:c}=await Promise.resolve().then(()=>(he(),Ti)),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 JA(e,t){if(rf(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(af(e))throw new Error("opensea: signed transaction material refused");let n=sf(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 XA(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 lf(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function uf(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function QA(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 Vi(e={},t={}){if(!St(t))throw new Error("OPENSEA_API_KEY required");YA(e);let{chain:n,chainId:r}=oo(e.chain),o=Q(e.buyer||e.minter||e.address,"buyer"),i=Q(e.contract,"NFT contract"),a=Xm(e.quantity),s=qe(e.priceWei,"priceWei"),c=qe(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=Qm(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 no(d,t),m=QA(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await S(`${wn(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:xn(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"))),b=JA(h,{buyer:o,chainId:r,targets:x});if(b.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,v,E=null,k;try{y=Fi.decodeFunctionData("mintPublic",b[0].data),v="public",k=Fi.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=Fi.decodeFunctionData("mintAllowList",b[0].data),v="allowlist";let O=y[4],j=[...y[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");k=Fi.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[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(y[0],"mint NFT contract"),P=Q(y[1],"mint fee recipient"),_=Q(y[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(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(k.toLowerCase()!==b[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let T=b.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 $=await Tc(b,r,{...t,provider:e.provider||t.provider});if($.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=Dm({chainId:r,tx:b[0],policy:U});return XA({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:b[0].to,feeRecipient:P,expiry:u,transactions:b.map(zi),gasWar:H,...$},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+hc,Date.parse(u),E?Number(BigInt(E.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function ZA(e={}){let t=Gm(e.chain);if(Vm.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?Um(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=Um(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:LA(e.quantity??1,"quantity"),price:{amount:RA(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:Q(e.price?.currency??e.currency??eo,"price currency")},start_time:n.text,end_time:r.text}}var Kn={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"}]},jm=new Di(["function setApprovalForAll(address operator,bool approved)"]),e1=new Di(["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 zm(e,t){return e?.[t]||(e?.action===t?e:null)}function t1(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(b=>zm(b,"createListingsAction")).find(Boolean)||o.find(b=>/createListings/i.test(String(b?.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 b of u.consideration){if(Number(b.itemType)!==0||Q(b.token,"listing payment token")!==eo)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(b.startAmount),v=BigInt(b.endAmount);if(y<=0n||y!==v)throw new Error("opensea: listing consideration must be fixed and positive");Q(b.recipient,"listing consideration recipient"),p+=y}let m=AA(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=Pc.hashStruct("OrderComponents",Kn,u),w=o.map(b=>zm(b,"itemApprovalAction")).find(Boolean)||o.find(b=>/setApprovalForAll/i.test(String(b?.action||""))),x=null;if(w){let b=w.transaction||w.itemApprovalAction?.transaction,y=cf(b,{buyer:t,chainId:r,targets:new Set([n.contract])}),v;try{v=jm.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let E=Q(v[0],"listing approval operator");if(v[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(jm.encodeFunctionData("setApprovalForAll",[E,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");x={...y,operator:E}}return{protocolAddress:l,typedData:{domain:c,types:Kn,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:x}}async function Wi(e={},t={}){if(!St(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(ZA);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 S(`${wn(t)}/listings/actions`,{method:"POST",headers:xn(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=oo(o[0].chain),u=t1(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await Tc(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(zi),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 df(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=oo(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=to(e.tokenId),c=Xm(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(Kn)){let _=l.types?.[I];if(!Array.isArray(_)||_.length!==P.length||_.some((T,$)=>T?.name!==P[$].name||T?.type!==P[$].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(I=>I!=="EIP712Domain").sort().join(",")!==Object.keys(Kn).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(to(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")!==eo)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 b=Pc.hashStruct("OrderComponents",Kn,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==b.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let v=e1.encodeFunctionData("cancel",[[m]]),E=[{from:o,to:p,data:v,value:"0x0",valueWei:0n,chainId:r}],k=await Tc(E,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:b,typedData:{domain:d,types:Kn,primaryType:"OrderComponents",message:m},transactions:E.map(zi),...k,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}he();var Gi=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"}),r1=/^0x[0-9a-fA-F]{40}$/;function o1(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}r1.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))Gi.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 i1(e){let{ok:t,errors:n,warnings:r}=o1(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
142
142
  - ${n.join(`
143
- - `)}`);let o=e.capabilities||{},i=Hi.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:Hi.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Hi)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 Ic=new Map;function rf(e){let t=jA(e);return Ic.set(t.chainId,t),t}function of(e){return Ic.get(Number(e))||null}function af(){return[...Ic.values()]}he();var _c={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Xe=e=>BigInt(e).toString(16).padStart(64,"0"),ro=e=>e.slice(2).toLowerCase().padStart(64,"0");function zA(e,t){return`0x${_c.getAmountsOut}`+Xe(e)+Xe(64)+Xe(t.length)+t.map(ro).join("")}function VA(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 Ac(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Pc=100;function WA(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Pc)throw new Error(`slippageBps ${n} exceeds the ${Pc} 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 sf(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await D(t,"eth_call",[{to:o,data:zA(i,a)},"latest"],s);return VA(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Ac(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=Ac(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=Ac(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=WA(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,b=x?`0x${_c.swapExactETHForTokens}`+Xe(g)+Xe(128)+ro(s)+Xe(w)+Xe(f.length)+f.map(ro).join(""):`0x${_c.swapExactTokensForTokens}`+Xe(a)+Xe(g)+Xe(160)+ro(s)+Xe(w)+Xe(f.length)+f.map(ro).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:b,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Pc,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 GA=[100,500,3e3,1e4],cf={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},bn=e=>BigInt(e).toString(16).padStart(64,"0"),oo=e=>e.slice(2).toLowerCase().padStart(64,"0"),lf=/^0x[0-9a-fA-F]{40}$/,Tc=100;function KA(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Tc)throw new Error(`slippageBps ${n} exceeds the ${Tc} 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 Cc(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function uf(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${cf.quoteExactInputSingle}`+oo(a)+oo(s)+bn(c)+bn(l)+bn(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=[],d=null;for(let p of GA){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=Cc(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(!lf.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=Cc(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(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c);if(k.best){let S=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.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:k.best.amountOut.toString(),returned:I.toString(),retentionBps:P,buyFee:k.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(k=>k&&k!==String(f).toLowerCase()&&k!==String(i).toLowerCase());if(v){let k=await o({quoter:l,tokenIn:v,tokenOut:i,amountIn:a},c),S=k.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:k.best.amountOut},c):{best:null};if(k.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:k.best.amountOut.toString(),returned:I.toString(),retentionBps:P,buyFee:k.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)),b=z.PASS,y="round trip completes with expected fee/impact loss";return x<5e3?(b=z.FAIL,y=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(b=z.CAUTION,y=`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:b,reason:y,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=Cc(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(!lf.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=KA(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${cf.exactInputSingle}`+oo(i)+oo(a)+bn(f)+oo(c)+bn(s)+bn(h)+bn(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:Tc,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 ji={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function df(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function pf(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 YA(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 qr(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:Y.LIVE}},async nativeBalance(r,o={}){let i=await pn(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 Hr({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,ji.decimals,o).catch(()=>null),n(r,ji.symbol,o).catch(()=>null),n(r,ji.name,o).catch(()=>null),n(r,ji.totalSupply,o).catch(()=>null)]),l=df(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:pf(a?.result??a),name:pf(s?.result??s),totalSupply:(df(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 mn(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=oc(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:em(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 d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),a&&(m.topics=a);let f=await D(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence: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=await this.resolveToken(r,o);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`});let l=await this.resolvePools(r,o);if(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 mf(e){let n={...YA(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,uf({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,sf({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 Vn=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 Nc(){return Vn.map(e=>rf(mf(e)))}var io=new Map,JA=Object.keys(ze).map(Number),XA=Object.keys(gt).map(Number),QA=Vn.map(e=>e.chainId),ZA=[...new Set(Object.values(Bi))],Oc=new Set,ff=!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(ff&&Oc.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return io.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),io.get(t)}function Rc(e){return io.get(e)||null}function zi({venue:e,op:t}={}){let n=[...io.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function e1(){Oc.clear();for(let e of io.keys())Oc.add(e);ff=!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:QA,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Vn.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:JA,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:XA,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:ZA,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."});e1();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:"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:"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."});L();st();st();var i1=/^0x[0-9a-fA-F]{40}$/,so="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Lc(e,t){let n=String(e||"").trim();if(!i1.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function vf(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Sf(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 a1(e){return[...e].sort((t,n)=>(vf(n.tvl)??-1)-(vf(t.tvl)??-1))}function $c(e){return e.hlInfo||ce}function Bc(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Mc(e={},t={}){let n=await $c(t)({type:"vaultSummaries"},t),r=a1((Array.isArray(n)?n:[]).map(Sf));return Bc({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Ki(e={},t={}){let r={type:"vaultDetails",vaultAddress:Lc(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Lc(e.user,"user"));let o=await $c(t)(r,t);return Bc({provider:"hl-vaults",vault:Sf(o||{}),raw:o})}async function Fc(e={},t={}){let n=Lc(e.user||e.address,"user"),r=await $c(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 Bc({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Dc(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Ki({...e,vaultAddress:so},t);if(n==="summaries")return Mc(e,t);if(n==="details")return Ki(e,t);if(n==="mine")return Fc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function kf(e={}){try{let t=await Dc({mode:"hlp"},e);return{ok:t.vault.vaultAddress===so&&!!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 c1}from"ethers";var Uc=999;var _e=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),qc=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),l1=c1.defaultAbiCoder();function co(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 lo(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 wn(e,t){return e.length?l1.encode(e,t):"0x"}function It(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 u1(e,t=0){let n=It(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Dt(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Uc});let r=await D(Uc,"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 Ut(e){return{provider:"hl-precompiles",chainId:Uc,...qc,...e}}async function Yi(e={}){let t=await Dt(_e.l1BlockNumber,"0x",e);return Ut({op:"l1BlockNumber",precompile:_e.l1BlockNumber,l1BlockNumber:It(t).toString(),raw:t})}async function Hc(e={},t={}){let n=lo(e.index??e.assetId??0,"index",32),r=await Dt(_e.markPx,wn(["uint32"],[n]),t);return Ut({op:"markPx",precompile:_e.markPx,index:n,markPx:It(r).toString(),raw:r})}async function jc(e={},t={}){let n=lo(e.index??e.assetId??0,"index",32),r=await Dt(_e.oraclePx,wn(["uint32"],[n]),t);return Ut({op:"oraclePx",precompile:_e.oraclePx,index:n,oraclePx:It(r).toString(),raw:r})}async function zc(e={},t={}){let n=lo(e.index??e.assetId??0,"index",32),r=await Dt(_e.spotPx,wn(["uint32"],[n]),t);return Ut({op:"spotPx",precompile:_e.spotPx,index:n,spotPx:It(r).toString(),raw:r})}async function Vc(e={},t={}){let n=co(e.user,"user"),r=lo(e.perp??e.assetId??0,"perp",16),o=await Dt(_e.position,wn(["address","uint16"],[n,r]),t);return Ut({op:"position",precompile:_e.position,user:n,perp:r,szi:u1(o,0),raw:o})}async function Wc(e={},t={}){let n=co(e.user,"user"),r=lo(e.token??0,"token",64),o=await Dt(_e.spotBalance,wn(["address","uint64"],[n,r]),t);return Ut({op:"spotBalance",precompile:_e.spotBalance,user:n,token:r,total:It(o,0).toString(),hold:It(o,1).toString(),raw:o})}async function Gc(e={},t={}){let n=co(e.user,"user"),r=co(e.vaultAddress??e.vault??so,"vault"),o=await Dt(_e.vaultEquity,wn(["address","address"],[n,r]),t);return Ut({op:"vaultEquity",precompile:_e.vaultEquity,user:n,vaultAddress:r,hlp:r===so,equity:It(o,0).toString(),raw:o})}async function Kc(e={},t={}){let n=co(e.user,"user"),r=await Dt(_e.withdrawable,wn(["address"],[n]),t);return Ut({op:"withdrawable",precompile:_e.withdrawable,user:n,withdrawable:It(r).toString(),raw:r})}async function Ef(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return Yi(t);if(n==="markPx")return Hc(e,t);if(n==="oraclePx")return jc(e,t);if(n==="spotPx")return zc(e,t);if(n==="position")return Vc(e,t);if(n==="spotBalance")return Wc(e,t);if(n==="vaultEquity"||n==="hlp")return Gc(e,t);if(n==="withdrawable")return Kc(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function If(e={}){try{let t=await Yi(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...qc,l1BlockNumber:t.l1BlockNumber,precompiles:_e}}catch(t){return{ok:!1,provider:"hl-precompiles",...qc,error:String(t?.message||t).slice(0,160)}}}st();Q();function Af(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Xi(e={},t,n){let r=String(t||""),o=Af(e);if(o){let a=uo(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=uo(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function Qi(e={},t=[],n){let r=Af(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(uo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&uo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(uo(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var Yc=Number.MAX_SAFE_INTEGER,Ji=String(Yc);function uo(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=Yc?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Ji.length||t.length===Ji.length&&t>Ji||t===Ji&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=Yc?r:null}function Gf(){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 _t(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function Kf(e){let t=_t(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function t_(e,t,n=4){let r=_t(e),o=_t(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 Yf(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=_t(a.funding),l=_t(a.markPx??a.oraclePx),u=_t(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:_t(a.oraclePx),openInterest:u,fundingAprPct:Kf(c)})}return r}function Jf(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=_t(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=Kf(n),o=n>0,i={coin:e.coin,notionalUsd:_t(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?t_(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 fl(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=Yf(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 hl(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=Yf(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return Jf(i,r)}async function gl(e={},t={}){Qf(e,t,"hl-delta-neutral");let n=Zf(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await hl(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=Xi(e,r.coin,"hl-delta-neutral");if(!Xf.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(()=>(ia(),ml)),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 Xf=/^0x[0-9a-fA-F]{40}$/;function Qf(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 n_(e,t,n){Qf(e,t,n)}function r_(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=Zf(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"&&Qi(e,n,"hl-delta-neutral"),t==="live"&&!Xf.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 Zf(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 eh(e={},t={}){n_(e,t,"hl-delta-neutral");let n=r_(e),r=await fl({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=Jf(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 gl({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();Q();Kn();var i_=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),yo=14,th=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Qn(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function yl(e){let t=String(e||"").replace(/\/$/,"");if(!i_.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=yl(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(xn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(xn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Qn(n.orderType,0,"orderType"),Qn(n.timeInForce,1,"timeInForce"),Qn(n.reduceOnly,0,"reduceOnly"),Qn(n.triggerPrice,0,"triggerPrice"),Qn(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=ke(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 b=ke(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>b)throw new Error("lighter: notional exceeds cap");let y=Ie(n.notionalUsd,"lighter: notionalUsd");return Qn(n.txType,yo,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(y)})}function a_(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 rh(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=yl(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:a_(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??yo,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 ih="https://mainnet.zklighter.elliot.ai",ah="https://testnet.zklighter.elliot.ai";function s_(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?ah:ih}function sh(){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 Vt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function c_(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 ch(e){let t=Vt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function l_(e,t,n=4){let r=Vt(e),o=Vt(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 oh(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function lh(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=oh(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=oh(a.market_id);if(s==null)continue;let c=o.get(s),l=Vt(c?.mark_price??c?.index_price),u=Vt(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:Vt(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:ch(u)})}return i}function uh(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Vt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=ch(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Vt(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?l_(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 dh(e={}){let t=s_(e),n=e.fetchImpl,r=await E(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await E(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function bl(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await dh(t),i=lh(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 wl(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 dh(t),a=lh(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return uh(a,r)}async function xl(e={},t={}){mh(e,t,"lighter");let n=fh(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 wl(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=Xi(e,o.coin,"lighter");if(!ph.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=c_(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:yo,submitTo:`${s?ah:ih}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=rh(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 ph=/^0x[0-9a-fA-F]{40}$/;function mh(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 u_(e,t,n){mh(e,t,n)}function d_(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=fh(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"&&Qi(e,n,"lighter"),t==="live"&&!ph.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 fh(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 hh(e={},t={}){u_(e,t,"lighter");let n=d_(e),r=await bl({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=uh(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 xl({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var m_="https://clob.polymarket.com",f_="https://gamma-api.polymarket.com";function bo(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||m_).replace(/\/$/,"")}function gh(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||f_).replace(/\/$/,"")}async function vl(e={}){return E(`${bo(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function yh(e={}){let t=await vl(e);return{ok:t!=null&&t!=="",time:t}}async function bh({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 E(`${gh(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function wh(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${bo(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function xh(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${bo(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function vh(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return E(`${bo(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Sh(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 E(`${bo(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function kh({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 E(`${gh(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}he();L();import{createHash as Eh}from"node:crypto";var Zn="mainnet-beta",g_="https://api.mainnet-beta.solana.com",Sl="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function y_(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||g_).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 b_(e,t){return t?[...e,{commitment:t}]:e}async function wo(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 E(y_(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 kl(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await wo("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Zn,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Ih(e={}){try{let[t,n]=await Promise.all([wo("getHealth",[],e),kl({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Zn,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Zn,error:String(t?.message||t),exec:!1}}}async function aa(e={},t={}){let n=de(e.address||e.owner,"address"),r=await wo("getBalance",b_([n],e.commitment),t);return{provider:"solana-rpc",cluster:Zn,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function w_(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 xo(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||Sl,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await wo("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(w_):[];return{provider:"solana-rpc",cluster:Zn,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function x_(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 v_(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 S_(e){let t=Buffer.from(e,"base64");try{let n=v_(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Eh("sha256").update(t.subarray(r)).digest("hex")}catch{return Eh("sha256").update(t).digest("hex")}}async function Ah(e={},t={}){let n=x_(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await wo("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Zn,ok:i.err==null,transactionHash:S_(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var E_="mainnet",I_="https://mempool.space/api",A_="https://mempool.space/testnet/api";function bt(e={}){return String(e.network||process.env.BTC_NETWORK||E_).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Il(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):bt(e)==="testnet"?A_:I_}function El(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 __(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 Al(e,t={}){let n=`${Il(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 Al(e,t);try{return JSON.parse(n)}catch{return n}}async function _h(e={}){try{let t=await Al("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:bt(e),baseUrl:El(Il(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:bt(e),baseUrl:El(Il(e)),error:El(t?.message||t),exec:!1}}}async function Ph(e={}){let t=await Al("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:bt(e),tipHeight:Number(t)}}async function Ch(e={}){try{let t=await sa("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:bt(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:bt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ca(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:bt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Th(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:bt(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 Nh(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:bt(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 Oh(e={},t={}){let n=__(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:bt(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 _l="https://ordinals.com";function la(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var C_=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Rh(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=la(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=C_.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 er(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Rh(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 Lh(e={}){let t=la(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:Rh(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 ua(e={},t={}){let n=ct(e.address||e.addr,"address"),r=la(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 er(a,t),c=T_(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 T_(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 tr(e={},t={}){let n=ct(e.address||e.addr,"address"),r=la(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 er(s,t),l=N_(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 $h(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||_l,o=await er(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Bh(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||_l,o=Number(e.page||0),i=await er(`${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 Mh(e={},t={}){let n=t.ordinalsBase||_l,r=e.height??await er(`${n}/r/blockheight`,t),o=await er(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function N_(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}))}Q();var R_=["unsigned","notsigned","tosign","signable"],L_=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),$_=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function Pl(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function B_(e){return R_.some(t=>e.startsWith(t))||L_.has(e)}function M_(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=Pl(t);return B_(n)?!1:$_.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function F_(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 Cl(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=>Cl(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(M_(c)){o.push(c);continue}o.push(...Cl(l,t+1,n,r))}let a=Object.keys(e).map(Pl).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(Pl(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),F_(e)&&o.push("v/r/s"),o}function Pt(e,t){let n=Cl(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 D_="https://api.satflow.com/v1";function Fh(e={}){return Ve({provider:"satflow",defaultUrl:D_,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function da(e={}){return Fh(e).baseUrl}function Nl(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function U_(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Nl(e)},Fh(e).trusted)}async function Wt(e,{method:t="GET",body:n,opts:r={}}={}){if(!Nl(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${da(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:U_(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 Dh(e={}){if(!!!Nl(e))return{ok:!1,provider:"satflow",baseUrl:da(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 Wt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:da(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:da(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Uh(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 Wt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function qh(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 Wt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Hh(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 Wt(`/item?${r}`,{opts:t})}}async function pa(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 Wt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function jh(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 Wt(`/orders/floor?${r}`,{opts:t})}}var q_=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function zh(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))q_.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var H_=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"]),j_=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function Tl(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 z_(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 Vh(e={},t={}){let n=zh(e,H_);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=Tl(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Wt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=Tl(a)??Tl(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`);Pt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=z_(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 ma(e={},t={}){let n=zh(e,j_);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 Wt("/intent/sell",{method:"POST",body:n,opts:t});return Pt("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."})}L();Q();var ha="https://lite-api.jup.ag/swap/v1",Ol="So11111111111111111111111111111111111111112",Kh="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",W_=100,Wh=2e4;function Yh(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||ha).replace(/\/$/,"")}function vo(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 Jh(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>W_)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function fa(e,t){return e==null?t:!!e}function G_(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 K_(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 Xh(e){let t=Buffer.from(e,"base64"),n=K_(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 So(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Wh}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=vo(e.inAmount,"inAmount"),a=vo(e.outAmount,"outAmount"),s=vo(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=Jh(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)||Wh,1e3),3e4)}}function Rl({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Ol)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=Xh(n),a=vo(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 Y_=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),J_="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function Gh(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=J_.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 Qh(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(`${ha}/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])=>Gh(p)),c=[],l=a.filter(([p])=>!Gh(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${ha}/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&&Y_.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:`${ha}/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 Zh(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await ga({inputMint:Ol,outputMint:Kh,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 ga(e={},t={}){let n=de(e.inputMint||e.fromMint||Ol,"inputMint"),r=de(e.outputMint||e.toMint||Kh,"outputMint"),o=vo(e.amount||e.inAmount,"amount"),i=Jh(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${Yh(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 E(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=So({...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 X_(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function e0(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:So(e.quoteResponse,t)}:await ga(e,t),o=r.quote,i=r.solanaGuard||So(o,t);if(fa(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await E(`${Yh(t)}/swap`,{method:"POST",body:X_({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:fa(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:fa(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:fa(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=G_(a?.swapTransaction);Xh(s),Pt("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=Rl({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"})}L();var Z_="https://coins.llama.fi",eP="https://api.llama.fi",tP="https://yields.llama.fi",nP="https://stablecoins.llama.fi";function rP(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||Z_).replace(/\/$/,"")}function t0(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||eP).replace(/\/$/,"")}async function vn(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return E(`${rP(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function n0(e={}){let n=(await vn(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function r0(e={}){return E(`${t0(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function o0(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||tP).replace(/\/$/,""),r=await E(`${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 ya(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||nP).replace(/\/$/,""),r=e.includePrices!==!1;return E(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function i0(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 E(`${t0(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function a0(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await vn(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();var Gt="0x000000000000000000000000000000000000dEaD";function Ll(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Gt}Q();ra();var iP="https://li.quest/v1";function Bl(e={}){return(e.baseUrl||process.env.LIFI_API_URL||iP).replace(/\/$/,"")}var $l="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",aP="0x0000000000000000000000000000000000000000";function sP(e){let t=String(e||$l).toLowerCase();return t===$l.toLowerCase()||t===aP}function s0(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 c0(e={}){let t=await E(`${Bl(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 ko(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=$l,toToken:i,fromAmount:a,fromAddress:s=Gt}=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 na({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(Df(u)))c.set(g,w);let d=await E(`${Bl(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 l0(e={},t={}){let n=await ko(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(!sP(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:s0(s,"approval token"),spender:s0(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 u0(e={}){return E(`${Bl(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}he();import{Interface as m0,getAddress as Eo,isAddress as lP}from"ethers";Q();var Kt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},uP=[1,50,100,200,2e3],d0=new m0(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),dP=new m0(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),f0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",h0="0x0000000000000000000000000000000000000000";function g0(e){let t=Number(e),n=Kt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Kt).join(", ")})`);return{chainId:t,...n}}function p0(e,t){let n=Kt[Number(t)];if(!e||e===f0||e===h0||/^eth$/i.test(String(e)))return Eo(n.weth);let r=String(e);if(/^weth$/i.test(r))return Eo(n.weth);if(/^usdc$/i.test(r))return Eo(n.usdc);if(!lP(r))throw new Error(`invalid token address: ${e}`);return Eo(r)}async function ba(e={},t={}){let{chainId:n,quoter:r,router:o}=g0(e.chainId??8453),i=p0(e.tokenIn||"WETH",n),a=p0(e.tokenOut||Kt[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]:[...uP],l=[],u=null;for(let d of c){let p=d0.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await D(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=d0.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return re({venue:"aerodrome",chainId:n,chain:Kt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function y0(e={},t={}){let n=Number(e.chainId??8453),r=g0(n),o=Eo(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===f0||i===h0||/^eth$/i.test(i),s=await ba(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=dP.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 b0(e={}){let t=Number(e.chainId??8453);try{let n=await ba({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:Kt[t]?.router,quoter:Kt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function w0(){return Object.entries(Kt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();Q();var mP="https://api.0x.org";function x0(e={}){return Ve({provider:"zerox",defaultUrl:mP,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function v0(e={}){return x0(e).baseUrl}function wa(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function S0(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":wa(e)},x0(e).trusted)}async function k0(e={}){if(!wa(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Ml({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 Ml(e={},t={}){if(!wa(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),E(`${v0(t)}/swap/allowance-holder/price?${s}`,{headers:S0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Io(e={},t={}){if(!wa(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 E(`${v0(t)}/swap/allowance-holder/quote?${c}`,{headers:S0(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 E0(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Io(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"})}L();Q();var hP="https://across.to/api",gP="https://api.hop.exchange/v1",yP="https://api.relay.link",bP={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function I0(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Fl({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 Fl(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||hP).replace(/\/$/,"");return E(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function A0(e={}){try{let t=await Dl({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 Dl(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||gP).replace(/\/$/,""),u=await E(`${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||bP[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 _0(e={}){try{let t=await xa({user:Gt,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 xa(e={},t={}){let{user:n=Gt,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||yP).replace(/\/$/,""),d=await E(`${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 P0(e={},t={}){let n=await xa(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"})}L();import{TypedDataEncoder as N0,getAddress as Ao,isAddress as xP}from"ethers";var u3=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Ul(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function C0(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}Q();var jl={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"},vP=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),SP=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Hl={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},O0={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},T0=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"}]}),w3=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function zl(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=jl[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function _o(e,t){let n=String(e||"").trim();if(!xP(n))throw new Error(`cowswap: ${t} must be an address`);return Ao(n).toLowerCase()}function ql(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 kP(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 EP(e){let t=vP[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:Ao(t)}}function IP(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=kP(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ql(e.sellAmount,"sellAmount"),buyAmount:ql(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:ql(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function R0(e={}){try{let t=await nr({chainId:1,sellToken:Hl[1],buyToken:O0[1],sellAmountBeforeFee:"1000000000000000",from:Gt},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 nr(e={},t={}){let n=Number(e.chainId??1),r=Ll(e.from||e.owner),o=e.sellToken||Hl[n],i=e.buyToken||O0[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=Hl[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 E(`${zl(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 L0(e={},t={}){let n=Number(e.chainId??1),r=_o(Ll(e.from||e.owner||e.signer),"owner"),o=await nr({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=IP(o?.quote||o,n,r),a=EP(n),s={domain:a,types:T0,primaryType:"Order",message:i},c=N0.hash(a,T0,i),l=SP[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:Ao(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:Ao(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:Ao(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:AP({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 AP(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=jl[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=_o(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=N0.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 $0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return E(`${zl(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function B0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return E(`${zl(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function M0(){return Object.keys(jl).map(Number)}L();Q();var PP="https://api.1inch.dev/swap/v6.0";function F0(e={}){return Ve({provider:"oneinch",defaultUrl:PP,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Vl(e={}){return F0(e).baseUrl}function Po(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Wl(e={}){let t=Po(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},F0(e).trusted)}async function D0(e={}){if(!Po(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Gl({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 Gl(e={},t={}){if(!Po(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 E(`${Vl(t)}/${n}/quote?${a}`,{headers:Wl(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 CP(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function Kl(e={},t={}){if(!Po(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return E(`${Vl(t)}/${n}/approve/spender`,{headers:Wl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function U0(e={},t={}){if(!Po(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 E(`${Vl(t)}/${n}/swap?${c}`,{headers:Wl(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(!CP(r)){let f=l?.spender||l?.approvalAddress||(await Kl({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"})}Q();var NP=96*1024,q0=50;function OP(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>NP)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 Ct(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function j0(e,t){let n=Ct(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 RP(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 LP(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=Ct(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:Ct(e.network,`accepts[${t}].network`),amount:j0(e.amount,`accepts[${t}].amount`),asset:Ct(e.asset,`accepts[${t}].asset`),payTo:Ct(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:RP(e.extra)})}function Yl(e){let t=OP(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>q0)throw new Error(`x402: accepts must contain 1-${q0} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:Ct(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(LP));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 H0(e,t){return String(e)===String(t)}function $P(e,t={}){let n=Yl(e),r=Ct(t.network,"network"),o=Ct(t.asset,"asset"),i=Ct(t.payTo,"payTo"),a=BigInt(j0(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&H0(l.asset,o)&&H0(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 z0(e={}){return e.paymentRequired??e.header??e.body}function V0(e={}){return Yl(z0(e))}function W0(e={},t={}){let n=Yl(z0(e)),r=$P(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 G0(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}L();var MP="https://api.bankr.bot";function Jl(e={}){return Ve({provider:"bankr",defaultUrl:MP,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function K0(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function FP(e={}){let t=K0(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function Y0(e={},t=!1){let n=FP(e),r=Jl(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function J0(e,t={}){return E(`${Jl(t).baseUrl}${e}`,{headers:Y0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function Xl(e={}){return J0("/wallet/me",e)}async function X0(e={}){return J0("/wallet/portfolio",e)}function Co(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function DP(e){let t=Co(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 Q0(e={},t={}){let n={fromChain:Co(e.fromChain,"fromChain"),fromToken:Co(e.fromToken,"fromToken"),toChain:Co(e.toChain,"toChain"),toToken:Co(e.toToken,"toToken"),amount:DP(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 E(`${Jl(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:Y0(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function Z0(e={}){if(!K0(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await Xl(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var qP=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function To(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||qP,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 eg(e={}){try{let t=await To({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 tg(e={}){let t=await To({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function ng(e,t={}){if(!e)throw new Error("coin required");let n=await To({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var jP=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function va(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||jP,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 rg(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await va([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 va([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import lg from"node:path";import{homedir as rC}from"node:os";import{createHash as oC,randomUUID as iC}from"node:crypto";import ae from"node:fs";import Sa from"node:path";import{createHash as VP,randomUUID as ig}from"node:crypto";var Ql=1,lt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Yt(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(Yt).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Yt(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function ag(e){return VP("sha256").update(Yt(e)).digest("hex")}function ka(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 Ea(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function sg(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function Zl(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function rr({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=()=>ig()}={}){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 b=n();return r(b),{schemaVersion:Ql,kind:t,generation:0,data:b}}function d(b){let y;try{y=JSON.parse(b)}catch(S){throw new lt(`corrupt ${t} snapshot: invalid JSON (${S.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new lt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==Ql)throw new lt(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new lt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...k}=y;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||ag(k)!==v)throw new lt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(S){throw new lt(`corrupt ${t} snapshot: ${S.message}`,"STORE_CORRUPT")}return k}function p(){if(!ae.existsSync(e))return u();let b=ae.statSync(e);if(!b.isFile()||b.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(){sg(Sa.dirname(e));let b=ka(o),y=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:b})}
144
- `,k=()=>{let _;try{return _=ae.openSync(l,"wx",384),ae.writeFileSync(_,v,"utf8"),ae.fsyncSync(_),ae.closeSync(_),{lockId:y}}catch(T){let $=_!==void 0;if($)try{ae.closeSync(_)}catch{}if($)try{ae.unlinkSync(l)}catch{}if(T?.code!=="EEXIST")throw T;return null}},I=ka(o)+s,P=new Int32Array(new SharedArrayBuffer(4));for(;;){let _=k();if(_)return _;let T=ka(o),$=Zl(l),U=!1;if($){let O=T-Number($.acquiredAt??$.mtimeMs);U=Number.isFinite(O)&&O>=a}else try{U=T-ae.statSync(l).mtimeMs>=a}catch{U=!1}if(U){let O=Zl(l);if($?O?.lockId===$.lockId:O===null){try{ae.unlinkSync(l)}catch(B){if(B?.code!=="ENOENT")throw B}continue}}let H=I-T;if(H<=0)throw new lt(`${t} store is busy`,"STORE_BUSY");Atomics.wait(P,0,0,Math.min(10,H))}}function f(b){if(Zl(l)?.lockId===b.lockId)try{ae.unlinkSync(l)}catch(v){if(v?.code!=="ENOENT")throw v}}function h(b){r(b.data);let y={...b,integrity:ag(b)},v=`${Yt(y)}
145
- `;if(Buffer.byteLength(v)>i)throw new lt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let k=Sa.dirname(e);sg(k);let S=Sa.join(k,`.${Sa.basename(e)}.${process.pid}.${ig()}.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(k,"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 Ea(p().data)}function w(){let b=p();return{schemaVersion:b.schemaVersion,kind:b.kind,generation:b.generation,data:Ea(b.data)}}function x(b){if(typeof b!="function")throw new TypeError("mutator must be a function");let y=m();try{let v=p(),k=Ea(v.data),S=b(k,{generation:v.generation,now:ka(o)});return r(k),h({schemaVersion:Ql,kind:t,generation:v.generation+1,data:k}),Ea(S)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:w,mutate:x})}import{wordlists as WP}from"ethers";var GP=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),KP=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],YP=new Set([12,15,18,21,24]);function JP(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return YP.has(t.length)&&t.every(n=>WP.en.getWordIndex(n)>=0)}var XP=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,QP=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,ZP=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function eC(e){let t=cg(e);return ZP.has(t)||QP.test(t)}var No=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function cg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function tC(e){let t=cg(e);return[...GP].some(n=>t.includes(n))}function nC(e,t,n){if(typeof t=="string"){if(KP.some(r=>r.test(t))||JP(t))throw new No(n);if(XP.test(t)&&!eC(e))throw new No(n)}}function eu(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return nC(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)=>eu(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(tC(o))throw new No(i);e[o]!==void 0&&(r[o]=eu(e[o],i,o))}return r}function Tt(e){return eu(e)}var Aa=1,ug="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",F3=Object.freeze(["listing","offer","arm","instruct"]),aC=Object.freeze(["open","cancelled","expired","armed","submitted"]),D3=Object.freeze(["arm","sign-and-broadcast"]),sC=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."}),cC=/^(?:0|[1-9][0-9]*)$/,lC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,uC=/^0x[a-fA-F0-9]{40}$/,dC=/^0x[a-fA-F0-9]{64}$/,pC=/[\u0000-\u001f\u007f]/,mC=new Set(aC),ru=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 ru(e,t)}function En(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))En(t);Object.freeze(e)}return e}function Ro(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||pC.test(o))&&G(`${t} is invalid`),r?o.toLowerCase():o}function Re(e,t){let n=Ro(e,t,{max:128});return lC.test(n)||G(`${t} must be a bounded id`),n}function Oo(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 cC.test(r)||G(`${t} must be a canonical integer string`),n&&r==="0"&&G(`${t} must be positive`),r}function kn(e,t){let n=Ro(e,t,{max:42,lower:!0});return uC.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 Sn(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 tu(e){return new Date(e).toISOString()}function fC(e){return oC("sha256").update(Yt(e),"utf8").digest("hex")}function hC(e=process.env){let t=e.ORACLE_CONFIG_DIR||lg.join(rC(),".config","oracle");return lg.join(t,"local-marketplace.v1.json")}function Ia(e){let t=e.status==="submitted";return En({schemaVersion:Aa,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:mC.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=>En({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:ug,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function gC(e){(!e||e.schemaVersion!==Aa||!Array.isArray(e.listings))&&G("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&G("marketplace capacity exceeded","STORE_LIMIT")}function nu(e,t){return En({schemaVersion:Aa,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:ug,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function yC(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=kn(r.from??r.offerer??t.seller,"artifact.from"),i=kn(r.to??r.recipient??n.buyer,"artifact.to"),a=Oo(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 bC(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=Ro(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 pg({filePath:e=hC(),clock:t=()=>Date.now(),idFactory:n=()=>iC()}={}){let r=rr({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Aa,listings:[]}),validateData:gC});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={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=kn(h.seller,"seller"),x=Ro(h.asset,"asset",{max:128}),b=Oo(h.amount,"amount",{positive:!0}),y=Oo(h.price,"price",{positive:!0}),v=Oo(h.chainId,"chainId",{positive:!0}),k=Sn(t),S=tu(k),I=h.expiresAt==null?tu(k+864e5):Ro(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(I))||Date.parse(I)<=k)&&G("expiresAt must be after now");let P=Re(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:b,price:y,chainId:v,status:"open",createdAt:S,expiresAt:I,offers:[],custody:"none",execution:"armed-local"},$={...T,listingHash:fC(T)};return _.listings.push($),Ia($)})}function s({tenantId:h}={}){let g=Re(h,"tenantId"),w=Sn(t);return En(r.read().listings.filter(x=>o(x,g)).map(x=>Ia(i({...x,offers:x.offers.map(b=>({...b}))},w))))}function c({tenantId:h,listingId:g,actor:w}={}){let x=Re(h,"tenantId"),b=Re(g,"listingId"),y=kn(w,"actor"),v=Sn(t);return r.mutate(k=>{let S=k.listings.find(I=>o(I,x)&&I.listingId===b);return S||G("listing not found","NOT_FOUND"),i(S,v),S.seller!==y&&G("only the seller can cancel","FORBIDDEN"),S.status!=="open"&&G("listing is not open","NOT_OPEN"),S.status="cancelled",Ia(S)})}function l(h={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=Re(h.listingId,"listingId"),x=kn(h.buyer,"buyer"),b=Oo(h.amount,"amount",{positive:!0}),y=Sn(t),v=Re(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(k=>{let S=k.listings.find(I=>o(I,g)&&I.listingId===w);return S||G("listing not found","NOT_FOUND"),i(S,y),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:b,status:"open",createdAt:tu(y)}),Ia(S)})}function u(h,{tenantId:g,listingId:w,offerId:x,actor:b,now:y,allowed:v=["open","armed"]}){let k=h.listings.find(I=>o(I,g)&&I.listingId===w);k||G("listing not found","NOT_FOUND"),i(k,y),v.includes(k.status)||G("listing is not open","NOT_OPEN"),k.seller!==b&&G("only the seller can arm a fill","FORBIDDEN");let S=k.offers.find(I=>I.offerId===x);return(!S||!["open","armed"].includes(S.status))&&G("offer not found","NOT_FOUND"),{row:k,offer:S}}function d({tenantId:h,listingId:g,offerId:w,actor:x}={}){let b=Re(h,"tenantId"),y=Re(g,"listingId"),v=Re(w,"offerId"),k=kn(x,"actor"),S=Sn(t);return r.mutate(I=>{let{row:P,offer:_}=u(I,{tenantId:b,listingId:y,offerId:v,actor:k,now:S});return P.status="armed",_.status="armed",nu(P,_)})}async function p({tenantId:h,listingId:g,offerId:w,actor:x,instruction:b,executor:y}={}){let v=Re(h,"tenantId"),k=Re(g,"listingId"),S=Re(w,"offerId"),I=kn(x,"actor"),P=Sn(t),_=r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:k,offerId:S,actor:I,now:P,allowed:["open","armed"]}),Se=bC(b,W);return W.status="armed",pe.status="armed",{armed:nu(W,pe),instruction:Se,listingHash:W.listingHash}});if(_.instruction.action==="arm")return _.armed;let T=r.read().listings.find(B=>B.listingId===k&&B.tenantId===v),$=T?.offers.find(B=>B.offerId===S),U=yC(_.instruction.artifact,T,$);(!y||typeof y.executeConfirmedArtifact!="function")&&G("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&G("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await y.executeConfirmedArtifact(U,_.instruction.nonce,y),O=H?.receipt?.transactionHash??H?.transactionHash;(typeof O!="string"||!dC.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:k,offerId:S,actor:I,now:Sn(t),allowed:["armed"]});return W.status="submitted",pe.status="submitted",W.transactionHash=O.toLowerCase(),En({...nu(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 Re(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&G("consult text required"),En({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 sC}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import mg from"node:path";import{homedir as wC}from"node:os";import{createHash as xC,randomUUID as vC}from"node:crypto";var Pa=1,fg="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",W3=Object.freeze(["open","cancelled","armed","submitted"]),SC=/^(?:0|[1-9][0-9]*)$/,kC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,EC=/^0x[a-fA-F0-9]{40}$/,IC=/^0x[a-fA-F0-9]{64}$/,AC=/[\u0000-\u001f\u007f]/,au=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 au(e,t)}function Lo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Lo(t);Object.freeze(e)}return e}function $o(e,t,{max:n=256}={}){typeof e!="string"&&J(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||AC.test(r))&&J(`${t} is invalid`),r}function Nt(e,t){let n=$o(e,t,{max:128});return kC.test(n)||J(`${t} must be a bounded id`),n}function _a(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 SC.test(r)||J(`${t} must be a canonical integer string`),n&&r==="0"&&J(`${t} must be positive`),r}function In(e,t){let n=$o(e,t,{max:42}).toLowerCase();return EC.test(n)||J(`${t} must be a 20-byte EVM address`),n}function _C(e){let t=$o(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 hg(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&J(`${t} must be a plain object`),e}function PC(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 CC(e){return new Date(e).toISOString()}function TC(e=process.env){let t=e.ORACLE_CONFIG_DIR||mg.join(wC(),".config","oracle");return mg.join(t,"local-x402.v1.json")}function ou(e){let t=e.status==="submitted";return Lo({schemaVersion:Pa,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:fg,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function NC(e){(!e||e.schemaVersion!==Pa||!Array.isArray(e.intents))&&J("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&J("x402 capacity exceeded","STORE_LIMIT")}function iu(e){return Lo({schemaVersion:Pa,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:fg,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function OC(e,t){typeof e=="string"&&J("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=hg(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=In(n.from??t.payer,"artifact.from"),o=In(n.to??t.payTo,"artifact.to"),i=_a(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 RC(e,t){if(e==null)return{action:"arm"};let n=hg(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=$o(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 gg({filePath:e=TC(),clock:t=()=>Date.now(),idFactory:n=()=>vC()}={}){let r=rr({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Pa,intents:[]}),validateData:NC});function o(l={}){Tt(l);let u=Nt(l.tenantId,"tenantId"),d=In(l.payer,"payer"),p=In(l.payTo,"payTo"),m=_C(l.resource),f=_a(l.amount,"amount",{positive:!0}),h=_a(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&J("amount exceeds maxBudget","BUDGET");let g=$o(l.asset??"USDC","asset",{max:32}),w=_a(l.chainId,"chainId",{positive:!0}),x=PC(t),b=Nt(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(S=>S.intentId===b)&&J("intentId already exists","DUPLICATE");let v={intentId:b,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:w,status:"open",createdAt:CC(x),custody:"none",execution:"armed-local"},k={...v,intentHash:xC("sha256").update(Yt(v),"utf8").digest("hex")};return y.intents.push(k),ou(k)})}function i({tenantId:l}={}){let u=Nt(l,"tenantId");return Lo(r.read().intents.filter(d=>d.tenantId===u).map(ou))}function a({tenantId:l,intentId:u,actor:d}={}){let p=Nt(l,"tenantId"),m=Nt(u,"intentId"),f=In(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",ou(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=Nt(l,"tenantId"),m=Nt(u,"intentId"),f=In(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",iu(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=Nt(l,"tenantId"),h=Nt(u,"intentId"),g=In(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=RC(p,I);return I.status="armed",{armed:iu(I),instruction:P}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(S=>S.tenantId===f&&S.intentId===h),b=OC(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 y=await m.executeConfirmedArtifact(b,w.instruction.nonce,m),v=y?.receipt?.transactionHash??y?.transactionHash;(typeof v!="string"||!IC.test(v))&&J("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let k=y?.receipt?.status??y?.status;return k!==1&&k!=="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(),Lo({...iu(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 yg from"node:path";import{homedir as LC}from"node:os";import{randomUUID as $C}from"node:crypto";var lu=1,BC="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",tD=Object.freeze(["listed","revoked"]),MC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,FC=/[\u0000-\u001f\u007f]/,DC=/^[a-f0-9]{64}$/,UC=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,qC=new Set(["read","prepare","none"]),cu=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function Ee(e,t){throw new cu(e,t)}function uu(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))uu(t);Object.freeze(e)}return e}function Jt(e,t,{max:n=256}={}){typeof e!="string"&&Ee(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||FC.test(r))&&Ee(`${t} is invalid`),r}function Bo(e,t){let n=Jt(e,t,{max:128});return MC.test(n)||Ee(`${t} must be a bounded id`),n}function bg(e,t){let n=Jt(e,t,{max:64}).toLowerCase();return DC.test(n)||Ee(`${t} must be 64 lowercase hex`),n}function HC(e,t){let n=Jt(e,t,{max:2048}),r;try{r=new URL(n)}catch{Ee(`${t} must be an https URL`)}return r.protocol!=="https:"&&Ee(`${t} must be https`),(r.username||r.password)&&Ee(`${t} must not contain credentials`),r.toString()}function jC(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Ee("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Jt(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!UC.test(r)||r==="0.0.0.0")&&Ee(`outboundHosts[${n}] is not an allowlisted host`),r}))}function wg(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&Ee("clock invalid","CLOCK_INVALID"),n}function xg(e){return new Date(e).toISOString()}function zC(e=process.env){let t=e.ORACLE_CONFIG_DIR||yg.join(LC(),".config","oracle");return yg.join(t,"local-pack-registry.v1.json")}function su(e){return uu({schemaVersion:lu,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:BC,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function VC(e){(!e||e.schemaVersion!==lu||!Array.isArray(e.packs))&&Ee("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Ee("pack registry capacity exceeded","STORE_LIMIT")}function vg({filePath:e=zC(),clock:t=()=>Date.now(),idFactory:n=()=>$C()}={}){let r=rr({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:lu,packs:[]}),validateData:VC});function o(l={}){Tt(l);let u=Bo(l.tenantId,"tenantId"),d=Jt(l.name,"name",{max:128}),p=Jt(l.version,"version",{max:64}),m=Jt(l.publisher,"publisher",{max:128}),f=bg(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:bg(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:HC(l.homepage,"homepage"),w=jC(l.outboundHosts),x=Jt(l.spendScope??"none","spendScope",{max:16});qC.has(x)||Ee("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&Ee("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let b=wg(t),y=Bo(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(S=>S.packId===y||S.tenantId===u&&S.name===d&&S.version===p&&S.status==="listed")&&Ee("pack already listed","DUPLICATE");let k={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:w,spendScope:x,status:"listed",createdAt:xg(b),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(k),su(k)})}function i({tenantId:l}={}){let u=Bo(l,"tenantId");return uu(r.read().packs.filter(d=>d.tenantId===u).map(su))}function a({tenantId:l,packId:u}={}){let d=Bo(l,"tenantId"),p=Bo(u,"packId"),m=wg(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||Ee("pack not found","NOT_FOUND"),h.status!=="listed"&&Ee("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=xg(m),su(h)})}function s(){Ee("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){Ee("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}L();import{getAddress as QC,Interface as ir,keccak256 as mu}from"ethers";import{createHash as fu,createHmac as ZC,timingSafeEqual as Bg}from"node:crypto";he();import{Interface as Eg,getAddress as du,isAddress as WC}from"ethers";var GC="0x0000000000000000000000000000000000000000",Ig=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),KC=new Eg(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),YC=new Eg(["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 JC(e){let t=Number(e??4663),n=Ig[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Sg(e,t){if(/^weth$/i.test(String(e||"")))return du(Ig[t].weth);if(!WC(String(e||"")))throw new Error(`up33: invalid token ${e}`);return du(e)}function XC(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function kg(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 Ag(e,t={},n={}){try{let r=JC(t.chainId),o=Sg(t.tokenIn,r.chainId),i=Sg(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=XC(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 kg(c,r.chainId,r.factory,KC,"getPool",[o,i,s]),u=du(l[0]);if(u.toLowerCase()===GC)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 kg(c,r.chainId,r.quoter,YC,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 _g(e={},t={}){return Ag("exact-input",e,t)}async function Pg(e={},t={}){return Ag("exact-output",e,t)}Q();var V=4663,Ca="https://anvil.clutch.market",eT=`${Ca}/api/markets/snapshot?chainId=${V}`,tT=`${Ca}/api/rpc?chainId=${V}`,nT=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Ge="0x0bd7d308f8e1639fab988df18a8011f41eacad73",hu="0x0000000000000000000000000000000000000000",An=1e5,rT=256e3,Cg=256,oT=3e4,iT=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"}),Te=new ir(["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"]),aT=new ir(["function allowance(address owner,address spender) view returns (uint256)"]),Mg=new ir(["function decimals() view returns (uint8)"]),Tg=new ir(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),nt=new ir(["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)"]),Xt=new ir(["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 QC(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Rt(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 Fg(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 Ng(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>Cg)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Cg}`);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 sT(e,t,n=[],r={}){if(Number(e)!==V)throw new Error(`stonkbrokers: Anvil supports chain ${V} only`);if(!nT.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await E(tT,{method:"POST",headers:{origin:Ca,referer:`${Ca}/`,"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)=>sT(t,n,r,e))}async function ar(e={},t={}){if(e.snapshot){let s=Ng(e.snapshot),c={kind:"anvil-markets",chainId:V,total:s.length,contentHash:fu("sha256").update(or(s)).digest("hex")},l=gu(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 E(eT,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:rT,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=Ng(r),i={kind:"anvil-markets",chainId:V,total:o.length,contentHash:fu("sha256").update(or(o)).digest("hex")},a=gu(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 Ta(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 Dg({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 ar({},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=iT[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=ut(n),c=Ta(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)||Ta(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=mu(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+oT}}function Ug(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 Fo(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=Rt(e.tokenId),i=await Dg({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Te,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Te,"inventory",[BigInt(o)],s),ee(a,r,nt,"ownerOf",[BigInt(o)],s),ee(a,n,Te,"collection",[],s),ee(a,n,Te,"token",[],s),ee(a,n,Te,"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,Mg,"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=Ug(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),b=!!c[4],y=!!l[0],v=q(u[0],"NFT owner")===n,k=b&&y&&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:Fg(c[2],c[3]),available:k,evidence:{quoteAvailable:b,inventory:y,ownerIsMarket:v,marketCollection:f,attestation:x},reason:k?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Na(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await Dg({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Te,"quoteSellNFT",[],a),ee(i,n,Te,"collection",[],a),ee(i,n,Te,"token",[],a),ee(i,n,Te,"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,Mg,"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=Ug(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:Fg(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function qg(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 Ot(e,t){let n=Ke(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Hg({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:Ot(o,"gasLimit").toString(),maxFeePerGas:Ot(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=Ot(a,"maxPriorityFeePerGasWei").toString()),c}function jg(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 zg(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=Rt(e.tokenId),a=Ot(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 Fo({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=Ot(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,aT,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let b={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[Hg({...b,to:r,data:Te.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},k={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:qg(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:y}};return jg(k,l)}async function Vg(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=Rt(e.tokenId),s=Ot(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 Na({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=Ot(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()),b=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=q(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),k={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},S=[Hg({...k,to:o,data:Te.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:y,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:qg(e.tradeId),slippageBps:0,expiresAtMs:x+b,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:I,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:S}};return jg(P,u)}async function cT(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(v=>Rt(v)),b={kind:"anvil-inventory",chainId:V,market:q(e.market,"Anvil market"),collection:q(e.collection,"NFT collection"),total:x.length,contentHash:fu("sha256").update(or(x)).digest("hex")},y=gu(e.inventoryCompletenessEvidence,b,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:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=ut(t),r=q(e.market,"Anvil market"),o=Ta(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)||Ta(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Te,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>An)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${An}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>An))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${An}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:An};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Te,"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,Te,"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 lT(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 uT(e,t,n){let r=ut(n);try{let o=String((await ee(r,e,nt,"tokenURI",[BigInt(t)]))[0]),i=lT(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await E(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 Wg(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 dT(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 Oa(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await cT({...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 Fe(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 Fe(p,s,async h=>{try{let g=await Fo({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 Fe(i,s,async u=>{try{let[d,p]=await Promise.all([uT(r,u,t),Fo({market:n,collection:r,tokenId:u},t)]),m=Wg(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?dT(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 Gg(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Og(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 Kg(e={}){return{maxMarkets:Og(e,"maxMarkets",An),maxItemsPerMarket:Og(e,"maxItemsPerMarket",An)}}function Yg(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Mo(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 Jg(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 Xg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Kg(e),o=await ar(e,t),i=Yg(o,e,n),a=t.scanCollection||Oa,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Fe(i,s,async l=>{let u=Gg(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,...Mo(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Mo(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:V,marketCount:i.length,...Jg(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 Qg(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=Kg(e),o=await ar(e,t),i=o.snapshotCoverage?.complete===!0,a=Yg(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||yu,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Fe(a,l,async d=>{let p=Gg(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",...Mo(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=Mo(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),...Mo(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:V,marketCount:a.length,...Jg(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 Rg(e,t){return e>t?"ARB":"PASS"}async function pT(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||Pg)({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||Im)({...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||_g)({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||Xr)({...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 Lg(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 mT(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 or(e){return Array.isArray(e)?`[${e.map(or).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${or(e[t])}`).join(",")}}`:JSON.stringify(e)}function Zg(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:ZC("sha256",n).update(or(r)).digest("hex")}}function fT(e,t){return Zg(e,t)}function gu(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=fT(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!Bg(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 hT(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:mT(e,t)}function pu(e,t,n,r,o,i){let a=hT(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=Zg(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!Bg(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=Ot(a.gasLimit,`${r} evidence gasLimit`),g=Ot(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 b=q(w.sender,`${r} simulation sender`),y=q(w.owner,`${r} simulation owner`);if(!o.owner||b!==o.owner||y!==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),k=Number(w.expiresAtMs);if(!Number.isFinite(v)||!Number.isFinite(k)||v>n||k<=n||k<=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 $g(e){let t=q(e,"OpenSea payment token");if(t!==hu&&t!==Ge)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function yu(e={},t={}){let n=await Oa(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,b,y={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:b,owner:i,...y}),s=(w,x,b,y,v)=>pu(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(b,y,x,v),o),c=(w,x)=>{let b=null;try{b=q(w?.target,"conversion target")}catch{}let y=a(w?.calldataHash,w,"conversion",{target:b,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(y.calldataHash)||!/^0x[0-9a-f]{64}$/.test(y.blockHash)||!/^\d+$/.test(y.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",y,o);if(v.amount!=null||w?.gasEstimate==null)return v;let k=pu(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(k.amount==null)return{amount:null,evidence:null,error:k.error};let S=Ke(w.gasEstimate,"conversion gasEstimate");return{amount:S*k.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:S.toString(),gasPriceEvidence:k.evidence},error:null}},l=(w,x,b,y,v)=>{try{let k=String(x?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(k))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,_=y==="seaport-fulfillment"&&v===hu?String(x?.priceWei??""):"0",T={orderHash:k,protocolAddress:S,target:S,valueWei:_},$=s(w,y,P,b,T);if($.amount==null)throw new Error($.error);if($.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let U=$.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=[$];if(U){let j=String(x?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(j)?j:null,W=y==="seaport-offer-acceptance"?n.collection:v;H.push(s(w,"seaport-approval",B,b,{...T,target:W,valueWei:"0"}))}if(v===hu){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,b,{...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(k){return{amount:null,evidence:null,error:String(k.message||k)}}},u=Ke(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||Mi,p=t.openSeaBestOffer||Fi,m=t.paymentTokenConversion||(w=>pT({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await Na({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 b=w.quote,y=mu(Te.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(b.totalCostRaw)])).toLowerCase(),v=s("anvil-to-opensea","anvil-call",y,b.evidence.attestation,{target:n.market,valueWei:b.nativeSwapFeeWei}),k=null,S=null;if(x)try{k=$g(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,b.evidence.attestation,"seaport-offer-acceptance",k),P={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:b.paymentToken,amountUnits:b.amountUnits,anvilTotalCostRaw:b.totalCostRaw,anvilBaseCostRaw:b.baseCostRaw,anvilFeeRaw:b.fees.totalFeeRaw,paymentTokenDecimals:b.paymentTokenDecimals,nativeSwapFeeWei:b.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:k,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||!b.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=Lg(await m({chainId:V,direction:"acquire-exact-output",amountRaw:b.totalCostRaw,paymentToken:b.paymentToken,quoteToken:Ge}),{direction:"acquire-exact-output",amountRaw:b.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,Se=BigInt(x.sellerNetWei)-BigInt(B.amountInWei)-BigInt(b.nativeSwapFeeWei)-pe;h.push({...P,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:Se.toString(),decision:Rg(Se,u),reason:Se>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=mu(Te.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),$=s("opensea-to-anvil","anvil-call",T,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),U=null,H=null;try{U=$g(_.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:$.amount==null?null:$.amount.toString(),gasEvidence:$.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($.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(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=Lg(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=$.amount+O.amount+W.amount,Se=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:Se.toString(),decision:Rg(Se,u),reason:Se>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 b=BigInt(w.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>b?1:y<b?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Ra(e={},t={}){let n=ut(t),r=Rt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,tt.ammVault,Tg,"quoteSpecificBuy",[BigInt(r)]),ee(n,tt.ammVault,Tg,"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 ey(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 ty(e={},t={}){let n=ut(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await Fe(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Rt(a.brokerTokenId,"brokerTokenId"),c=Rt(a.nestedTokenId,"nestedTokenId"),l=q(a.tba,"TBA"),u=q(a.nestedCollection,"nested collection"),d=Wg({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([ey(s,n),ee(n,u,nt,"ownerOf",[BigInt(c)]).then(g=>q(g[0],"nested owner")),Ra({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 ny(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=Rt(e.brokerTokenId,"brokerTokenId"),o=Ke(e.maxTokenCostWei,"maxTokenCostWei"),i=Ke(e.maxEthFeeWei,"maxEthFeeWei"),a=await Ra({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 Do(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,Xt,"pendingEth"),ee(n,o,Xt,"minDropWei"),ee(n,o,Xt,"roundActive"),ee(n,o,Xt,"currentRound"),ee(n,o,Xt,"roundState").catch(()=>null),ee(n,o,Xt,"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 ry(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"?Xt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Xt.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=>Rt(s,"brokerTokenId")):[],r=ut(t),o=await Fe(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")),ey(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Do({which:"stock"},t),Do({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 iy(e={},t={}){try{let n=await ar(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 ay(e={},t={}){try{let n=await Do({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)}}}Q();import{createHash as yT}from"node:crypto";var La="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",bT=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"}]),_n=Object.freeze(Object.fromEntries(bT.map(e=>[e.name,e.selector]))),wT=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),xT=new Set(["name","endpoint","version","skills","domains"]),vT=new Set(["agentId","agentRegistry"]),sy=new Set(["reputation","crypto-economic","tee-attestation"]),ST=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,kT=64*1024;function Uo(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 bu(e,t,n){for(let r of Object.keys(e)){if(ST.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 sr(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 cy(e,t,{service:n=!1}={}){let r=sr(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 wu(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 $a(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function xu(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 vu(e){let t=$a(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return wu(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function uy(){let e=[];try{let t=$a(process.env.ORACLE_ERC8004_CHAIN_ID);vu(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 ET(e){return JSON.parse(JSON.stringify(e))}function Ba(e){let t=Uo(e,"registration file");if(bu(t,wT,"registration"),t.type!==La)throw new Error("erc8004: registration-v1 type required");let n={type:La,name:sr(t.name,"name",128),description:sr(t.description,"description",4096),image:cy(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=Uo(a,`services[${s}]`);bu(c,xT,`services[${s}]`);let l=sr(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:cy(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=sr(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=Uo(a,`registrations[${s}]`);bu(c,vT,`registrations[${s}]`);let l=xu(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>sy.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!sy.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>kT)throw new Error("erc8004: registration metadata oversized");return ET(n)}function IT(e){if(Uo(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==La)throw new Error("erc8004: registration-v1 type required");return Ba({type:La,...e})}function AT(e){let t=Ba(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function qo(e){return BigInt(e).toString(16).padStart(64,"0")}function dy(e){let t=Buffer.from(e,"utf8").toString("hex");return`${qo(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function _T(e){return`${_n.register}${qo(32)}${dy(e)}`}function PT(e,t){return`${_n.setAgentURI}${qo(e)}${qo(64)}${dy(t)}`}function CT(e,t){return`${e}${qo(t)}`}function TT(e){return yT("sha256").update(e,"utf8").digest("hex")}function Su(e,t){Uo(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 py(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=$a(e.chainId),c=wu(e.owner,"owner"),l=vu(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:TT(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 my(e={},t={}){Su(e,new Set(["chainId","owner","registration"]));let n=AT(IT(e.registration));return py(e,t,{kind:"erc8004-register",uri:n,selector:_n.register,data:_T(n)})}function fy(e={},t={}){Su(e,new Set(["chainId","owner","agentId","agentURI"]));let n=xu(e.agentId),r=hy(e.agentURI);return py(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:_n.setAgentURI,data:PT(n,r),id:n})}function hy(e){let t=sr(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 Ba(o),t}function ly(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 wu(`0x${e.slice(-40)}`,t)}function NT(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 gy(e={},t={}){Su(e,new Set(["chainId","agentId"]));let n=$a(e.chainId),r=xu(e.agentId),o=vu(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:CT(d,r)},"latest"]),[a,s,c]=await Promise.all([i(_n.ownerOf),i(_n.tokenURI),i(_n.getAgentWallet)]),l=hy(NT(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=Ba(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:ly(a,"owner"),tokenURI:l,agentURI:l,agentWallet:ly(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}he();var yy=999;async function by(e={}){let t={chainId:yy,rpc:null,dex:null};try{t.rpc=await qn(yy,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await zr("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 wy(e="HYPE",t={}){let r=(await zr(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 xy(e,t={}){return mn(e,t)}L();Q();var LT="https://api-mainnet.magiceden.dev/v2",Ho=1e9;function vy(e={}){return Ve({provider:"magiceden",defaultUrl:LT,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function lr(e={}){return vy(e).baseUrl}function Pn(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function ur(e={}){let t=Pn(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},vy(e).trusted)}function ku(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 cr(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 $T(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 BT(e){return Math.round(cr(e,"priceSol")*Ho)}function MT(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 FT({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function DT(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=FT(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Sy(e={}){try{let t=await Eu({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!Pn(e),readTier:"keyless",prepareTier:Pn(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!Pn(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Eu(e={},t={}){let n=ku(e.symbol||e.collection),r=await E(`${lr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:ur(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/Ho:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Ho:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Ho:null,exec:!1,raw:r}}function ky(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*Ho):null,tokenSize:e.tokenSize??1}}async function Ey(e={},t={}){let n=ku(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(`${lr(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 E(i.toString(),{headers:ur(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(ky);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Iy(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await E(`${lr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:ur(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(ky);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Ay(e={},t={}){if(!Pn(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=cr(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:cr(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${lr(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 E(l.toString(),{headers:ur(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Pt("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:BT(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ma(e={},t={}){if(!Pn(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=cr(e.priceSol??e.price,"priceSol"),s=MT(e.expiry),c=DT(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${lr(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 E(l.toString(),{headers:ur(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Pt("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 _y(e={},t={}){if(!Pn(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=ku(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=cr(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:cr(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${lr(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await E(a.toString(),{headers:ur(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=$T(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`);Pt("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})}Q();Zc();L();st();var dr=8,Iu=10n**BigInt(dr),qT="0xa4b1",Py=7,Au=1,HT=2n**64n-1n;function jT(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 zo(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function mr(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 jo(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>dr)throw new Error(`hl-staking: ${t} has more than ${dr} decimals`);let i=BigInt(r)*Iu+BigInt((o+"0".repeat(dr)).slice(0,dr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>HT)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function pr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Lt(e){let t=BigInt(String(e||"0")),n=t/Iu,r=(t%Iu).toString().padStart(dr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function Cy(e={}){try{let t=await _u(e);return{ok:t.count>0,provider:"hl-staking",chain:zo(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 _u(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 Pu(e={},t={}){let n=mr(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 Cu(e={},t={}){let n=mr(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 Ty(e={},t={}){let n=mr(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 Ny(e={},t={}){let n=mr(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 Tu(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 Fa(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||qT)}function zT(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Fa(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Nu({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:zo(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:jT(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:zT(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=ea(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 Oy(e={},t={}){let n=jo(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:jo(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Lt(n)} HYPE exceeds maxHype cap ${Lt(r)} HYPE`);let o=Tu(e),i=zo(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Fa(t),wei:pr(n),nonce:o};return Nu({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:pr(n),nonce:o},opts:t,args:e,caps:{amountHype:Lt(n),maxHype:r?Lt(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 Ry(e={},t={}){let n=jo(e.amountHype??e.amount,"amountHype"),r=Tu(e),o=zo(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Fa(t),wei:pr(n),nonce:r};return Nu({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:pr(n),nonce:r},opts:t,args:e,caps:{amountHype:Lt(n)},notes:[`Starts the ${Py} 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 Ly(e={},t={}){let n=mr(e.validator,"validator"),r=jo(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:jo(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${Lt(r)} HYPE exceeds maxHype cap ${Lt(s)} HYPE`);let c=Tu(e),l=zo(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Fa(t),validator:n,wei:pr(r),isUndelegate:a,nonce:c};return Nu({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:pr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:Lt(r),maxHype:s?Lt(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Au} 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 ${Au} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function $y(e={},t={}){let n=mr(e.user||e.address,"user"),r=await Pu({user:n},t),o=await Cu({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Py,validatorLockupDays:Au,exec:!1}}st();async function Ou(e={}){let t=Date.now();try{let n=await Et(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 WT=24*365,GT=8;function Ne(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function KT(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Da(e={},t={}){let[n,r]=await Promise.all([Qe(t),Et(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=Ne(u.markPx),p=Ne(u.prevDayPx),m=Ne(u.openInterest),f=Ne(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ne(u.oraclePx),midPx:Ne(u.midPx)??Ne(r?.[c.name]),prevDayPx:p,change24hPct:KT(d,p),dayNtlVolumeUsd:Ne(u.dayNtlVlm),premium:Ne(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(WT/GT)*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 By(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Da(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 My(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([Da({},t),Wi({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Wn(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:Ne(h.o),high:Ne(h.h),low:Ne(h.l),close:Ne(h.c),volume:Ne(h.v)})),p=l?.levels??[],m=Ne(p?.[0]?.[0]?.px),f=Ne(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 Fy(e={},t={}){let n=await Gi(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 mN,readFileSync as fN,readdirSync as hN,renameSync as gN,writeFileSync as yN}from"node:fs";import{homedir as bN}from"node:os";import{join as ja}from"node:path";var Vo=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});L();he();Q();import{Interface as Ru,getAddress as Vy,isAddress as JT}from"ethers";var Dy=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Uy=Object.freeze({42161:{name:"arbitrum",api:Dy[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Dy[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),qy="0x0000000000000000000000000000000000000000",XT=`0x${"0".repeat(64)}`,Hy=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),jy=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Ua=new Ru(["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"]),Wy=new Ru(["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)"]),QT=new Ru(["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)"]),ZT=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function hr(e){let t=Number(e??42161),n=Uy[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Uy).join(", ")})`);return{chainId:t,...n}}function qa(e,t={}){let n=hr(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function rt(e,t){if(!JT(e))throw new Error(`${t} must be a valid EVM address`);return Vy(e)}function ne(e){return Vy(e).toLowerCase()}function fr(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 Cn(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 eN(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 tN(e){let t=String(e||"marketIncrease").trim();if(!(t in Hy))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:Hy[t]}}function nN(e){let t=String(e||"noSwap").trim();if(!(t in jy))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:jy[t]}}function rN(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function oN(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function iN(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function aN({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=fr(e?.minPrice,"gmx minPrice"),i=fr(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 sN(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function cN(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function wt(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 lN(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:wt(t,"account",a=>ne(a)),market:wt(t,"market",a=>ne(a)),initialCollateralToken:wt(t,"initialCollateralToken",a=>ne(a)),key:wt(o,"key",a=>String(a).toLowerCase()),reason:wt(i,"reason",a=>String(a)),sizeDeltaUsd:wt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:wt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:wt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:wt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:wt(r,"isLong",a=>!!a)}}function uN(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=QT.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=ZT[r];if(!o)return null;let i=lN(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||cN(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 zy(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function dN(e=[],{chainId:t}={}){let n=hr(t);return(Array.isArray(e)?e:[]).map(r=>uN(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function Gy(e={},t={}){return E(`${qa(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Lu(e={},t={}){return E(`${qa(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Ky(e={},t={}){return E(`${qa(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function gr(e={},t={}){return E(`${qa(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Yy(e={}){let t=await gr({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function Jy(e={},t={}){let n=hr(e.chainId??42161),r=rt(e.account||e.owner||e.user,"gmx account"),o=Cn(e.start??0,"gmx start"),i=Cn(e.end??e.limit??20,"gmx end"),a=Wy.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 Xy(e={},t={}){let n=hr(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=Wy.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 Qy(e={},t={}){let n=hr(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=dN(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)=>zy(d.status)>=zy(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 Zy(e={},t={}){let n=hr(e.chainId??42161),r=tN(e.orderType||e.type),o=nN(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"):qy,l=e.uiFeeReceiver?rt(e.uiFeeReceiver,"gmx uiFeeReceiver"):qy,u=rt(e.market||e.marketToken,"gmx market"),d=rt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?fr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Cn(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=fr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=fr(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=eN(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[b,y]=await Promise.all([Lu({chainId:n.chainId},t),gr({chainId:n.chainId},t)]),v=oN(rN(b,"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 k=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 _=sN(v,x);if(_>0n&&m>_)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=iN(y,k);if(!T)throw new Error("gmx index ticker not found");let $=e.acceptablePrice?fr(e.acceptablePrice,"gmx acceptablePrice").toString():aN({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=Cn(e.triggerPrice??"0","gmx triggerPrice"),O=Cn(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=Cn(e.minOutputAmount??"0","gmx minOutputAmount"),B=Cn(e.validFromTime??"0","gmx validFromTime"),W=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,Se=String(e.referralCode||XT);if(!/^0x[0-9a-fA-F]{64}$/.test(Se))throw new Error("gmx referralCode must be bytes32 hex");let St=Array.isArray(e.dataList)?e.dataList:[];for(let me of St)if(!/^0x[0-9a-fA-F]{64}$/.test(String(me)))throw new Error("gmx dataList entries must be bytes32 hex");let Mt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:U},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt($),executionFee:f,callbackGasLimit:O,minOutputAmount:j,validFromTime:B},orderType:r.code,decreasePositionSwapType:o.code,isLong:x,shouldUnwrapNativeToken:W,autoCancel:pe,referralCode:Se,dataList:St},R=[];r.key==="marketIncrease"&&p>0n&&R.push(Ua.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(Ua.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(Ua.encodeFunctionData("createOrder",[Mt]));let F=Ua.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(k),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"})}st();var Qt="oracle.hl.entry-state.v1",wN=8,xN=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function yr(e){return e==null||e===0?0:e>0?1:-1}function Wo(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function vN(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||ja(bN(),".config","oracle")}function nb(e={}){return ja(vN(e),"hl-entry-states")}function Ha(e,t,n){return n==null&&e.push(t),n}function SN(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 $t(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function kN(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 $t("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)yr(o[a].rate)!==yr(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 EN(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return $t("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}:$t("defillama.stablecoins","no peggedUSD")}function eb(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 IN(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 $t("gmx.tickers","no matching symbol");let c=eb(s.minPrice,n),l=eb(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return $t("gmx.tickers","unreadable price");let d=n!=null&&n>0?Wo(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?$t("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 AN({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?$t("hl-info.fundingHistory","not fetched"):kN(r,{coin:e,asOfMs:n}),llamaStables:o==null?$t("defillama.stablecoins","not fetched"):EN(o,n),gmxTicker:i==null?$t("gmx.tickers","not fetched"):IN(i,{coin:e,hlMark:t,asOfMs:n})}}function tb(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 _N(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 PN({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:Qt,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=SN(n,e);if(!d)return{schema:Qt,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Ha(u,"markPx",le(m.markPx)),h=Ha(u,"oraclePx",le(m.oraclePx)),g=le(m.midPx),w=le(m.premium),x=Ha(u,"fundingRate",le(m.funding)),b=Ha(u,"openInterestCoin",le(m.openInterest)),y=le(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],k=le(v[0]),S=le(v[1]),I=x==null?null:x*(xN/wN)*100,P=b==null||f==null?null:b*f,_=i==null||i===0||b==null?null:(b-i)/i*100;_==null&&u.push("oiDeltaPct");let T=r?.levels,$=Array.isArray(T)?T[0]:[],U=Array.isArray(T)?T[1]:[],H=le($?.[0]?.px),O=le(U?.[0]?.px);H==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let j=tb(U,Number(t)||0,"buy"),B=tb($,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:Wo(j.avgFillPx,W),Se=B.avgFillPx==null||W==null?null:Wo(W,B.avgFillPx),St=_N(o,e);for(let Z of St.unknown||[])u.push(Z);let Mt=le(m.prevDayPx),R=f==null||Mt==null||Mt===0?null:(f-Mt)/Mt*100;R==null&&u.push("change24hPct");let F=AN({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:Qt,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:Wo(f,h),fundingRate:x,fundingAprPct:I,openInterestCoin:b,openInterestUsd:P,oiDeltaPct:_,dayNtlVolumeUsd:y,change24hPct:R,impactBidPx:k,impactAskPx:S,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:O,spreadBps:H==null||O==null?null:Wo(O,H),notionalUsd:Number(t)||0,buy:j,sell:B,buySlipBps:pe,sellSlipBps:Se},position:St,overlays:F,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function rb(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 CN(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 TN({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Qt||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=CN(n),a=rb(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Qt,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Vo.ALERT_ONLY},c=nb({...o,configDir:r||o.configDir});mN(c,{recursive:!0,mode:448});let l=ja(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return yN(u,`${JSON.stringify(s,null,2)}
146
- `,{mode:384}),gN(u,l),s}function $u(e={}){let t=nb(e),n=[];try{n=hN(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(fN(ja(t,r),"utf8")))}function NN(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Vo.ALERT_ONLY};let r=e.see,o=t;yr(r.fundingRate)!==yr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),yr(r.premium)!==yr(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:Qt,id:e.id,coin:e.see.coin,side:e.side,actionMode:Vo.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function ob(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 Go(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?Wn(n,t).catch(()=>null):Promise.resolve(null),e.user?Gn(e.user,t).catch(()=>null):Promise.resolve(null),n?bf({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),ya({},t).catch(()=>null),gr({chainId:42161},t).catch(()=>null)]);return PN({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function ib(e={},t={}){let n=e.see&&e.see.schema===Qt?e.see:await Go(e,t);return{see:n,...rb(n,e.side)}}async function ab(e={},t={}){let n=e.see&&e.see.schema===Qt?e.see:await Go(e,t);return TN({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function sb(e={},t={}){let n=e.locked||$u(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Vo.ALERT_ONLY};let r=await Go({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return NN(n,r)}st();Zi();ia();async function cb(e={}){let t=await ao(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function lb(e={},t={}){let n=e.coin,r=e.outcome==null?null:qt(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=db(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=Bu(i)));let a=n==null?null:Ht(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 ao(t))?.outcomes||[]).find(f=>{try{return qt(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=Bu(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=qt(r,i).coin}if(a=Ht(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,Xn(c,t)}async function ub(e={},t={}){let n=e.coin,r=e.outcome==null?null:qt(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=db(e.outcomeSide):(o=e.side,o!=null&&(o=Bu(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=qt(r,o).coin}let i=Ht(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,go(a,t)}function db(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function Bu(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")}Q();Kn();var VD="0x"+"00".repeat(32);function LN(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 pb(e,t){let n=et(e.makerAmount,"poly: makerAmount"),r=et(e.takerAmount,"poly: takerAmount");return LN(t==="BUY"?n:r)}Kn();var $N=new Set(["https://clob.polymarket.com/order"]),Ko=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),YD=Object.freeze(Ko.map(e=>e[0])),BN=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),MN="0xe111180000d2663c0091e4f400237545b87b996b",FN="0xe2222d279d744050d28e00520010520000310f59",mb=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function fb(e){let t=String(e||"").replace(/\/$/,"");if(!$N.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(!BN.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function gb(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=mb(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(fb(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?FN:MN;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!==Ko.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<Ko.length;S+=1)if(s[S]?.name!==Ko[S][0]||s[S]?.type!==Ko[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=mb(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=ke(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let b=ke(n.price,6,"poly: price");if(b<=0n||b>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*b!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(ke(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=pb(a,d);if(ke(v,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let k=t.maxNotionalUsd??t.maxNotionalUsdc;if(k!=null){let S=ke(k,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:fb(n.submitTo)})}function DN(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 yb(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:DN({...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 gb(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as nU,randomInt as UN}from"node:crypto";import{keccak256 as oU,concat as iU,zeroPadValue as aU,getCreate2Address as sU,AbiCoder as cU}from"ethers";var Sb=137;var qN="0xE111180000d2663C0091e4f400237545B87B996B",HN="0xe2222d279d744050d28e00520010520000310F59",bb="0x0000000000000000000000000000000000000000000000000000000000000000",Mu=6;var jN={name:"Polymarket CTF Exchange",version:"2",chainId:Sb},zN={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 za(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Va(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function xb(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function kb(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function VN(e,t,n,r){let o=kb(Number(n),r.price);if(e==="BUY"){let c=Va(Number(t),r.size),l=c*o;return za(l)>r.amount&&(l=xb(l,r.amount+4),za(l)>r.amount&&(l=Va(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=Va(Number(t),r.size),s=a*o;return za(s)>r.amount&&(s=xb(s,r.amount+4),za(s)>r.amount&&(s=Va(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function vb(e){let t=Number(e).toFixed(Mu),[n,r=""]=t.split(".");return(n+r.padEnd(Mu,"0").slice(0,Mu)).replace(/^0+/,"")||"0"}function WN(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=bb,builder:p=bb}=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=kb(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=VN(n,f,g,h),b=vb(w),y=vb(x),v=String(UN(1,2**31-1)),k=Date.now().toString(),S=n==="BUY"?0:1,I=s?HN:qN,P={salt:v,maker:i,signer:a,tokenId:String(t),makerAmount:b,takerAmount:y,side:S,signatureType:u,timestamp:k,metadata:d,builder:p},_={...jN,verifyingContract:I},T=n==="BUY"?w:x;return{domain:_,types:zN,value:P,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:T,exchange:I,negRisk:s}}function Eb(){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 Ib(e={},t={}){let n=WN(e),r={provider:"poly-clob",kind:"poly-order",chainId:Sb,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=yb(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as rO,keccak256 as $b}from"ethers";Q();Qa();Ka();var oO=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function iO(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Tt(e);for(let o of Object.keys(n))if(!oO.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 Bb(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=Cb(n,o),a=Lb(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 rO(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}:{...iO(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:$b(s),authorityReport:Tb(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:$b(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:Ja},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"})}Qa();Vu();ia();L();var yO="https://api.geckoterminal.com/api/v2",ts=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||yO).replace(/\/$/,""),wr=e=>encodeURIComponent(String(e));async function Wu(e={},t={}){let n=Math.max(1,Number(e.page||1));return E(`${ts(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function zb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return E(`${ts(t)}/networks/${wr(e.network)}/pools/${wr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Vb(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return E(`${ts(t)}/networks/${wr(e.network)}/tokens/${wr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Wb(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)),E(`${ts(t)}/networks/${wr(e.network)}/pools/${wr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Gb(e={}){let t=await Wu({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();he();import{Interface as Xb,getAddress as Qb,isAddress as wO}from"ethers";Q();var xO="https://api.curve.finance/v1",Zb=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||xO).replace(/\/$/,""),vO=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),ew="0x0000000000000000000000000000000000000000",Gu=new Xb(["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)"]),Kb=new Xb(["function coins(uint256) view returns (address)"]);function tw(e){let t=vO[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function ni(e,t){if(!wO(e))throw new Error(`${t} must be a valid EVM address`);return Qb(e)}function SO(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 Yb(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 nw(e,t,n){return[e,t,n,...Array(8).fill(ew)]}function rw(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function ow(e){return[e,...Array(4).fill(ew)]}async function kO({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=Kb.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=Kb.decodeFunctionResult("coins",c);i.push(Qb(l[0]))}return i}function Jb(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 iw(e={}){return E(`${Zb(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Ku(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 E(`${Zb(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function aw(e={}){let t=await Ku({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function Yu(e={},t={}){let n=Number(e.chainId??8453),r=tw(n),o=ni(e.pool,"curve pool"),i=ni(e.tokenIn,"curve tokenIn"),a=ni(e.tokenOut,"curve tokenOut"),s=SO(e.amountIn,"curve amountIn"),c=Yb(e.nCoins??2,"curve nCoins",2,8),l=Yb(e.poolType,"curve poolType",1,4),u=t.rpcCall||D,d=await kO({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=Jb(d,i,"tokenIn"),m=Jb(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=nw(i,o,a),h=rw(p,m,l,c),g=ow(o),w=Gu.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),b=Gu.decodeFunctionResult("get_dy",x),y=BigInt(b[0]);if(y<=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:y.toString(),nCoins:c,poolType:l,swapType:1,i:p,j:m,route:f,swapParams:h.map(v=>v.map(k=>k.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function sw(e={},t={}){let n=Number(e.chainId??8453),r=tw(n),o=ni(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=ni(e.receiver||e.recipient||o,"curve receiver"),a=await Yu({...e,sender:o},t),s=nw(a.tokenIn,a.pool,a.tokenOut),c=rw(a.i,a.j,a.poolType,a.nCoins),l=ow(a.pool),u=Gu.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"})}L();he();Q();import{Interface as IO,getAddress as AO,isAddress as _O,keccak256 as cw,toUtf8Bytes as lw}from"ethers";var PO="https://api.morpho.org/graphql",ns=new IO(["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)"]),CO=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||PO;async function Xu(e,t,n={}){return E(CO(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var TO="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 } } } }",NO="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 ri(e,t){let n=String(e||"").trim();if(!_O(n))throw new Error(`morpho: ${t} must be an address`);return AO(n).toLowerCase()}function OO(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 Ju(e){return Array.isArray(e)?`[${e.map(Ju).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ju(e[t])}`).join(",")}}`:JSON.stringify(e)}async function oi(e,t,n,r,o={}){let i=ns.encodeFunctionData(n,r),s=await(o.rpcCall||D)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return ns.decodeFunctionResult(n,s)}function RO(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function uw(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Xu(TO,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Qu(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return Xu(NO,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function dw(e={}){return{ok:(await Xu("query { __typename }",{},e))?.data?.__typename==="Query"}}async function pw(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=ri(e.vault||e.vaultAddress,"vault"),i=ri(e.owner||e.from||e.sender,"owner"),a=ri(e.receiver||i,"receiver"),s=OO(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await Qu({chainId:n,first:100},t),u=RO(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await oi(n,o,"asset",[],t),m=ri(p,"vault asset");if((u?.asset?.address?ri(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[x]=await oi(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[b]=await oi(n,o,"previewDeposit",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:b.toString()},h=ns.encodeFunctionData("deposit",[s,a])}else{let[x]=await oi(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[b]=await oi(n,o,"previewWithdraw",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:b.toString()},h=ns.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...g,calldataHash:cw(lw(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=cw(lw(Ju(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:u,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();he();import{Interface as $O,getAddress as Zu,isAddress as BO}from"ethers";Q();var MO="https://api-v3.balancer.fi/",FO=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||MO;async function hw(e,t,n={}){return E(FO(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var DO="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",mw=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"}}),UO="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",qO="0x0000000000000000000000000000000000000000",ed=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 gw(e){let t=Number(e??8453),n=mw[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(mw).join(", ")})`);return{chainId:t,...n}}function yw(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===qO||t===UO.toLowerCase()}function rs(e,t){if(!BO(e))throw new Error(`${t} must be a valid EVM address`);return Zu(e)}function fw(e,t,n){let r=String(e||"");return yw(r)||/^weth$/i.test(r)?Zu(t.weth):/^usdc$/i.test(r)?Zu(t.usdc):rs(r,n)}function HO(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 bw(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(DO,{first:n,chains:r,where:{chainIn:r}},t)}async function xw(e={}){return{ok:(await hw("query { __typename }",{},e))?.data?.__typename==="Query"}}async function td(e={},t={}){let n=gw(e.chainId),r=rs(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=fw(o,n,"balancer tokenIn"),a=fw(e.tokenOut||"USDC",n,"balancer tokenOut"),s=HO(e.amountIn,"balancer amountIn"),c=rs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=ed.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,bw(e.userData)]),d=await(t.rpcCall||D)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=ed.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 vw(e={},t={}){let n=gw(e.chainId),r=rs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=yw(o),a=await td({...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=ed.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,bw(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"})}L();import{getAddress as zO}from"ethers";Q();var VO="https://api-v2.pendle.finance/core",WO=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),GO="0x0000000000000000000000000000000000000000",KO="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Sw=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||VO).replace(/\/$/,"");function os(e,t){try{return zO(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function xr(e,t){return os(e,t).toLowerCase()}function YO(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===KO||t===GO}function nd(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 JO(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:os(t.token,`pendle input ${n} token`),amount:nd(t.amount,`pendle input ${n} amount`)}))}function XO(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>os(t,`pendle output ${n} token`))}function QO(e){let t=WO[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function ZO(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 nd(t,"pendle output amount")}function e2(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!YO(r.token)).map(r=>({token:xr(r.token,"pendle approval token"),spender:xr(t,"pendle approval spender"),amount:nd(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function rd(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)),E(`${Sw(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function kw(e={}){let t=await rd({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function od(e={},t={}){let n=Number(e.chainId??42161),r=QO(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=os(e.receiver||o,"pendle receiver"),a=JO(e.inputs),s=XO(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 E(`${Sw(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(xr(p.to,"pendle tx target")!==xr(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&xr(p.from,"pendle tx sender")!==xr(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=ZO(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:e2(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 Ew(e={},t={}){let n=await od(e,t),{transaction:r,...o}=n;return o}L();import{isAddress as n2}from"ethers";Q();var r2="https://api.odos.xyz",id=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||r2).replace(/\/$/,"");async function ad(e={}){return E(`${id(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function o2(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(!n2(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Iw(e={},t={}){let n=o2(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 E(`${id(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 Aw(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Iw(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 _w(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Iw(e,t),i=await E(`${id(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 Pw(e={}){let t=await ad(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var Cw=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,a2=/[<>&`*_~[\]()|\\]/g,s2=/[\u0000-\u001F\u007F]/g;function sd(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Cw,"").replace(s2,"").replace(a2,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function cd(e){if(e==null)return!1;let t=String(e);return Cw.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Tw=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 is(e,t={}){let n=Number(e),r=t.baseUrl||Tw[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Nw(e){return!!Tw[Number(e)]}async function ld(e={},t={}){return E(`${is(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ow(e={},t={}){if(!e.address)throw new Error("address required");return E(`${is(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Rw(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return E(`${is(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Lw(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${is(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await E(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function $w(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=sd(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=sd(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:cd(o.symbol)||cd(o.name)||void 0})}return n}async function Bw(e={}){let t=await ld({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as l2}from"ethers";L();he();st();var u2="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",Fw=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 Zt(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function as(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function Mw(e){if(!e)return null;try{return l2(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function On(e={},t=process.env){let n=e.addresses||{},r=Mw(n.evm||e.evmAddress||as(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||as(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||as(t,"ORACLE_BITCOIN_ADDRESS"),a=Mw(n.hyperliquid||e.hyperliquidAddress||as(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 ii(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 vr(e){let t=Number(e);return Number.isFinite(t)?t:null}function ss(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function en(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Dw(e,t){let n=Fw[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 d2(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:ii(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 ud(e,t){return{family:e,status:"unsupported",reason:t}}function dd(e,t){if(!e||e.status!=="ok")return e;let n=Dw(t,e.symbol),r=vr(e.amount),o=r!=null&&n.priceUsd!=null?ss(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Uw(e={}){let t=On({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function cs(e={},t={}){let n=new Date().toISOString(),r=On(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Vn.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(Fw))],u=o?ve(()=>vn(l,Zt(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Fe(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={...Zt(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},me=await ve(()=>pn(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 Ce=F.nativeCurrency?.decimals??18,je=F.nativeCurrency?.symbol||"NATIVE",K=me.data.balanceWei,be={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Nw(R)){let un=await ve(()=>Lw({chainId:R,address:r.evm},{...Zt(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));un.ok?be={status:"ok",assets:$w(un.data,{fungibleOnly:!0}).map(Mr=>{let Fr=ii(Mr.amountRaw,Mr.decimals);return{...Mr,amount:Fr,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:un.ms}:be={status:"unavailable",assets:[],reason:un.error||"blockscout token-balances failed",source:"blockscout",latencyMs:un.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:Ce,amount:ii(K,Ce)},fungibleTokens:be,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:be.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=Zt(t,"solana"),F=await ve(()=>aa({address:r.solana},R)),Z=i||a?await Promise.all([ve(()=>xo({owner:r.solana,programId:Sl},R)).then(be=>({...be,program:"spl-token"})),ve(()=>xo({owner:r.solana,programId:u2},R)).then(be=>({...be,program:"token-2022"}))]):[],me=d2(Z),Ce=me.filter(be=>be.classification==="collectible-candidate"),je=me.filter(be=>be.classification!=="collectible-candidate"),K=Z.filter(be=>!be.ok).map(be=>be.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Z.some(be=>be.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:ii(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?Ce:[],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=Zt(t,"bitcoin"),F=Zt(t,"bitcoinMeta"),[Z,me,Ce]=await Promise.all([ve(()=>ca({address:r.bitcoin},R)),i?ve(()=>ua({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?ve(()=>tr({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),je=me.ok?me.data:null,K=Ce.ok?Ce.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:ii(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||Ce.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=Zt(t,"hyperliquid"),[F,Z,me]=await Promise.all([ve(()=>Vi(r.hyperliquid,R)),ve(()=>Gn(r.hyperliquid,R)),ve(()=>Et(R))]),Ce=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(K=>en(K.total)||en(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=>en(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:Ce,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,b]=await Promise.all([d,p,m,f,u]),y=b.ok?b.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"}),k=[];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&&k.push(`${F}:${String(Z.address).toLowerCase()}`)}let S=null;if(o&&k.length){let R=[...new Set(k)],F=await ve(()=>vn(R,Zt(t,"prices")));F.ok&&(S=F.data)}let I=h.map(R=>{let F=R.native?{...R,native:dd(R.native,y)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Z=v[F.chainId],me=F.fungibleTokens.assets.map(Ce=>{let je=String(Ce.symbol||"").toUpperCase(),K=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(je)&&(K=1),K==null&&Z&&Ce.address&&S?.coins){let Up=`${Z}:${String(Ce.address).toLowerCase()}`,Mr=S.coins[Up],Fr=Number(Mr?.price);Number.isFinite(Fr)&&Fr>0&&(K=Fr)}let be=vr(Ce.amount),un=be!=null&&K!=null?ss(be*K):null;return{...Ce,priceUsd:K,usdValue:un}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});g.native&&(g.native=dd(g.native,y)),w.native&&(w.native=dd(w.native,y));let P=0,_=0,T=0;for(let R of[...I,g,w]){R.native?.status==="ok"&&en(R.native.amount)&&(R.native.usdValue!=null?(P+=R.native.usdValue,_+=1):T+=1);for(let F of R.fungibleTokens?.assets||[])!en(F.amount)&&!en(F.amountRaw)||(F.usdValue!=null?(P+=F.usdValue,_+=1):T+=1)}let $=Dw(y,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),Z=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?$.priceUsd||vr(x.mids?.HYPE):vr(x.mids?.[R.coin]),me=vr(R.total);R.priceUsd=Z,R.usdValue=me!=null&&Z!=null?ss(me*Z):null,en(R.total)&&(R.usdValue!=null?(P+=R.usdValue,_+=1):T+=1)}let U=vr(x.perps?.accountValueUsd);U!=null&&U!==0&&(P+=U,_+=1);let H=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>en(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"),Se=I.filter(R=>R.fungibleTokens?.status==="ok");pe.length&&!Se.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 ${Se.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."),b.ok||W.push(`Price provider unavailable: ${b.error}`);let St=[ud("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),ud("sui","Sui balance adapter is not installed"),ud("aptos","Aptos balance adapter is not installed")],Mt=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")+St.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&&!Mt&&B("unavailable")===0&&B("not-configured")===0&&St.length===0,priceSource:o?"DefiLlama":null,priceStatus:b.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...I,g,w,x],unsupportedFamilies:St,warnings:W}}import{constants as us}from"node:fs";import{chmod as B2,mkdir as M2,open as F2,readFile as D2}from"node:fs/promises";import{createHash as U2,randomUUID as q2}from"node:crypto";import H2 from"node:os";import kr from"node:path";L();L();var m2=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"]),f2=new Set(["image/jpeg","image/png","image/webp"]);function h2(e){let t=String(e||"").toLowerCase();return m2.some(n=>t===n||t.endsWith(`.${n}`))}function g2(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 qw(e){let t=g2(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!h2(n.hostname)?null:n}async function y2(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=qw(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 ve(()=>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=qw(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(!f2.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("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function b2(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function Hw(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 b of a){if(c>=l){s.push({item:b,image:null,error:"gallery page byte cap reached"});continue}try{let y=await y2(b.imageUrl||b.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:b,image:y,error:null})}catch(y){s.push({item:b,image:null,error:String(y?.message||y).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:b,image:y,error:v},k)=>{let S=k%u,I=Math.floor(k/u),P=S*d,_=m+I*p,T=y?`<image x="${P+14}" y="${_+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.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>`,$=pd(b2(b,k).slice(0,34)),U=pd(b.chain||"unknown chain");return`${T}<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">${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(b=>b.image).length,placeholders:s.filter(b=>!b.image).map(b=>({assetKey:b.item.assetKey||null,name:b.item.name||null,sourceUrl:b.item.imageUrl||null,error:b.error})),rasterOnly:!0,externalScripts:!1}}var w2=[/\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],x2=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,v2=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function S2(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;x2.test(n)&&t.push("url-in-name");let i=w2.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),v2.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 jw(e={}){let t=S2(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}Q();var k2=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),E2=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 Rn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function ai(e,t){let n=await ve(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function I2(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function A2(e={},t){let n=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:n==null?null:String(n),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(n?`Inscription ${n}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function _2(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 Ww(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function P2(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 C2(e,t){let n=Ww(e),r=t.get(n),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!r)return{...e,assetKey:n};let i=Number(r.costUsd),a=Number(r.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(a)||a<0)return{...e,assetKey:n,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let s=Math.round((i+a)*100)/100;return Number.isFinite(o)?{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-s)*100)/100,currentValueUsd:o,totalCostUsd:s,realizedUsd:null}}:{...e,assetKey:n,acquisitionCost:{costUsd:i,feesUsd:a,totalCostUsd:s,acquiredAt:r.acquiredAt||null,source:r.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function T2(e){let t=new Map;for(let n of e){let r=Ww(n);t.has(r)||t.set(r,n)}return[...t.values()]}function N2(e,t){let n=e.filter(i=>i.itemPnl?.status==="estimated"),r=e.length-n.length,o=Math.round(n.reduce((i,a)=>i+Number(a.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:r===0&&e.length?"estimated-complete-for-held-items":n.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:n.length,unknownItems:r,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function Gw(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Sr(e={},t={}){let n=new Date().toISOString(),r=On(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=k2.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=Rn(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Fe(l,4,async y=>({row:y,result:await ai(`opensea-${y.chain}`,()=>to({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:v}of u)if(v.ok){let k=v.data.nfts.map(S=>({...S,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...k),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:v.data.complete?"ok":"partial",count:k.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let y of i.filter(v=>v.family!=="solana"))a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let y=await ai("opensea-solana",()=>to({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let v=y.data.nfts.map(k=>({...k,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...v),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:v.length,complete:y.data.complete,next:y.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:y.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 y=await ai("satflow-wallet-contents",()=>pa({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Rn(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let v=I2(y.data.contents).map(S=>A2(S,r.bitcoin));s.push(...v);let k=v.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:k?"ok":"partial",count:v.length,complete:k,source:"satflow"})}else{let v=await ai("bitcoin-meta-inscriptions",()=>tr({address:r.bitcoin},Rn(t,"bitcoinMeta")),t.timeoutMs??35e3),k=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];s.push(...k.map(S=>_2(S,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:k.length?"partial":"unavailable",count:k.length,complete:!1,source:k.length?"bitcoin-meta":"satflow",error:k.length?"Satflow unavailable; fallback has IDs only":y.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 y of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await ai(`opensea-pnl-${y}`,()=>$i({address:y},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:v.error})}let p=P2(e.costBasis),m=T2(s).map(y=>C2(y,p)).map(y=>jw(y)),f=m.filter(y=>!y.spam),h=m.filter(y=>y.spam),g=f.filter(y=>y.estimatedValueUsd!=null&&Number.isFinite(Number(y.estimatedValueUsd))),w=Math.round(g.reduce((y,v)=>y+Number(v.estimatedValueUsd),0)*100)/100,x=f.length-g.length,b=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:E2,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&&b.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:N2(f,d),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}function zw(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 O2(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 Kw(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 qi(e,Rn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=zw(e.expiry??e.endTime,"Solana NFT listing expiry");return Ma({...e,expiry:r},Rn(t,"magiceden"))}if(n==="satflow"){let r=zw(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return ma({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:O2(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Rn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function md(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 fd(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function ls(e){return String(e??"").trim().toLowerCase()}function R2(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=ls(t),i=ls(n);return!o||!i?!1:r.some(a=>ls(a.trait_type??a.traitType??a.type)===o&&ls(a.value??a.trait_value??a.traitValue)===i)}function L2(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function Vw(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 hd(e){return Math.round(Number(e)*1e6)/1e6}function tn(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 Yw(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return tn(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 tn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=md(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=md(e.minTraitVolumeEth,"minTraitVolumeEth"),u=md(e.traitFloorEth,"traitFloorEth"),d=fd(e.collectionFloorEth),p=fd(e.maxListingAgeMs),m=fd(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return tn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return tn(e,"invalid-min-trait-sales");if(u<=0)return tn(e,"trait-floor-unavailable");let f=S=>R2(S,e.traitType,e.traitValue)&&L2(S,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(S=>{if(!m)return!0;let I=Vw(S,["timestamp","soldAt","createdAt"]);return I!=null&&i-I<=m}),g=hd(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 tn(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=Vw(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),b={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."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return tn(e,"invalid-min-trait-listings",b);if(x.length<y)return tn(e,"trait-listing-depth-insufficient",b);let v=x[0],k=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:hd(v.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:b,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:hd(v.priceEth),discountBps:v.discountBps},evidence:b,prepareIntent:k}}async function Jw(e={},t={}){let n=await Sr({...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 Xw(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Sr({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await Hw({...e,items:n},Rn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var Qw=10*1024*1024,tx=1e3;function nn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Er(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Zw(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 nx(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 j2(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function rx(e={}){return`portfolio_${U2("sha256").update(j2(e)).digest("hex").slice(0,20)}`}function ox(e={}){if(e.historyFile)return kr.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return kr.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||kr.join(H2.homedir(),".hermes");return kr.join(kr.resolve(n),"state","oracle","portfolio-history.jsonl")}function z2(e){let t=nn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Er(t):null}function V2(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=nn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Er(t):null}function W2(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=nn(c.usdValue);return l==null?s:s+l},0),i=nn(n.perps?.accountValueUsd),a=Er(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>nn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=nn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Er(r)})}return t}function G2(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 K2(e,t){let n=ox(t),r=`${JSON.stringify(e)}
147
- `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await M2(kr.dirname(n),{recursive:!0,mode:448});let o=us.O_APPEND|us.O_CREAT|us.O_WRONLY|(us.O_NOFOLLOW||0),i=await F2(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await B2(n,384),n}async function ix(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||cs,o=t.nftInventoryImpl||Sr,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=z2(s),u=V2(c),d=[l,u].filter(v=>v!=null),p=d.length?Er(d.reduce((v,k)=>v+k,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||On(e,t.env||process.env),w=rx(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let b={schemaVersion:1,id:`snapshot_${q2()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:W2(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:G2(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await K2(b,t),snapshot:b,balance:s,nfts:c}}async function Y2(e){let t=ox(e);try{let n=await D2(t);if(n.byteLength>Qw)throw new Error(`portfolio history exceeds ${Qw} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
148
- `))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 J2(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=On(e,t.env||process.env);return Object.values(n).some(Boolean)?rx(n):null}async function gd(e={},t={}){let n=nx(e.limit,100,1,tx,"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=Zw(e.since,"portfolio history since"),i=Zw(e.until,"portfolio history until"),a=J2(e,t),s=await Y2(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=>nn(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 ex(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function ds(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function X2(e,t){if(e.length<=t)return e;let n=[];for(let r=0;r<t;r+=1)n.push(e[Math.round(r*(e.length-1)/(t-1))]);return n}function Q2(e,t){let c=e.map(b=>b.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let b=Math.max(1,Math.abs(l)*.05);l-=b,u+=b}else{let b=(u-l)*.1;l=Math.max(0,l-b),u+=b}let d=b=>e.length===1?1240/2:100+1040*b/(e.length-1),p=b=>570-(b-l)/(u-l)*470,m=e.map((b,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(b.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(b,y)=>{let v=y/4,k=100+v*470,S=u-v*(u-l);return`<line x1="100" y1="${k}" x2="1140" y2="${k}" stroke="#26313c" stroke-width="1"/><text x="86" y="${k+5}" text-anchor="end" fill="#8795a5" font-size="15">${ex(S)}</text>`}).join(""),h=e.map((b,y)=>`<circle cx="${d(y)}" cy="${p(b.value)}" r="5" fill="#b8f0ff"><title>${ds(b.recordedAt)}: ${ex(b.value)}</title></circle>`).join(""),g=ds(e[0].recordedAt.slice(0,10)),w=ds(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 ${ds(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 ax(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=nx(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await gd({...e,order:"asc",limit:e.limit??tx},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:nn(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=X2(o,n),a=i[0].value,s=i.at(-1).value,c=Er(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=Q2(i,r.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:r.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(u).toString("base64"),byteLength:Buffer.byteLength(u),summary:{points:i.length,omittedUnavailablePoints:r.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:a,endKnownUsd:s,changeUsd:c,changePct:l,completeSnapshots:i.filter(d=>d.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}he();var eR=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"}}),tR=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),nR=`0x${"0".repeat(64)}`;function rR(e){return!e||e==="0x"||e===nR}async function Ln(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(f){return{address:r,chainId:o,status:"unavailable",error:f?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(eR))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of tR)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!rR(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{a.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=s.filter(f=>f.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function sx(e={}){let t=Date.now();try{let n=await Ln({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 iR=/^0x[0-9a-fA-F]{40}$/,cx=4663;function ps(e,t){let n=String(e||"").trim();if(!iR.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function yd(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 si(e,t){return e==null||e===""?null:yd(e,t)}function aR({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=ps(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=yd(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=si(u.gasLimit??c.gasLimit,"gasLimit"),h=si(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}),b=fe(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:b.selectedBps,expiresAtMs:g+w},v=si(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(y.maxPriorityFeePerGas=v),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=si(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=si(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:b.selectedBps,expiresAtMs:g+w,fee:{oracleFeeBps:5},autoSlippage:b,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function sR(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}Nc();let n=of(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function cR({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 lx(e={},t={}){let n=Number(e.chainId??cx);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ps(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ps(e.tokenIn,"tokenIn"):null,i=e.recipient?ps(e.recipient,"recipient"):null,a=e.amountIn==null?null:yd(e.amountIn,"amountIn"),s=sR(n,t.scanner),c=t.scanContractRisk||Ln,[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=cR({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,b=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=aR({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(y){b=String(y?.message||y).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:b,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function ux(){Nc();let e=af();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:cx,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 uR=5,bd=[50,75,90],dx=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function $n(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 dR(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 ms(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=dx[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(dx).join(", ")}`};let i,a,s,c;try{i=$n(e.maxFeePerGasWei,"maxFeePerGasWei"),a=$n(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=$n(e.gasLimit,"gasLimit"),c=$n(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${uR.toString(16)}`,"pending",bd],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=$n(u?.baseFeePerGas,"baseFeePerGas")??$n(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 $n(S?.[o.percentile],"reward")}catch{return null}}).filter(S=>S!=null&&S>0n),f=dR(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 b=s!=null?s*w:null;c!=null&&b!=null&&b>c&&x.push({field:"totalGas",wanted:b.toString(),capped:c.toString()});let y=f==null||g>=f,v=c==null||b==null||b<=c,k=y&&v;return y||h.push(`tip cap ${g} is below the observed ${bd[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||h.push(`worst-case gas ${b} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:k,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:bd[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:b==null?null:b.toString(),clamps:x,notes:h}}he();var mR="08c379a0",fR="4e487b71",hR=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 gR(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===mR)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===fR){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:hR[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 yR(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 bR(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 wR(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 ci(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=wR(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=yR(f);if(!bR(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=gR(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 px(e={}){let t=Date.now();try{let n=await ci({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 vR=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 SR(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 kR(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 mx(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=kR(t);else if(o==="quantity")r+=SR(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function ER({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 fs(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=vR.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 fx(e={}){let t=Date.now();try{let n=await fs({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 wd(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 fs({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(b=>b.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(b=>b.signature)};let c=a.found.length>1&&!e.signature,l=await Ln({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await ci({chainId:r,tx:{from:o,to:n,data:mx(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 ms({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=mx(s,{minter:o,quantity:i})}catch(b){return{status:"error",error:b.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=xc({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(b=>b.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(b=>b.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=ER({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(b){x=String(b?.message||b).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(b=>b.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}Q();import{createHash as vL}from"node:crypto";import{createHash as AR}from"node:crypto";var _R=1,PR=8,Pe=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},CR=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),TR=new Set(["family","id"]),NR=new Set(["id","startsAt","endsAt","eligibility"]),OR=new Set(["kind","proofFormat","proofDigest"]),RR=new Set(["amount","unit"]),LR=new Set(["value","unit"]);function Ir(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Pe(`${t} must be a plain object`);return e}function Ar(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Pe(`${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 Pe(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function $R(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Pe(`${t} must be a positive safe integer`);return e}function xd(e,t){if(e=Ir(e,t),Ar(e,RR,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Pe(`${t} requires amount and unit`,"ambiguous-unit");let n=it(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Pe(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:it(e.unit,`${t}.unit`)}}function vd(e,t){if(e=Ir(e,t),Ar(e,LR,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Pe(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function BR(e,t){e=Ir(e,t),Ar(e,OR,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 Pe(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function MR(e,t){let n=`stages[${t}]`;e=Ir(e,n),Ar(e,NR,n);let r=vd(e.startsAt,`${n}.startsAt`),o=vd(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Pe(`${n} must end after it starts`,"invalid-stage-range");return{id:it(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:BR(e.eligibility,`${n}.eligibility`)}}function Sd(e){if(e=Ir(e,"input"),Ar(e,CR,"input"),e.version!==_R)throw new Pe("version must be 1");let t=Ir(e.chain,"chain");Ar(t,TR,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>PR)throw new Pe("stages must contain 1 through 8 entries","stage-count");let r=n.map(MR).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 Pe("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 Pe("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Pe("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:$R(e.quantity,"quantity"),stages:r,mintValueCap:xd(e.mintValueCap,"mintValueCap"),networkFeeCap:xd(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:xd(e.priorityFeeCap,"priorityFeeCap"),expiry:vd(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Pe("every stage must end no later than expiry","stage-after-expiry");return i}function FR(e){return JSON.stringify(Sd(e))}function hx(e){return`sha256:${AR("sha256").update(FR(e),"utf8").digest("hex")}`}var kd=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Bn=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Ed=Object.freeze(Object.values(Bn)),gx=new Set(Ed),yx=Object.freeze(Ed.slice(0,4)),DR=Ed,UR=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Le=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function hs(e,t){if(!Array.isArray(e)||e.length===0)throw new Le(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Le(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Le(`${t} contains duplicates`);return[...n].sort()}function qR(e){if(!Array.isArray(e))throw new Le("capabilities must be an array");let t=new Set(e);for(let n of t)if(!gx.has(n))throw new Le(`unknown capability ${n}`,"unknown-capability");return DR.every(n=>t.has(n))?kd.AUTOMINT_READY:yx.every(n=>t.has(n))?kd.PREPARE_READY:kd.RESEARCH_ONLY}function Id(e=[]){if(!Array.isArray(e))throw new Le("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Le("entry must be an object");for(let i of Object.keys(n))if(!UR.has(i))throw new Le(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Le("entry id must be an exact string");if(t.has(n.id))throw new Le(`duplicate entry id ${n.id}`,"duplicate-entry");let r=hs(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(hs(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(hs(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(hs(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:qR(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=yx){let o=t.get(n);if(!o)throw new Le(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!gx.has(i))throw new Le(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Le(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var Gq=Id([]);Q();import{getAddress as HR,Interface as Ad,keccak256 as jR}from"ethers";var rn=Object.freeze({manifold:new Ad(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Ad(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Ad(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Pd=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"})}),Xq=Object.freeze(Object.fromEntries(Object.entries(Pd).map(([e,t])=>[rn[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 HR(String(e||""))}catch{return oe(`invalid ${t}`)}}function $e(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 _d(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 zR(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=rn[e].getFunction(Pd[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 VR(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 WR(e,t){let n=e.stage;if(!n)return null;let r=$e(n.startTime,"stage startTime"),o=$e(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 GR(e,t){let n=Pd[e];String(t).slice(0,10).toLowerCase()!==rn[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=rn[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=rn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=rn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=rn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&oe("calldata must be canonical with no suffix"),r}async function bx(e,t={},n={}){rn[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=zR(e,t,n),s=Ye(t.recipient||t.minter,"recipient"),c=$e(t.quantity,"quantity",{positive:!0}),l=$e(t.priceWei,"priceWei"),u=$e(t.maxValueWei,"maxValueWei"),d=$e(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 VR(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||jR(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let f=GR(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=WR(t,h),w,x,b,y=null,v=[];if(e==="manifold")Ye(f[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||$e(f[1],"instanceId")!==$e(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||$e(f[2],"mintIndex")!==$e(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),v=_d([...f[3]]),w=Ye(f[4],"calldata recipient"),x=1n,b=l;else if(e==="zora")w=Ye(f[0],"calldata recipient"),x=BigInt(f[1]),b=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]),b=BigInt(f[3]);let _=f[4];v=_d([..._.proof]),y=BigInt(_.quantityLimitPerWallet),y<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"),b!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(v.map(_=>_.toLowerCase()))!==JSON.stringify(_d(t.proof).map(_=>_.toLowerCase()))&&oe("proof mismatch");let k=$e(p.value??0,"transaction value"),S=l*c;(k<S||k-S>d||k>u)&&oe("transaction value or fee cap exceeded");let I=p.gasLimit==null?null:$e(p.gasLimit,"gasLimit"),P=p.maxFeePerGas==null?null:$e(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(I==null||I>$e(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>$e(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:k.toString(),platformFeeWei:(k-S).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.toString()},proof:v,transaction:{chainId:r,to:i,data:p.data,value:k.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 KR="RESEARCH_ONLY";var YR="canonical serialized-message decoding and program-specific instruction validation are not implemented",gs=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),Zq=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function JR(){throw new Error(`solana-mint: ${KR}; disabled until ${YR}`)}function wx(){JR()}Q();import{Address as XR,CompactSize as QR,NETWORK as ZR,OutScript as Tx,Script as eL,TEST_NETWORK as xx,Transaction as tL,utils as nL}from"@scure/btc-signer";import{createHash as li}from"node:crypto";var vx="universal-ordinals-mint",Sx="bitcoin-ordinals-mint-plan",rL=1800*1e3,oL=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),kx=new Set,iL=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 on(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 Cd(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 Nx(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 aL(e){return e==="bitcoin"||e==="mainnet"?ZR:e==="regtest"?{...xx,bech32:"bcrt"}:xx}function Ex(e,t){try{let n=Tx.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 sL(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function cL(e){let t=li("sha256").update(e.unsignedTx).digest();return li("sha256").update(t).digest().reverse().toString("hex")}function Ix(e,...t){let n=li("sha256").update(e,"ascii").digest();return li("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function lL(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=Ix("TapLeaf",Buffer.from([a]),Buffer.from(QR.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Ix("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=nL.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 Ax(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=tL.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(sL(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=Ex(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)=>lL(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 Ex(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:cL(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 uL(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 dL(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 pL=new Set([1,3]);function mL(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=dL(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!pL.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 fL(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=eL.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(mL(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(li("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||uL(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 _x(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 hL(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 Ox(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 Rx(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=on(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function gL(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:on(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:Nx(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:Ox(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 yL(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:on(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Nx(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 Px(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 Cx(e,t,n){try{return Buffer.from(Tx.encode(XR(aL(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 bL(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)=>Rx({...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 wL(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");hL(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(!oL.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=Ox(e.parentId??e.parentInscriptionId),a=pt(e.recipient??e.destination,"recipient"),s=on(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(Rx);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");bL(e,c);let l=Ax(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Ax(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=yL(e.commitOutputs),p=gL(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((T,$)=>T.txid!==c[$].txid||T.vout!==c[$].vout||T.valueSats!==c[$].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Px(l.outputs,d,"commit PSBT"),Px(u.outputs,p,"reveal PSBT");let m=Cx(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,$]of p.entries())if($.scriptHex!==Cx($.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");fL(u,{contentHash:r,contentType:o,parentId:i});let g=Cd(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Cd(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Cd(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let b=on(e.commitFeeSats,"commitFeeSats"),y=on(e.revealFeeSats,"revealFeeSats"),v=on(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(b+y>v)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==b.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(b)/l.vsizeLowerBound>g||Number(y)/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:on(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>rL)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(_x),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(_x),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:b.toString(),revealFee:y.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:I,expiresAt:_}}function xL(e={},t={}){let n=wL(e,t),r=n.commitInputs.find(s=>kx.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:vx,kind:Sx,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...iL},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:vx,kind:Sx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)kx.add(s.outpoint);return a}var Lx=xL;var SL=Object.freeze([Bn.DISCOVERY,Bn.ELIGIBILITY,Bn.PREPARATION,Bn.SIMULATION]),$x=[["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",gs.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",gs.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",gs.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Bx=Object.freeze($x.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([Bn.DISCOVERY]):SL,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),m8=Id(Bx.map(({family:e,tier:t,enabled:n,...r})=>r)),Mx=new Map($x.map(e=>[e[0],e])),kL=new Set(["intent","adapterId","input"]),EL=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,ys=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 ys(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function Ae(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function Fx(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))EL.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),Fx(r,`${t}.${n}`)}function IL(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function AL(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:${vL("sha256").update(JSON.stringify(IL(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 _L(e,t){let n=Mx.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 PL(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,Ae(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Ae(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Ae(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,Ae(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Ae(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Ae(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,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function CL(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==fn(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 TL(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=Ae(e,"mintValueCap","wei"),o=Ae(e,"networkFeeCap","wei"),i=Ae(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 NL(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,Ae(e,"mintValueCap","lamports"),"mint-value cap");let r=Ae(e,"networkFeeCap","lamports"),o=Ae(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 OL(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,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(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 Td(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Bx})}async function Dx(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Td()}}async function Ux(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))kL.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"),Mx.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"),Fx(n);let r;try{r=Sd(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=_L(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=AL(r,n,r.chain.family,o);PL(r,n);let s;try{i[4]==="evm"?s=await bx(i[5],n,t):i[4]==="opensea"?s=await Ui(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await wx(n,t)):s=await Lx(n,t)}catch(u){if(u instanceof ys)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}CL(s);let c=i[4]==="bitcoin"?OL(r,n,s):i[4]==="solana"?NL(r,n,s):TL(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 Nd="ROUTE_ONLY",Od=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),Hx=new Set(Object.values(Od)),LL=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),$L=new Set(["amount","currency"]),BL=new Set(["value","unit"]),ML=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),FL=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 Cr(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 ui(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 jx(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 _r(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 zx(e,t){return e=Cr(e,t),ui(e,$L,t),{amount:jx(e.amount,`${t}.amount`),currency:ge(e.currency,`${t}.currency`)}}function qx(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>zx(n,`${t}[${r}]`))}function DL(e){if(e=Cr(e,"expiry"),ui(e,BL,"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 UL(e,t,n){Object.hasOwn(e,n)&&(t[n]=ge(e[n],n))}function Vx(e){e=Cr(e,"intent"),ui(e,LL,"intent");let t=ge(e.action,"action");if(!Hx.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"])UL(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=jx(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=zx(e.price,"price"),n.expiry=DL(e.expiry),n.fees=qx(e.fees,"fees"),n.royalties=qx(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ge(e.listingId,"listingId")),n}function qL(e){e=Cr(e,"adapter"),ui(e,ML,"adapter");let t=_r(e.actions,"adapter.actions");for(let o of t)if(!Hx.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=Cr(e.surface,"adapter.surface");ui(n,FL,"adapter.surface");let r=Cr(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(_r(e.networks,"adapter.networks")),standards:Object.freeze(_r(e.standards,"adapter.standards")),marketplaces:Object.freeze(_r(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(_r(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(_r(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Nd,custody:"user",surface:Object.freeze({provider:ge(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function HL(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(qL);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:Nd,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=Vx(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 Pr=(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}}),Rd=HL([Pr("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"}),Pr("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"}),Pr("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"}),Pr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Pr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Pr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Wx(e,{access:t="public",feeProfile:n="default",registry:r=Rd,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=Vx(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:Nd,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)})}Q();var ws="universal-evm-nft-transfer",Gx="evm-nft-safe-transfer",zL=1800*1e3,VL=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),WL=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function Kx(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(WL.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);Kx(r,t)}}}function Ld(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 Mn(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 di=e=>e.toString(16).padStart(64,"0"),bs=e=>e.slice(2).padStart(64,"0");function GL(e,t,n,r,o){return e==="erc721"?`0x42842e0e${bs(t)}${bs(n)}${di(r)}`:`0xf242432a${bs(t)}${bs(n)}${di(r)}${di(o)}${di(160n)}${di(0n)}`}function KL(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(Kx(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=Mn(e.chainId,"chainId",{positive:!0,safe:!0}),o=Ld(e.sender??e.from,"sender"),i=Ld(e.recipient??e.to,"recipient"),a=Ld(e.contract??e.contractAddress??e.tokenContract,"contract"),s=Mn(e.tokenId,"tokenId"),c=Mn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(Mn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=Mn(e.gasLimit,"gasLimit",{positive:!0}),u=Mn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=Mn(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)>zL)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=GL(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 Yx(e={},t={}){let n=KL(e,t),r={provider:ws,kind:Gx,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...VL},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:ws,kind:Gx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}Q();var xs="universal-solana-nft-transfer",Jx="solana-verified-nft-transfer",Qx="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Fn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Xx=new Set(Object.values(Fn)),JL=new Set([Fn.token,Fn.token2022]),XL=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),QL=/^(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 vt(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 we(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function Zx(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))QL.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),Zx(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 ZL(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 e$(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 t$(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),Zx(e),(e.network!=="mainnet-beta"||e.genesisHash!==Qx)&&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=vt(e.quantity,"quantity",{positive:!0}),s=vt(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!==Fn.core:!JL.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"&&we(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(vt(e.decimals??0,"decimals")):null,p=vt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=vt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=vt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&te("priority fee exceeds reviewed cap");let g=vt(e.networkFeeLamports,"networkFeeLamports"),w=vt(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 b=mt(x.recentBlockhash,"recentBlockhash");we(b,e.approvedBlockhash,"blockhash mutation after approval");let y=vt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=vt(e.currentBlockHeight,"currentBlockHeight");v>y&&te("expired blockhash"),(!Array.isArray(x.instructions)||x.instructions.length<3)&&te("canonical instructions required");let k=new Set([o,n,l,u].filter(Boolean)),S=new Set([o,i,n,r,l,u,...Xx].filter(Boolean)),I=0,P=0,_=0,T=0;for(let[$,U]of x.instructions.entries()){let H=mt(U.programId,`instructions[${$}].programId`);Xx.has(H)||te(`unknown program ${H}`);let O=ZL(U,`instructions[${$}]`);e$(U,S,k);let j=String(O.type??O.instruction??"").toLowerCase();H===Fn.computeBudget?j.includes("limit")?(we(O.units??O.computeUnitLimit,p,"compute-unit limit"),I++):j.includes("price")?(we(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),P++):te("unsupported compute budget instruction"):H===Fn.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),we(O.payer,o,"ATA payer"),we(O.owner,i,"ATA recipient"),we(O.mint,n,"ATA mint"),we(O.tokenAccount,u,"recipient ATA"),we(O.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&H===c?(j!=="transferchecked"&&te("only canonical transferChecked is allowed"),we(O.mint,n,"mint"),we(O.owner,o,"owner"),we(O.recipient,i,"recipient"),we(O.sourceTokenAccount,l,"source token account"),we(O.destinationTokenAccount,u,"recipient ATA"),we(O.amount,a,"quantity"),we(O.decimals,d,"decimals"),_++):t==="core"&&H===Fn.core?(j!=="transfer"&&te("only canonical Core transfer is allowed"),we(O.asset,n,"mint/asset"),we(O.collection,r,"collection"),O.collectionVerified!==!0&&te("verified collection required in Core instruction"),we(O.owner,o,"owner"),we(O.newOwner,i,"recipient"),we(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:b,lastValidBlockHeight:y.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 ev(e={},t={}){let n=t$(e),r=Number(t.nowMs??Date.now()),o={provider:xs,kind:Jx,chain:"solana-mainnet-beta",genesisHash:Qx,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...XL},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:xs,kind:Jx,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}Q();var vs="universal-ordinals-transfer",tv="bitcoin-ordinals-transfer-plan",nv=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),r$=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function sn(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function an(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 rv(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function sv(e,t){let n=sn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function cv(e,t="inscriptionId"){let n=sn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function lv(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`),lv(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 uv(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 ov(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),uv(e,t);let n=sv(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:an(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:sn(e.address,`${t}.address`),sequence:Number(an(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function iv(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),uv(e,t),{role:sn(e.role,`${t}.role`),address:sn(e.address,`${t}.address`),valueSats:an(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:cv(e.inscriptionId,`${t}.inscriptionId`)}}}function av(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function o$(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),lv(e);let t=sn(e.network,"network").toLowerCase(),n=sv(e.genesisHash,"genesisHash");(!nv[t]||n!==nv[t])&&ie("network/genesis mismatch");let r=cv(e.inscriptionId),o=ov(e.ownerInput,"ownerInput");sn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=sn(e.destination,"destination"),a=an(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:iv(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=rv(e.feeRateSatVb,"feeRateSatVb"),l=rv(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=an(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=an(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(an(e.locktime,"locktime",{max:0xffffffffn})),m=Number(an(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"),av(ov(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((b,y)=>iv(b,`psbt.outputs[${y}]`)):ie("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};av(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(b=>b.role==="inscription"&&b.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let x=h.reduce((b,y)=>b+BigInt(y.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 dv(e={},t={}){let n=o$(e);return N({provider:vs,kind:tv,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...r$},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:vs,kind:tv,env:t.env})}he();function a$(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 pv(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(!Ul(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=a$(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 mv(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 c$=1440*60*1e3;function l$(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>c$&&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 fv="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",u$=4663,d$="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",hv="a22cb465",p$="a0712d68";function $d(e){return String(e||"").trim().toLowerCase()}function Tr(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function m$(e){let t=Tr(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 f$(e){return Tr(e).includes(Tr(fv))}function h$(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Tr(n?.data).startsWith(hv))}function g$(e={},t){let n=Tr(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return $d(i[0])!==d$?!1:Tr(i[2])===n})}function y$(e=1){return`0x${p$}${BigInt(e).toString(16).padStart(64,"0")}`}function gv(e={},t={}){let n=$d(e.contract),r=$d(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!==u$&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),f$(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"),h$(s)&&a.push("simulation sets approval / setApprovalForAll"),g$(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:y$(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:m$(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!C0(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=l$(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:fv.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}L();Q();ra();var w$="https://api.paraswap.io",Bd=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||w$).replace(/\/$/,"");function Nr(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 Md(e={},t={}){let n=Number(e.chainId||1);return E(`${Bd(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Or(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Nr(e.srcToken,"srcToken"),destToken:Nr(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 na({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(Uf(o)))r.set(s,c);let i=await E(`${Bd(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 yv(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=Nr(e.userAddress,"userAddress"),o=await Or(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Nr(e.srcToken,"srcToken"),destToken:Nr(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=Nr(e.receiver,"receiver"));let c=await E(`${Bd(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 bv(e={}){let t=await Md({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 v$}from"node:crypto";import{getAddress as Ev,isAddress as Fd}from"ethers";var wv="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",S$=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),k$=Object.freeze(["lifi"]),xv=/^0x[0-9a-fA-F]{64}$/,E$=/^\d+$/;function ye(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function vv(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ye(t,"must be a positive chainId"),n}function Ss(e,t){let n=String(e??"").trim();return(!E$.test(n)||BigInt(n)<=0n)&&ye(t,"must be a positive integer string"),n}function I$(e,t){return e==null||e===""?null:Ss(e,t)}function Sv(e,t){let n=String(e??"").trim();return n.toLowerCase()===wv.toLowerCase()?wv:(Fd(n)||ye(t,"must be an EVM address or native token sentinel"),Ev(n))}function Iv(e,t){let n=String(e??"").trim();return Fd(n)||ye(t,"must be an EVM address"),Ev(n)}function A$(e,t){return e==null||e===""?null:Iv(e,t)}function kv(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 _$(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 Rr(e){if(Array.isArray(e))return e.map(Rr);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Rr(e[n]));return t}return e}function P$(e){return JSON.stringify(Rr(e))}function ks(e){return`0x${v$("sha256").update(P$(e)).digest("hex")}`}function Av(e,t){let n={...e};for(let r of t)delete n[r];return n}function C$(e){return ks(Av(e,["intentHash"]))}function T$(e){return ks(Av(e,["firmQuoteHash"]))}function Dd(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=vv(e.fromChainId??e.fromChain,"fromChainId"),i=vv(e.toChainId??e.toChain,"toChainId"),s=o===i?S$:k$,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Sv(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Sv(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:Ss(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Iv(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:_$(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:I$(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:kv(e.allowedSources,"allowedSources",s),allowedRouters:kv(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)?Rr(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):ks({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=C$(c),Object.freeze(c)}function N$(e){return(!e||typeof e!="object"||Array.isArray(e))&&ye("artifact","required"),e.typedDataHash!=null&&!xv.test(String(e.typedDataHash))&&ye("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!xv.test(String(e.calldataHash))&&ye("artifact.calldataHash","must be bytes32"),e.to!=null&&!Fd(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"),Rr(e)}function _v(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=Ss(t.amountOut??t.buyAmount,"amountOut"),s=Ss(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ye("minBuyAmount","exceeds amountOut");let c=N$(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=A$(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)?Rr(t.metadata):{}};return d.quoteId||(d.quoteId=ks({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=T$(d),Object.freeze(d)}function pi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Pv(e,t){return String(e?.[t]??"").trim()}function mi(e,t){return Object.freeze({source:e,run:t})}function O$(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 pi(e,"lifi")&&a.push(mi("lifi",async()=>{let c=await(r.lifiQuote??ko)({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 R$(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(pi(e,"paraswap")&&a.push(mi("paraswap",async()=>{let c=await(r.paraswapPrice??Or)({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}}})),pi(e,"0x")&&(Pv(n,"ZEROX_API_KEY")||Pv(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(mi("0x",async()=>{let c=await(r.zeroxQuote??Io)({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}}})),pi(e,"cow")&&a.push(mi("cow",async()=>{let c=await(r.cowQuote??nr)({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}}})),pi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(mi("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Hn)({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 R$(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function L$(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function $$(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>L$(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(_v(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 B$(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 Cv(e,t={}){let n=O$(e,t),{quotes:r,failed:o}=await $$(e,n,t),i=B$(r,t);return{kind:"rfq-result",intent:e,best:i.best,quotes:i.quotes,failed:o,warnings:[...i.warnings],sourcesTried:n.length,sourcesAnswered:r.length}}function Tv(e={},t={}){return Dd(e,t)}async function Nv(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Dd(e,t);return Cv(n,t)}async function Ov(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var F$="https://app.across.to";function Ud(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||F$).replace(/\/$/,"")}async function Rv(e={}){try{let t=await E(`${Ud(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 Lv(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return E(`${Ud(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function $v(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)),E(`${Ud(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var U$="https://api.beefy.finance";function qd(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||U$).replace(/\/$/,"")}async function Bv(e={}){try{let t=await E(`${qd(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 Mv(e={},t={}){let n=await E(`${qd(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 Fv(e={}){return E(`${qd(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var H$="https://public-api.birdeye.so";function Dv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||H$).replace(/\/$/,"")}async function Uv(e={}){try{let t=await E(`${Dv(e)}/public/tokenlist?sort_by=v24hUSD&sort_type=desc&offset=0&limit=1`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??1e4});return{ok:Array.isArray(t?.data)&&t.data.length>0,provider:"birdeye-tokens"}}catch(t){return{ok:!1,provider:"birdeye-tokens",error:String(t.message||t).slice(0,120)}}}async function qv(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 E(`${Dv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var z$="https://api.celenium.io";function Hd(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||z$).replace(/\/$/,"")}async function Hv(e={}){try{let t=await E(`${Hd(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 jv(e={}){return E(`${Hd(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function zv(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 E(`${Hd(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var W$="https://api.mainnet-beta.solana.com";function G$(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||W$).replace(/\/$/,"")}async function Es(e,t,n={}){let r=G$(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 Vv(e={}){try{let t=await Es("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 Wv(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 Es("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function Gv(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)),Es("searchAssets",o,t)}async function Kv(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Es("getAssetProof",{id:n},t)}L();var Y$="https://api.l2beat.com";function jd(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||Y$).replace(/\/$/,"")}async function Yv(e={}){try{let t=await E(`${jd(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 Jv(e={},t={}){let n=await E(`${jd(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 Xv(e={},t={}){return E(`${jd(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var X$="https://api.spark.fi";function zd(e={}){return(e.baseUrl||process.env.SPARK_API_URL||X$).replace(/\/$/,"")}async function Qv(e={}){try{return{ok:(await E(`${zd(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 Zv(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?E(`${zd(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):E(`${zd(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var Z$="https://api.symbiotic.fi";function Vd(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||Z$).replace(/\/$/,"")}async function eS(e={}){try{let t=await E(`${Vd(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 tS(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await E(`${Vd(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 nS(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return E(`${Vd(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var tB="https://staking-api.polygon.technology/api/v2",nB=18,rB=200,oB=50,iB=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function Gd(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||tB).replace(/\/$/,"")}function aB(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 sB(e,t=oB){let n=Number(e??t);return Number.isFinite(n)?Math.min(rB,Math.max(1,Math.trunc(n))):t}function Wd(e){let t=Number(e);return Number.isFinite(t)?t/10**nB:null}async function Kd(e,t={}){let n=await E(`${Gd(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 rS(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:Wd(e.totalStaked),selfStakePolApprox:Wd(e.selfStake),delegatedStakePolApprox:Wd(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function oS(e={},t={}){let n=await Kd("/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=iB.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=sB(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(rS)}}async function iS(e={},t={}){let n=aB(e.id??e.validatorId,"id"),o=(await Kd(`/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:{...rS(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 aS(e={}){try{let t=await Kd("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:Gd(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:Gd(e),error:String(t?.message||t),exec:!1}}}L();var lB="https://api.v3.aave.com/graphql",K8=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),uB=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||lB;async function Is(e,t,n={}){let r=await E(uB(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 dB=`query Markets($request: MarketsRequest!) {
143
+ - `)}`);let o=e.capabilities||{},i=Gi.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:Gi.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of Gi)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 Nc=new Map;function pf(e){let t=i1(e);return Nc.set(t.chainId,t),t}function mf(e){return Nc.get(Number(e))||null}function ff(){return[...Nc.values()]}he();var Rc={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},Xe=e=>BigInt(e).toString(16).padStart(64,"0"),io=e=>e.slice(2).toLowerCase().padStart(64,"0");function a1(e,t){return`0x${Rc.getAmountsOut}`+Xe(e)+Xe(64)+Xe(t.length)+t.map(io).join("")}function s1(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 Oc(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var Lc=100;function c1(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Lc)throw new Error(`slippageBps ${n} exceeds the ${Lc} 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 hf(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await D(t,"eth_call",[{to:o,data:a1(i,a)},"latest"],s);return s1(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=Oc(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=Oc(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=Oc(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=c1(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,b=x?`0x${Rc.swapExactETHForTokens}`+Xe(g)+Xe(128)+io(s)+Xe(w)+Xe(f.length)+f.map(io).join(""):`0x${Rc.swapExactTokensForTokens}`+Xe(a)+Xe(g)+Xe(160)+io(s)+Xe(w)+Xe(f.length)+f.map(io).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:b,value:x?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:Lc,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 l1=[100,500,3e3,1e4],gf={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},vn=e=>BigInt(e).toString(16).padStart(64,"0"),ao=e=>e.slice(2).toLowerCase().padStart(64,"0"),yf=/^0x[0-9a-fA-F]{40}$/,Bc=100;function u1(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Bc)throw new Error(`slippageBps ${n} exceeds the ${Bc} 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 $c(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function bf(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${gf.quoteExactInputSingle}`+ao(a)+ao(s)+vn(c)+vn(l)+vn(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=[],d=null;for(let p of l1){let m=await r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:p},l);u.push({fee:p,amountOut:m?m.toString():null}),m&&(!d||m>d.amountOut)&&(d={fee:p,amountOut:m})}return{best:d,tried:u}}return{async quote({tokenIn:i,tokenOut:a,amountIn:s},c={}){let l=$c(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(!yf.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=$c(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 k=await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:E.best.amountOut},c);if(k.best){let I=k.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: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 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),k=E.best?await o({quoter:l,tokenIn:i,tokenOut:v,amountIn:E.best.amountOut},c):{best:null};if(E.best&&k.best){let I=k.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: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=g.best.amountOut,x=Number(w*10000n/BigInt(a)),b=z.PASS,y="round trip completes with expected fee/impact loss";return x<5e3?(b=z.FAIL,y=`round trip returns only ${(x/100).toFixed(2)}% -- punitive tax or no real liquidity`):x<9e3&&(b=z.CAUTION,y=`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:b,reason:y,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=$c(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(!yf.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=u1(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${gf.exactInputSingle}`+ao(i)+ao(a)+vn(f)+ao(c)+vn(s)+vn(h)+vn(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:Bc,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 Ki={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function wf(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function xf(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 d1(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 jr(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:Y.LIVE}},async nativeBalance(r,o={}){let i=await hn(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 zr({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,Ki.decimals,o).catch(()=>null),n(r,Ki.symbol,o).catch(()=>null),n(r,Ki.name,o).catch(()=>null),n(r,Ki.totalSupply,o).catch(()=>null)]),l=wf(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:xf(a?.result??a),name:xf(s?.result??s),totalSupply:(wf(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 gn(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=uc(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 d=r;d<=o;d+=s){let p=Math.min(d+s-1,o);u.push([d,p])}for(let[d,p]of u){let m={fromBlock:`0x${d.toString(16)}`,toBlock:`0x${p.toString(16)}`};i&&(m.address=i),a&&(m.topics=a);let f=await D(t,"eth_getLogs",[m],c).catch(h=>({error:String(h?.message||h)}));if(f?.error)return{chainId:t,fromBlock:r,toBlock:o,logs:l,complete:!1,failedAt:[d,p],error:f.error,evidence: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=await this.resolveToken(r,o);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`});let l=await this.resolvePools(r,o);if(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 vf(e){let n={...d1(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,bf({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,hf({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 Yn=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 Mc(){return Yn.map(e=>pf(vf(e)))}var so=new Map,p1=Object.keys(ze).map(Number),m1=Object.keys(gt).map(Number),f1=Yn.map(e=>e.chainId),h1=[...new Set(Object.values(qi))],Fc=new Set,kf=!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(kf&&Fc.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return so.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),so.get(t)}function Dc(e){return so.get(e)||null}function Yi({venue:e,op:t}={}){let n=[...so.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function g1(){Fc.clear();for(let e of so.keys())Fc.add(e);kf=!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:f1,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:Yn.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:p1,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:m1,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:h1,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."});g1();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:"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."});L();st();st();var v1=/^0x[0-9a-fA-F]{40}$/,lo="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Uc(e,t){let n=String(e||"").trim();if(!v1.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function Cf(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Tf(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 k1(e){return[...e].sort((t,n)=>(Cf(n.tvl)??-1)-(Cf(t.tvl)??-1))}function qc(e){return e.hlInfo||ce}function Hc(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function jc(e={},t={}){let n=await qc(t)({type:"vaultSummaries"},t),r=k1((Array.isArray(n)?n:[]).map(Tf));return Hc({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Zi(e={},t={}){let r={type:"vaultDetails",vaultAddress:Uc(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Uc(e.user,"user"));let o=await qc(t)(r,t);return Hc({provider:"hl-vaults",vault:Tf(o||{}),raw:o})}async function zc(e={},t={}){let n=Uc(e.user||e.address,"user"),r=await qc(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 Hc({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Vc(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Zi({...e,vaultAddress:lo},t);if(n==="summaries")return jc(e,t);if(n==="details")return Zi(e,t);if(n==="mine")return zc(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Nf(e={}){try{let t=await Vc({mode:"hlp"},e);return{ok:t.vault.vaultAddress===lo&&!!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 E1}from"ethers";var Wc=999;var _e=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),Gc=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),I1=E1.defaultAbiCoder();function uo(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 po(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?I1.encode(e,t):"0x"}function It(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 A1(e,t=0){let n=It(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function Dt(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Wc});let r=await D(Wc,"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 Ut(e){return{provider:"hl-precompiles",chainId:Wc,...Gc,...e}}async function ea(e={}){let t=await Dt(_e.l1BlockNumber,"0x",e);return Ut({op:"l1BlockNumber",precompile:_e.l1BlockNumber,l1BlockNumber:It(t).toString(),raw:t})}async function Kc(e={},t={}){let n=po(e.index??e.assetId??0,"index",32),r=await Dt(_e.markPx,kn(["uint32"],[n]),t);return Ut({op:"markPx",precompile:_e.markPx,index:n,markPx:It(r).toString(),raw:r})}async function Yc(e={},t={}){let n=po(e.index??e.assetId??0,"index",32),r=await Dt(_e.oraclePx,kn(["uint32"],[n]),t);return Ut({op:"oraclePx",precompile:_e.oraclePx,index:n,oraclePx:It(r).toString(),raw:r})}async function Jc(e={},t={}){let n=po(e.index??e.assetId??0,"index",32),r=await Dt(_e.spotPx,kn(["uint32"],[n]),t);return Ut({op:"spotPx",precompile:_e.spotPx,index:n,spotPx:It(r).toString(),raw:r})}async function Xc(e={},t={}){let n=uo(e.user,"user"),r=po(e.perp??e.assetId??0,"perp",16),o=await Dt(_e.position,kn(["address","uint16"],[n,r]),t);return Ut({op:"position",precompile:_e.position,user:n,perp:r,szi:A1(o,0),raw:o})}async function Qc(e={},t={}){let n=uo(e.user,"user"),r=po(e.token??0,"token",64),o=await Dt(_e.spotBalance,kn(["address","uint64"],[n,r]),t);return Ut({op:"spotBalance",precompile:_e.spotBalance,user:n,token:r,total:It(o,0).toString(),hold:It(o,1).toString(),raw:o})}async function Zc(e={},t={}){let n=uo(e.user,"user"),r=uo(e.vaultAddress??e.vault??lo,"vault"),o=await Dt(_e.vaultEquity,kn(["address","address"],[n,r]),t);return Ut({op:"vaultEquity",precompile:_e.vaultEquity,user:n,vaultAddress:r,hlp:r===lo,equity:It(o,0).toString(),raw:o})}async function el(e={},t={}){let n=uo(e.user,"user"),r=await Dt(_e.withdrawable,kn(["address"],[n]),t);return Ut({op:"withdrawable",precompile:_e.withdrawable,user:n,withdrawable:It(r).toString(),raw:r})}async function Of(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return ea(t);if(n==="markPx")return Kc(e,t);if(n==="oraclePx")return Yc(e,t);if(n==="spotPx")return Jc(e,t);if(n==="position")return Xc(e,t);if(n==="spotBalance")return Qc(e,t);if(n==="vaultEquity"||n==="hlp")return Zc(e,t);if(n==="withdrawable")return el(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Rf(e={}){try{let t=await ea(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...Gc,l1BlockNumber:t.l1BlockNumber,precompiles:_e}}catch(t){return{ok:!1,provider:"hl-precompiles",...Gc,error:String(t?.message||t).slice(0,160)}}}st();X();function Lf(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function na(e={},t,n){let r=String(t||""),o=Lf(e);if(o){let a=mo(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=mo(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function ra(e={},t=[],n){let r=Lf(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(mo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&mo(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(mo(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var tl=Number.MAX_SAFE_INTEGER,ta=String(tl);function mo(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=tl?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>ta.length||t.length===ta.length&&t>ta||t===ta&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=tl?r:null}function th(){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 _t(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function nh(e){let t=_t(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function b_(e,t,n=4){let r=_t(e),o=_t(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 rh(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=_t(a.funding),l=_t(a.markPx??a.oraclePx),u=_t(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:_t(a.oraclePx),openInterest:u,fundingAprPct:nh(c)})}return r}function oh(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=_t(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=nh(n),o=n>0,i={coin:e.coin,notionalUsd:_t(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?b_(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 wl(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=rh(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 xl(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=rh(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return oh(i,r)}async function vl(e={},t={}){ah(e,t,"hl-delta-neutral");let n=sh(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await xl(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=na(e,r.coin,"hl-delta-neutral");if(!ih.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(()=>(wo(),bl)),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 ih=/^0x[0-9a-fA-F]{40}$/;function ah(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 w_(e,t,n){ah(e,t,n)}function x_(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=sh(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"&&ra(e,n,"hl-delta-neutral"),t==="live"&&!ih.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 sh(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={}){w_(e,t,"hl-delta-neutral");let n=x_(e),r=await wl({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=oh(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 vl({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();X();Qn();var k_=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),xo=14,lh=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function er(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function kl(e){let t=String(e||"").replace(/\/$/,"");if(!k_.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function uh(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=lh(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=kl(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(Sn(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(Sn(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");er(n.orderType,0,"orderType"),er(n.timeInForce,1,"timeInForce"),er(n.reduceOnly,0,"reduceOnly"),er(n.triggerPrice,0,"triggerPrice"),er(n.orderExpiry,-1,"orderExpiry");let c=lh(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=Se(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 b=Se(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(w>b)throw new Error("lighter: notional exceeds cap");let y=Ie(n.notionalUsd,"lighter: notionalUsd");return er(n.txType,xo,"txType"),Object.freeze({unit:"usd",value:String(y),notional:String(y),fee:"0",kind:r,symbol:c,marketIndex:i,side:n.side,baseAmount:p,price:m,submitTo:o,actionType:"create-order",amount:String(y)})}function S_(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 dh(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=kl(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:S_(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??xo,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return uh(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var mh="https://mainnet.zklighter.elliot.ai",fh="https://testnet.zklighter.elliot.ai";function E_(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?fh:mh}function hh(){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 Wt(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function I_(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 gh(e){let t=Wt(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function A_(e,t,n=4){let r=Wt(e),o=Wt(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 ph(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Sl(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=ph(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=ph(a.market_id);if(s==null)continue;let c=o.get(s),l=Wt(c?.mark_price??c?.index_price),u=Wt(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:Wt(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:gh(u)})}return i}function yh(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Wt(e.funding);if(n==null)throw new Error("lighter: funding required");let r=gh(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Wt(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?A_(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 El(e={}){let t=E_(e),n=e.fetchImpl,r=await S(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await S(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function bh(e={}){let{funding:t,books:n}=await El(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:Sl(t,n)}}async function Il(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await El(t),i=Sl(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 Al(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 El(t),a=Sl(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return yh(a,r)}async function _l(e={},t={}){xh(e,t,"lighter");let n=vh(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 Al(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=na(e,o.coin,"lighter");if(!wh.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=I_(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:xo,submitTo:`${s?fh:mh}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=dh(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 wh=/^0x[0-9a-fA-F]{40}$/;function xh(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 __(e,t,n){xh(e,t,n)}function P_(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=vh(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"&&ra(e,n,"lighter"),t==="live"&&!wh.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 vh(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 kh(e={},t={}){__(e,t,"lighter");let n=P_(e),r=await Il({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=yh(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 _l({coin:c.symbol,notionalUsd:c.notionalUsd,maxNotionalUsd:a,owner:e.owner,accountIndex:n.accountIndex,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs,testnet:t.testnet});i.push({...l,mode:"live",surface:"lighter"})}return{loop:!0,mode:n.mode,surface:"lighter",signer:"lighter",considered:r.considered,actions:i,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned official sendTx for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}L();var T_="https://clob.polymarket.com",N_="https://gamma-api.polymarket.com";function vo(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||T_).replace(/\/$/,"")}function Sh(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||N_).replace(/\/$/,"")}async function Pl(e={}){return S(`${vo(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Eh(e={}){let t=await Pl(e);return{ok:t!=null&&t!=="",time:t}}async function Ih({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 S(`${Sh(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Ah(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return S(`${vo(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function _h(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return S(`${vo(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ph(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return S(`${vo(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Ch(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 S(`${vo(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Th({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 S(`${Sh(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}he();L();import{createHash as Nh}from"node:crypto";var tr="mainnet-beta",R_="https://api.mainnet-beta.solana.com",Cl="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function L_(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||R_).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 $_(e,t){return t?[...e,{commitment:t}]:e}async function ko(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 S(L_(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 Tl(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await ko("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:tr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Oh(e={}){try{let[t,n]=await Promise.all([ko("getHealth",[],e),Tl({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:tr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:tr,error:String(t?.message||t),exec:!1}}}async function da(e={},t={}){let n=de(e.address||e.owner,"address"),r=await ko("getBalance",$_([n],e.commitment),t);return{provider:"solana-rpc",cluster:tr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function B_(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 So(e={},t={}){let n=de(e.owner||e.address,"owner"),r=e.mint?{mint:de(e.mint,"mint")}:{programId:de(e.programId||Cl,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await ko("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(B_):[];return{provider:"solana-rpc",cluster:tr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function M_(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 F_(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 D_(e){let t=Buffer.from(e,"base64");try{let n=F_(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Nh("sha256").update(t.subarray(r)).digest("hex")}catch{return Nh("sha256").update(t).digest("hex")}}async function Rh(e={},t={}){let n=M_(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await ko("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:tr,ok:i.err==null,transactionHash:D_(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}L();var q_="mainnet",H_="https://mempool.space/api",j_="https://mempool.space/testnet/api";function bt(e={}){return String(e.network||process.env.BTC_NETWORK||q_).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Ol(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):bt(e)==="testnet"?j_:H_}function Nl(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 z_(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 Rl(e,t={}){let n=`${Ol(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 pa(e,t={}){let n=await Rl(e,t);try{return JSON.parse(n)}catch{return n}}async function Lh(e={}){try{let t=await Rl("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:bt(e),baseUrl:Nl(Ol(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:bt(e),baseUrl:Nl(Ol(e)),error:Nl(t?.message||t),exec:!1}}}async function $h(e={}){let t=await Rl("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:bt(e),tipHeight:Number(t)}}async function Bh(e={}){try{let t=await pa("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:bt(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:bt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function ma(e={},t={}){let n=ct(e.address||e.addr,"address"),r=await pa(`/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:bt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Mh(e={},t={}){let n=ct(e.address||e.addr,"address"),r=await pa(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:bt(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 Fh(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 pa(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:bt(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 Dh(e={},t={}){let n=z_(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:bt(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 Ll="https://ordinals.com";function fa(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var W_=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Uh(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=fa(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=W_.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 nr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Uh(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 qh(e={}){let t=fa(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:Uh(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 ha(e={},t={}){let n=ct(e.address||e.addr,"address"),r=fa(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 nr(a,t),c=G_(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 G_(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 rr(e={},t={}){let n=ct(e.address||e.addr,"address"),r=fa(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 nr(s,t),l=K_(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 Hh(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||Ll,o=await nr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function jh(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||Ll,o=Number(e.page||0),i=await nr(`${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 zh(e={},t={}){let n=t.ordinalsBase||Ll,r=e.height??await nr(`${n}/r/blockheight`,t),o=await nr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function K_(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 J_=["unsigned","notsigned","tosign","signable"],X_=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),Q_=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function $l(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Z_(e){return J_.some(t=>e.startsWith(t))||X_.has(e)}function eP(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=$l(t);return Z_(n)?!1:Q_.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function tP(e){let t=Number(e?.v),n=String(e?.r||""),r=String(e?.s||"");return[0,1,27,28].includes(t)&&/^0x[0-9a-f]{2,64}$/i.test(n)&&/^0x[0-9a-f]{2,64}$/i.test(r)}function Bl(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=>Bl(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(eP(c)){o.push(c);continue}o.push(...Bl(l,t+1,n,r))}let a=Object.keys(e).map($l).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test($l(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),tP(e)&&o.push("v/r/s"),o}function Pt(e,t){let n=Bl(t);if(n.length)throw new Error(`${e}: refused a pre-signed transaction payload from the API (fields: ${[...new Set(n)].join(", ")}) \u2014 @oracle-agent/oracle is prepare-only and will not bind signed material into a prepared envelope`)}var nP="https://api.satflow.com/v1";function Vh(e={}){return Ve({provider:"satflow",defaultUrl:nP,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function ga(e={}){return Vh(e).baseUrl}function Fl(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function rP(e={}){return Ue({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":Fl(e)},Vh(e).trusted)}async function Gt(e,{method:t="GET",body:n,opts:r={}}={}){if(!Fl(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${ga(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:rP(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 Wh(e={}){if(!!!Fl(e))return{ok:!1,provider:"satflow",baseUrl:ga(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 Gt("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:ga(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:ga(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function Gh(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 Gt(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function Kh(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 Gt(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function Yh(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 Gt(`/item?${r}`,{opts:t})}}async function ya(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 Gt(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function Jh(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 Gt(`/orders/floor?${r}`,{opts:t})}}var oP=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function Xh(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))oP.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var iP=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"]),aP=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function Ml(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 sP(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 Qh(e={},t={}){let n=Xh(e,iP);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=Ml(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Gt("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=Ml(a)??Ml(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`);Pt("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=sP(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 ba(e={},t={}){let n=Xh(e,aP);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 Gt("/intent/sell",{method:"POST",body:n,opts:t});return Pt("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."})}L();X();var xa="https://lite-api.jup.ag/swap/v1",Dl="So11111111111111111111111111111111111111112",t0="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",lP=100,Zh=2e4;function n0(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||xa).replace(/\/$/,"")}function Eo(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 r0(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>lP)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function wa(e,t){return e==null?t:!!e}function uP(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 dP(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 o0(e){let t=Buffer.from(e,"base64"),n=dP(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 Io(e={},{quotedAtMs:t=Date.now(),ttlMs:n=Zh}={}){let r=de(e.inputMint,"inputMint"),o=de(e.outputMint,"outputMint"),i=Eo(e.inAmount,"inAmount"),a=Eo(e.outAmount,"outAmount"),s=Eo(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=r0(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)||Zh,1e3),3e4)}}function Ul({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Dl)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=o0(n),a=Eo(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 pP=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),mP="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function e0(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=mP.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 i0(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(`${xa}/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])=>e0(p)),c=[],l=a.filter(([p])=>!e0(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${xa}/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&&pP.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:`${xa}/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 a0(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await va({inputMint:Dl,outputMint:t0,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 va(e={},t={}){let n=de(e.inputMint||e.fromMint||Dl,"inputMint"),r=de(e.outputMint||e.toMint||t0,"outputMint"),o=Eo(e.amount||e.inAmount,"amount"),i=r0(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${n0(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 S(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Io({...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 fP(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function s0(e={},t={}){let n=de(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Io(e.quoteResponse,t)}:await va(e,t),o=r.quote,i=r.solanaGuard||Io(o,t);if(wa(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await S(`${n0(t)}/swap`,{method:"POST",body:fP({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:wa(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:wa(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:wa(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=uP(a?.swapTransaction);o0(s),Pt("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=Ul({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"})}L();var gP="https://coins.llama.fi",yP="https://api.llama.fi",bP="https://yields.llama.fi",wP="https://stablecoins.llama.fi";function xP(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||gP).replace(/\/$/,"")}function c0(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||yP).replace(/\/$/,"")}async function In(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return S(`${xP(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function l0(e={}){let n=(await In(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function u0(e={}){return S(`${c0(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function d0(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||bP).replace(/\/$/,""),r=await S(`${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 ka(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||wP).replace(/\/$/,""),r=e.includePrices!==!1;return S(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function p0(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 S(`${c0(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function m0(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await In(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}L();var Kt="0x000000000000000000000000000000000000dEaD";function ql(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Kt}X();ca();var kP="https://li.quest/v1";function jl(e={}){return(e.baseUrl||process.env.LIFI_API_URL||kP).replace(/\/$/,"")}var Hl="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",SP="0x0000000000000000000000000000000000000000";function EP(e){let t=String(e||Hl).toLowerCase();return t===Hl.toLowerCase()||t===SP}function f0(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 h0(e={}){let t=await S(`${jl(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 Ao(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Hl,toToken:i,fromAmount:a,fromAddress:s=Kt}=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 sa({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,w]of Object.entries(Gf(u)))c.set(g,w);let d=await S(`${jl(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 g0(e={},t={}){let n=await Ao(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(!EP(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:f0(s,"approval token"),spender:f0(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 y0(e={}){return S(`${jl(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}he();import{Interface as x0,getAddress as _o,isAddress as AP}from"ethers";X();var Yt={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},_P=[1,50,100,200,2e3],b0=new x0(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),PP=new x0(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),v0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",k0="0x0000000000000000000000000000000000000000";function S0(e){let t=Number(e),n=Yt[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Yt).join(", ")})`);return{chainId:t,...n}}function w0(e,t){let n=Yt[Number(t)];if(!e||e===v0||e===k0||/^eth$/i.test(String(e)))return _o(n.weth);let r=String(e);if(/^weth$/i.test(r))return _o(n.weth);if(/^usdc$/i.test(r))return _o(n.usdc);if(!AP(r))throw new Error(`invalid token address: ${e}`);return _o(r)}async function Sa(e={},t={}){let{chainId:n,quoter:r,router:o}=S0(e.chainId??8453),i=w0(e.tokenIn||"WETH",n),a=w0(e.tokenOut||Yt[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]:[..._P],l=[],u=null;for(let d of c){let p=b0.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await D(n,"eth_call",[{to:r,data:p},"latest"],t);if(!m||m==="0x"){l.push({tickSpacing:d,ok:!1,error:"empty result"});continue}let f=b0.decodeFunctionResult("quoteExactInputSingle",m),h={tickSpacing:d,ok:!0,amountOut:f[0].toString(),sqrtPriceX96After:f[1].toString(),initializedTicksCrossed:Number(f[2]),gasEstimate:f[3].toString()};l.push(h),(!u||BigInt(h.amountOut)>BigInt(u.amountOut))&&(u=h)}catch(m){l.push({tickSpacing:d,ok:!1,error:String(m.message||m).slice(0,160)})}}if(!u){let d=l.map(p=>`${p.tickSpacing}:${p.error||"fail"}`).join("; ");throw new Error(`aerodrome quote failed chain=${n}: ${d}`)}return re({venue:"aerodrome",chainId:n,chain:Yt[n].name,quoter:r,router:o,tokenIn:i,tokenOut:a,amountIn:s.toString(),tickSpacing:u.tickSpacing,amountOut:u.amountOut,gasEstimate:u.gasEstimate,sqrtPriceX96After:u.sqrtPriceX96After,initializedTicksCrossed:u.initializedTicksCrossed,triedTickSpacings:l,best:!0},{chainId:n,venue:o,amountOut:u.amountOut,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function E0(e={},t={}){let n=Number(e.chainId??8453),r=S0(n),o=_o(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===v0||i===k0||/^eth$/i.test(i),s=await Sa(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=PP.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 I0(e={}){let t=Number(e.chainId??8453);try{let n=await Sa({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:Yt[t]?.router,quoter:Yt[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function A0(){return Object.entries(Yt).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}L();X();var TP="https://api.0x.org";function _0(e={}){return Ve({provider:"zerox",defaultUrl:TP,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function P0(e={}){return _0(e).baseUrl}function Ea(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function C0(e={}){return Ue({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Ea(e)},_0(e).trusted)}async function T0(e={}){if(!Ea(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(!Ea(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),S(`${P0(t)}/swap/allowance-holder/price?${s}`,{headers:C0(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Po(e={},t={}){if(!Ea(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 S(`${P0(t)}/swap/allowance-holder/quote?${c}`,{headers:C0(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 N0(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Po(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"})}L();X();var OP="https://across.to/api",RP="https://api.hop.exchange/v1",LP="https://api.relay.link",$P={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453};async function O0(e={}){try{return{ok:!0,estimatedFillTimeSec:(await Vl({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 Vl(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||OP).replace(/\/$/,"");return S(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function R0(e={}){try{let t=await Wl({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 Wl(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||RP).replace(/\/$/,""),u=await S(`${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||$P[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 L0(e={}){try{let t=await Ia({user:Kt,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 Ia(e={},t={}){let{user:n=Kt,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||LP).replace(/\/$/,""),d=await S(`${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 $0(e={},t={}){let n=await Ia(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"})}L();import{TypedDataEncoder as F0,getAddress as Co,isAddress as MP}from"ethers";var qD=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});function Gl(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function B0(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}X();var Jl={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"},FP=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),DP=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Yl={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},D0={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},M0=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"}]}),JD=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});function Xl(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=Jl[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function To(e,t){let n=String(e||"").trim();if(!MP(n))throw new Error(`cowswap: ${t} must be an address`);return Co(n).toLowerCase()}function Kl(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 UP(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 qP(e){let t=FP[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:Co(t)}}function HP(e={},t,n){let r=To(e.sellToken,"sellToken"),o=To(e.buyToken,"buyToken"),i=To(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=UP(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:Kl(e.sellAmount,"sellAmount"),buyAmount:Kl(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:Kl(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function U0(e={}){try{let t=await or({chainId:1,sellToken:Yl[1],buyToken:D0[1],sellAmountBeforeFee:"1000000000000000",from:Kt},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 or(e={},t={}){let n=Number(e.chainId??1),r=ql(e.from||e.owner),o=e.sellToken||Yl[n],i=e.buyToken||D0[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=Yl[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 S(`${Xl(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 q0(e={},t={}){let n=Number(e.chainId??1),r=To(ql(e.from||e.owner||e.signer),"owner"),o=await or({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=HP(o?.quote||o,n,r),a=qP(n),s={domain:a,types:M0,primaryType:"Order",message:i},c=F0.hash(a,M0,i),l=DP[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:Co(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:Co(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:Co(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:jP({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 jP(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=Jl[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=To(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=F0.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 H0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return S(`${Xl(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function j0(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return S(`${Xl(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function z0(){return Object.keys(Jl).map(Number)}L();X();var VP="https://api.1inch.dev/swap/v6.0";function V0(e={}){return Ve({provider:"oneinch",defaultUrl:VP,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function Ql(e={}){return V0(e).baseUrl}function No(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function Zl(e={}){let t=No(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},V0(e).trusted)}async function W0(e={}){if(!No(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await eu({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 eu(e={},t={}){if(!No(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 S(`${Ql(t)}/${n}/quote?${a}`,{headers:Zl(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 WP(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function tu(e={},t={}){if(!No(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return S(`${Ql(t)}/${n}/approve/spender`,{headers:Zl(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function G0(e={},t={}){if(!No(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 S(`${Ql(t)}/${n}/swap?${c}`,{headers:Zl(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(!WP(r)){let f=l?.spender||l?.approvalAddress||(await tu({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 KP=96*1024,K0=50;function YP(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>KP)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 Ct(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function J0(e,t){let n=Ct(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 JP(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 XP(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=Ct(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:Ct(e.network,`accepts[${t}].network`),amount:J0(e.amount,`accepts[${t}].amount`),asset:Ct(e.asset,`accepts[${t}].asset`),payTo:Ct(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:JP(e.extra)})}function nu(e){let t=YP(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>K0)throw new Error(`x402: accepts must contain 1-${K0} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:Ct(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(XP));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 Y0(e,t){return String(e)===String(t)}function QP(e,t={}){let n=nu(e),r=Ct(t.network,"network"),o=Ct(t.asset,"asset"),i=Ct(t.payTo,"payTo"),a=BigInt(J0(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&Y0(l.asset,o)&&Y0(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 X0(e={}){return e.paymentRequired??e.header??e.body}function Q0(e={}){return nu(X0(e))}function Z0(e={},t={}){let n=nu(X0(e)),r=QP(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 eg(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}L();var eC="https://api.bankr.bot";function ru(e={}){return Ve({provider:"bankr",defaultUrl:eC,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function tg(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function tC(e={}){let t=tg(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function ng(e={},t=!1){let n=tC(e),r=ru(e);return Ue({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function rg(e,t={}){return S(`${ru(t).baseUrl}${e}`,{headers:ng(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function ou(e={}){return rg("/wallet/me",e)}async function og(e={}){return rg("/wallet/portfolio",e)}function Oo(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function nC(e){let t=Oo(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 ig(e={},t={}){let n={fromChain:Oo(e.fromChain,"fromChain"),fromToken:Oo(e.fromToken,"fromToken"),toChain:Oo(e.toChain,"toChain"),toToken:Oo(e.toToken,"toToken"),amount:nC(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 S(`${ru(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:ng(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function ag(e={}){if(!tg(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await ou(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var oC=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Ro(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||oC,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 sg(e={}){try{let t=await Ro({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 Ro({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function lg(e,t={}){if(!e)throw new Error("coin required");let n=await Ro({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var aC=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function Aa(e=[],t={}){let n=Array.isArray(e)?e.map(String):[String(e)];if(!n.length||!n[0])throw new Error("polyWsSnapshot requires assetIds");let r=t.timeoutMs??8e3,o=t.maxMessages??1,i=t.WebSocket||globalThis.WebSocket;if(!i)throw new Error("WebSocket not available");let a=t.url||aC,s=Date.now();return new Promise((c,l)=>{let u=!1,d=[],p=0,m=new i(a),f=setTimeout(()=>{h(),u||(u=!0,d.length?c({ok:!0,partial:!0,ms:Date.now()-s,messages:d}):l(new Error(`poly ws timeout after ${r}ms`)))},r);function h(){clearTimeout(f);try{m.close()}catch{}}m.addEventListener("open",()=>{m.send(JSON.stringify({assets_ids:n,type:"market"}))}),m.addEventListener("message",g=>{let w;try{w=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{w={raw:String(g.data).slice(0,300)}}d.push(w),p+=1,p>=o&&(h(),u||(u=!0,c({ok:!0,ms:Date.now()-s,assetIds:n,messages:d,last:d[d.length-1]})))}),m.addEventListener("error",()=>{h(),u||(u=!0,l(new Error("poly ws error")))})})}async function ug(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await Aa([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 dg(e,t={}){if(!e)throw new Error("assetId required");let n=await Aa([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import gg from"node:path";import{homedir as xC}from"node:os";import{createHash as vC,randomUUID as kC}from"node:crypto";import ae from"node:fs";import _a from"node:path";import{createHash as cC,randomUUID as pg}from"node:crypto";var iu=1,lt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function Jt(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(Jt).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${Jt(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function mg(e){return cC("sha256").update(Jt(e)).digest("hex")}function Pa(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 Ca(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function fg(e){ae.mkdirSync(e,{recursive:!0,mode:448});try{ae.chmodSync(e,448)}catch{}}function au(e){try{let t=ae.statSync(e);return{...JSON.parse(ae.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function ir({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=()=>pg()}={}){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 b=n();return r(b),{schemaVersion:iu,kind:t,generation:0,data:b}}function d(b){let y;try{y=JSON.parse(b)}catch(k){throw new lt(`corrupt ${t} snapshot: invalid JSON (${k.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new lt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==iu)throw new lt(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new lt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:v,...E}=y;if(typeof v!="string"||!/^[a-f0-9]{64}$/.test(v)||mg(E)!==v)throw new lt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(k){throw new lt(`corrupt ${t} snapshot: ${k.message}`,"STORE_CORRUPT")}return E}function p(){if(!ae.existsSync(e))return u();let b=ae.statSync(e);if(!b.isFile()||b.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(){fg(_a.dirname(e));let b=Pa(o),y=String(c()),v=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:b})}
144
+ `,E=()=>{let _;try{return _=ae.openSync(l,"wx",384),ae.writeFileSync(_,v,"utf8"),ae.fsyncSync(_),ae.closeSync(_),{lockId:y}}catch(T){let $=_!==void 0;if($)try{ae.closeSync(_)}catch{}if($)try{ae.unlinkSync(l)}catch{}if(T?.code!=="EEXIST")throw T;return null}},I=Pa(o)+s,P=new Int32Array(new SharedArrayBuffer(4));for(;;){let _=E();if(_)return _;let T=Pa(o),$=au(l),U=!1;if($){let O=T-Number($.acquiredAt??$.mtimeMs);U=Number.isFinite(O)&&O>=a}else try{U=T-ae.statSync(l).mtimeMs>=a}catch{U=!1}if(U){let O=au(l);if($?O?.lockId===$.lockId:O===null){try{ae.unlinkSync(l)}catch(B){if(B?.code!=="ENOENT")throw B}continue}}let H=I-T;if(H<=0)throw new lt(`${t} store is busy`,"STORE_BUSY");Atomics.wait(P,0,0,Math.min(10,H))}}function f(b){if(au(l)?.lockId===b.lockId)try{ae.unlinkSync(l)}catch(v){if(v?.code!=="ENOENT")throw v}}function h(b){r(b.data);let y={...b,integrity:mg(b)},v=`${Jt(y)}
145
+ `;if(Buffer.byteLength(v)>i)throw new lt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let E=_a.dirname(e);fg(E);let k=_a.join(E,`.${_a.basename(e)}.${process.pid}.${pg()}.tmp`),I;try{I=ae.openSync(k,"wx",384),ae.writeFileSync(I,v,"utf8"),ae.fsyncSync(I),ae.closeSync(I),I=void 0,ae.renameSync(k,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(k)}catch(P){if(P?.code!=="ENOENT")throw P}}}function g(){return Ca(p().data)}function w(){let b=p();return{schemaVersion:b.schemaVersion,kind:b.kind,generation:b.generation,data:Ca(b.data)}}function x(b){if(typeof b!="function")throw new TypeError("mutator must be a function");let y=m();try{let v=p(),E=Ca(v.data),k=b(E,{generation:v.generation,now:Pa(o)});return r(E),h({schemaVersion:iu,kind:t,generation:v.generation+1,data:E}),Ca(k)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:w,mutate:x})}import{wordlists as lC}from"ethers";var uC=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),dC=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],pC=new Set([12,15,18,21,24]);function mC(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return pC.has(t.length)&&t.every(n=>lC.en.getWordIndex(n)>=0)}var fC=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,hC=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,gC=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function yC(e){let t=hg(e);return gC.has(t)||hC.test(t)}var Lo=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function hg(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function bC(e){let t=hg(e);return[...uC].some(n=>t.includes(n))}function wC(e,t,n){if(typeof t=="string"){if(dC.some(r=>r.test(t))||mC(t))throw new Lo(n);if(fC.test(t)&&!yC(e))throw new Lo(n)}}function su(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return wC(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)=>su(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(bC(o))throw new Lo(i);e[o]!==void 0&&(r[o]=su(e[o],i,o))}return r}function Tt(e){return su(e)}var Na=1,yg="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",hU=Object.freeze(["listing","offer","arm","instruct"]),SC=Object.freeze(["open","cancelled","expired","armed","submitted"]),gU=Object.freeze(["arm","sign-and-broadcast"]),EC=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."}),IC=/^(?:0|[1-9][0-9]*)$/,AC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,_C=/^0x[a-fA-F0-9]{40}$/,PC=/^0x[a-fA-F0-9]{64}$/,CC=/[\u0000-\u001f\u007f]/,TC=new Set(SC),uu=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 uu(e,t)}function Pn(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Pn(t);Object.freeze(e)}return e}function Bo(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||CC.test(o))&&G(`${t} is invalid`),r?o.toLowerCase():o}function Re(e,t){let n=Bo(e,t,{max:128});return AC.test(n)||G(`${t} must be a bounded id`),n}function $o(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 IC.test(r)||G(`${t} must be a canonical integer string`),n&&r==="0"&&G(`${t} must be positive`),r}function _n(e,t){let n=Bo(e,t,{max:42,lower:!0});return _C.test(n)||G(`${t} must be a 20-byte EVM address`),n}function bg(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&G(`${t} must be a plain object`),e}function An(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 cu(e){return new Date(e).toISOString()}function NC(e){return vC("sha256").update(Jt(e),"utf8").digest("hex")}function OC(e=process.env){let t=e.ORACLE_CONFIG_DIR||gg.join(xC(),".config","oracle");return gg.join(t,"local-marketplace.v1.json")}function Ta(e){let t=e.status==="submitted";return Pn({schemaVersion:Na,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:TC.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=>Pn({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:yg,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function RC(e){(!e||e.schemaVersion!==Na||!Array.isArray(e.listings))&&G("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&G("marketplace capacity exceeded","STORE_LIMIT")}function lu(e,t){return Pn({schemaVersion:Na,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:yg,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function LC(e,t,n){typeof e=="string"&&G("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=bg(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&G("generic signHash is refused","SIGNHASH_REFUSED");let o=_n(r.from??r.offerer??t.seller,"artifact.from"),i=_n(r.to??r.recipient??n.buyer,"artifact.to"),a=$o(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 $C(e,t){if(e==null)return{action:"arm"};let n=bg(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&G("generic signHash is refused","SIGNHASH_REFUSED");let r=Bo(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 wg({filePath:e=OC(),clock:t=()=>Date.now(),idFactory:n=()=>kC()}={}){let r=ir({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Na,listings:[]}),validateData:RC});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={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=_n(h.seller,"seller"),x=Bo(h.asset,"asset",{max:128}),b=$o(h.amount,"amount",{positive:!0}),y=$o(h.price,"price",{positive:!0}),v=$o(h.chainId,"chainId",{positive:!0}),E=An(t),k=cu(E),I=h.expiresAt==null?cu(E+864e5):Bo(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(I))||Date.parse(I)<=E)&&G("expiresAt must be after now");let P=Re(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:b,price:y,chainId:v,status:"open",createdAt:k,expiresAt:I,offers:[],custody:"none",execution:"armed-local"},$={...T,listingHash:NC(T)};return _.listings.push($),Ta($)})}function s({tenantId:h}={}){let g=Re(h,"tenantId"),w=An(t);return Pn(r.read().listings.filter(x=>o(x,g)).map(x=>Ta(i({...x,offers:x.offers.map(b=>({...b}))},w))))}function c({tenantId:h,listingId:g,actor:w}={}){let x=Re(h,"tenantId"),b=Re(g,"listingId"),y=_n(w,"actor"),v=An(t);return r.mutate(E=>{let k=E.listings.find(I=>o(I,x)&&I.listingId===b);return k||G("listing not found","NOT_FOUND"),i(k,v),k.seller!==y&&G("only the seller can cancel","FORBIDDEN"),k.status!=="open"&&G("listing is not open","NOT_OPEN"),k.status="cancelled",Ta(k)})}function l(h={}){Tt(h);let g=Re(h.tenantId,"tenantId"),w=Re(h.listingId,"listingId"),x=_n(h.buyer,"buyer"),b=$o(h.amount,"amount",{positive:!0}),y=An(t),v=Re(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(E=>{let k=E.listings.find(I=>o(I,g)&&I.listingId===w);return k||G("listing not found","NOT_FOUND"),i(k,y),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(I=>I.offerId===v)&&G("offerId already exists","DUPLICATE"),k.offers.push({offerId:v,buyer:x,amount:b,status:"open",createdAt:cu(y)}),Ta(k)})}function u(h,{tenantId:g,listingId:w,offerId:x,actor:b,now:y,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,y),v.includes(E.status)||G("listing is not open","NOT_OPEN"),E.seller!==b&&G("only the seller can arm a fill","FORBIDDEN");let k=E.offers.find(I=>I.offerId===x);return(!k||!["open","armed"].includes(k.status))&&G("offer not found","NOT_FOUND"),{row:E,offer:k}}function d({tenantId:h,listingId:g,offerId:w,actor:x}={}){let b=Re(h,"tenantId"),y=Re(g,"listingId"),v=Re(w,"offerId"),E=_n(x,"actor"),k=An(t);return r.mutate(I=>{let{row:P,offer:_}=u(I,{tenantId:b,listingId:y,offerId:v,actor:E,now:k});return P.status="armed",_.status="armed",lu(P,_)})}async function p({tenantId:h,listingId:g,offerId:w,actor:x,instruction:b,executor:y}={}){let v=Re(h,"tenantId"),E=Re(g,"listingId"),k=Re(w,"offerId"),I=_n(x,"actor"),P=An(t),_=r.mutate(B=>{let{row:W,offer:pe}=u(B,{tenantId:v,listingId:E,offerId:k,actor:I,now:P,allowed:["open","armed"]}),ke=$C(b,W);return W.status="armed",pe.status="armed",{armed:lu(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),$=T?.offers.find(B=>B.offerId===k),U=LC(_.instruction.artifact,T,$);(!y||typeof y.executeConfirmedArtifact!="function")&&G("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&G("generic signHash executors are refused","SIGNHASH_REFUSED");let H=await y.executeConfirmedArtifact(U,_.instruction.nonce,y),O=H?.receipt?.transactionHash??H?.transactionHash;(typeof O!="string"||!PC.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:k,actor:I,now:An(t),allowed:["armed"]});return W.status="submitted",pe.status="submitted",W.transactionHash=O.toLowerCase(),Pn({...lu(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 Re(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&G("consult text required"),Pn({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 EC}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import xg from"node:path";import{homedir as BC}from"node:os";import{createHash as MC,randomUUID as FC}from"node:crypto";var Ra=1,vg="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",SU=Object.freeze(["open","cancelled","armed","submitted"]),DC=/^(?:0|[1-9][0-9]*)$/,UC=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,qC=/^0x[a-fA-F0-9]{40}$/,HC=/^0x[a-fA-F0-9]{64}$/,jC=/[\u0000-\u001f\u007f]/,mu=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 mu(e,t)}function Mo(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Mo(t);Object.freeze(e)}return e}function Fo(e,t,{max:n=256}={}){typeof e!="string"&&J(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||jC.test(r))&&J(`${t} is invalid`),r}function Nt(e,t){let n=Fo(e,t,{max:128});return UC.test(n)||J(`${t} must be a bounded id`),n}function Oa(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 DC.test(r)||J(`${t} must be a canonical integer string`),n&&r==="0"&&J(`${t} must be positive`),r}function Cn(e,t){let n=Fo(e,t,{max:42}).toLowerCase();return qC.test(n)||J(`${t} must be a 20-byte EVM address`),n}function zC(e){let t=Fo(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 kg(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&J(`${t} must be a plain object`),e}function VC(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 WC(e){return new Date(e).toISOString()}function GC(e=process.env){let t=e.ORACLE_CONFIG_DIR||xg.join(BC(),".config","oracle");return xg.join(t,"local-x402.v1.json")}function du(e){let t=e.status==="submitted";return Mo({schemaVersion:Ra,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:vg,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function KC(e){(!e||e.schemaVersion!==Ra||!Array.isArray(e.intents))&&J("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&J("x402 capacity exceeded","STORE_LIMIT")}function pu(e){return Mo({schemaVersion:Ra,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:vg,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function YC(e,t){typeof e=="string"&&J("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=kg(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=Cn(n.from??t.payer,"artifact.from"),o=Cn(n.to??t.payTo,"artifact.to"),i=Oa(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 JC(e,t){if(e==null)return{action:"arm"};let n=kg(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&J("generic signHash is refused","SIGNHASH_REFUSED");let r=Fo(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 Sg({filePath:e=GC(),clock:t=()=>Date.now(),idFactory:n=()=>FC()}={}){let r=ir({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:Ra,intents:[]}),validateData:KC});function o(l={}){Tt(l);let u=Nt(l.tenantId,"tenantId"),d=Cn(l.payer,"payer"),p=Cn(l.payTo,"payTo"),m=zC(l.resource),f=Oa(l.amount,"amount",{positive:!0}),h=Oa(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&J("amount exceeds maxBudget","BUDGET");let g=Fo(l.asset??"USDC","asset",{max:32}),w=Oa(l.chainId,"chainId",{positive:!0}),x=VC(t),b=Nt(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(k=>k.intentId===b)&&J("intentId already exists","DUPLICATE");let v={intentId:b,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:w,status:"open",createdAt:WC(x),custody:"none",execution:"armed-local"},E={...v,intentHash:MC("sha256").update(Jt(v),"utf8").digest("hex")};return y.intents.push(E),du(E)})}function i({tenantId:l}={}){let u=Nt(l,"tenantId");return Mo(r.read().intents.filter(d=>d.tenantId===u).map(du))}function a({tenantId:l,intentId:u,actor:d}={}){let p=Nt(l,"tenantId"),m=Nt(u,"intentId"),f=Cn(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",du(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=Nt(l,"tenantId"),m=Nt(u,"intentId"),f=Cn(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",pu(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=Nt(l,"tenantId"),h=Nt(u,"intentId"),g=Cn(d,"actor"),w=r.mutate(k=>{let I=k.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=JC(p,I);return I.status="armed",{armed:pu(I),instruction:P}});if(w.instruction.action==="arm")return w.armed;let x=r.read().intents.find(k=>k.tenantId===f&&k.intentId===h),b=YC(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 y=await m.executeConfirmedArtifact(b,w.instruction.nonce,m),v=y?.receipt?.transactionHash??y?.transactionHash;(typeof v!="string"||!HC.test(v))&&J("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let E=y?.receipt?.status??y?.status;return E!==1&&E!=="0x1"&&J("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(k=>{let I=k.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(),Mo({...pu(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 Eg from"node:path";import{homedir as XC}from"node:os";import{randomUUID as QC}from"node:crypto";var gu=1,ZC="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",OU=Object.freeze(["listed","revoked"]),eT=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,tT=/[\u0000-\u001f\u007f]/,nT=/^[a-f0-9]{64}$/,rT=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,oT=new Set(["read","prepare","none"]),hu=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function Ee(e,t){throw new hu(e,t)}function yu(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))yu(t);Object.freeze(e)}return e}function Xt(e,t,{max:n=256}={}){typeof e!="string"&&Ee(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||tT.test(r))&&Ee(`${t} is invalid`),r}function Do(e,t){let n=Xt(e,t,{max:128});return eT.test(n)||Ee(`${t} must be a bounded id`),n}function Ig(e,t){let n=Xt(e,t,{max:64}).toLowerCase();return nT.test(n)||Ee(`${t} must be 64 lowercase hex`),n}function iT(e,t){let n=Xt(e,t,{max:2048}),r;try{r=new URL(n)}catch{Ee(`${t} must be an https URL`)}return r.protocol!=="https:"&&Ee(`${t} must be https`),(r.username||r.password)&&Ee(`${t} must not contain credentials`),r.toString()}function aT(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Ee("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Xt(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!rT.test(r)||r==="0.0.0.0")&&Ee(`outboundHosts[${n}] is not an allowlisted host`),r}))}function Ag(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&Ee("clock invalid","CLOCK_INVALID"),n}function _g(e){return new Date(e).toISOString()}function sT(e=process.env){let t=e.ORACLE_CONFIG_DIR||Eg.join(XC(),".config","oracle");return Eg.join(t,"local-pack-registry.v1.json")}function fu(e){return yu({schemaVersion:gu,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:ZC,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function cT(e){(!e||e.schemaVersion!==gu||!Array.isArray(e.packs))&&Ee("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Ee("pack registry capacity exceeded","STORE_LIMIT")}function Pg({filePath:e=sT(),clock:t=()=>Date.now(),idFactory:n=()=>QC()}={}){let r=ir({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:gu,packs:[]}),validateData:cT});function o(l={}){Tt(l);let u=Do(l.tenantId,"tenantId"),d=Xt(l.name,"name",{max:128}),p=Xt(l.version,"version",{max:64}),m=Xt(l.publisher,"publisher",{max:128}),f=Ig(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Ig(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:iT(l.homepage,"homepage"),w=aT(l.outboundHosts),x=Xt(l.spendScope??"none","spendScope",{max:16});oT.has(x)||Ee("spendScope must be read, prepare, or none"),x!=="none"&&x!=="read"&&Ee("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let b=Ag(t),y=Do(String(l.packId??`pack-${n()}`),"packId");return r.mutate(v=>{v.packs.some(k=>k.packId===y||k.tenantId===u&&k.name===d&&k.version===p&&k.status==="listed")&&Ee("pack already listed","DUPLICATE");let E={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:w,spendScope:x,status:"listed",createdAt:_g(b),revokedAt:null,execution:"none",pluginExecution:!1};return v.packs.push(E),fu(E)})}function i({tenantId:l}={}){let u=Do(l,"tenantId");return yu(r.read().packs.filter(d=>d.tenantId===u).map(fu))}function a({tenantId:l,packId:u}={}){let d=Do(l,"tenantId"),p=Do(u,"packId"),m=Ag(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||Ee("pack not found","NOT_FOUND"),h.status!=="listed"&&Ee("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=_g(m),fu(h)})}function s(){Ee("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){Ee("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}L();import{getAddress as hT,Interface as sr,keccak256 as xu}from"ethers";import{createHash as vu,createHmac as gT,timingSafeEqual as jg}from"node:crypto";he();import{Interface as Ng,getAddress as bu,isAddress as lT}from"ethers";var uT="0x0000000000000000000000000000000000000000",Og=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),dT=new Ng(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),pT=new Ng(["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 mT(e){let t=Number(e??4663),n=Og[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Cg(e,t){if(/^weth$/i.test(String(e||"")))return bu(Og[t].weth);if(!lT(String(e||"")))throw new Error(`up33: invalid token ${e}`);return bu(e)}function fT(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function Tg(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 Rg(e,t={},n={}){try{let r=mT(t.chainId),o=Cg(t.tokenIn,r.chainId),i=Cg(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=fT(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 Tg(c,r.chainId,r.factory,dT,"getPool",[o,i,s]),u=bu(l[0]);if(u.toLowerCase()===uT)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 Tg(c,r.chainId,r.quoter,pT,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 Lg(e={},t={}){return Rg("exact-input",e,t)}async function $g(e={},t={}){return Rg("exact-output",e,t)}X();var V=4663,La="https://anvil.clutch.market",yT=`${La}/api/markets/snapshot?chainId=${V}`,bT=`${La}/api/rpc?chainId=${V}`,wT=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),Ge="0x0bd7d308f8e1639fab988df18a8011f41eacad73",ku="0x0000000000000000000000000000000000000000",Tn=1e5,xT=256e3,Bg=256,vT=3e4,kT=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"}),Te=new sr(["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"]),ST=new sr(["function allowance(address owner,address spender) view returns (uint256)"]),zg=new sr(["function decimals() view returns (uint8)"]),Mg=new sr(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),nt=new sr(["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)"]),Qt=new sr(["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 hT(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function Rt(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 Vg(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 Fg(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>Bg)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${Bg}`);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 ET(e,t,n=[],r={}){if(Number(e)!==V)throw new Error(`stonkbrokers: Anvil supports chain ${V} only`);if(!wT.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await S(bT,{method:"POST",headers:{origin:La,referer:`${La}/`,"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)=>ET(t,n,r,e))}async function cr(e={},t={}){if(e.snapshot){let s=Fg(e.snapshot),c={kind:"anvil-markets",chainId:V,total:s.length,contentHash:vu("sha256").update(ar(s)).digest("hex")},l=Su(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 S(yT,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:xT,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=Fg(r),i={kind:"anvil-markets",chainId:V,total:o.length,contentHash:vu("sha256").update(ar(o)).digest("hex")},a=Su(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 $a(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 Wg({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 cr({},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=kT[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=ut(n),c=$a(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)||$a(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=xu(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+vT}}function Gg(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 qo(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=Rt(e.tokenId),i=await Wg({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([ee(a,n,Te,"quoteSpecificBuy",[BigInt(o)],s),ee(a,n,Te,"inventory",[BigInt(o)],s),ee(a,r,nt,"ownerOf",[BigInt(o)],s),ee(a,n,Te,"collection",[],s),ee(a,n,Te,"token",[],s),ee(a,n,Te,"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,zg,"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=Gg(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:w}),b=!!c[4],y=!!l[0],v=q(u[0],"NFT owner")===n,E=b&&y&&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:Vg(c[2],c[3]),available:E,evidence:{quoteAvailable:b,inventory:y,ownerIsMarket:v,marketCollection:f,attestation:x},reason:E?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function Ba(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await Wg({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([ee(i,n,Te,"quoteSellNFT",[],a),ee(i,n,Te,"collection",[],a),ee(i,n,Te,"token",[],a),ee(i,n,Te,"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,zg,"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=Gg(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:Vg(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function Kg(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 Ot(e,t){let n=Ke(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function Yg({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:Ot(o,"gasLimit").toString(),maxFeePerGas:Ot(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=Ot(a,"maxPriorityFeePerGasWei").toString()),c}function Jg(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 Xg(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=Rt(e.tokenId),a=Ot(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 qo({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=Ot(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,ST,"allowance",[n,r],w))[0]);if(x<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let b={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[Yg({...b,to:r,data:Te.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:Kg(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:y}};return Jg(E,l)}async function Qg(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=Rt(e.tokenId),s=Ot(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 Ba({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=Ot(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()),b=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=q(u.paymentToken,"Anvil payment token"),v=Number(u.paymentTokenDecimals),E={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},k=[Yg({...E,to:o,data:Te.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:y,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:Kg(e.tradeId),slippageBps:0,expiresAtMs:x+b,fee:{oracleFeeBps:0},artifact:{chainId:V,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:v,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:I,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:k}};return Jg(P,u)}async function IT(e={},t={}){if(Array.isArray(e.tokenIds)){let x=e.tokenIds.map(v=>Rt(v)),b={kind:"anvil-inventory",chainId:V,market:q(e.market,"Anvil market"),collection:q(e.collection,"NFT collection"),total:x.length,contentHash:vu("sha256").update(ar(x)).digest("hex")},y=Su(e.inventoryCompletenessEvidence,b,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:y.valid,continuation:y.valid?null:{offset:x.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=ut(t),r=q(e.market,"Anvil market"),o=$a(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)||$a(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await ee(n,r,Te,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>Tn)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${Tn}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>Tn))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${Tn}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:Tn};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await ee(n,r,Te,"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,Te,"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 AT(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 _T(e,t,n){let r=ut(n);try{let o=String((await ee(r,e,nt,"tokenURI",[BigInt(t)]))[0]),i=AT(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await S(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 Zg(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 PT(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 Ma(e={},t={}){let n=q(e.market,"Anvil market"),r=q(e.collection,"NFT collection"),o=await IT({...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 Fe(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 Fe(p,s,async h=>{try{let g=await qo({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 Fe(i,s,async u=>{try{let[d,p]=await Promise.all([_T(r,u,t),qo({market:n,collection:r,tokenId:u},t)]),m=Zg(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?PT(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 ey(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Dg(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 ty(e={}){return{maxMarkets:Dg(e,"maxMarkets",Tn),maxItemsPerMarket:Dg(e,"maxItemsPerMarket",Tn)}}function ny(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Uo(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 ry(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 oy(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=ty(e),o=await cr(e,t),i=ny(o,e,n),a=t.scanCollection||Ma,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await Fe(i,s,async l=>{let u=ey(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,...Uo(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Uo(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:V,marketCount:i.length,...ry(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 iy(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=ty(e),o=await cr(e,t),i=o.snapshotCoverage?.complete===!0,a=ny(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Eu,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await Fe(a,l,async d=>{let p=ey(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",...Uo(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=Uo(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),...Uo(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:V,marketCount:a.length,...ry(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 Ug(e,t){return e>t?"ARB":"PASS"}async function CT(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||$g)({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||Rm)({...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||Lg)({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||Zr)({...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 qg(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 TT(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 ar(e){return Array.isArray(e)?`[${e.map(ar).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ar(e[t])}`).join(",")}}`:JSON.stringify(e)}function ay(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:gT("sha256",n).update(ar(r)).digest("hex")}}function NT(e,t){return ay(e,t)}function Su(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=NT(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!jg(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 OT(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:TT(e,t)}function wu(e,t,n,r,o,i){let a=OT(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=ay(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!jg(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=Ot(a.gasLimit,`${r} evidence gasLimit`),g=Ot(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 b=q(w.sender,`${r} simulation sender`),y=q(w.owner,`${r} simulation owner`);if(!o.owner||b!==o.owner||y!==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 Hg(e){let t=q(e,"OpenSea payment token");if(t!==ku&&t!==Ge)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Eu(e={},t={}){let n=await Ma(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,b,y={})=>({calldataHash:w==null?null:String(w).toLowerCase(),blockNumber:String(x?.blockNumber??""),blockHash:String(x?.blockHash||"").toLowerCase(),leg:b,owner:i,...y}),s=(w,x,b,y,v)=>wu(e.gasEvidence??e.gasCostEvidence,w,r,`${x} gas`,a(b,y,x,v),o),c=(w,x)=>{let b=null;try{b=q(w?.target,"conversion target")}catch{}let y=a(w?.calldataHash,w,"conversion",{target:b,valueWei:String(w?.valueWei??"0")});if(!/^0x[0-9a-f]{64}$/.test(y.calldataHash)||!/^0x[0-9a-f]{64}$/.test(y.blockHash)||!/^\d+$/.test(y.blockNumber))return{amount:null,evidence:null,error:"conversion quote lacks route/calldata/block binding"};let v=wu(e.conversionGasEvidence??e.conversionGasCostEvidence,x,r,"conversion gas",y,o);if(v.amount!=null||w?.gasEstimate==null)return v;let E=wu(e.gasPriceEvidence,x,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(E.amount==null)return{amount:null,evidence:null,error:E.error};let k=Ke(w.gasEstimate,"conversion gasEstimate");return{amount:k*E.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:x,leg:"conversion",gasEstimate:k.toString(),gasPriceEvidence:E.evidence},error:null}},l=(w,x,b,y,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 k=q(x?.protocolAddress,"Seaport protocol address"),I=String(x?.executionCalldataHash||"").toLowerCase(),P=/^0x[0-9a-f]{64}$/.test(I)?I:null,_=y==="seaport-fulfillment"&&v===ku?String(x?.priceWei??""):"0",T={orderHash:E,protocolAddress:k,target:k,valueWei:_},$=s(w,y,P,b,T);if($.amount==null)throw new Error($.error);if($.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let U=$.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=[$];if(U){let j=String(x?.approvalCalldataHash||"").toLowerCase(),B=/^0x[0-9a-f]{64}$/.test(j)?j:null,W=y==="seaport-offer-acceptance"?n.collection:v;H.push(s(w,"seaport-approval",B,b,{...T,target:W,valueWei:"0"}))}if(v===ku){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,b,{...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||Hi,p=t.openSeaBestOffer||ji,m=t.paymentTokenConversion||(w=>CT({...w,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await Ba({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 b=w.quote,y=xu(Te.encodeFunctionData("buySpecificNFT",[BigInt(w.tokenId),BigInt(b.totalCostRaw)])).toLowerCase(),v=s("anvil-to-opensea","anvil-call",y,b.evidence.attestation,{target:n.market,valueWei:b.nativeSwapFeeWei}),E=null,k=null;if(x)try{E=Hg(x.paymentToken)}catch(B){k=String(B.message||B)}let I=k||!x?{amount:null,evidence:null,error:k||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",x,b.evidence.attestation,"seaport-offer-acceptance",E),P={route:"anvil-to-opensea",tokenId:w.tokenId,stars:w.stars,paymentToken:b.paymentToken,amountUnits:b.amountUnits,anvilTotalCostRaw:b.totalCostRaw,anvilBaseCostRaw:b.baseCostRaw,anvilFeeRaw:b.fees.totalFeeRaw,paymentTokenDecimals:b.paymentTokenDecimals,nativeSwapFeeWei:b.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||!b.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(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=qg(await m({chainId:V,direction:"acquire-exact-output",amountRaw:b.totalCostRaw,paymentToken:b.paymentToken,quoteToken:Ge}),{direction:"acquire-exact-output",amountRaw:b.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(b.nativeSwapFeeWei)-pe;h.push({...P,conversionGasCostWei:W.amount.toString(),conversionGasEvidence:W.evidence,totalExecutionGasWei:pe.toString(),anvilCostInWethWei:B.amountInWei,conversion:B,netWei:ke.toString(),decision:Ug(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=xu(Te.encodeFunctionData("sellNFT",[BigInt(w.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),$=s("opensea-to-anvil","anvil-call",T,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),U=null,H=null;try{U=Hg(_.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:$.amount==null?null:$.amount.toString(),gasEvidence:$.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($.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(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=qg(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=$.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:Ug(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 b=BigInt(w.netWei??"-1"),y=BigInt(x.netWei??"-1");return y>b?1:y<b?-1:0}),arbCount:g.filter(w=>w.decision==="ARB").length,exec:!1,readOnly:!0}}async function Fa(e={},t={}){let n=ut(t),r=Rt(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([ee(n,tt.ammVault,Mg,"quoteSpecificBuy",[BigInt(r)]),ee(n,tt.ammVault,Mg,"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 sy(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 Fe(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=Rt(a.brokerTokenId,"brokerTokenId"),c=Rt(a.nestedTokenId,"nestedTokenId"),l=q(a.tba,"TBA"),u=q(a.nestedCollection,"nested collection"),d=Zg({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([sy(s,n),ee(n,u,nt,"ownerOf",[BigInt(c)]).then(g=>q(g[0],"nested owner")),Fa({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 ly(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=q(e.buyer,"buyer"),r=Rt(e.brokerTokenId,"brokerTokenId"),o=Ke(e.maxTokenCostWei,"maxTokenCostWei"),i=Ke(e.maxEthFeeWei,"maxEthFeeWei"),a=await Fa({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 Ho(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,Qt,"pendingEth"),ee(n,o,Qt,"minDropWei"),ee(n,o,Qt,"roundActive"),ee(n,o,Qt,"currentRound"),ee(n,o,Qt,"roundState").catch(()=>null),ee(n,o,Qt,"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 uy(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"?Qt.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Qt.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 dy(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>Rt(s,"brokerTokenId")):[],r=ut(t),o=await Fe(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")),sy(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Ho({which:"stock"},t),Ho({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 py(e={},t={}){try{let n=await cr(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 my(e={},t={}){try{let n=await Ho({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 LT}from"node:crypto";var Da="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",$T=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"}]),Nn=Object.freeze(Object.fromEntries($T.map(e=>[e.name,e.selector]))),BT=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),MT=new Set(["name","endpoint","version","skills","domains"]),FT=new Set(["agentId","agentRegistry"]),fy=new Set(["reputation","crypto-economic","tee-attestation"]),DT=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,UT=64*1024;function jo(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 Iu(e,t,n){for(let r of Object.keys(e)){if(DT.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 lr(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 hy(e,t,{service:n=!1}={}){let r=lr(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 Au(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 Ua(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function _u(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 Pu(e){let t=Ua(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Au(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function yy(){let e=[];try{let t=Ua(process.env.ORACLE_ERC8004_CHAIN_ID);Pu(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 qT(e){return JSON.parse(JSON.stringify(e))}function qa(e){let t=jo(e,"registration file");if(Iu(t,BT,"registration"),t.type!==Da)throw new Error("erc8004: registration-v1 type required");let n={type:Da,name:lr(t.name,"name",128),description:lr(t.description,"description",4096),image:hy(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=jo(a,`services[${s}]`);Iu(c,MT,`services[${s}]`);let l=lr(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:hy(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=lr(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=jo(a,`registrations[${s}]`);Iu(c,FT,`registrations[${s}]`);let l=_u(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>fy.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!fy.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>UT)throw new Error("erc8004: registration metadata oversized");return qT(n)}function HT(e){if(jo(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Da)throw new Error("erc8004: registration-v1 type required");return qa({type:Da,...e})}function jT(e){let t=qa(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function zo(e){return BigInt(e).toString(16).padStart(64,"0")}function by(e){let t=Buffer.from(e,"utf8").toString("hex");return`${zo(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function zT(e){return`${Nn.register}${zo(32)}${by(e)}`}function VT(e,t){return`${Nn.setAgentURI}${zo(e)}${zo(64)}${by(t)}`}function WT(e,t){return`${e}${zo(t)}`}function GT(e){return LT("sha256").update(e,"utf8").digest("hex")}function Cu(e,t){jo(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 wy(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=Ua(e.chainId),c=Au(e.owner,"owner"),l=Pu(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:GT(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 xy(e={},t={}){Cu(e,new Set(["chainId","owner","registration"]));let n=jT(HT(e.registration));return wy(e,t,{kind:"erc8004-register",uri:n,selector:Nn.register,data:zT(n)})}function vy(e={},t={}){Cu(e,new Set(["chainId","owner","agentId","agentURI"]));let n=_u(e.agentId),r=ky(e.agentURI);return wy(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:Nn.setAgentURI,data:VT(n,r),id:n})}function ky(e){let t=lr(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 qa(o),t}function gy(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 Au(`0x${e.slice(-40)}`,t)}function KT(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 Sy(e={},t={}){Cu(e,new Set(["chainId","agentId"]));let n=Ua(e.chainId),r=_u(e.agentId),o=Pu(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:WT(d,r)},"latest"]),[a,s,c]=await Promise.all([i(Nn.ownerOf),i(Nn.tokenURI),i(Nn.getAgentWallet)]),l=ky(KT(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=qa(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:gy(a,"owner"),tokenURI:l,agentURI:l,agentWallet:gy(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}he();var Ey=999;async function Iy(e={}){let t={chainId:Ey,rpc:null,dex:null};try{t.rpc=await Vn(Ey,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Wr("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 Ay(e="HYPE",t={}){let r=(await Wr(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 _y(e,t={}){return gn(e,t)}L();X();var XT="https://api-mainnet.magiceden.dev/v2",Vo=1e9;function Py(e={}){return Ve({provider:"magiceden",defaultUrl:XT,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function dr(e={}){return Py(e).baseUrl}function On(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function pr(e={}){let t=On(e);return Ue({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Py(e).trusted)}function Tu(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 ur(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 QT(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 ZT(e){return Math.round(ur(e,"priceSol")*Vo)}function eN(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 tN({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function nN(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=tN(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Cy(e={}){try{let t=await Nu({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!On(e),readTier:"keyless",prepareTier:On(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!On(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Nu(e={},t={}){let n=Tu(e.symbol||e.collection),r=await S(`${dr(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:pr(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/Vo:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Vo:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Vo:null,exec:!1,raw:r}}function Ty(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*Vo):null,tokenSize:e.tokenSize??1}}async function Ny(e={},t={}){let n=Tu(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(`${dr(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 S(i.toString(),{headers:pr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Ty);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Oy(e={},t={}){let n=de(e.tokenMint||e.mint,"tokenMint"),r=await S(`${dr(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:pr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Ty);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Ry(e={},t={}){if(!On(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=ur(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:ur(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${dr(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 S(l.toString(),{headers:pr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Pt("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:ZT(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ha(e={},t={}){if(!On(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=ur(e.priceSol??e.price,"priceSol"),s=eN(e.expiry),c=nN(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${dr(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 S(l.toString(),{headers:pr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});Pt("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 Ly(e={},t={}){if(!On(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=de(e.buyer||e.userPublicKey,"buyer"),r=Tu(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=ur(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:ur(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${dr(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await S(a.toString(),{headers:pr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=QT(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`);Pt("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();il();L();st();var mr=8,Ou=10n**BigInt(mr),oN="0xa4b1",$y=7,Ru=1,iN=2n**64n-1n;function aN(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 Go(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function hr(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 Wo(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>mr)throw new Error(`hl-staking: ${t} has more than ${mr} decimals`);let i=BigInt(r)*Ou+BigInt((o+"0".repeat(mr)).slice(0,mr)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>iN)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function fr(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function Lt(e){let t=BigInt(String(e||"0")),n=t/Ou,r=(t%Ou).toString().padStart(mr,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function By(e={}){try{let t=await Lu(e);return{ok:t.count>0,provider:"hl-staking",chain:Go(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 Lu(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 $u(e={},t={}){let n=hr(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 Bu(e={},t={}){let n=hr(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 My(e={},t={}){let n=hr(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 Fy(e={},t={}){let n=hr(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 Mu(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 ja(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||oN)}function sN(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(ja(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function Fu({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:Go(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:aN(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:sN(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=ia(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 Dy(e={},t={}){let n=Wo(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Wo(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${Lt(n)} HYPE exceeds maxHype cap ${Lt(r)} HYPE`);let o=Mu(e),i=Go(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:ja(t),wei:fr(n),nonce:o};return Fu({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:fr(n),nonce:o},opts:t,args:e,caps:{amountHype:Lt(n),maxHype:r?Lt(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 Uy(e={},t={}){let n=Wo(e.amountHype??e.amount,"amountHype"),r=Mu(e),o=Go(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:ja(t),wei:fr(n),nonce:r};return Fu({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:fr(n),nonce:r},opts:t,args:e,caps:{amountHype:Lt(n)},notes:[`Starts the ${$y} 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 qy(e={},t={}){let n=hr(e.validator,"validator"),r=Wo(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:Wo(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${Lt(r)} HYPE exceeds maxHype cap ${Lt(s)} HYPE`);let c=Mu(e),l=Go(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:ja(t),validator:n,wei:fr(r),isUndelegate:a,nonce:c};return Fu({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:fr(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:Lt(r),maxHype:s?Lt(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Ru} 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 ${Ru} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Hy(e={},t={}){let n=hr(e.user||e.address,"user"),r=await $u({user:n},t),o=await Bu({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:$y,validatorLockupDays:Ru,exec:!1}}st();async function Du(e={}){let t=Date.now();try{let n=await Et(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 lN=24*365,uN=8;function Ne(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function dN(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function gr(e={},t={}){let[n,r]=await Promise.all([Qe(t),Et(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=Ne(u.markPx),p=Ne(u.prevDayPx),m=Ne(u.openInterest),f=Ne(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ne(u.oraclePx),midPx:Ne(u.midPx)??Ne(r?.[c.name]),prevDayPx:p,change24hPct:dN(d,p),dayNtlVolumeUsd:Ne(u.dayNtlVlm),premium:Ne(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(lN/uN)*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 jy(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await gr(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 zy(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([gr({},t),Xi({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),Jn(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:Ne(h.o),high:Ne(h.h),low:Ne(h.l),close:Ne(h.c),volume:Ne(h.v)})),p=l?.levels??[],m=Ne(p?.[0]?.[0]?.px),f=Ne(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 Vy(e={},t={}){let n=await Qi(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 TN,readFileSync as NN,readdirSync as ON,renameSync as RN,writeFileSync as LN}from"node:fs";import{homedir as $N}from"node:os";import{join as Ka}from"node:path";var Ko=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});L();he();X();import{Interface as Uu,getAddress as Qy,isAddress as mN}from"ethers";var Wy=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Gy=Object.freeze({42161:{name:"arbitrum",api:Wy[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Wy[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),Ky="0x0000000000000000000000000000000000000000",fN=`0x${"0".repeat(64)}`,Yy=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Jy=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),za=new Uu(["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"]),Zy=new Uu(["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)"]),hN=new Uu(["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)"]),gN=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function br(e){let t=Number(e??42161),n=Gy[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Gy).join(", ")})`);return{chainId:t,...n}}function Va(e,t={}){let n=br(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function rt(e,t){if(!mN(e))throw new Error(`${t} must be a valid EVM address`);return Qy(e)}function ne(e){return Qy(e).toLowerCase()}function yr(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 Rn(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 yN(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 bN(e){let t=String(e||"marketIncrease").trim();if(!(t in Yy))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:Yy[t]}}function wN(e){let t=String(e||"noSwap").trim();if(!(t in Jy))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:Jy[t]}}function xN(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function vN(e,t){let n=ne(t);return e.find(r=>ne(r.marketToken||r.market||r.address)===n)||null}function kN(e,t){let n=ne(t);return e.find(r=>ne(r.tokenAddress||r.address)===n)||null}function SN({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=yr(e?.minPrice,"gmx minPrice"),i=yr(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 EN(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function IN(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function wt(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 AN(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:wt(t,"account",a=>ne(a)),market:wt(t,"market",a=>ne(a)),initialCollateralToken:wt(t,"initialCollateralToken",a=>ne(a)),key:wt(o,"key",a=>String(a).toLowerCase()),reason:wt(i,"reason",a=>String(a)),sizeDeltaUsd:wt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:wt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:wt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:wt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:wt(r,"isLong",a=>!!a)}}function _N(e={},t){if(ne(e.address)!==ne(t.eventEmitter))return null;let n;try{n=hN.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=gN[r];if(!o)return null;let i=AN(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||IN(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 Xy(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function PN(e=[],{chainId:t}={}){let n=br(t);return(Array.isArray(e)?e:[]).map(r=>_N(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function eb(e={},t={}){return S(`${Va(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function qu(e={},t={}){return S(`${Va(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function tb(e={},t={}){return S(`${Va(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Zt(e={},t={}){return S(`${Va(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function nb(e={}){let t=await Zt({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function rb(e={},t={}){let n=br(e.chainId??42161),r=rt(e.account||e.owner||e.user,"gmx account"),o=Rn(e.start??0,"gmx start"),i=Rn(e.end??e.limit??20,"gmx end"),a=Zy.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 ob(e={},t={}){let n=br(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=Zy.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 ib(e={},t={}){let n=br(e.chainId??42161),r=t.receipt||await Vr({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=PN(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)=>Xy(d.status)>=Xy(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 Wa(e={},t={}){let n=br(e.chainId??42161),r=bN(e.orderType||e.type),o=wN(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"):Ky,l=e.uiFeeReceiver?rt(e.uiFeeReceiver,"gmx uiFeeReceiver"):Ky,u=rt(e.market||e.marketToken,"gmx market"),d=rt(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?yr(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):Rn(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=yr(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=yr(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=yN(e.maxSlippageBps??e.slippageBps,50),x=e.isLong==null?!0:!!e.isLong,[b,y]=await Promise.all([qu({chainId:n.chainId},t),Zt({chainId:n.chainId},t)]),v=vN(xN(b,"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"),k=rt(v.longToken,"gmx market longToken"),I=rt(v.shortToken,"gmx market shortToken"),P=ne(d);if(![ne(k),ne(I)].includes(P))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let _=EN(v,x);if(_>0n&&m>_)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let T=kN(y,E);if(!T)throw new Error("gmx index ticker not found");let $=e.acceptablePrice?yr(e.acceptablePrice,"gmx acceptablePrice").toString():SN({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=Rn(e.triggerPrice??"0","gmx triggerPrice"),O=Rn(e.callbackGasLimit??"0","gmx callbackGasLimit"),j=Rn(e.minOutputAmount??"0","gmx minOutputAmount"),B=Rn(e.validFromTime??"0","gmx validFromTime"),W=!!e.shouldUnwrapNativeToken,pe=e.autoCancel==null?!0:!!e.autoCancel,ke=String(e.referralCode||fN);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 Mt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:U},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:H,acceptablePrice:BigInt($),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(za.encodeFunctionData("sendTokens",[d,n.orderVault,p])),R.push(za.encodeFunctionData("sendWnt",[n.orderVault,f])),R.push(za.encodeFunctionData("createOrder",[Mt]));let F=za.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:$,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 en="oracle.hl.entry-state.v1",BN=8,MN=24*365;function le(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function wr(e){return e==null||e===0?0:e>0?1:-1}function Yo(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function FN(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Ka($N(),".config","oracle")}function cb(e={}){return Ka(FN(e),"hl-entry-states")}function Ga(e,t,n){return n==null&&e.push(t),n}function DN(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 $t(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function UN(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 $t("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)wr(o[a].rate)!==wr(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 qN(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return $t("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}:$t("defillama.stablecoins","no peggedUSD")}function ab(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 HN(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 $t("gmx.tickers","no matching symbol");let c=ab(s.minPrice,n),l=ab(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return $t("gmx.tickers","unreadable price");let d=n!=null&&n>0?Yo(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?$t("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 jN({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?$t("hl-info.fundingHistory","not fetched"):UN(r,{coin:e,asOfMs:n}),llamaStables:o==null?$t("defillama.stablecoins","not fetched"):qN(o,n),gmxTicker:i==null?$t("gmx.tickers","not fetched"):HN(i,{coin:e,hlMark:t,asOfMs:n})}}function sb(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 zN(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 VN({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:en,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=DN(n,e);if(!d)return{schema:en,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Ga(u,"markPx",le(m.markPx)),h=Ga(u,"oraclePx",le(m.oraclePx)),g=le(m.midPx),w=le(m.premium),x=Ga(u,"fundingRate",le(m.funding)),b=Ga(u,"openInterestCoin",le(m.openInterest)),y=le(m.dayNtlVlm),v=Array.isArray(m.impactPxs)?m.impactPxs:[],E=le(v[0]),k=le(v[1]),I=x==null?null:x*(MN/BN)*100,P=b==null||f==null?null:b*f,_=i==null||i===0||b==null?null:(b-i)/i*100;_==null&&u.push("oiDeltaPct");let T=r?.levels,$=Array.isArray(T)?T[0]:[],U=Array.isArray(T)?T[1]:[],H=le($?.[0]?.px),O=le(U?.[0]?.px);H==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let j=sb(U,Number(t)||0,"buy"),B=sb($,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:Yo(j.avgFillPx,W),ke=B.avgFillPx==null||W==null?null:Yo(W,B.avgFillPx),kt=zN(o,e);for(let Z of kt.unknown||[])u.push(Z);let Mt=le(m.prevDayPx),R=f==null||Mt==null||Mt===0?null:(f-Mt)/Mt*100;R==null&&u.push("change24hPct");let F=jN({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:en,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:w,markOracleBps:Yo(f,h),fundingRate:x,fundingAprPct:I,openInterestCoin:b,openInterestUsd:P,oiDeltaPct:_,dayNtlVolumeUsd:y,change24hPct:R,impactBidPx:E,impactAskPx:k,maxLeverage:p.maxLeverage??null,book:{bidPx:H,askPx:O,spreadBps:H==null||O==null?null:Yo(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 lb(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 WN(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 GN({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==en||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=WN(n),a=lb(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:en,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:Ko.ALERT_ONLY},c=cb({...o,configDir:r||o.configDir});TN(c,{recursive:!0,mode:448});let l=Ka(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return LN(u,`${JSON.stringify(s,null,2)}
146
+ `,{mode:384}),RN(u,l),s}function Hu(e={}){let t=cb(e),n=[];try{n=ON(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(NN(Ka(t,r),"utf8")))}function KN(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:Ko.ALERT_ONLY};let r=e.see,o=t;wr(r.fundingRate)!==wr(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),wr(r.premium)!==wr(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:en,id:e.id,coin:e.see.coin,side:e.side,actionMode:Ko.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function ub(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 Jo(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?Jn(n,t).catch(()=>null):Promise.resolve(null),e.user?Xn(e.user,t).catch(()=>null):Promise.resolve(null),n?Af({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),ka({},t).catch(()=>null),Zt({chainId:42161},t).catch(()=>null)]);return VN({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:le(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function db(e={},t={}){let n=e.see&&e.see.schema===en?e.see:await Jo(e,t);return{see:n,...lb(n,e.side)}}async function pb(e={},t={}){let n=e.see&&e.see.schema===en?e.see:await Jo(e,t);return GN({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function mb(e={},t={}){let n=e.locked||Hu(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:Ko.ALERT_ONLY};let r=await Jo({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return KN(n,r)}st();oa();wo();async function fb(e={}){let t=await co(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function hb(e={},t={}){let n=e.coin,r=e.outcome==null?null:qt(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=yb(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=ju(i)));let a=n==null?null:Ht(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 co(t))?.outcomes||[]).find(f=>{try{return qt(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=ju(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=qt(r,i).coin}if(a=Ht(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,Vt(c,t)}async function gb(e={},t={}){let n=e.coin,r=e.outcome==null?null:qt(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=yb(e.outcomeSide):(o=e.side,o!=null&&(o=ju(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=qt(r,o).coin}let i=Ht(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,bo(a,t)}function yb(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function ju(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();Qn();var k3="0x"+"00".repeat(32);function XN(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 bb(e,t){let n=et(e.makerAmount,"poly: makerAmount"),r=et(e.takerAmount,"poly: takerAmount");return XN(t==="BUY"?n:r)}Qn();var QN=new Set(["https://clob.polymarket.com/order"]),Xo=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),A3=Object.freeze(Xo.map(e=>e[0])),ZN=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),eO="0xe111180000d2663c0091e4f400237545b87b996b",tO="0xe2222d279d744050d28e00520010520000310f59",wb=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function xb(e){let t=String(e||"").replace(/\/$/,"");if(!QN.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function vb(e){let t=Ze(e,"poly: exchange").toLowerCase();if(!ZN.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function kb(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=wb(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(xb(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(vb(o.verifyingContract),vb(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?tO:eO;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!==Xo.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let k=0;k<Xo.length;k+=1)if(s[k]?.name!==Xo[k][0]||s[k]?.type!==Xo[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(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=wb(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=Se(n.quantity,6,"poly: quantity");if(x<=0n||x!==w)throw new Error("poly: quantity must match CLOB v2 amounts");let b=Se(n.price,6,"poly: price");if(b<=0n||b>=1000000n)throw new Error("poly: price must be within (0,1)");if(w*b!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Se(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=bb(a,d);if(Se(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 k=Se(E,6,"poly: maxNotionalUsd");if(g>k)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:xb(n.submitTo)})}function nO(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 Sb(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:nO({...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 kb(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as R3,randomInt as rO}from"node:crypto";import{keccak256 as $3,concat as B3,zeroPadValue as M3,getCreate2Address as F3,AbiCoder as D3}from"ethers";var Pb=137;var oO="0xE111180000d2663C0091e4f400237545B87B996B",iO="0xe2222d279d744050d28e00520010520000310F59",Eb="0x0000000000000000000000000000000000000000000000000000000000000000",zu=6;var aO={name:"Polymarket CTF Exchange",version:"2",chainId:Pb},sO={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"}]},Ib={"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 Ya(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Ja(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function Ab(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function Cb(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function cO(e,t,n,r){let o=Cb(Number(n),r.price);if(e==="BUY"){let c=Ja(Number(t),r.size),l=c*o;return Ya(l)>r.amount&&(l=Ab(l,r.amount+4),Ya(l)>r.amount&&(l=Ja(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=Ja(Number(t),r.size),s=a*o;return Ya(s)>r.amount&&(s=Ab(s,r.amount+4),Ya(s)>r.amount&&(s=Ja(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function _b(e){let t=Number(e).toFixed(zu),[n,r=""]=t.split(".");return(n+r.padEnd(zu,"0").slice(0,zu)).replace(/^0+/,"")||"0"}function lO(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=Eb,builder:p=Eb}=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=Ib[String(c)]||Ib["0.01"],g=Cb(m,h.price),{rawMakerAmt:w,rawTakerAmt:x}=cO(n,f,g,h),b=_b(w),y=_b(x),v=String(rO(1,2**31-1)),E=Date.now().toString(),k=n==="BUY"?0:1,I=s?iO:oO,P={salt:v,maker:i,signer:a,tokenId:String(t),makerAmount:b,takerAmount:y,side:k,signatureType:u,timestamp:E,metadata:d,builder:p},_={...aO,verifyingContract:I},T=n==="BUY"?w:x;return{domain:_,types:sO,value:P,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?x:w),notionalUsdc:T,exchange:I,negRisk:s}}function Tb(){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 Nb(e={},t={}){let n=lO(e),r={provider:"poly-clob",kind:"poly-order",chainId:Pb,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=Sb(r,e,t)}catch{r.oraclePrepared=!1}return N(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as xO,keccak256 as qb}from"ethers";X();rs();Za();var vO=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function kO(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=Tt(e);for(let o of Object.keys(n))if(!vO.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 Hb(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=$b(n,o),a=Ub(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 xO(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}:{...kO(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:qb(s),authorityReport:Bb(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:qb(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:ts},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"})}rs();Qu();wo();L();var LO="https://api.geckoterminal.com/api/v2",as=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||LO).replace(/\/$/,""),vr=e=>encodeURIComponent(String(e));async function Zu(e={},t={}){let n=Math.max(1,Number(e.page||1));return S(`${as(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Jb(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return S(`${as(t)}/networks/${vr(e.network)}/pools/${vr(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Xb(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return S(`${as(t)}/networks/${vr(e.network)}/tokens/${vr(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Qb(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)),S(`${as(t)}/networks/${vr(e.network)}/pools/${vr(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Zb(e={}){let t=await Zu({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}L();he();import{Interface as rw,getAddress as ow,isAddress as BO}from"ethers";X();var MO="https://api.curve.finance/v1",iw=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||MO).replace(/\/$/,""),FO=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),aw="0x0000000000000000000000000000000000000000",ed=new rw(["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)"]),ew=new rw(["function coins(uint256) view returns (address)"]);function sw(e){let t=FO[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function ii(e,t){if(!BO(e))throw new Error(`${t} must be a valid EVM address`);return ow(e)}function DO(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 tw(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(aw)]}function lw(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function uw(e){return[e,...Array(4).fill(aw)]}async function UO({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=ew.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=ew.decodeFunctionResult("coins",c);i.push(ow(l[0]))}return i}function nw(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 dw(e={}){return S(`${iw(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function td(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 S(`${iw(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function pw(e={}){let t=await td({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function nd(e={},t={}){let n=Number(e.chainId??8453),r=sw(n),o=ii(e.pool,"curve pool"),i=ii(e.tokenIn,"curve tokenIn"),a=ii(e.tokenOut,"curve tokenOut"),s=DO(e.amountIn,"curve amountIn"),c=tw(e.nCoins??2,"curve nCoins",2,8),l=tw(e.poolType,"curve poolType",1,4),u=t.rpcCall||D,d=await UO({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=nw(d,i,"tokenIn"),m=nw(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=cw(i,o,a),h=lw(p,m,l,c),g=uw(o),w=ed.encodeFunctionData("get_dy",[f,h,s,g]),x=await u(n,"eth_call",[{to:r,data:w},e.blockTag||"latest"],t),b=ed.decodeFunctionResult("get_dy",x),y=BigInt(b[0]);if(y<=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:y.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:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function mw(e={},t={}){let n=Number(e.chainId??8453),r=sw(n),o=ii(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=ii(e.receiver||e.recipient||o,"curve receiver"),a=await nd({...e,sender:o},t),s=cw(a.tokenIn,a.pool,a.tokenOut),c=lw(a.i,a.j,a.poolType,a.nCoins),l=uw(a.pool),u=ed.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"})}L();he();X();import{Interface as HO,getAddress as jO,isAddress as zO,keccak256 as fw,toUtf8Bytes as hw}from"ethers";var VO="https://api.morpho.org/graphql",ss=new HO(["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)"]),WO=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||VO;async function od(e,t,n={}){return S(WO(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var GO="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 } } } }",KO="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 ai(e,t){let n=String(e||"").trim();if(!zO(n))throw new Error(`morpho: ${t} must be an address`);return jO(n).toLowerCase()}function YO(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 rd(e){return Array.isArray(e)?`[${e.map(rd).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${rd(e[t])}`).join(",")}}`:JSON.stringify(e)}async function si(e,t,n,r,o={}){let i=ss.encodeFunctionData(n,r),s=await(o.rpcCall||D)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return ss.decodeFunctionResult(n,s)}function JO(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function gw(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return od(GO,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function id(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return od(KO,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function yw(e={}){return{ok:(await od("query { __typename }",{},e))?.data?.__typename==="Query"}}async function bw(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=ai(e.vault||e.vaultAddress,"vault"),i=ai(e.owner||e.from||e.sender,"owner"),a=ai(e.receiver||i,"receiver"),s=YO(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await id({chainId:n,first:100},t),u=JO(l?.data?.vaults?.items,o);if(!u)throw new Error("morpho: vault not found in public Morpho vault registry");if(u.listed===!1)throw new Error("morpho: vault is not listed");let d=Number(u?.state?.totalAssetsUsd??0);if(Number.isFinite(c)&&d<c)throw new Error(`morpho: vault totalAssetsUsd ${d} below minimum ${c}`);let[p]=await si(n,o,"asset",[],t),m=ai(p,"vault asset");if((u?.asset?.address?ai(u.asset.address,"api vault asset"):m)!==m)throw new Error("morpho: API asset and on-chain asset mismatch");let h,g;if(r==="deposit"){let[x]=await si(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[b]=await si(n,o,"previewDeposit",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:b.toString()},h=ss.encodeFunctionData("deposit",[s,a])}else{let[x]=await si(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(x.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[b]=await si(n,o,"previewWithdraw",[s],t);if(BigInt(b.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:b.toString()},h=ss.encodeFunctionData("withdraw",[s,a,i])}let w={mode:"erc4626-vault",version:1,provider:"morpho",chainId:n,action:r,vault:o,asset:m,owner:i,receiver:a,amount:s,totalAssetsUsd:d,...g,calldataHash:fw(hw(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return w.guardHash=fw(hw(rd(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:u,vaultGuard:w,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:w}},{provider:"morpho",kind:"erc4626-vault"})}L();he();import{Interface as QO,getAddress as ad,isAddress as ZO}from"ethers";X();var e2="https://api-v3.balancer.fi/",t2=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||e2;async function vw(e,t,n={}){return S(t2(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var n2="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",ww=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"}}),r2="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",o2="0x0000000000000000000000000000000000000000",sd=new QO(["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 kw(e){let t=Number(e??8453),n=ww[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(ww).join(", ")})`);return{chainId:t,...n}}function Sw(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===o2||t===r2.toLowerCase()}function cs(e,t){if(!ZO(e))throw new Error(`${t} must be a valid EVM address`);return ad(e)}function xw(e,t,n){let r=String(e||"");return Sw(r)||/^weth$/i.test(r)?ad(t.weth):/^usdc$/i.test(r)?ad(t.usdc):cs(r,n)}function i2(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 Ew(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 Iw(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 vw(n2,{first:n,chains:r,where:{chainIn:r}},t)}async function Aw(e={}){return{ok:(await vw("query { __typename }",{},e))?.data?.__typename==="Query"}}async function cd(e={},t={}){let n=kw(e.chainId),r=cs(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=xw(o,n,"balancer tokenIn"),a=xw(e.tokenOut||"USDC",n,"balancer tokenOut"),s=i2(e.amountIn,"balancer amountIn"),c=cs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=sd.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,Ew(e.userData)]),d=await(t.rpcCall||D)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=sd.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 _w(e={},t={}){let n=kw(e.chainId),r=cs(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Sw(o),a=await cd({...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=sd.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,Ew(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"})}L();import{getAddress as s2}from"ethers";X();var c2="https://api-v2.pendle.finance/core",l2=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),u2="0x0000000000000000000000000000000000000000",d2="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Pw=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||c2).replace(/\/$/,"");function ls(e,t){try{return s2(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function kr(e,t){return ls(e,t).toLowerCase()}function p2(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===d2||t===u2}function ld(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 m2(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:ls(t.token,`pendle input ${n} token`),amount:ld(t.amount,`pendle input ${n} amount`)}))}function f2(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>ls(t,`pendle output ${n} token`))}function h2(e){let t=l2[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function g2(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 ld(t,"pendle output amount")}function y2(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!p2(r.token)).map(r=>({token:kr(r.token,"pendle approval token"),spender:kr(t,"pendle approval spender"),amount:ld(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function ud(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)),S(`${Pw(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cw(e={}){let t=await ud({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function dd(e={},t={}){let n=Number(e.chainId??42161),r=h2(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=ls(e.receiver||o,"pendle receiver"),a=m2(e.inputs),s=f2(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 S(`${Pw(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=g2(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:y2(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 Tw(e={},t={}){let n=await dd(e,t),{transaction:r,...o}=n;return o}L();import{isAddress as w2}from"ethers";X();var x2="https://api.odos.xyz",pd=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||x2).replace(/\/$/,"");async function md(e={}){return S(`${pd(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function v2(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(!w2(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Nw(e={},t={}){let n=v2(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 S(`${pd(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 Ow(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Nw(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 Rw(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Nw(e,t),i=await S(`${pd(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 Lw(e={}){let t=await md(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}L();var $w=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,S2=/[<>&`*_~[\]()|\\]/g,E2=/[\u0000-\u001F\u007F]/g;function fd(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace($w,"").replace(E2,"").replace(S2,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function hd(e){if(e==null)return!1;let t=String(e);return $w.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Bw=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 us(e,t={}){let n=Number(e),r=t.baseUrl||Bw[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Mw(e){return!!Bw[Number(e)]}async function gd(e={},t={}){return S(`${us(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Fw(e={},t={}){if(!e.address)throw new Error("address required");return S(`${us(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Dw(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return S(`${us(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Uw(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${us(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await S(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function qw(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=fd(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=fd(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:hd(o.symbol)||hd(o.name)||void 0})}return n}async function Hw(e={}){let t=await gd({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as A2}from"ethers";L();he();st();var _2="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",zw=Object.freeze({ETH:"coingecko:ethereum",POL:"coingecko:polygon-ecosystem-token",BNB:"coingecko:binancecoin",AVAX:"coingecko:avalanche-2",HYPE:"coingecko:hyperliquid",USDT0:"coingecko:tether",SOL:"coingecko:solana",BTC:"coingecko:bitcoin"});function tn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function ds(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function jw(e){if(!e)return null;try{return A2(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function Bn(e={},t=process.env){let n=e.addresses||{},r=jw(n.evm||e.evmAddress||ds(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||ds(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||ds(t,"ORACLE_BITCOIN_ADDRESS"),a=jw(n.hyperliquid||e.hyperliquidAddress||ds(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 ci(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 Sr(e){let t=Number(e);return Number.isFinite(t)?t:null}function ps(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function nn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function Vw(e,t){let n=zw[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 P2(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:ci(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 yd(e,t){return{family:e,status:"unsupported",reason:t}}function bd(e,t){if(!e||e.status!=="ok")return e;let n=Vw(t,e.symbol),r=Sr(e.amount),o=r!=null&&n.priceUsd!=null?ps(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function Ww(e={}){let t=Bn({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function ms(e={},t={}){let n=new Date().toISOString(),r=Bn(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(Yn.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(zw))],u=o?ve(()=>In(l,tn(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=Fe(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={...tn(t,"evm"),rpcUrl:e.rpcUrls?.[R]||t.evm?.rpcUrls?.[R]},me=await ve(()=>hn(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 Ce=F.nativeCurrency?.decimals??18,je=F.nativeCurrency?.symbol||"NATIVE",K=me.data.balanceWei,be={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Mw(R)){let mn=await ve(()=>Uw({chainId:R,address:r.evm},{...tn(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));mn.ok?be={status:"ok",assets:qw(mn.data,{fungibleOnly:!0}).map(Dr=>{let Ur=ci(Dr.amountRaw,Dr.decimals);return{...Dr,amount:Ur,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:mn.ms}:be={status:"unavailable",assets:[],reason:mn.error||"blockscout token-balances failed",source:"blockscout",latencyMs:mn.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:Ce,amount:ci(K,Ce)},fungibleTokens:be,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:be.source==="blockscout"?"evm-rpc+blockscout":"evm-rpc"}}),p=(async()=>{if(!r.solana)return{family:"solana",name:"Solana Mainnet",address:null,status:"not-configured",error:"set ORACLE_SOLANA_ADDRESS or pass addresses.solana"};let R=tn(t,"solana"),F=await ve(()=>da({address:r.solana},R)),Z=i||a?await Promise.all([ve(()=>So({owner:r.solana,programId:Cl},R)).then(be=>({...be,program:"spl-token"})),ve(()=>So({owner:r.solana,programId:_2},R)).then(be=>({...be,program:"token-2022"}))]):[],me=P2(Z),Ce=me.filter(be=>be.classification==="collectible-candidate"),je=me.filter(be=>be.classification!=="collectible-candidate"),K=Z.filter(be=>!be.ok).map(be=>be.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:F.ok||Z.some(be=>be.ok)?"ok":"unavailable",native:F.ok?{status:"ok",symbol:"SOL",amountRaw:F.data.lamports,decimals:9,amount:ci(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?Ce:[],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=tn(t,"bitcoin"),F=tn(t,"bitcoinMeta"),[Z,me,Ce]=await Promise.all([ve(()=>ma({address:r.bitcoin},R)),i?ve(()=>ha({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?ve(()=>rr({address:r.bitcoin},F)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),je=me.ok?me.data:null,K=Ce.ok?Ce.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:ci(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||Ce.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=tn(t,"hyperliquid"),[F,Z,me]=await Promise.all([ve(()=>Ji(r.hyperliquid,R)),ve(()=>Xn(r.hyperliquid,R)),ve(()=>Et(R))]),Ce=(F.ok&&Array.isArray(F.data?.balances)?F.data.balances:[]).filter(K=>nn(K.total)||nn(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=>nn(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:Ce,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,b]=await Promise.all([d,p,m,f,u]),y=b.ok?b.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 k=null;if(o&&E.length){let R=[...new Set(E)],F=await ve(()=>In(R,tn(t,"prices")));F.ok&&(k=F.data)}let I=h.map(R=>{let F=R.native?{...R,native:bd(R.native,y)}:R;if(F.fungibleTokens?.status==="ok"&&Array.isArray(F.fungibleTokens.assets)){let Z=v[F.chainId],me=F.fungibleTokens.assets.map(Ce=>{let je=String(Ce.symbol||"").toUpperCase(),K=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(je)&&(K=1),K==null&&Z&&Ce.address&&k?.coins){let Kp=`${Z}:${String(Ce.address).toLowerCase()}`,Dr=k.coins[Kp],Ur=Number(Dr?.price);Number.isFinite(Ur)&&Ur>0&&(K=Ur)}let be=Sr(Ce.amount),mn=be!=null&&K!=null?ps(be*K):null;return{...Ce,priceUsd:K,usdValue:mn}});F={...F,fungibleTokens:{...F.fungibleTokens,assets:me}}}return F});g.native&&(g.native=bd(g.native,y)),w.native&&(w.native=bd(w.native,y));let P=0,_=0,T=0;for(let R of[...I,g,w]){R.native?.status==="ok"&&nn(R.native.amount)&&(R.native.usdValue!=null?(P+=R.native.usdValue,_+=1):T+=1);for(let F of R.fungibleTokens?.assets||[])!nn(F.amount)&&!nn(F.amountRaw)||(F.usdValue!=null?(P+=F.usdValue,_+=1):T+=1)}let $=Vw(y,"HYPE");for(let R of x.spot?.balances||[]){let F=String(R.coin||"").toUpperCase(),Z=F==="USDC"||F==="USDT"||F==="USDT0"?1:F==="HYPE"?$.priceUsd||Sr(x.mids?.HYPE):Sr(x.mids?.[R.coin]),me=Sr(R.total);R.priceUsd=Z,R.usdValue=me!=null&&Z!=null?ps(me*Z):null,nn(R.total)&&(R.usdValue!=null?(P+=R.usdValue,_+=1):T+=1)}let U=Sr(x.perps?.accountValueUsd);U!=null&&U!==0&&(P+=U,_+=1);let H=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(R=>nn(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."),b.ok||W.push(`Price provider unavailable: ${b.error}`);let kt=[yd("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),yd("sui","Sui balance adapter is not installed"),yd("aptos","Aptos balance adapter is not installed")],Mt=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:ps(P),label:"known priced value, not a complete portfolio total",pricedItems:_,unpricedNonzeroItems:T,complete:T===0&&!Mt&&B("unavailable")===0&&B("not-configured")===0&&kt.length===0,priceSource:o?"DefiLlama":null,priceStatus:b.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...I,g,w,x],unsupportedFamilies:kt,warnings:W}}import{constants as hs}from"node:fs";import{chmod as Z2,mkdir as eR,open as tR,readFile as nR}from"node:fs/promises";import{createHash as rR,randomUUID as oR}from"node:crypto";import iR from"node:os";import Ir from"node:path";L();L();var T2=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"]),N2=new Set(["image/jpeg","image/png","image/webp"]);function O2(e){let t=String(e||"").toLowerCase();return T2.some(n=>t===n||t.endsWith(`.${n}`))}function R2(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 Gw(e){let t=R2(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!O2(n.hostname)?null:n}async function L2(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=Gw(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 ve(()=>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=Gw(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(!N2.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 wd(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function $2(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function Kw(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 b of a){if(c>=l){s.push({item:b,image:null,error:"gallery page byte cap reached"});continue}try{let y=await L2(b.imageUrl||b.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:b,image:y,error:null})}catch(y){s.push({item:b,image:null,error:String(y?.message||y).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:b,image:y,error:v},E)=>{let k=E%u,I=Math.floor(E/u),P=k*d,_=m+I*p,T=y?`<image x="${P+14}" y="${_+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.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>`,$=wd($2(b,E).slice(0,34)),U=wd(b.chain||"unknown chain");return`${T}<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">${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 ${wd(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(b=>b.image).length,placeholders:s.filter(b=>!b.image).map(b=>({assetKey:b.item.assetKey||null,name:b.item.name||null,sourceUrl:b.item.imageUrl||null,error:b.error})),rasterOnly:!0,externalScripts:!1}}var B2=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],M2=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,F2=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function D2(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;M2.test(n)&&t.push("url-in-name");let i=B2.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),F2.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 Yw(e={}){let t=D2(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}X();var U2=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"}]),q2=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 Mn(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function li(e,t){let n=await ve(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function H2(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 j2(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 z2(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 Qw(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function V2(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 W2(e,t){let n=Qw(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 G2(e){let t=new Map;for(let n of e){let r=Qw(n);t.has(r)||t.set(r,n)}return[...t.values()]}function K2(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 Zw(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Er(e={},t={}){let n=new Date().toISOString(),r=Bn(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=U2.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=Mn(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await Fe(l,4,async y=>({row:y,result:await li(`opensea-${y.chain}`,()=>ro({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:v}of u)if(v.ok){let E=v.data.nfts.map(k=>({...k,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...E),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:v.data.complete?"ok":"partial",count:E.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!r.evm)for(let y of i.filter(v=>v.family!=="solana"))a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"not-configured",reason:"EVM address missing"});if(r.solana&&(!o||o.has("solana"))){let y=await li("opensea-solana",()=>ro({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let v=y.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:y.data.complete?"ok":"partial",count:v.length,complete:y.data.complete,next:y.data.next,source:"opensea"})}else a.push({family:"solana",chain:"solana",status:"unavailable",error:y.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 y=await li("satflow-wallet-contents",()=>ya({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},Mn(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let v=H2(y.data.contents).map(k=>j2(k,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 li("bitcoin-meta-inscriptions",()=>rr({address:r.bitcoin},Mn(t,"bitcoinMeta")),t.timeoutMs??35e3),E=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];s.push(...E.map(k=>z2(k,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":y.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 y of[...new Set([r.evm,r.solana].filter(Boolean))]){let v=await li(`opensea-pnl-${y}`,()=>Ui({address:y},c),t.timeoutMs??35e3);d.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:v.error})}let p=V2(e.costBasis),m=G2(s).map(y=>W2(y,p)).map(y=>Yw(y)),f=m.filter(y=>!y.spam),h=m.filter(y=>y.spam),g=f.filter(y=>y.estimatedValueUsd!=null&&Number.isFinite(Number(y.estimatedValueUsd))),w=Math.round(g.reduce((y,v)=>y+Number(v.estimatedValueUsd),0)*100)/100,x=f.length-g.length,b=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:q2,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&&b.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:K2(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 Jw(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 Y2(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 ex(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 Wi(e,Mn(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=Jw(e.expiry??e.endTime,"Solana NFT listing expiry");return Ha({...e,expiry:r},Mn(t,"magiceden"))}if(n==="satflow"){let r=Jw(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return ba({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:Y2(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},Mn(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function xd(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 vd(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function fs(e){return String(e??"").trim().toLowerCase()}function J2(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=fs(t),i=fs(n);return!o||!i?!1:r.some(a=>fs(a.trait_type??a.traitType??a.type)===o&&fs(a.value??a.trait_value??a.traitValue)===i)}function X2(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function Xw(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 kd(e){return Math.round(Number(e)*1e6)/1e6}function rn(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 tx(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return rn(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 rn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=xd(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=xd(e.minTraitVolumeEth,"minTraitVolumeEth"),u=xd(e.traitFloorEth,"traitFloorEth"),d=vd(e.collectionFloorEth),p=vd(e.maxListingAgeMs),m=vd(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return rn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return rn(e,"invalid-min-trait-sales");if(u<=0)return rn(e,"trait-floor-unavailable");let f=k=>J2(k,e.traitType,e.traitValue)&&X2(k,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(k=>{if(!m)return!0;let I=Xw(k,["timestamp","soldAt","createdAt"]);return I!=null&&i-I<=m}),g=kd(h.reduce((k,I)=>k+Number(I.priceEth??I.price??0),0)),w={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return rn(e,"trait-liquidity-insufficient",{traitSales:w});let x=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(k=>{let I=Number(k.priceEth??k.price);if(!Number.isFinite(I)||I<=0||I>a)return!1;if(!p)return!0;let P=Xw(k,["listedAt","createdAt","timestamp"]);return P!=null&&i-P<=p}).map(k=>{let I=Number(k.priceEth??k.price),P=Math.round((u-I)/u*1e4);return{...k,priceEth:I,discountBps:P}}).filter(k=>k.discountBps>=s).sort((k,I)=>k.priceEth-I.priceEth||I.discountBps-k.discountBps),b={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."},y=e.minTraitListings==null?1:Number(e.minTraitListings);if(!Number.isFinite(y)||y<1)return rn(e,"invalid-min-trait-listings",b);if(x.length<y)return rn(e,"trait-listing-depth-insufficient",b);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:kd(v.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:b,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:kd(v.priceEth),discountBps:v.discountBps},evidence:b,prepareIntent:E}}async function nx(e={},t={}){let n=await Er({...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 rx(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Er({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await Kw({...e,items:n},Mn(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var ox=10*1024*1024,sx=1e3;function on(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ar(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function ix(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 aR(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function lx(e={}){return`portfolio_${rR("sha256").update(aR(e)).digest("hex").slice(0,20)}`}function ux(e={}){if(e.historyFile)return Ir.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Ir.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Ir.join(iR.homedir(),".hermes");return Ir.join(Ir.resolve(n),"state","oracle","portfolio-history.jsonl")}function sR(e){let t=on(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Ar(t):null}function cR(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=on(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Ar(t):null}function lR(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=on(c.usdValue);return l==null?s:s+l},0),i=on(n.perps?.accountValueUsd),a=Ar(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>on(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=on(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Ar(r)})}return t}function uR(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 dR(e,t){let n=ux(t),r=`${JSON.stringify(e)}
147
+ `;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await eR(Ir.dirname(n),{recursive:!0,mode:448});let o=hs.O_APPEND|hs.O_CREAT|hs.O_WRONLY|(hs.O_NOFOLLOW||0),i=await tR(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await Z2(n,384),n}async function dx(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||ms,o=t.nftInventoryImpl||Er,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=sR(s),u=cR(c),d=[l,u].filter(v=>v!=null),p=d.length?Ar(d.reduce((v,E)=>v+E,0)):null,m=!!(s?.valuation?.complete&&(!n||c?.valuation?.complete===!0)),f=typeof t.now=="function"?t.now():new Date,h=new Date(f).toISOString(),g=s?.addresses||Bn(e,t.env||process.env),w=lx(g),x=[...s?.warnings||[]];n&&c?.status==="unavailable"&&x.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&x.push("NFT estimated value is incomplete and is not an executable bid.");let b={schemaVersion:1,id:`snapshot_${oR()}`,portfolioId:w,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!g?.[v]])),valuation:{knownUsd:p,liquidKnownUsd:l,nftEstimatedValueUsd:u,complete:m,label:m?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(s?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(s?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:lR(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:uR(s,c,n),warnings:[...new Set(x)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await dR(b,t),snapshot:b,balance:s,nfts:c}}async function pR(e){let t=ux(e);try{let n=await nR(t);if(n.byteLength>ox)throw new Error(`portfolio history exceeds ${ox} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
148
+ `))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 mR(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=Bn(e,t.env||process.env);return Object.values(n).some(Boolean)?lx(n):null}async function Sd(e={},t={}){let n=cx(e.limit,100,1,sx,"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=ix(e.since,"portfolio history since"),i=ix(e.until,"portfolio history until"),a=mR(e,t),s=await pR(t),c=s.snapshots.filter(d=>!(a&&d.portfolioId!==a||o&&d.recordedAt<o||i&&d.recordedAt>i));c.sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)));let l=c.length;c=c.slice(-n),r==="desc"&&c.reverse();let u=c.filter(d=>on(d?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:s.file,portfolioId:a,order:r,totalStored:s.snapshots.length,totalMatching:l,corruptLines:s.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:u.length,unpricedSnapshots:c.length-u.length,firstRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((d,p)=>String(d.recordedAt).localeCompare(String(p.recordedAt))).at(-1).recordedAt:null}}}function ax(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function gs(e){return String(e).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function fR(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 hR(e,t){let c=e.map(b=>b.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let b=Math.max(1,Math.abs(l)*.05);l-=b,u+=b}else{let b=(u-l)*.1;l=Math.max(0,l-b),u+=b}let d=b=>e.length===1?1240/2:100+1040*b/(e.length-1),p=b=>570-(b-l)/(u-l)*470,m=e.map((b,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(b.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(b,y)=>{let v=y/4,E=100+v*470,k=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">${ax(k)}</text>`}).join(""),h=e.map((b,y)=>`<circle cx="${d(y)}" cy="${p(b.value)}" r="5" fill="#b8f0ff"><title>${gs(b.recordedAt)}: ${ax(b.value)}</title></circle>`).join(""),g=gs(e[0].recordedAt.slice(0,10)),w=gs(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 ${gs(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 px(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 Sd({...e,order:"asc",limit:e.limit??sx},t);if(!r.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=r.snapshots.map(d=>({recordedAt:d.recordedAt,value:on(d?.valuation?.knownUsd),complete:d?.valuation?.complete===!0})).filter(d=>d.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=fR(o,n),a=i[0].value,s=i.at(-1).value,c=Ar(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=hR(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 yR=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"}}),bR=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),wR=`0x${"0".repeat(64)}`;function xR(e){return!e||e==="0x"||e===wR}async function Fn(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(f){return{address:r,chainId:o,status:"unavailable",error:f?.message||"eth_getCode failed",risk:"unknown-risk",findings:[],isProxy:!1,codeSize:0,notes:["could not read contract code; treat as unverified"]}}if(!i||i==="0x")return{address:r,chainId:o,status:"ok",risk:"high",findings:[{selector:"-",name:"no-code",weight:"high",note:"no contract deployed at this address"}],isProxy:!1,codeSize:0,notes:["nothing is deployed here \u2014 an approval or transfer to this address is unrecoverable"]};let a=[],s=[],c=i.slice(2).toLowerCase();for(let[f,h]of Object.entries(yR))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of bR)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!xR(g)){l=!0,u=f,d=`0x${String(g).slice(-40)}`;break}}catch{a.push(`proxy slot (${f}) unreadable; proxy status uncertain`)}l&&(s.push({selector:u,name:"proxy",weight:"high",note:"implementation is upgradeable \u2014 current behaviour is not a guarantee"}),a.push(`bytecode scan covers the proxy (${u}), not the implementation ${d} it delegates to`));let m=s.filter(f=>f.weight==="high").length>0?"high":s.length>0?"elevated":"unknown-risk";return m==="unknown-risk"&&a.push("no owner-power selectors found; this is weak evidence, not a safety guarantee"),{address:r,chainId:o,status:"ok",risk:m,findings:s,isProxy:l,proxyStandard:u,implementation:d,codeSize:Math.floor(c.length/2),notes:a}}async function mx(e={}){let t=Date.now();try{let n=await Fn({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 kR=/^0x[0-9a-fA-F]{40}$/,fx=4663;function ys(e,t){let n=String(e||"").trim();if(!kR.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Ed(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 ui(e,t){return e==null||e===""?null:Ed(e,t)}function SR({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=ys(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=Ed(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=ui(u.gasLimit??c.gasLimit,"gasLimit"),h=ui(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=mc({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:w,secret:l.routeAttestationSecret}),b=fe(x,{chainId:e,venue:"uniswap-v3",data:p,secret:l.routeAttestationSecret}),y={chainId:e,from:o,to:d,data:p,value:m,gasLimit:f,maxFeePerGas:h,slippageBps:b.selectedBps,expiresAtMs:g+w},v=ui(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return v&&(y.maxPriorityFeePerGas=v),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||v)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=ui(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=ui(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:b.selectedBps,expiresAtMs:g+w,fee:{oracleFeeBps:5},autoSlippage:b,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function ER(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}Mc();let n=mf(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function IR({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 hx(e={},t={}){let n=Number(e.chainId??fx);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=ys(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?ys(e.tokenIn,"tokenIn"):null,i=e.recipient?ys(e.recipient,"recipient"):null,a=e.amountIn==null?null:Ed(e.amountIn,"amountIn"),s=ER(n,t.scanner),c=t.scanContractRisk||Fn,[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=IR({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),w=null,x=null,b=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=SR({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:w,args:e,opts:t})}catch(y){b=String(y?.message||y).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:b,signed:x?"pending-local-signer":!1,broadcast:x?"pending-local-signer":!1}}async function gx(){Mc();let e=ff();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:fx,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 _R=5,Id=[50,75,90],yx=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Dn(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 PR(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 bs(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=yx[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(yx).join(", ")}`};let i,a,s,c;try{i=Dn(e.maxFeePerGasWei,"maxFeePerGasWei"),a=Dn(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=Dn(e.gasLimit,"gasLimit"),c=Dn(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${_R.toString(16)}`,"pending",Id],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=Dn(u?.baseFeePerGas,"baseFeePerGas")??Dn(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 Dn(k?.[o.percentile],"reward")}catch{return null}}).filter(k=>k!=null&&k>0n),f=PR(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 b=s!=null?s*w:null;c!=null&&b!=null&&b>c&&x.push({field:"totalGas",wanted:b.toString(),capped:c.toString()});let y=f==null||g>=f,v=c==null||b==null||b<=c,E=y&&v;return y||h.push(`tip cap ${g} is below the observed ${Id[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),v||h.push(`worst-case gas ${b} 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:Id[o.percentile],maxFeePerGas:w.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:b==null?null:b.toString(),clamps:x,notes:h}}he();var TR="08c379a0",NR="4e487b71",OR=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 RR(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===TR)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===NR){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:OR[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 LR(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 $R(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 BR(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 di(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=BR(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=LR(f);if(!$R(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=RR(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 bx(e={}){let t=Date.now();try{let n=await di({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 FR=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 DR(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 UR(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 wx(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=UR(t);else if(o==="quantity")r+=DR(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function qR({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 ws(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=FR.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 xx(e={}){let t=Date.now();try{let n=await ws({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 Ad(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 ws({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(b=>b.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(b=>b.signature)};let c=a.found.length>1&&!e.signature,l=await Fn({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await di({chainId:r,tx:{from:o,to:n,data:wx(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 bs({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=wx(s,{minter:o,quantity:i})}catch(b){return{status:"error",error:b.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=Ac({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(b=>b.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(b=>b.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=qR({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(b){x=String(b?.message||b).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(b=>b.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 FL}from"node:crypto";import{createHash as jR}from"node:crypto";var zR=1,VR=8,Pe=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},WR=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),GR=new Set(["family","id"]),KR=new Set(["id","startsAt","endsAt","eligibility"]),YR=new Set(["kind","proofFormat","proofDigest"]),JR=new Set(["amount","unit"]),XR=new Set(["value","unit"]);function _r(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new Pe(`${t} must be a plain object`);return e}function Pr(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new Pe(`${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 Pe(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function QR(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Pe(`${t} must be a positive safe integer`);return e}function _d(e,t){if(e=_r(e,t),Pr(e,JR,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new Pe(`${t} requires amount and unit`,"ambiguous-unit");let n=it(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new Pe(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:it(e.unit,`${t}.unit`)}}function Pd(e,t){if(e=_r(e,t),Pr(e,XR,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new Pe(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function ZR(e,t){e=_r(e,t),Pr(e,YR,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 Pe(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function eL(e,t){let n=`stages[${t}]`;e=_r(e,n),Pr(e,KR,n);let r=Pd(e.startsAt,`${n}.startsAt`),o=Pd(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new Pe(`${n} must end after it starts`,"invalid-stage-range");return{id:it(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:ZR(e.eligibility,`${n}.eligibility`)}}function Cd(e){if(e=_r(e,"input"),Pr(e,WR,"input"),e.version!==zR)throw new Pe("version must be 1");let t=_r(e.chain,"chain");Pr(t,GR,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>VR)throw new Pe("stages must contain 1 through 8 entries","stage-count");let r=n.map(eL).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 Pe("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 Pe("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new Pe("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:QR(e.quantity,"quantity"),stages:r,mintValueCap:_d(e.mintValueCap,"mintValueCap"),networkFeeCap:_d(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:_d(e.priorityFeeCap,"priorityFeeCap"),expiry:Pd(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new Pe("every stage must end no later than expiry","stage-after-expiry");return i}function tL(e){return JSON.stringify(Cd(e))}function vx(e){return`sha256:${jR("sha256").update(tL(e),"utf8").digest("hex")}`}var Td=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Un=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Nd=Object.freeze(Object.values(Un)),kx=new Set(Nd),Sx=Object.freeze(Nd.slice(0,4)),nL=Nd,rL=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Le=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function xs(e,t){if(!Array.isArray(e)||e.length===0)throw new Le(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Le(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Le(`${t} contains duplicates`);return[...n].sort()}function oL(e){if(!Array.isArray(e))throw new Le("capabilities must be an array");let t=new Set(e);for(let n of t)if(!kx.has(n))throw new Le(`unknown capability ${n}`,"unknown-capability");return nL.every(n=>t.has(n))?Td.AUTOMINT_READY:Sx.every(n=>t.has(n))?Td.PREPARE_READY:Td.RESEARCH_ONLY}function Od(e=[]){if(!Array.isArray(e))throw new Le("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Le("entry must be an object");for(let i of Object.keys(n))if(!rL.has(i))throw new Le(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Le("entry id must be an exact string");if(t.has(n.id))throw new Le(`duplicate entry id ${n.id}`,"duplicate-entry");let r=xs(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(xs(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(xs(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(xs(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:oL(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=Sx){let o=t.get(n);if(!o)throw new Le(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!kx.has(i))throw new Le(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Le(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var E8=Od([]);X();import{getAddress as iL,Interface as Rd,keccak256 as aL}from"ethers";var an=Object.freeze({manifold:new Rd(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Rd(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Rd(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),$d=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"})}),P8=Object.freeze(Object.fromEntries(Object.entries($d).map(([e,t])=>[an[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 iL(String(e||""))}catch{return oe(`invalid ${t}`)}}function $e(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 Ld(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 sL(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=an[e].getFunction($d[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 cL(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 lL(e,t){let n=e.stage;if(!n)return null;let r=$e(n.startTime,"stage startTime"),o=$e(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 uL(e,t){let n=$d[e];String(t).slice(0,10).toLowerCase()!==an[e].getFunction(n.signature).selector.toLowerCase()&&oe("unknown selector");let r;try{r=an[e].decodeFunctionData(n.signature,t)}catch{oe("invalid calldata layout")}let o;return e==="manifold"&&(o=an.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=an.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=an.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 Ex(e,t={},n={}){an[e]||oe("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=sL(e,t,n),s=Ye(t.recipient||t.minter,"recipient"),c=$e(t.quantity,"quantity",{positive:!0}),l=$e(t.priceWei,"priceWei"),u=$e(t.maxValueWei,"maxValueWei"),d=$e(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 cL(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||aL(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&oe("runtime bytecode is not reviewed");let f=uL(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=lL(t,h),w,x,b,y=null,v=[];if(e==="manifold")Ye(f[0],"calldata contract")!==o&&oe("calldata contract mismatch"),(t.instanceId==null||$e(f[1],"instanceId")!==$e(t.instanceId,"instanceId"))&&oe("instance/stage mismatch"),(t.mintIndex==null||$e(f[2],"mintIndex")!==$e(t.mintIndex,"mintIndex"))&&oe("mint index/stage mismatch"),v=Ld([...f[3]]),w=Ye(f[4],"calldata recipient"),x=1n,b=l;else if(e==="zora")w=Ye(f[0],"calldata recipient"),x=BigInt(f[1]),b=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]),b=BigInt(f[3]);let _=f[4];v=Ld([..._.proof]),y=BigInt(_.quantityLimitPerWallet),y<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"),b!==l&&oe("price mismatch"),t.proof!=null&&JSON.stringify(v.map(_=>_.toLowerCase()))!==JSON.stringify(Ld(t.proof).map(_=>_.toLowerCase()))&&oe("proof mismatch");let E=$e(p.value??0,"transaction value"),k=l*c;(E<k||E-k>d||E>u)&&oe("transaction value or fee cap exceeded");let I=p.gasLimit==null?null:$e(p.gasLimit,"gasLimit"),P=p.maxFeePerGas==null?null:$e(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(I==null||I>$e(t.maxGasLimit,"maxGasLimit"))&&oe("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(P==null||P>$e(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-k).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.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 dL="RESEARCH_ONLY";var pL="canonical serialized-message decoding and program-specific instruction validation are not implemented",vs=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),T8=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function mL(){throw new Error(`solana-mint: ${dL}; disabled until ${pL}`)}function Ix(){mL()}X();import{Address as fL,CompactSize as hL,NETWORK as gL,OutScript as Bx,Script as yL,TEST_NETWORK as Ax,Transaction as bL,utils as wL}from"@scure/btc-signer";import{createHash as pi}from"node:crypto";var _x="universal-ordinals-mint",Px="bitcoin-ordinals-mint-plan",xL=1800*1e3,vL=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Cx=new Set,kL=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 sn(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 Bd(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 Mx(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 SL(e){return e==="bitcoin"||e==="mainnet"?gL:e==="regtest"?{...Ax,bech32:"bcrt"}:Ax}function Tx(e,t){try{let n=Bx.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 EL(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function IL(e){let t=pi("sha256").update(e.unsignedTx).digest();return pi("sha256").update(t).digest().reverse().toString("hex")}function Nx(e,...t){let n=pi("sha256").update(e,"ascii").digest();return pi("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function AL(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=Nx("TapLeaf",Buffer.from([a]),Buffer.from(hL.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Nx("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=wL.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 Ox(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=bL.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(EL(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=Tx(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)=>AL(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 Tx(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:IL(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 _L(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 PL(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 CL=new Set([1,3]);function TL(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=PL(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!CL.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 NL(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=yL.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(TL(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(pi("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||_L(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 Rx(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 OL(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 Fx(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 Dx(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=sn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function RL(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:sn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:Mx(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:Fx(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 LL(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:sn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Mx(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 Lx(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 $x(e,t,n){try{return Buffer.from(Bx.encode(fL(SL(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 $L(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)=>Dx({...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 BL(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");OL(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(!vL.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=Fx(e.parentId??e.parentInscriptionId),a=pt(e.recipient??e.destination,"recipient"),s=sn(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(Dx);if(new Set(c.map(T=>T.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");$L(e,c);let l=Ox(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=Ox(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=LL(e.commitOutputs),p=RL(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((T,$)=>T.txid!==c[$].txid||T.vout!==c[$].vout||T.valueSats!==c[$].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Lx(l.outputs,d,"commit PSBT"),Lx(u.outputs,p,"reveal PSBT");let m=$x(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,$]of p.entries())if($.scriptHex!==$x($.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");NL(u,{contentHash:r,contentType:o,parentId:i});let g=Bd(e.commitFeeRateSatVb,"commitFeeRateSatVb"),w=Bd(e.revealFeeRateSatVb,"revealFeeRateSatVb"),x=Bd(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(x<=0||g>x||w>x)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let b=sn(e.commitFeeSats,"commitFeeSats"),y=sn(e.revealFeeSats,"revealFeeSats"),v=sn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(b+y>v)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==b.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(b)/l.vsizeLowerBound>g||Number(y)/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:sn(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>xL)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(Rx),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(Rx),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:w,maxRate:x,commitFee:b.toString(),revealFee:y.toString(),maxTotalFee:v.toString(),rbf:e.rbf,cpfp:I,expiresAt:_}}function ML(e={},t={}){let n=BL(e,t),r=n.commitInputs.find(s=>Cx.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:_x,kind:Px,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...kL},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:_x,kind:Px,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Cx.add(s.outpoint);return a}var Ux=ML;var DL=Object.freeze([Un.DISCOVERY,Un.ELIGIBILITY,Un.PREPARATION,Un.SIMULATION]),qx=[["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",vs.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",vs.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",vs.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Hx=Object.freeze(qx.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([Un.DISCOVERY]):DL,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),z8=Od(Hx.map(({family:e,tier:t,enabled:n,...r})=>r)),jx=new Map(qx.map(e=>[e[0],e])),UL=new Set(["intent","adapterId","input"]),qL=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,ks=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 ks(e,t,n?{cause:n}:{})}function M(e,t,n){String(e??"")!==String(t)&&ue("intent-mismatch",`${n} does not match canonical intent`)}function Ae(e,t,n){let r=e[t];return r.unit!==n&&ue("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function zx(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))qL.test(n)&&ue("custody-refused",`${t}.${n} is outside the prepare-only boundary`),zx(r,`${t}.${n}`)}function HL(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function jL(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:${FL("sha256").update(JSON.stringify(HL(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 zL(e,t){let n=jx.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 VL(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,Ae(e,"mintValueCap","wei"),"mint-value cap"),M(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,Ae(e,"networkFeeCap","wei"),"network-fee cap"),M(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,Ae(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,Ae(e,"mintValueCap","lamports"),"mint-value cap"),M(t.networkFeeCapLamports,Ae(e,"networkFeeCap","lamports"),"network-fee cap"),M(t.priorityFeeCapLamports,Ae(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,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function WL(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==yn(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 GL(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=Ae(e,"mintValueCap","wei"),o=Ae(e,"networkFeeCap","wei"),i=Ae(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 KL(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,Ae(e,"mintValueCap","lamports"),"mint-value cap");let r=Ae(e,"networkFeeCap","lamports"),o=Ae(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 YL(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,Ae(e,"mintValueCap","sats"),"mint-value cap"),M(t.maxTotalFeeSats,Ae(e,"networkFeeCap","sats"),"network-fee cap"),M(t.maxFeeRateSatVb,Ae(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 Md(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Hx})}async function Vx(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Md()}}async function Wx(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))UL.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"),jx.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"),zx(n);let r;try{r=Cd(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=zL(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=jL(r,n,r.chain.family,o);VL(r,n);let s;try{i[4]==="evm"?s=await Ex(i[5],n,t):i[4]==="opensea"?s=await Vi(n,t):i[4]==="solana"?(M(n.programId,i[5],"selected Solana adapter program"),s=await Ix(n,t)):s=await Ux(n,t)}catch(u){if(u instanceof ks)throw u;ue("adapter-refused",u?.message||"adapter preparation failed",u)}WL(s);let c=i[4]==="bitcoin"?YL(r,n,s):i[4]==="solana"?KL(r,n,s):GL(r,n,s),l=Object.freeze({intentHash:vx(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 Fd="ROUTE_ONLY",Dd=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),Kx=new Set(Object.values(Dd)),XL=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),QL=new Set(["amount","currency"]),ZL=new Set(["value","unit"]),e$=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),t$=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 Nr(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 mi(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 Yx(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 Cr(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 Jx(e,t){return e=Nr(e,t),mi(e,QL,t),{amount:Yx(e.amount,`${t}.amount`),currency:ge(e.currency,`${t}.currency`)}}function Gx(e,t){if(!Array.isArray(e))throw new se(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>Jx(n,`${t}[${r}]`))}function n$(e){if(e=Nr(e,"expiry"),mi(e,ZL,"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 r$(e,t,n){Object.hasOwn(e,n)&&(t[n]=ge(e[n],n))}function Xx(e){e=Nr(e,"intent"),mi(e,XL,"intent");let t=ge(e.action,"action");if(!Kx.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"])r$(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=Yx(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=Jx(e.price,"price"),n.expiry=n$(e.expiry),n.fees=Gx(e.fees,"fees"),n.royalties=Gx(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=ge(e.listingId,"listingId")),n}function o$(e){e=Nr(e,"adapter"),mi(e,e$,"adapter");let t=Cr(e.actions,"adapter.actions");for(let o of t)if(!Kx.has(o))throw new se(`adapter has unknown action ${o}`,"invalid-action");let n=Nr(e.surface,"adapter.surface");mi(n,t$,"adapter.surface");let r=Nr(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(Cr(e.networks,"adapter.networks")),standards:Object.freeze(Cr(e.standards,"adapter.standards")),marketplaces:Object.freeze(Cr(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(Cr(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(Cr(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Fd,custody:"user",surface:Object.freeze({provider:ge(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function i$(e=[]){if(!Array.isArray(e))throw new se("entries must be an array");let t=e.map(o$);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:Fd,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=Xx(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 Tr=(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}}),Ud=i$([Tr("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"}),Tr("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"}),Tr("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"}),Tr("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),Tr("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),Tr("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function Qx(e,{access:t="public",feeProfile:n="default",registry:r=Ud,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=Xx(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:Fd,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 Es="universal-evm-nft-transfer",Zx="evm-nft-safe-transfer",s$=1800*1e3,c$=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),l$=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function ev(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(l$.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);ev(r,t)}}}function qd(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 qn(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 fi=e=>e.toString(16).padStart(64,"0"),Ss=e=>e.slice(2).padStart(64,"0");function u$(e,t,n,r,o){return e==="erc721"?`0x42842e0e${Ss(t)}${Ss(n)}${fi(r)}`:`0xf242432a${Ss(t)}${Ss(n)}${fi(r)}${fi(o)}${fi(160n)}${fi(0n)}`}function d$(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(ev(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=qn(e.chainId,"chainId",{positive:!0,safe:!0}),o=qd(e.sender??e.from,"sender"),i=qd(e.recipient??e.to,"recipient"),a=qd(e.contract??e.contractAddress??e.tokenContract,"contract"),s=qn(e.tokenId,"tokenId"),c=qn(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(qn(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=qn(e.gasLimit,"gasLimit",{positive:!0}),u=qn(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=qn(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)>s$)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=u$(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 tv(e={},t={}){let n=d$(e,t),r={provider:Es,kind:Zx,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...c$},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:Es,kind:Zx,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}X();var Is="universal-solana-nft-transfer",nv="solana-verified-nft-transfer",ov="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Hn=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),rv=new Set(Object.values(Hn)),m$=new Set([Hn.token,Hn.token2022]),f$=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),h$=/^(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 vt(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 we(e,t,n){String(e??"")!==String(t)&&te(`${n} mismatch; mutation refused`)}function iv(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))h$.test(r)&&o!=null&&o!==!1&&te(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),iv(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 g$(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 y$(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 b$(e={}){(!e||typeof e!="object"||Array.isArray(e))&&te("request object required"),iv(e),(e.network!=="mainnet-beta"||e.genesisHash!==ov)&&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=vt(e.quantity,"quantity",{positive:!0}),s=vt(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!==Hn.core:!m$.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"&&we(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(vt(e.decimals??0,"decimals")):null,p=vt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=vt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=vt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&te("priority fee exceeds reviewed cap");let g=vt(e.networkFeeLamports,"networkFeeLamports"),w=vt(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 b=mt(x.recentBlockhash,"recentBlockhash");we(b,e.approvedBlockhash,"blockhash mutation after approval");let y=vt(x.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),v=vt(e.currentBlockHeight,"currentBlockHeight");v>y&&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)),k=new Set([o,i,n,r,l,u,...rv].filter(Boolean)),I=0,P=0,_=0,T=0;for(let[$,U]of x.instructions.entries()){let H=mt(U.programId,`instructions[${$}].programId`);rv.has(H)||te(`unknown program ${H}`);let O=g$(U,`instructions[${$}]`);y$(U,k,E);let j=String(O.type??O.instruction??"").toLowerCase();H===Hn.computeBudget?j.includes("limit")?(we(O.units??O.computeUnitLimit,p,"compute-unit limit"),I++):j.includes("price")?(we(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),P++):te("unsupported compute budget instruction"):H===Hn.associatedToken?((t!=="metaplex"||j!=="createassociatedtokenaccountidempotent")&&te("non-canonical associated token instruction"),we(O.payer,o,"ATA payer"),we(O.owner,i,"ATA recipient"),we(O.mint,n,"ATA mint"),we(O.tokenAccount,u,"recipient ATA"),we(O.tokenProgramId,c,"ATA token program"),T++):t==="metaplex"&&H===c?(j!=="transferchecked"&&te("only canonical transferChecked is allowed"),we(O.mint,n,"mint"),we(O.owner,o,"owner"),we(O.recipient,i,"recipient"),we(O.sourceTokenAccount,l,"source token account"),we(O.destinationTokenAccount,u,"recipient ATA"),we(O.amount,a,"quantity"),we(O.decimals,d,"decimals"),_++):t==="core"&&H===Hn.core?(j!=="transfer"&&te("only canonical Core transfer is allowed"),we(O.asset,n,"mint/asset"),we(O.collection,r,"collection"),O.collectionVerified!==!0&&te("verified collection required in Core instruction"),we(O.owner,o,"owner"),we(O.newOwner,i,"recipient"),we(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:b,lastValidBlockHeight:y.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 av(e={},t={}){let n=b$(e),r=Number(t.nowMs??Date.now()),o={provider:Is,kind:nv,chain:"solana-mainnet-beta",genesisHash:ov,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...f$},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:Is,kind:nv,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}X();var As="universal-ordinals-transfer",sv="bitcoin-ordinals-transfer-plan",cv=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),x$=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function ie(e){throw new Error(`ordinals transfer: ${e}`)}function ln(e,t){let n=String(e??"").trim();return n||ie(`${t} required`),n}function cn(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 lv(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&ie(`${t} must be positive`),n}function mv(e,t){let n=ln(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||ie(`${t} must be 64 hex`),n}function fv(e,t="inscriptionId"){let n=ln(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||ie(`${t} must be canonical`),n}function hv(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`),hv(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 gv(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 uv(e,t){(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),gv(e,t);let n=mv(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:cn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:ln(e.address,`${t}.address`),sequence:Number(cn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function dv(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&ie(`${t} must be an object`),gv(e,t),{role:ln(e.role,`${t}.role`),address:ln(e.address,`${t}.address`),valueSats:cn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:fv(e.inscriptionId,`${t}.inscriptionId`)}}}function pv(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&ie(`${n} mismatch; mutation refused`)}function v$(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ie("request object required"),hv(e);let t=ln(e.network,"network").toLowerCase(),n=mv(e.genesisHash,"genesisHash");(!cv[t]||n!==cv[t])&&ie("network/genesis mismatch");let r=fv(e.inscriptionId),o=uv(e.ownerInput,"ownerInput");ln(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&ie("current inscription outpoint mismatch");let i=ln(e.destination,"destination"),a=cn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:dv(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&ie("exact change output invalid");let c=lv(e.feeRateSatVb,"feeRateSatVb"),l=lv(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&ie("fee rate exceeds reviewed cap");let u=cn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=cn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&ie("total fee exceeds reviewed cap");let p=Number(cn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(cn(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"),pv(uv(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((b,y)=>dv(b,`psbt.outputs[${y}]`)):ie("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};pv(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(b=>b.role==="inscription"&&b.inscriptionId===r).length!==1&&ie("exactly one inscription-carrying output required");let x=h.reduce((b,y)=>b+BigInt(y.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 yv(e={},t={}){let n=v$(e);return N({provider:As,kind:sv,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...x$},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:As,kind:sv,env:t.env})}he();function S$(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 bv(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(!Gl(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=S$(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 wv(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 I$=1440*60*1e3;function A$(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>I$&&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 xv="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",_$=4663,P$="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",vv="a22cb465",C$="a0712d68";function Hd(e){return String(e||"").trim().toLowerCase()}function Or(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function T$(e){let t=Or(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${vv}${t.padStart(64,"0")}${"0".repeat(64)}`}function N$(e){return Or(e).includes(Or(xv))}function O$(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Or(n?.data).startsWith(vv))}function R$(e={},t){let n=Or(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return Hd(i[0])!==P$?!1:Or(i[2])===n})}function L$(e=1){return`0x${C$}${BigInt(e).toString(16).padStart(64,"0")}`}function kv(e={},t={}){let n=Hd(e.contract),r=Hd(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!==_$&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),N$(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"),O$(s)&&a.push("simulation sets approval / setApprovalForAll"),R$(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:L$(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:T$(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!B0(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=A$(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:xv.toLowerCase(),reasons:a,mintTx:l,revokeTx:u,notes:["failClosedPass is not safe \u2014 owner can still change the contract after this block",d?"ARMED one-shot: fire mint then revoke; grant must not be reused":"prepare-only: unsigned mint + revoke; arm this exact contract to fire"]}}L();X();ca();var B$="https://api.paraswap.io",jd=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||B$).replace(/\/$/,"");function Rr(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 S(`${jd(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Lr(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Rr(e.srcToken,"srcToken"),destToken:Rr(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 sa({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(Kf(o)))r.set(s,c);let i=await S(`${jd(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 Sv(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=Rr(e.userAddress,"userAddress"),o=await Lr(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Rr(e.srcToken,"srcToken"),destToken:Rr(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=Rr(e.receiver,"receiver"));let c=await S(`${jd(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 Ev(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 F$}from"node:crypto";import{getAddress as Tv,isAddress as Vd}from"ethers";var Iv="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",D$=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),U$=Object.freeze(["lifi"]),Av=/^0x[0-9a-fA-F]{64}$/,q$=/^\d+$/;function ye(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function _v(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&ye(t,"must be a positive chainId"),n}function _s(e,t){let n=String(e??"").trim();return(!q$.test(n)||BigInt(n)<=0n)&&ye(t,"must be a positive integer string"),n}function H$(e,t){return e==null||e===""?null:_s(e,t)}function Pv(e,t){let n=String(e??"").trim();return n.toLowerCase()===Iv.toLowerCase()?Iv:(Vd(n)||ye(t,"must be an EVM address or native token sentinel"),Tv(n))}function Nv(e,t){let n=String(e??"").trim();return Vd(n)||ye(t,"must be an EVM address"),Tv(n)}function j$(e,t){return e==null||e===""?null:Nv(e,t)}function Cv(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 z$(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 $r(e){if(Array.isArray(e))return e.map($r);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=$r(e[n]));return t}return e}function V$(e){return JSON.stringify($r(e))}function Ps(e){return`0x${F$("sha256").update(V$(e)).digest("hex")}`}function Ov(e,t){let n={...e};for(let r of t)delete n[r];return n}function W$(e){return Ps(Ov(e,["intentHash"]))}function G$(e){return Ps(Ov(e,["firmQuoteHash"]))}function Wd(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=_v(e.fromChainId??e.fromChain,"fromChainId"),i=_v(e.toChainId??e.toChain,"toChainId"),s=o===i?D$:U$,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:Pv(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:Pv(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:_s(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:Nv(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:z$(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:H$(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:Cv(e.allowedSources,"allowedSources",s),allowedRouters:Cv(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)?$r(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):Ps({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=W$(c),Object.freeze(c)}function K$(e){return(!e||typeof e!="object"||Array.isArray(e))&&ye("artifact","required"),e.typedDataHash!=null&&!Av.test(String(e.typedDataHash))&&ye("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!Av.test(String(e.calldataHash))&&ye("artifact.calldataHash","must be bytes32"),e.to!=null&&!Vd(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"),$r(e)}function Rv(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=_s(t.amountOut??t.buyAmount,"amountOut"),s=_s(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&ye("minBuyAmount","exceeds amountOut");let c=K$(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=j$(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)?$r(t.metadata):{}};return d.quoteId||(d.quoteId=Ps({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=G$(d),Object.freeze(d)}function hi(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function Lv(e,t){return String(e?.[t]??"").trim()}function gi(e,t){return Object.freeze({source:e,run:t})}function Y$(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 hi(e,"lifi")&&a.push(gi("lifi",async()=>{let c=await(r.lifiQuote??Ao)({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 J$(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(hi(e,"paraswap")&&a.push(gi("paraswap",async()=>{let c=await(r.paraswapPrice??Lr)({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}}})),hi(e,"0x")&&(Lv(n,"ZEROX_API_KEY")||Lv(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(gi("0x",async()=>{let c=await(r.zeroxQuote??Po)({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}}})),hi(e,"cow")&&a.push(gi("cow",async()=>{let c=await(r.cowQuote??or)({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}}})),hi(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(gi("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Wn)({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 J$(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function X$(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function Q$(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>X$(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(Rv(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 Z$(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 $v(e,t={}){let n=Y$(e,t),{quotes:r,failed:o}=await Q$(e,n,t),i=Z$(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 Bv(e={},t={}){return Wd(e,t)}async function Mv(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:Wd(e,t);return $v(n,t)}async function Fv(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}L();var tB="https://app.across.to";function Gd(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||tB).replace(/\/$/,"")}async function Dv(e={}){try{let t=await S(`${Gd(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 Uv(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return S(`${Gd(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function qv(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)),S(`${Gd(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var rB="https://api.beefy.finance";function Kd(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||rB).replace(/\/$/,"")}async function Hv(e={}){try{let t=await S(`${Kd(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 jv(e={},t={}){let n=await S(`${Kd(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 zv(e={}){return S(`${Kd(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}L();var iB="https://public-api.birdeye.so";function Vv(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||iB).replace(/\/$/,"")}async function Wv(e={}){try{let t=await S(`${Vv(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 Gv(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 S(`${Vv(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var sB="https://api.celenium.io";function Yd(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||sB).replace(/\/$/,"")}async function Kv(e={}){try{let t=await S(`${Yd(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 Yv(e={}){return S(`${Yd(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function Jv(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 S(`${Yd(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var lB="https://api.mainnet-beta.solana.com";function uB(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||lB).replace(/\/$/,"")}async function Cs(e,t,n={}){let r=uB(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 Xv(e={}){try{let t=await Cs("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 Qv(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 Cs("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function Zv(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)),Cs("searchAssets",o,t)}async function ek(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return Cs("getAssetProof",{id:n},t)}L();var pB="https://api.l2beat.com";function Jd(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||pB).replace(/\/$/,"")}async function tk(e={}){try{let t=await S(`${Jd(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 nk(e={},t={}){let n=await S(`${Jd(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 rk(e={},t={}){return S(`${Jd(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var fB="https://api.spark.fi";function Xd(e={}){return(e.baseUrl||process.env.SPARK_API_URL||fB).replace(/\/$/,"")}async function ok(e={}){try{return{ok:(await S(`${Xd(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 ik(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?S(`${Xd(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):S(`${Xd(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}L();var gB="https://api.symbiotic.fi";function Qd(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||gB).replace(/\/$/,"")}async function ak(e={}){try{let t=await S(`${Qd(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 sk(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await S(`${Qd(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 ck(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return S(`${Qd(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}L();var bB="https://staking-api.polygon.technology/api/v2",wB=18,xB=200,vB=50,kB=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function ep(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||bB).replace(/\/$/,"")}function SB(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 EB(e,t=vB){let n=Number(e??t);return Number.isFinite(n)?Math.min(xB,Math.max(1,Math.trunc(n))):t}function Zd(e){let t=Number(e);return Number.isFinite(t)?t/10**wB:null}async function tp(e,t={}){let n=await S(`${ep(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 lk(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:Zd(e.totalStaked),selfStakePolApprox:Zd(e.selfStake),delegatedStakePolApprox:Zd(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function uk(e={},t={}){let n=await tp("/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=kB.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=EB(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(lk)}}async function dk(e={},t={}){let n=SB(e.id??e.validatorId,"id"),o=(await tp(`/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:{...lk(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 pk(e={}){try{let t=await tp("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:ep(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:ep(e),error:String(t?.message||t),exec:!1}}}L();var AB="https://api.v3.aave.com/graphql",I9=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),_B=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||AB;async function Ts(e,t,n={}){let r=await S(_B(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 PB=`query Markets($request: MarketsRequest!) {
149
149
  markets(request: $request) {
150
150
  name
151
151
  address
@@ -153,7 +153,7 @@ anchor-lang = "0.31.1"
153
153
  totalMarketSize
154
154
  totalAvailableLiquidity
155
155
  }
156
- }`,pB=`query Market($request: MarketRequest!) {
156
+ }`,CB=`query Market($request: MarketRequest!) {
157
157
  market(request: $request) {
158
158
  name
159
159
  address
@@ -186,6 +186,6 @@ anchor-lang = "0.31.1"
186
186
  }
187
187
  }
188
188
  }
189
- }`,mB=`query Chains($filter: ChainsFilter!) {
189
+ }`,TB=`query Chains($filter: ChainsFilter!) {
190
190
  chains(filter: $filter) { chainId name isTestnet explorerUrl }
191
- }`;function fB(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 sS(e={},t={}){let n={chainIds:fB(e)};return e.user&&(n.user=String(e.user)),{markets:(await Is(dB,{request:n},t))?.data?.markets??[]}}async function cS(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 Is(pB,{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 lS(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 Is(mB,{filter:r},t))?.data?.chains??[]}}async function uS(e={}){return{ok:(await Is("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var gB="https://staking-api.babylonlabs.io";function Yd(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||gB).replace(/\/$/,"")}function As(e,t={}){return E(`${Yd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function dS(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 pS(e={}){try{let n=(await As("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:Yd(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:Yd(e),error:String(t?.message||t),exec:!1}}}async function mS(e={},t={}){let r=(await As("/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 fS(e={},t={}){let n=await As("/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=dS(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=dS(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 As(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var bB="https://markets.bisq.network";function Jd(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||bB).replace(/\/$/,"")}function gS(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 _s(e,t={}){return E(`${Jd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function yS(e={}){try{let t=await _s("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:Jd(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:Jd(e),error:String(t?.message||t),exec:!1}}}async function bS(e={},t={}){let n=await _s("/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=gS(e.market||e.pair||"btc_usd","market"),r=await _s(`/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 xS(e={},t={}){let n=gS(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 _s(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}L();var Bt=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"}}),xB=new Map([["bob",60808],["rootstock",30],["rsk",30]]),vB=60808;function fi(e){if(e==null||e==="")return vB;let t=xB.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Bt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Bt).join(", ")} / bob, rootstock)`);return n}function Xd(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=fi(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Bt[n].url).replace(/\/$/,"")}function vS(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 Ps(e,t,n={}){return E(`${Xd(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function SS(e={},t={}){let n;try{n=fi(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Bt[n];try{let o=await Ps(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Xd(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:Xd(n,e),error:String(o?.message||o),exec:!1}}}async function Qd(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Bt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await Qd({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Bt[c].name,error:String(l?.message||l)}}}))}}let r=fi(n),o=Bt[r],i=await Ps(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 kS(e={},t={}){let n=fi(e.chainId??e.chain),r=vS(e.address||e.addr,"address"),o=Bt[n],i=await Ps(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 ES(e={},t={}){let n=fi(e.chainId??e.chain),r=vS(e.address||e.addr,"address"),o=await Ps(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:Bt[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var kB="https://insights.braiins.com/api/v1.0";function Zd(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||kB).replace(/\/$/,"")}function ep(e,t={}){return E(`${Zd(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function IS(e={}){try{let t=await ep("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:Zd(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:Zd(e),error:String(t?.message||t),exec:!1}}}async function AS(e={},t={}){let n=await ep("/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 _S(e={},t={}){let n=await ep("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}L();var IB="https://api.cow.fi",PS=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function CS(e={}){return(e.baseUrl||process.env.COW_API_URL||IB).replace(/\/$/,"")}function AB(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=PS[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(PS).join(", ")})`);return n}function tp(e,t,n){return`${CS(n)}/${AB(e)}/api/v1${t}`}function TS(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 NS(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function OS(e={},t={}){return E(tp(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function RS(e={},t={}){let n=TS(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(NS(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await E(`${tp(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 LS(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",TS(e.owner||e.address||e.user,"owner"));let r=await E(`${tp(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,NS(e))}}async function $S(e={}){let t=await E(`${CS(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}L();var PB="https://api.hiro.so",CB=20;function np(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||PB).replace(/\/$/,"")}function TB(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function hi(e,t={}){return E(`${np(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:TB(t)})}async function BS(e={}){try{let t=await hi("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:np(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:CB,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:np(e),error:String(t?.message||t),exec:!1}}}async function MS(e={},t={}){let n=await hi("/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 FS(e={},t={}){let n=await hi("/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 DS(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await hi(`/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 US(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await hi(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}L();var OB="https://bundles.jito.wtf",HS=1e9;function rp(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||OB).replace(/\/$/,"")}function RB(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function qS(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*HS):null}function LB(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/HS:null,raw:e}}async function jS(e={}){try{let t=await E(`${rp(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 zS(e={},t={}){let n=RB(e.limit,5,100),r=new URL(`${rp(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 E(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(LB),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 VS(e={}){let t=await E(`${rp(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,qS(i)])),suggestedTipLamports:qS(r.p75||r.p50),raw:n}}L();var BB="https://api.kamino.finance";function MB(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||BB).replace(/\/$/,"")}function Je(e){let t=Number(e);return Number.isFinite(t)?t:null}function WS(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 op(e={},t={}){let n=new URL(`${MB(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function GS(e={}){try{let t=await op({},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 KS(e={},t={}){let r=(await op(e,t)).map(WS),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 YS(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await op({...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",...WS(o),raw:o}}L();var DB="https://blockstream.info/liquid/api",JS="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Cs(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||DB).replace(/\/$/,"")}function UB(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 qB(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 XS(e,t={}){let n=`${Cs(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 QS(e,t={}){return E(`${Cs(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function ZS(e={}){try{let t=await XS("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Cs(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Cs(e),error:String(t?.message||t),exec:!1}}}async function ek(e={},t={}){let n=await XS("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function tk(e={},t={}){let n=UB(e.address||e.addr,"address"),r=await QS(`/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 nk(e={},t={}){let n=qB(e.assetId||e.asset||JS,"assetId"),r=await QS(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===JS,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}L();var jB="https://api-mainnet.magiceden.dev/v2/ord/btc",zB=600;function ip(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||jB).replace(/\/$/,"")}function VB(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function rk(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 ok(e,t={}){return E(`${ip(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:VB(t),retries:t.retries??1})}async function ik(e={}){let t=rk(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await ok(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:ip(e),probeCollection:t,rateLimitRpm:zB,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 ak(e={},t={}){let n=rk(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await ok(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}L();var GB="https://mempool.space/api",KB=7;function ap(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||GB).replace(/\/$/,"")}function Ts(e,t={}){return E(`${ap(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function sk(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>KB}}async function ck(e={}){try{let n=(await Ts("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=sk(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 lk(e={},t={}){let r=(await Ts("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=sk(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 uk(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 Ts(`/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 dk(e={},t={}){let n=await Ts("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var JB="https://mempool.space/api",pk=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function sp(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||JB).replace(/\/$/,"")}function mk(e,t){let n=String(e||t).trim().toLowerCase();if(!pk.has(n))throw new Error(`mempool-mining: window must be one of ${[...pk].join(", ")}`);return n}function gi(e,t={}){return E(`${sp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function fk(e={}){try{let t=await gi("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:sp(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:sp(e),error:String(t?.message||t),exec:!1}}}async function hk(e={},t={}){let n=await gi("/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 gk(e={},t={}){let n=mk(e.window||e.timeframe,"1w"),r=await gi(`/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 yk(e={},t={}){let n=mk(e.window||e.timeframe,"3d"),r=await gi(`/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 bk(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await gi(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}L();var QB="https://amm-v2.meteora.ag",wk=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),xk=new Set(["dynamic","multitoken","lst","farms"]),ZB=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function eM(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||QB).replace(/\/$/,"")}function Be(e){let t=Number(e);return Number.isFinite(t)?t:null}function tM(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:Be(e.pool_lp_price_in_usd),tvlUsd:Be(e.pool_tvl),farmTvlUsd:Be(e.farm_tvl),volume24hUsd:Be(e.trading_volume),volume7dUsd:Be(e.weekly_trading_volume),fee24hUsd:Be(e.fee_volume),fee7dUsd:Be(e.weekly_fee_volume),tradeApyPct:Be(e.trade_apy),weeklyTradeApyPct:Be(e.weekly_trade_apy),baseApyPct:Be(e.daily_base_apy),farmingApyPct:Be(e.farming_apy),totalApyPct:(Be(e.trade_apy)??0)+(Be(e.farming_apy)??0),aprPct:Be(e.apr),feePct:Be(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 nM(e={},t={}){let n=new URL(`${eM(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(!wk.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...wk].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(!xk.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...xk].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(!ZB.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 cp(e={},t={}){let{url:n,page:r,size:o}=nM(e,t),i=await E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(tM),totalCount:i?.total_count??null,page:r,size:o}}async function vk(e={}){try{let{pools:t,totalCount:n}=await cp({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 Sk(e={},t={}){let n=await cp({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 kk(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 cp({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}L();var oM="https://ordinals.com";function Ns(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||oM).replace(/\/$/,"")}function iM(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 Ek(e,t={}){let n=`${Ns(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 lp(e,t={}){return E(`${Ns(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Ik(e={}){try{let t=await Ek("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Ns(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Ns(e),error:String(t?.message||t),exec:!1}}}async function Ak(e={},t={}){let n=await Ek("/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 _k(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 lp(`/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 Pk(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 lp(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 Ck(e={},t={}){let n=iM(e.name||e.rune||e.runeName,"name"),r=await lp(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var sM="https://hermes.pyth.network",dp={"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"},cM=/^[0-9a-fA-F]{64}$/;function Tk(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||sM).replace(/\/$/,"")}function Nk(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=dp[n.toUpperCase()]||dp[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!cM.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 up(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function pp(e={}){let t=up({price:Number(e.price?.conf),expo:e.price?.expo}),n=up(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:up(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 mp(e,t={}){let n=new URL(`${Tk(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"),E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Ok(e={}){try{let t=await mp([dp["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(pp):[])[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 Rk(e={},t={}){let n=Nk(e.feedId||e.id||e.symbol,"feedId"),r=await mp([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(pp):[],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 Lk(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>Nk(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let a=[];for(let l of i)a.push(await mp(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(pp):[]),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 $k(e={},t={}){let n=new URL(`${Tk(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 E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}L();var uM="https://relayscan.io",Bk=new Set(["1h","12h","24h","7d"]);function fp(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||uM).replace(/\/$/,"")}function Mk(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!Bk.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...Bk].join(", ")}`);return t}function dM(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 hp(e={},t={}){return E(`${fp(t)}/overview/json?t=${Mk(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Fk(e={},t={}){return E(`${fp(t)}/builder-profit/json?t=${Mk(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Dk(e={},t={}){let n=dM(e);return E(`${fp(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function Uk(e={}){let t=await hp({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}L();var mM="https://extra-api.sanctum.so",fM=30,hM=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function gp(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||mM).replace(/\/$/,"")}function qk(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 gM(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Dn(e,t,n={}){let r={},o={};for(let i of gM(t,fM)){let a=new URL(`${gp(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await E(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function Hk(e={}){try{let[t,n]=await Promise.all([E(`${gp(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Dn("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 yp(e={},t={}){let n=await E(`${gp(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 jk(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await yp({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=hM);let r=[...new Set(n.map(s=>qk(s,"lsts[]")))],[o,i]=await Promise.all([Dn("apy/latest",r,t),Dn("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 zk(e={},t={}){let n=qk(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Dn("apy/latest",[n],t),Dn("apy/inception",[n],t),Dn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Dn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}L();var bM="https://api.save.finance",wM="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",Vk="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",xM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function bp(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||bM).replace(/\/$/,"")}function Wk(e,t="address"){let n=String(e??"").trim();if(!xM.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function Gk(e){let t=Number(e);return Number.isFinite(t)?t:null}function vM(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 SM(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:Gk(e.rates?.supplyInterest),borrowApyPct:Gk(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 Kk(e={}){try{let t=await E(`${bp(e)}/v1/reserves?ids=${Vk}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:Vk,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function wp(e={},t={}){let n=new URL(`${bp(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 E(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(vM);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 Yk(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=>Wk(String(s).trim(),"reserve"));else{let a=Wk(e.market||e.marketAddress||wM,"market"),c=(await wp({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 E(`${bp(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...SM(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 xp(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 Un(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 yi(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:xp(e.amount,"amount")}}function vp(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 bi(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 Sp(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 EM(e={},t={}){let n=yi(e),r=Un(e.slices??10,"slices",2,100),o=Un(e.durationSec??3600,"durationSec",r,604800),i=vp(n.total,Array(r).fill(1));return bi(n,"TWAP",Sp(i,o,t.nowMs),{durationSec:o})}function IM(e={},t={}){let n=yi(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=Un(e.durationSec??3600,"durationSec",r.length,604800),i=vp(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Sp(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return bi(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function AM(e={}){let t=yi(e),n=Un(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=xp(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 bi(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function _M(e={}){let t=yi(e),n=xp(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 bi(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function PM(e={},t={}){let n=yi(e),r=Un(e.slices??10,"slices",2,100),o=Un(e.durationSec??3600,"durationSec",r,604800),i=Un(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=vp(n.total,a);return bi(n,"IS",Sp(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function Jk(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return EM(e,t);if(n==="VWAP")return IM(e,t);if(n==="POV")return AM(e,t);if(n==="ICEBERG")return _M(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return PM(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function Xk(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}Q();import{TypedDataEncoder as zM,getAddress as VM,isAddress as WM}from"ethers";var nE=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Ip=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"}]}),rE=/^(?:0|[1-9][0-9]*)$/;function Ls(e,t){let n=String(e||"").trim();if(!WM(n))throw new Error(`limit-order: ${t} must be an address`);return VM(n)}function Ap(e,t){let n=String(e??"").trim();if(!rE.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 oE(){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 GM(e){let t=Number(e),n=nE[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function KM(e){let t=Number(e);if(!nE[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function YM(e={}){let t=Ls(e.maker,"maker"),n=e.receiver?Ls(e.receiver,"receiver"):t,r=Ls(e.makerAsset,"makerAsset"),o=Ls(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=Ap(e.makingAmount,"makingAmount"),a=Ap(e.takingAmount,"takingAmount"),s=Ap(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!rE.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 iE(e={},t={}){let n=Number(e.chainId),r=GM(n),o=YM(e),i={types:Ip,domain:r,primaryType:"Order",message:o},a=zM.hash(r,Ip,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:KM(n),domain:r,types:Ip,message:o,typedData:i,digest:a})})}function aE(e={},t={}){let n=iE(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 sE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Ep(),kp)),r=iE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}Q();var XM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,QM=/^(?:0|[1-9][0-9]*)$/;function _p(e,t){let n=String(e||"").trim();if(!XM.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function ZM(e,t){let n=String(e??"").trim();if(!QM.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function cE(){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 lE(e={}){let t=_p(e.owner,"owner"),n=_p(e.inputMint,"inputMint"),r=_p(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=ZM(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 uE(e={},t={}){let n=lE(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=So({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 Rl({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 dE(e={},t={}){let n=lE(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=uE(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 pE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Ep(),kp)),r=uE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}L();var tF="protective-monitors",nF="read-only",rF=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),oF="https://hermes.pyth.network",iF="https://coins.llama.fi",aF="https://api.llama.fi/hacks",sF="https://api.gopluslabs.io/api/v1/token_security",cF="https://api.v3.aave.com/user",lF=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),uF=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),dF=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),mE=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),pF=/^0x[0-9a-fA-F]{40}$/,mF=/^[0-9a-fA-F]{64}$/;function Br(e,t={}){return{ok:!0,provider:tF,op:e,alertOnly:!0,execution:nF,exec:!1,...t}}function Me(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function wi(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):E(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function $s(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function fF(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return mF.test(r)||Me("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=$s(e.symbol),n=lF[t];return n||Me("unknown symbol",t),n}function hF(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=$s(e.symbol);return uF[t]||`coingecko:${t.toLowerCase()}`}function fE(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&Me("thresholdBps must be a non-negative number"),n}function gF(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))&&Me("no pyth price returned"),r<0?n/10**-r:n*10**r}function yF(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function bF(e,t={}){let n=String(t.pythBaseUrl||oF).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function wF(e,t={}){return`${String(t.llamaCoinsBaseUrl||iF).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function hE(e,t){let n=fF(e),r=await wi(bF(n,t),t),o=gF(r);return o>0||Me("pyth price must be positive"),{id:n,price:o}}async function gE(e,t){let n=hF(e),r=await wi(wF(n,t),t);return{coin:n,price:yF(r,n)}}function yE(){return Br("health",{ok:!0,ops:[...rF],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function Pp(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&Me("peg must be a positive number");let r=fE(e,50),o=await hE(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await gE(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return Br("depeg",{symbol:$s(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function Cp(e={},t={}){let n=fE(e,100),r=await hE(e,t),o=await gE(e,t);o.price>0||Me("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return Br("oracleDeviation",{symbol:$s(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function xF(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function vF(e,t){return{id:xF(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 SF(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 bE(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return SF(t);try{return bE(JSON.parse(t))}catch{Me("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 kF(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 Tp(e={},t={}){let n=String(e.url||t.hacksUrl||aF),r=e.payload??await wi(n,t),o=kF(bE(r).map(vF));return Br("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function EF(e){return e===!0||e===1||e==="1"}function IF(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 Np(e={},t={}){e.asSoleGate===!0&&Me("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();pF.test(n)||Me("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&Me("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||sF).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await wi(i,t),s=IF(a,n);s||Me("goplus returned no result for",n);let c=dF.filter(l=>EF(s.token[l]));return Br("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 AF(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&Me("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function _F(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||Me("position healthFactor required");let r=AF(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 Op(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||Me("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${cF}/${a}`);n=await wi(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(_F),i=o.reduce((a,s)=>a?mE[s.rung]<mE[a]?s.rung:a:s.rung,null);return Br("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 P9=Object.freeze({depeg:Pp,oracleDeviation:Cp,exploitFeed:Tp,goplus:Np,liquidationLadder:Op});import{existsSync as CF,readFileSync as TF}from"node:fs";import{dirname as NF,join as wE}from"node:path";import{fileURLToPath as OF}from"node:url";var Bs=Object.freeze({OK:"OK",FAILED:"FAILED"}),RF=Object.freeze({hl:9,dydx:10,binance:8}),xE=Object.freeze(["hl","dydx","binance"]),LF=wE(NF(OF(import.meta.url)),"../../../fixtures/funding-scanner");function vE(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...xE],note:"Public payload/fixture scan. CEX legs never live-call. Missing venue is FAILED, never 0-funding."}}function ft(e){if(e==null||e==="")return null;let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function $F(e){let t=ft(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function BF(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=ft(t[e]);if(n!=null&&n>=0)return n}return ft(RF[e])}function Lp(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 MF({venue:e,coin:t,hourly:n,feeDragBps:r}){let o=ft(n),i=ft(r);if(!e||!t||o==null||i==null||i<0)throw new Error("funding-scanner: unified row requires venue, coin, hourly, feeDragBps");let a=$F(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:Bs.OK})}function Rp(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:ft(n),netAnnualizedPct:null,quality:Bs.FAILED,error:String(t||"missing venue")})}function FF(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=Lp(t[o]?.name),a=ft(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function DF(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=Lp(o?.ticker||o?.market||o?.symbol),a=ft(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 UF(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:ft(e.fundingIntervalHours),entries:t}}return{intervalHours:null,entries:[]}}function qF(e){let{intervalHours:t,entries:n}=UF(e),r=[];for(let o of n){let i=Lp(o?.symbol||o?.pair),a=ft(o?.fundingIntervalHours)??t,s=ft(o?.lastFundingRate??o?.lastFundingRatePeriod??o?.fundingRate);!i||s==null||!(a>0)||r.push({venue:"binance",coin:i,hourly:s/a})}return r}var HF=Object.freeze({hl:FF,dydx:DF,binance:qF});function jF(e,t){let n=wE(e,`${t}.json`);if(!CF(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(TF(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function zF(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 jF(n,e)}function VF(e,t){let n=HF[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 WF(e,t){let n=e.quality===Bs.FAILED||e.netAnnualizedPct==null,r=t.quality===Bs.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 SE(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:xE).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||LF,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=BF(s,i),l=zF(s,r,o);if(l.missing){a.push(Rp(s,l.error,c));continue}let u=VF(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(Rp(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(MF({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(Rp(s,p.message,c))}}return a.sort(WF),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)})}var KF=Math.sqrt(2*Math.PI);function Ms(e){return Math.exp(-.5*e*e)/KF}function YF(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 cn(e){return .5*(1+YF(e/Math.SQRT2))}function kE({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*cn(p)-s*f*cn(m),g=s*f*cn(-m)-a*cn(-p),w=i==="put"?g:h,x=i==="put"?cn(p)-1:cn(p),b=Ms(p)/(a*l*d),y=a*Ms(p)*d/100,v=i==="put"?(-(a*Ms(p)*l)/(2*d)+c*s*f*cn(-m))/365:(-(a*Ms(p)*l)/(2*d)-c*s*f*cn(m))/365;return Object.freeze({kind:i,price:w,delta:x,gamma:b,vega:y,theta:v,d1:p,d2:m})}var L9=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function Fs(){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 Ds(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=kE({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 EE(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function xi(e){return String(e||"").trim().toLowerCase()}function XF(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function IE({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=xi(d.from),m=xi(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=XF(a),c=new Map;for(let d of t){let p=xi(d.funder),m=xi(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]?xi(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 AE(){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 _E(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 PE(){return{...Fs(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function CE(e,t){return Ds(e,t)}function TE(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function NE(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 n4=Object.freeze([]);function OE(){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 RE(e={}){let t=String(e.address||"").toLowerCase(),n=n4.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 LE(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 $E(){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 BE(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 o4(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function ME(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:o4(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var i4=/^0x[0-9a-fA-F]{8}$/,FE=/^0x[0-9a-fA-F]{40}$/;function DE(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!FE.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(!FE.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!i4.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 $p=/^0x[0-9a-fA-F]{40}$/;function UE(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(!$p.test(n)||!$p.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||!$p.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 WE=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 zE(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Od,adapters:Object.freeze(Rd.adapters.map(e=>{let t=WE[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function v4(e,t={}){let n=Wx(e,t),r=WE[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 Bp=new Map;function qs(e={}){let t=e.filePath||void 0,n=t||"__default__";return Bp.has(n)||Bp.set(n,gg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Bp.get(n)}var Mp=new Map;function Fp(e={}){let t=e.filePath||void 0,n=t||"__default__";return Mp.has(n)||Mp.set(n,vg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Mp.get(n)}var Dp=new Map;function vi(e={}){let t=e.filePath||void 0,n=t||"__default__";return Dp.has(n)||Dp.set(n,pg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Dp.get(n)}var S4={"hl-info":{health:e=>hf(e),allMids:e=>Et(e),l2Book:(e,t={})=>Wn(t.coin,e),outcomeMeta:e=>ao(e),clearinghouse:(e,t={})=>Vi(t.user,e),userFills:(e,t={})=>gf(t.user,e),meta:e=>yf(e),metaAndAssetCtxs:e=>Qe(e),candleSnapshot:(e,t={})=>Wi(t,e),openOrders:(e,t={})=>wf(t.user,e),frontendOpenOrders:(e,t={})=>xf(t.user,e),userState:(e,t={})=>Gn(t.user,e),spotMeta:e=>Gi(e)},"hl-vaults":{health:e=>kf(e),summaries:(e,t={})=>Mc(t,e),details:(e,t={})=>Ki(t,e),userEquities:(e,t={})=>Fc(t,e),tracker:(e,t={})=>Dc(t,e)},"hl-precompiles":{health:e=>If(e),read:(e,t={})=>Ef(t,e),l1BlockNumber:e=>Yi(e),markPx:(e,t={})=>Hc(t,e),oraclePx:(e,t={})=>jc(t,e),spotPx:(e,t={})=>zc(t,e),position:(e,t={})=>Vc(t,e),spotBalance:(e,t={})=>Wc(t,e),vaultEquity:(e,t={})=>Gc(t,e),withdrawable:(e,t={})=>Kc(t,e)},"hl-delta-neutral":{health:()=>Gf(),scan:(e,t={})=>fl(t,e),quote:(e,t={})=>hl(t,e),prepare:(e,t={})=>gl(t,e),loop:(e,t={})=>eh(t,e)},"lighter-delta-neutral":{health:()=>sh(),scan:(e,t={})=>bl(t,e),quote:(e,t={})=>wl(t,e),prepare:(e,t={})=>xl(t,e),loop:(e,t={})=>hh(t,e)},"poly-public":{health:e=>yh(e),time:e=>vl(e),markets:(e,t={})=>bh(t,e),book:(e,t={})=>wh(t.tokenId,e),midpoint:(e,t={})=>xh(t.tokenId,e),spread:(e,t={})=>vh(t.tokenId,e),price:(e,t={})=>Sh(t.tokenId,{side:t.side},e),events:(e,t={})=>kh(t,e)},"evm-rpc":{health:(e,t={})=>qn(t.chainId??1,e),healthAll:(e,t={})=>rc({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>qr(t.chainId??1,e),chainId:(e,t={})=>tc(t.chainId??1,e),getBalance:(e,t={})=>pn(t.chainId??1,t.address,e),call:(e,t={})=>D(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>nc(t,e),erc20Balance:(e,t={})=>Hr(t,e),transactionReceipt:(e,t={})=>jr(t,e)},portfolio:{health:e=>Uw(e),balances:(e,t={})=>cs(t,e),snapshot:(e,t={})=>ix(t,e),history:(e,t={})=>gd(t,e),valueGraph:(e,t={})=>ax(t,e)},"nft-portfolio":{health:e=>Gw(e),inventory:(e,t={})=>Sr(t,e),gallery:(e,t={})=>Xw(t,e),pnl:(e,t={})=>Jw(t,e),prepareList:(e,t={})=>Kw(t,e),traitSnipe:(e,t={})=>Yw(t,e)},"contract-risk":{health:e=>sx(e),scan:(e,t={})=>Ln(t,e)},"evm-token-sniper":{health:e=>ux(e),scan:(e,t={})=>lx(t,e)},"evm-simulate":{health:e=>px(e),simulate:(e,t={})=>ci(t,e)},"nft-mint":{health:e=>fx(e),discover:(e,t={})=>fs(t,e),prepare:(e,t={})=>wd(t,e),priceGas:(e,t={})=>ms(t,e),createTrigger:(e,t={})=>pv(t,e),checkOpen:(e,t={})=>mv(t,e),evaluateMancerOs:(e,t={})=>gv(t,e)},"universal-mint-router":{health:()=>Dx(),capabilities:()=>Td(),prepare:(e,t={})=>Ux(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:zE()}),capabilities:()=>zE(),route:(e,t={})=>v4(t,e)},"erc8004-identity":{health:()=>uy(),prepareIdentityRegistration:(e,t={})=>my(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>fy(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>gy(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:ws,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>Yx(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:xs,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>ev(t,e)},"universal-ordinals-transfer":{health:()=>({provider:vs,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>dv(t,e)},"solana-rpc":{health:e=>Ih(e),latestBlockhash:(e,t={})=>kl(t,e),getBalance:(e,t={})=>aa(t,e),tokenAccounts:(e,t={})=>xo(t,e),simulate:(e,t={})=>Ah(t,e)},"bitcoin-esplora":{health:e=>_h(e),tipHeight:e=>Ph(e),fees:e=>Ch(e),address:(e,t={})=>ca(t,e),utxos:(e,t={})=>Th(t,e),tx:(e,t={})=>Nh(t,e),decode:(e,t={})=>Oh(t,e)},"bitcoin-meta":{health:e=>Lh(e),runeBalances:(e,t={})=>ua(t,e),inscriptions:(e,t={})=>tr(t,e),inscriptionInfo:(e,t={})=>$h(t,e),inscriptionChildren:(e,t={})=>Bh(t,e),ordBlockInfo:(e,t={})=>Mh(t,e)},satflow:{health:e=>Dh(e),collectionFloors:(e,t={})=>Uh(t,e),collectionStats:(e,t={})=>qh(t,e),item:(e,t={})=>Hh(t,e),walletContents:(e,t={})=>pa(t,e),floorListings:(e,t={})=>jh(t,e),preparePurchase:(e,t={})=>Vh(t,e),prepareList:(e,t={})=>ma(t,e)},jupiter:{health:e=>Zh(e),venues:(e,t={})=>Qh(t,e),quote:(e,t={})=>ga(t,e),prepare:(e,t={})=>e0(t,e)},defillama:{health:e=>n0(e),prices:(e,t={})=>vn(t.coins||[],e),pricesBySymbol:(e,t={})=>a0(t.symbols,e),protocols:e=>r0(e),yields:(e,t={})=>o0(t,e),stablecoins:(e,t={})=>ya(t,e),dexVolumes:(e,t={})=>i0(t,e)},lifi:{health:e=>c0(e),quote:(e,t={})=>ko(t,e),prepare:(e,t={})=>l0(t,e),chains:e=>u0(e)},dexscreener:{health:e=>tm(e),token:(e,t={})=>mn(t.address||t.tokenAddress,e),search:(e,t={})=>zr(t.q||t.query,e),pair:(e,t={})=>nm(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>bm({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Hn(t,e),prepare:(e,t={})=>ym(t,e),quotePath:(e,t={})=>gm(t,e),ethUsdc:(e,t={})=>mc(t,e),chains:()=>wm()},"uniswap-v4":{health:(e,t={})=>Pm({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Xr(t,e),inspectHook:(e,t={})=>km(t,e),prepare:(e,t={})=>Am(t,e),chains:()=>_m()},x402:{health:()=>G0(),inspect:(e,t={})=>V0(t),prepare:(e,t={})=>W0(t,e)},bankr:{health:e=>Z0(e),wallet:e=>Xl(e),portfolio:e=>X0(e),swapQuote:(e,t={})=>Q0(t,e)},aerodrome:{health:(e,t={})=>b0({...e,chainId:t.chainId??8453}),quote:(e,t={})=>ba(t,e),prepare:(e,t={})=>y0(t,e),chains:()=>w0()},zerox:{health:e=>k0(e),price:(e,t={})=>Ml(t,e),quote:(e,t={})=>Io(t,e),prepare:(e,t={})=>E0(t,e)},across:{health:e=>I0(e),suggestedFees:(e,t={})=>Fl(t,e)},hop:{health:e=>A0(e),quote:(e,t={})=>Dl(t,e)},relay:{health:e=>_0(e),quote:(e,t={})=>xa(t,e),prepare:(e,t={})=>P0(t,e)},cowswap:{health:e=>R0(e),quote:(e,t={})=>nr(t,e),prepareOrder:(e,t={})=>L0(t,e),order:(e,t={})=>B0(t,e),status:(e,t={})=>$0(t,e),chains:()=>M0()},oneinch:{health:e=>D0(e),quote:(e,t={})=>Gl(t,e),prepare:(e,t={})=>U0(t,e),approveSpender:(e,t={})=>Kl(t,e)},"hl-ws":{health:e=>eg(e),allMids:e=>tg(e),l2Book:(e,t={})=>ng(t.coin,e),snapshot:(e,t={})=>To(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>rg({...e,assetId:t.assetId}),book:(e,t={})=>og(t.assetId||t.tokenId,e),snapshot:(e,t={})=>va(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>qm(e),collection:(e,t={})=>eo(t.slug,e),floor:(e,t={})=>Hm(t.slug,e),bestListings:(e,t={})=>kc(t,e),bestListing:(e,t={})=>Mi(t,e),bestOffer:(e,t={})=>Fi(t,e),accountNfts:(e,t={})=>to(t,e),accountPnl:(e,t={})=>$i(t,e),prepareBuy:(e,t={})=>ef(t,e),prepareSweep:(e,t={})=>tf(t,e),prepareMint:(e,t={})=>Ui(t,e),prepareList:(e,t={})=>qi(t,e),prepareCancel:(e,t={})=>nf(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={})=>vi(e).createListing(t),listListings:(e,t={})=>vi(e).listListings(t),cancelListing:(e,t={})=>vi(e).cancelListing(t),createOffer:(e,t={})=>vi(e).createOffer(t),armFill:(e,t={})=>vi(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={})=>qs(e).createIntent(t),listIntents:(e,t={})=>qs(e).listIntents(t),cancelIntent:(e,t={})=>qs(e).cancelIntent(t),armPayment:(e,t={})=>qs(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={})=>Fp(e).registerPack(t),listPacks:(e,t={})=>Fp(e).listPacks(t),revokePack:(e,t={})=>Fp(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>iy(t,e),markets:(e,t={})=>ar(t,e),quoteSpecificBuy:(e,t={})=>Fo(t,e),quoteSell:(e,t={})=>Na(t,e),scanCollection:(e,t={})=>Oa(t,e),scanAllMarkets:(e,t={})=>Xg(t,e),scanCrossVenueArb:(e,t={})=>yu(t,e),scanAllMarketsArb:(e,t={})=>Qg(t,e),prepareSpecificBuy:(e,t={})=>zg(t,e),prepareSell:(e,t={})=>Vg(t,e)},stonkbrokers:{health:(e,t={})=>ay(t,e),quoteBrokerBuy:(e,t={})=>Ra(t,e),scanBrokerLoot:(e,t={})=>ty(t,e),prepareBrokerBuy:(e,t={})=>ny(t,e),brokerDesk:(e,t={})=>oy(t,e),clockInStatus:(e,t={})=>Do(t,e),prepareClockIn:(e,t={})=>ry(t,e)},"hl-outcome":{list:e=>cb(e),prepareOrder:(e,t={})=>lb(t,e),prepareCancel:(e,t={})=>ub(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Xa().map(e=>e.id),nativeTemplates:ei().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Xa(),listNative:()=>ei(),gate:(e,t={})=>Qo(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Bb(t,e),buildNative:(e,t={})=>ti(t),eval:async()=>(await Promise.resolve().then(()=>(jE(),HE))).runContractsEval()},"poly-clob":{health:()=>Eb(),prepareOrder:(e,t={})=>Ib(t||{},e)},"hl-perps":{health:e=>Ou(e),assetInfo:(e,t={})=>zt(t,e),prepareOrder:(e,t={})=>Xn(t,e),prepareCancel:(e,t={})=>go(t,e),prepareLeverage:(e,t={})=>ul(t,e),prepareIsolatedMargin:(e,t={})=>dl(t,e),prepareBracket:(e,t={})=>pl(t,e),prepareBuilderApproval:(e,t={})=>ll(t,e)},"hl-markets":{health:e=>Ou(e),markets:(e,t={})=>Da(t,e),leaderboards:(e,t={})=>By(t,e),coin:(e,t={})=>My(t,e),spot:(e,t={})=>Fy(t,e)},"hl-entry-state":{health:e=>ob(e),see:(e,t={})=>Go(t,e),qualify:(e,t={})=>ib(t,e),lock:(e,t={})=>ab(t,e),list:e=>$u(e),watch:(e,t={})=>sb(t,e)},"magiceden-sol":{health:e=>Sy(e),stats:(e,t={})=>Eu(t,e),listings:(e,t={})=>Ey(t,e),tokenListings:(e,t={})=>Iy(t,e),prepareBuy:(e,t={})=>Ay(t,e),prepareList:(e,t={})=>Ma(t,e),prepareMint:(e,t={})=>_y(t,e)},"hl-staking":{health:e=>Cy(e),validators:e=>_u(e),delegatorSummary:(e,t={})=>Pu(t,e),delegations:(e,t={})=>Cu(t,e),rewards:(e,t={})=>Ty(t,e),history:(e,t={})=>Ny(t,e),preflight:(e,t={})=>$y(t,e),prepareStakeDeposit:(e,t={})=>Oy(t,e),prepareStakeWithdraw:(e,t={})=>Ry(t,e),prepareDelegate:(e,t={})=>Ly(t,e)},"hyperevm-dex":{health:e=>by(e),search:(e,t={})=>wy(t.q||t.query||"HYPE",e),token:(e,t={})=>xy(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Gb(e),networks:(e,t={})=>Wu(t,e),pool:(e,t={})=>zb(t,e),token:(e,t={})=>Vb(t,e),ohlcv:(e,t={})=>Wb(t,e)},curve:{health:e=>aw(e),openapi:e=>iw(e),pools:(e,t={})=>Ku(t,e),quote:(e,t={})=>Yu(t,e),prepare:(e,t={})=>sw(t,e)},gmx:{health:e=>Yy(e),tickers:(e,t={})=>gr(t,e),markets:(e,t={})=>Gy(t,e),marketsInfo:(e,t={})=>Lu(t,e),tokens:(e,t={})=>Ky(t,e),prepareOrder:(e,t={})=>Zy(t,e),positions:(e,t={})=>Jy(t,e),orderStatus:(e,t={})=>Xy(t,e),verifyOrder:(e,t={})=>Qy(t,e)},morpho:{health:e=>dw(e),markets:(e,t={})=>uw(t,e),vaults:(e,t={})=>Qu(t,e),prepareVault:(e,t={})=>pw(t,e)},balancer:{health:e=>xw(e),pools:(e,t={})=>ww(t,e),quote:(e,t={})=>td(t,e),prepare:(e,t={})=>vw(t,e)},pendle:{health:e=>kw(e),markets:(e,t={})=>rd(t,e),quote:(e,t={})=>Ew(t,e),prepare:(e,t={})=>od(t,e)},odos:{health:e=>Pw(e),chains:e=>ad(e),quote:(e,t={})=>Aw(t,e),prepare:(e,t={})=>_w(t,e)},blockscout:{health:e=>Bw(e),stats:(e,t={})=>ld(t,e),address:(e,t={})=>Ow(t,e),token:(e,t={})=>Rw(t,e)},paraswap:{health:e=>bv(e),tokens:(e,t={})=>Md(t,e),price:(e,t={})=>Or(t,e),quote:(e,t={})=>Or(t,e),prepare:(e,t={})=>yv(t,e)},rfq:{health:e=>Ov(e),intent:(e,t={})=>Tv(t,e),quote:(e,t={})=>Nv(t,e)},"polygon-staking":{health:e=>aS(e),validators:(e,t={})=>oS(t,e),validatorDetail:(e,t={})=>iS(t,e)},"aave-v3":{health:e=>uS(e),markets:(e,t={})=>sS(t,e),marketReserves:(e,t={})=>cS(t,e),chains:e=>lS(e)},"babylon-staking":{health:e=>pS(e),stats:e=>mS(e),finalityProviders:e=>fS(e),delegations:(e,t={})=>hS(t,e)},"bisq-markets":{health:e=>yS(e),markets:e=>bS(e),ticker:(e,t={})=>wS(t,e),trades:(e,t={})=>xS(t,e)},"bob-rootstock":{health:(e,t={})=>SS(t.chainId,e),stats:(e,t={})=>Qd(t,e),addressInfo:(e,t={})=>kS(t,e),tokenBalances:(e,t={})=>ES(t,e)},"braiins-insights":{health:e=>IS(e),priceStats:e=>AS(e),poolStats:e=>_S(e)},"cow-protocol":{health:e=>$S(e),auction:e=>OS(e),openOrders:(e,t={})=>RS(t,e),recentTrades:(e,t={})=>LS(t,e)},"hiro-stacks":{health:e=>BS(e),networkInfo:e=>MS(e),stackingInfo:e=>FS(e),poxCycles:e=>DS(e),blocks:(e,t={})=>US(t,e)},"jito-mev":{health:e=>jS(e),recentBundles:(e,t={})=>zS(t,e),tipFloor:e=>VS(e)},"kamino-strategies":{health:e=>GS(e),strategies:(e,t={})=>KS(t,e),strategyMetrics:(e,t={})=>YS(t,e)},"liquid-esplora":{health:e=>ZS(e),tipHeight:e=>ek(e),addressInfo:(e,t={})=>tk(t,e),assetInfo:(e,t={})=>nk(t,e)},"magiceden-ordinals":{health:e=>ik(e),collectionStat:(e,t={})=>ak(t,e)},"mempool-lightning":{health:e=>ck(e),statistics:e=>lk(e),nodeRankings:(e,t={})=>uk(t,e),nodeCountries:e=>dk(e)},"mempool-mining":{health:e=>fk(e),difficulty:e=>hk(e),poolShare:(e,t={})=>gk(t,e),hashrate:(e,t={})=>yk(t,e),rewardStats:(e,t={})=>bk(t,e)},"meteora-dlmm":{health:e=>vk(e),pools:(e,t={})=>Sk(t,e),poolSearch:(e,t={})=>kk(t,e)},"ordinals-runes":{health:e=>Ik(e),blockHeight:e=>Ak(e),blockInfo:(e,t={})=>_k(t,e),satInfo:(e,t={})=>Pk(t,e),runeInfo:(e,t={})=>Ck(t,e)},"pyth-price-feeds":{health:e=>Ok(e),latestPrice:(e,t={})=>Rk(t,e),latestPrices:(e,t={})=>Lk(t,e),feedDirectory:e=>$k(e)},"relayscan-mev":{health:e=>Uk(e),overview:(e,t={})=>hp(t,e),builderProfit:(e,t={})=>Fk(t,e),dailyStats:(e,t={})=>Dk(t,e)},"sanctum-lst":{health:e=>Hk(e),lstList:e=>yp(e),apyAll:e=>jk(e),apyIndividual:(e,t={})=>zk(t,e)},"solend-lending":{health:e=>Kk(e),markets:e=>wp(e),reserves:(e,t={})=>Yk(t,e)},"execution-strategies":{health:()=>Xk(),plan:(e,t={})=>Jk(t)},"across-bridge":{health:e=>Rv(e),pools:(e,t={})=>Lv(t,e),suggestedFees:(e,t={})=>$v(t,e)},"beefy-yields":{health:e=>Bv(e),apy:(e,t={})=>Mv(t,e),apyBreakdown:e=>Fv(e)},"birdeye-tokens":{health:e=>Uv(e),tokenList:(e,t={})=>qv(t,e)},"celestia-da":{health:e=>Hv(e),stats:e=>jv(e),blockStats:(e,t={})=>zv(t,e)},"das-assets":{health:e=>Vv(e),assetsByOwner:(e,t={})=>Wv(t,e),searchAssets:(e,t={})=>Gv(t,e),assetProof:(e,t={})=>Kv(t,e)},"l2beat-tvl":{health:e=>Yv(e),tvl:(e,t={})=>Jv(t,e),activity:(e,t={})=>Xv(t,e)},"spark-lend":{health:e=>Qv(e),markets:(e,t={})=>Zv(t,e)},"symbiotic-restaking":{health:e=>eS(e),vaults:(e,t={})=>tS(t,e),vaultDetail:(e,t={})=>nS(t,e)},"limit-order":{health:()=>oE(),prepare:(e,t={})=>aE(t,e),arm:(e,t={})=>sE(t,e)},"jupiter-dca":{health:()=>cE(),prepare:(e,t={})=>dE(t,e),arm:(e,t={})=>pE(t,e)},"protective-monitors":{health:()=>yE(),depeg:(e,t={})=>Pp(t,e),oracleDeviation:(e,t={})=>Cp(t,e),exploitFeed:(e,t={})=>Tp(t,e),goplus:(e,t={})=>Np(t,e),liquidationLadder:(e,t={})=>Op(t,e)},"funding-scanner":{health:()=>vE(),scan:(e,t={})=>SE(t,e)},"onchain-options":{health:()=>Fs(),rank:(e,t={})=>Ds(t.listings||t,t)},"holder-clusters":{health:()=>EE(),score:(e,t={})=>IE(t)},kalshi:{health:()=>AE(),markets:(e,t={})=>_E(t)},"derive-options":{health:()=>PE(),rank:(e,t={})=>CE(t.listings||t,t)},limitless:{health:()=>TE(),markets:(e,t={})=>NE(t)},"dov-vaults":{health:()=>OE(),read:(e,t={})=>RE(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>LE(t.left||{},t.right||{})},"tee-attestation":{health:()=>$E(),verify:(e,t={})=>BE(t)},"keeper-mirror":{health:e=>ME(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>DE(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>UE(t)}},VE=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),GE=new Set(["hl-exec"]);function k4(e){return GE.has(String(e||""))}function E4(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(GE.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=zi().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!VE.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(VE.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(k4(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.`);E4(e,t,n);let o=Rc(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=S4[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function I4({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||zi().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 Fe(s,i??8,async d=>{if(!Rc(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await ve(()=>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 KE(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function A4(e){return e.execution==="prepare"&&KE(e).length?"armed-local":e.execution||"read-only"}function _4(){return zi().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:A4(e),localSignerSurfaces:KE(e),description:e.description}))}var cH={catalog:_4,health:I4,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{GE as EXECUTION_PROVIDERS,E4 as assertDataOpAllowed,cH as data,A as dataCall,_4 as dataCatalog,I4 as dataHealth,k4 as isExecutionProvider,v4 as routeUniversalNftLifecycle,zE as universalNftLifecycleCapabilities};
191
+ }`;function NB(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 mk(e={},t={}){let n={chainIds:NB(e)};return e.user&&(n.user=String(e.user)),{markets:(await Ts(PB,{request:n},t))?.data?.markets??[]}}async function fk(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 Ts(CB,{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 hk(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 Ts(TB,{filter:r},t))?.data?.chains??[]}}async function gk(e={}){return{ok:(await Ts("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}L();var RB="https://staking-api.babylonlabs.io";function np(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||RB).replace(/\/$/,"")}function Ns(e,t={}){return S(`${np(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function yk(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 bk(e={}){try{let n=(await Ns("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:np(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:np(e),error:String(t?.message||t),exec:!1}}}async function wk(e={},t={}){let r=(await Ns("/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 xk(e={},t={}){let n=await Ns("/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=yk(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 vk(e={},t={}){let n=yk(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 Ns(`/v2/delegations?${r}`,t),i=Array.isArray(o?.data)?o.data:[],a=i.reduce((s,c)=>s+Number(c.delegation_staking?.staking_amount??c.staking_amount??0),0);return{provider:"babylon-staking",stakerPkHex:n,count:i.length,totalStakedSats:String(a),nextKey:o?.pagination?.next_key||null,delegations:i.map(s=>({stakingTxHashHex:s.delegation_staking?.staking_tx_hash_hex??s.staking_tx_hash_hex??null,state:s.state??null,stakingAmountSats:s.delegation_staking?.staking_amount==null&&s.staking_amount==null?null:String(s.delegation_staking?.staking_amount??s.staking_amount),stakingTimelock:s.delegation_staking?.staking_timelock??null,startHeight:s.delegation_staking?.start_height??null,finalityProviderBtcPks:s.finality_provider_btc_pks_hex??null})),raw:i}}L();var $B="https://markets.bisq.network";function rp(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||$B).replace(/\/$/,"")}function kk(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 Os(e,t={}){return S(`${rp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Sk(e={}){try{let t=await Os("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:rp(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:rp(e),error:String(t?.message||t),exec:!1}}}async function Ek(e={},t={}){let n=await Os("/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 Ik(e={},t={}){let n=kk(e.market||e.pair||"btc_usd","market"),r=await Os(`/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 Ak(e={},t={}){let n=kk(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 Os(`/api/trades?${o}`,t),a=Array.isArray(i)?i:[],s=a.length?Number(a[0].trade_date||0):null,c=a.reduce((l,u)=>l+Number(u.amount||0),0);return{provider:"bisq-markets",market:n,count:a.length,latestTradeAt:s?new Date(s).toISOString():null,latestTradeAgeHours:s?Math.round((Date.now()-s)/36e5*10)/10:null,volumeBase:c,trades:a.slice(0,r).map(l=>({price:l.price==null?null:Number(l.price),amount:l.amount==null?null:Number(l.amount),volume:l.volume==null?null:Number(l.volume),paymentMethod:l.payment_method??null,tradeDate:l.trade_date??null,tradeAt:l.trade_date?new Date(Number(l.trade_date)).toISOString():null}))}}L();var Bt=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"}}),MB=new Map([["bob",60808],["rootstock",30],["rsk",30]]),FB=60808;function yi(e){if(e==null||e==="")return FB;let t=MB.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!Bt[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(Bt).join(", ")} / bob, rootstock)`);return n}function op(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=yi(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||Bt[n].url).replace(/\/$/,"")}function _k(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 Rs(e,t,n={}){return S(`${op(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function Pk(e={},t={}){let n;try{n=yi(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=Bt[n];try{let o=await Rs(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:op(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:op(n,e),error:String(o?.message||o),exec:!1}}}async function ip(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(Bt).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await ip({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:Bt[c].name,error:String(l?.message||l)}}}))}}let r=yi(n),o=Bt[r],i=await Rs(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 Ck(e={},t={}){let n=yi(e.chainId??e.chain),r=_k(e.address||e.addr,"address"),o=Bt[n],i=await Rs(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 Tk(e={},t={}){let n=yi(e.chainId??e.chain),r=_k(e.address||e.addr,"address"),o=await Rs(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:Bt[n].name,address:r,count:i.length,tokens:i.slice(0,a).map(s=>({symbol:s.token?.symbol??null,name:s.token?.name??null,address:s.token?.address??s.token?.address_hash??null,type:s.token?.type??null,decimals:s.token?.decimals??null,rawBalance:s.value==null?null:String(s.value),balance:s.value==null||s.token?.decimals==null?null:Number(s.value)/10**Number(s.token.decimals),exchangeRate:s.token?.exchange_rate??null}))}}L();var UB="https://insights.braiins.com/api/v1.0";function ap(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||UB).replace(/\/$/,"")}function sp(e,t={}){return S(`${ap(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function Nk(e={}){try{let t=await sp("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:ap(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:ap(e),error:String(t?.message||t),exec:!1}}}async function Ok(e={},t={}){let n=await sp("/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 Rk(e={},t={}){let n=await sp("/pool-stats",t),r=Array.isArray(n)?n:Array.isArray(n?.pools)?n.pools:[],o=String(e.window||"1w").trim().toLowerCase(),i=l=>l?.blocks_mined?.[o]||null,a=[...r].sort((l,u)=>Number(i(u)?.absolute||0)-Number(i(l)?.absolute||0)),s=Math.min(200,Math.max(1,Number(e.limit||a.length||1))),c=r.length?Object.keys(r[0]?.blocks_mined||{}):[];if(c.length&&!c.includes(o))throw new Error(`braiins-insights: window must be one of ${c.join(", ")}`);return{provider:"braiins-insights",window:o,availableWindows:c,count:a.length,pools:a.slice(0,s).map(l=>({name:l.pool_name??l.name??null,blocksMined:i(l)?.absolute??null,sharePct:i(l)?.relative_pct??null,blockValueAvg:l.block_value_avg??null,hashrate:l.hashrate??null,luck:l.luck??null,blocksMinedAllWindows:l.blocks_mined??null})),raw:a.slice(0,s)}}L();var HB="https://api.cow.fi",Lk=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function $k(e={}){return(e.baseUrl||process.env.COW_API_URL||HB).replace(/\/$/,"")}function jB(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=Lk[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(Lk).join(", ")})`);return n}function cp(e,t,n){return`${$k(n)}/${jB(e)}/api/v1${t}`}function Bk(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 S(cp(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function Dk(e={},t={}){let n=Bk(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 S(`${cp(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 Uk(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",Bk(e.owner||e.address||e.user,"owner"));let r=await S(`${cp(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 qk(e={}){let t=await S(`${$k(e)}/mainnet/api/v1/version`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}),n=typeof t=="string"?t:JSON.stringify(t??"");return{ok:n.trim().length>0,provider:"cow-protocol",version:n.trim()||null}}L();var VB="https://api.hiro.so",WB=20;function lp(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||VB).replace(/\/$/,"")}function GB(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function bi(e,t={}){return S(`${lp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:GB(t)})}async function Hk(e={}){try{let t=await bi("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:lp(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:WB,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:lp(e),error:String(t?.message||t),exec:!1}}}async function jk(e={},t={}){let n=await bi("/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 zk(e={},t={}){let n=await bi("/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 bi(`/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 Wk(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await bi(`/extended/v2/blocks?limit=${n}`,t),o=Array.isArray(r?.results)?r.results:[];return{provider:"hiro-stacks",total:r?.total??null,limit:n,blocks:o.map(i=>({height:i.height??null,hash:i.hash??null,burnBlockHeight:i.burn_block_height??null,burnBlockTime:i.burn_block_time??null,txCount:i.tx_count??null,canonical:i.canonical??null}))}}L();var YB="https://bundles.jito.wtf",Kk=1e9;function up(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||YB).replace(/\/$/,"")}function JB(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function Gk(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*Kk):null}function XB(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/Kk:null,raw:e}}async function Yk(e={}){try{let t=await S(`${up(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 Jk(e={},t={}){let n=JB(e.limit,5,100),r=new URL(`${up(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 S(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(XB),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 Xk(e={}){let t=await S(`${up(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,Gk(i)])),suggestedTipLamports:Gk(r.p75||r.p50),raw:n}}L();var ZB="https://api.kamino.finance";function eM(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||ZB).replace(/\/$/,"")}function Je(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qk(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 dp(e={},t={}){let n=new URL(`${eM(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await S(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function Zk(e={}){try{let t=await dp({},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 eS(e={},t={}){let r=(await dp(e,t)).map(Qk),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 tS(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await dp({...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",...Qk(o),raw:o}}L();var nM="https://blockstream.info/liquid/api",nS="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function Ls(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||nM).replace(/\/$/,"")}function rM(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 oM(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 rS(e,t={}){let n=`${Ls(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 oS(e,t={}){return S(`${Ls(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function iS(e={}){try{let t=await rS("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:Ls(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:Ls(e),error:String(t?.message||t),exec:!1}}}async function aS(e={},t={}){let n=await rS("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function sS(e={},t={}){let n=rM(e.address||e.addr,"address"),r=await oS(`/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 cS(e={},t={}){let n=oM(e.assetId||e.asset||nS,"assetId"),r=await oS(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===nS,name:r.name??r.entity?.domain??null,ticker:r.ticker??null,precision:r.precision??null,issuanceTxid:r.issuance_txin?.txid??null,txCount:o.tx_count??null,pegInAmount:o.peg_in_amount==null?null:String(o.peg_in_amount),pegOutAmount:o.peg_out_amount==null?null:String(o.peg_out_amount),issuedAmount:o.issued_amount==null?null:String(o.issued_amount),burnedAmount:o.burned_amount==null?null:String(o.burned_amount),circulatingAmount:o.peg_in_amount!=null?String(Number(o.peg_in_amount)-Number(o.peg_out_amount||0)-Number(o.burned_amount||0)):o.issued_amount!=null?String(Number(o.issued_amount)-Number(o.burned_amount||0)):null,raw:r}}L();var aM="https://api-mainnet.magiceden.dev/v2/ord/btc",sM=600;function pp(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||aM).replace(/\/$/,"")}function cM(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function lS(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 uS(e,t={}){return S(`${pp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:cM(t),retries:t.retries??1})}async function dS(e={}){let t=lS(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await uS(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:pp(e),probeCollection:t,rateLimitRpm:sM,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:pp(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 pS(e={},t={}){let n=lS(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await uS(`/stat?collectionSymbol=${encodeURIComponent(n)}`,t),o=r?.floorPrice==null?null:Number(r.floorPrice);return{ok:!0,provider:"magiceden-ordinals",collectionSymbol:n,floorPriceSats:o==null?null:String(r.floorPrice),floorPriceBtc:o==null?null:o/1e8,totalVolumeSats:r?.totalVolume==null?null:String(r.totalVolume),totalVolumeBtc:r?.totalVolume==null?null:Number(r.totalVolume)/1e8,totalListed:r?.totalListed??null,owners:r?.owners??null,supply:r?.supply??null,pendingTransactions:r?.pendingTransactions??null,inscriptionNumberMin:r?.inscriptionNumberMin??null,inscriptionNumberMax:r?.inscriptionNumberMax??null,raw:r}}catch(r){let o=r?.status??null;if(!(o===502||o===503||o===504))throw r;return{ok:!1,provider:"magiceden-ordinals",collectionSymbol:n,status:o,upstreamDown:!0,error:String(r?.message||r),fallback:"satflow",note:"Magic Eden ordinals API is returning 5xx ('no healthy upstream'). Query the satflow provider for floors and listings."}}}L();var uM="https://mempool.space/api",dM=7;function mp(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||uM).replace(/\/$/,"")}function $s(e,t={}){return S(`${mp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function mS(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>dM}}async function fS(e={}){try{let n=(await $s("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=mS(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:mp(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:mp(e),error:String(t?.message||t),exec:!1}}}async function hS(e={},t={}){let r=(await $s("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=mS(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 gS(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 $s(`/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 yS(e={},t={}){let n=await $s("/v1/lightning/nodes/countries",t),r=Array.isArray(n)?n:[],o=Math.min(250,Math.max(1,Number(e.limit||r.length||1))),i=r.reduce((a,s)=>a+Number(s.count||0),0);return{provider:"mempool-lightning",countryCount:r.length,totalNodes:i,topCountrySharePct:r[0]?.share??null,countries:r.slice(0,o).map(a=>({name:a.name?.en??a.name??null,iso:a.iso??null,count:a.count??null,sharePct:a.share??null,capacitySats:a.capacity==null?null:String(a.capacity)}))}}L();var mM="https://mempool.space/api",bS=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function fp(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||mM).replace(/\/$/,"")}function wS(e,t){let n=String(e||t).trim().toLowerCase();if(!bS.has(n))throw new Error(`mempool-mining: window must be one of ${[...bS].join(", ")}`);return n}function wi(e,t={}){return S(`${fp(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function xS(e={}){try{let t=await wi("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:fp(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:fp(e),error:String(t?.message||t),exec:!1}}}async function vS(e={},t={}){let n=await wi("/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 kS(e={},t={}){let n=wS(e.window||e.timeframe,"1w"),r=await wi(`/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 SS(e={},t={}){let n=wS(e.window||e.timeframe,"3d"),r=await wi(`/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 ES(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await wi(`/v1/mining/reward-stats/${n}`,t),o=Number(r.totalReward||0),i=Number(r.totalFee||0);return{provider:"mempool-mining",blockCount:n,startBlock:r.startBlock??null,endBlock:r.endBlock??null,totalRewardSats:String(r.totalReward??""),totalFeeSats:String(r.totalFee??""),totalSubsidySats:String(o-i),feeSharePct:o>0?i/o*100:null,totalTx:r.totalTx??null,raw:r}}L();var hM="https://amm-v2.meteora.ag",IS=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),AS=new Set(["dynamic","multitoken","lst","farms"]),gM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function yM(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||hM).replace(/\/$/,"")}function Be(e){let t=Number(e);return Number.isFinite(t)?t:null}function bM(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:Be(e.pool_lp_price_in_usd),tvlUsd:Be(e.pool_tvl),farmTvlUsd:Be(e.farm_tvl),volume24hUsd:Be(e.trading_volume),volume7dUsd:Be(e.weekly_trading_volume),fee24hUsd:Be(e.fee_volume),fee7dUsd:Be(e.weekly_fee_volume),tradeApyPct:Be(e.trade_apy),weeklyTradeApyPct:Be(e.weekly_trade_apy),baseApyPct:Be(e.daily_base_apy),farmingApyPct:Be(e.farming_apy),totalApyPct:(Be(e.trade_apy)??0)+(Be(e.farming_apy)??0),aprPct:Be(e.apr),feePct:Be(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 wM(e={},t={}){let n=new URL(`${yM(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(!IS.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...IS].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(!AS.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...AS].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(!gM.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 hp(e={},t={}){let{url:n,page:r,size:o}=wM(e,t),i=await S(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(bM),totalCount:i?.total_count??null,page:r,size:o}}async function _S(e={}){try{let{pools:t,totalCount:n}=await hp({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 PS(e={},t={}){let n=await hp({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 CS(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 hp({sortKey:e.sortKey||"tvl",orderBy:"desc",...e},t);return{provider:"meteora-dlmm",chain:"solana-mainnet-beta",filter:n??null,mints:r?Array.isArray(r)?r:[r]:[],page:o.page,size:o.size,totalCount:o.totalCount,count:o.pools.length,pools:o.pools}}L();var vM="https://ordinals.com";function Bs(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||vM).replace(/\/$/,"")}function kM(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 TS(e,t={}){let n=`${Bs(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 gp(e,t={}){return S(`${Bs(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function NS(e={}){try{let t=await TS("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Bs(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Bs(e),error:String(t?.message||t),exec:!1}}}async function OS(e={},t={}){let n=await TS("/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 RS(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 gp(`/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 LS(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 gp(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 $S(e={},t={}){let n=kM(e.name||e.rune||e.runeName,"name"),r=await gp(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}L();var EM="https://hermes.pyth.network",bp={"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"},IM=/^[0-9a-fA-F]{64}$/;function BS(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||EM).replace(/\/$/,"")}function MS(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=bp[n.toUpperCase()]||bp[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!IM.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 yp(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function wp(e={}){let t=yp({price:Number(e.price?.conf),expo:e.price?.expo}),n=yp(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:yp(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 xp(e,t={}){let n=new URL(`${BS(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"),S(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function FS(e={}){try{let t=await xp([bp["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(wp):[])[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 DS(e={},t={}){let n=MS(e.feedId||e.id||e.symbol,"feedId"),r=await xp([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(wp):[],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 US(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>MS(l,"feedIds[]")))];if(!r.length)throw new Error("pyth-price-feeds: feedIds[] required");let o=40,i=[];for(let l=0;l<r.length;l+=o)i.push(r.slice(l,l+o));let a=[];for(let l of i)a.push(await xp(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(wp):[]),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 qS(e={},t={}){let n=new URL(`${BS(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 S(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),o=Array.isArray(r)?r:[];return{provider:"pyth-price-feeds",count:o.length,feeds:o.map(i=>({id:i.id,symbol:i.attributes?.symbol||null,displaySymbol:i.attributes?.display_symbol||null,base:i.attributes?.base||null,quote:i.attributes?.quote_currency||null,assetType:i.attributes?.asset_type||null}))}}L();var _M="https://relayscan.io",HS=new Set(["1h","12h","24h","7d"]);function vp(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||_M).replace(/\/$/,"")}function jS(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!HS.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...HS].join(", ")}`);return t}function PM(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 kp(e={},t={}){return S(`${vp(t)}/overview/json?t=${jS(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function zS(e={},t={}){return S(`${vp(t)}/builder-profit/json?t=${jS(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function VS(e={},t={}){let n=PM(e);return S(`${vp(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function WS(e={}){let t=await kp({timespan:"1h"},e);return{ok:Array.isArray(t?.relays)&&t.relays.length>0,provider:"relayscan-mev",relays:Array.isArray(t?.relays)?t.relays.length:0}}L();var TM="https://extra-api.sanctum.so",NM=30,OM=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Sp(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||TM).replace(/\/$/,"")}function GS(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 RM(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function jn(e,t,n={}){let r={},o={};for(let i of RM(t,NM)){let a=new URL(`${Sp(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await S(a.toString(),{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4}),c=s?.apys||s?.tvls||s?.solValues||{};Object.assign(r,c),Object.assign(o,s?.errs||{})}return{values:r,errs:o}}async function KS(e={}){try{let[t,n]=await Promise.all([S(`${Sp(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),jn("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 Ep(e={},t={}){let n=await S(`${Sp(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 YS(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await Ep({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=OM);let r=[...new Set(n.map(s=>GS(s,"lsts[]")))],[o,i]=await Promise.all([jn("apy/latest",r,t),jn("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 JS(e={},t={}){let n=GS(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([jn("apy/latest",[n],t),jn("apy/inception",[n],t),jn("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),jn("sol-value/current",[n],t).catch(()=>({values:{},errs:{}}))]),s=Number(r.values[n]),c=Number(o.values[n]),l=r.errs[n]||o.errs[n]||null;if(!Number.isFinite(s)&&!Number.isFinite(c))throw new Error(`sanctum-lst: no APY for ${n}${l?` (${JSON.stringify(l)})`:""}`);let u=a.values[n];return{provider:"sanctum-lst",chain:"solana-mainnet-beta",lst:n,apyLatest:Number.isFinite(s)?s:null,apyLatestPct:Number.isFinite(s)?s*100:null,apyInception:Number.isFinite(c)?c:null,apyInceptionPct:Number.isFinite(c)?c*100:null,tvlLamports:i.values[n]??null,tvlSol:i.values[n]!=null?Number(i.values[n])/1e9:null,solValueLamports:u??null,solPerToken:u!=null?Number(u)/1e9:null,error:l}}L();var $M="https://api.save.finance",BM="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",XS="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",MM=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Ip(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||$M).replace(/\/$/,"")}function QS(e,t="address"){let n=String(e??"").trim();if(!MM.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function ZS(e){let t=Number(e);return Number.isFinite(t)?t:null}function FM(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 DM(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:ZS(e.rates?.supplyInterest),borrowApyPct:ZS(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 eE(e={}){try{let t=await S(`${Ip(e)}/v1/reserves?ids=${XS}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:XS,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function Ap(e={},t={}){let n=new URL(`${Ip(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 S(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(FM);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 tE(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=>QS(String(s).trim(),"reserve"));else{let a=QS(e.market||e.marketAddress||BM,"market"),c=(await Ap({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 S(`${Ip(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...DM(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 _p(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 zn(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 xi(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:_p(e.amount,"amount")}}function Pp(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 vi(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 Cp(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 qM(e={},t={}){let n=xi(e),r=zn(e.slices??10,"slices",2,100),o=zn(e.durationSec??3600,"durationSec",r,604800),i=Pp(n.total,Array(r).fill(1));return vi(n,"TWAP",Cp(i,o,t.nowMs),{durationSec:o})}function HM(e={},t={}){let n=xi(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=zn(e.durationSec??3600,"durationSec",r.length,604800),i=Pp(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Cp(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return vi(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function jM(e={}){let t=xi(e),n=zn(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=_p(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 vi(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function zM(e={}){let t=xi(e),n=_p(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 vi(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function VM(e={},t={}){let n=xi(e),r=zn(e.slices??10,"slices",2,100),o=zn(e.durationSec??3600,"durationSec",r,604800),i=zn(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=Pp(n.total,a);return vi(n,"IS",Cp(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function nE(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return qM(e,t);if(n==="VWAP")return HM(e,t);if(n==="POV")return jM(e,t);if(n==="ICEBERG")return zM(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return VM(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 sF,getAddress as cF,isAddress as lF}from"ethers";var cE=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Op=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"}]}),lE=/^(?:0|[1-9][0-9]*)$/;function Ds(e,t){let n=String(e||"").trim();if(!lF(n))throw new Error(`limit-order: ${t} must be an address`);return cF(n)}function Rp(e,t){let n=String(e??"").trim();if(!lE.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 uF(e){let t=Number(e),n=cE[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function dF(e){let t=Number(e);if(!cE[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function pF(e={}){let t=Ds(e.maker,"maker"),n=e.receiver?Ds(e.receiver,"receiver"):t,r=Ds(e.makerAsset,"makerAsset"),o=Ds(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=Rp(e.makingAmount,"makingAmount"),a=Rp(e.takingAmount,"takingAmount"),s=Rp(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!lE.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 dE(e={},t={}){let n=Number(e.chainId),r=uF(n),o=pF(e),i={types:Op,domain:r,primaryType:"Order",message:o},a=sF.hash(r,Op,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:dF(n),domain:r,types:Op,message:o,typedData:i,digest:a})})}function pE(e={},t={}){let n=dE(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 mE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Np(),Tp)),r=dE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}X();var fF=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,hF=/^(?:0|[1-9][0-9]*)$/;function Lp(e,t){let n=String(e||"").trim();if(!fF.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function gF(e,t){let n=String(e??"").trim();if(!hF.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function fE(){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 hE(e={}){let t=Lp(e.owner,"owner"),n=Lp(e.inputMint,"inputMint"),r=Lp(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=gF(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 gE(e={},t={}){let n=hE(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=Io({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 Ul({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 yE(e={},t={}){let n=hE(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=gE(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 bE(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(Np(),Tp)),r=gE(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}L();var bF="protective-monitors",wF="read-only",xF=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),vF="https://hermes.pyth.network",kF="https://coins.llama.fi",SF="https://api.llama.fi/hacks",EF="https://api.gopluslabs.io/api/v1/token_security",IF="https://api.v3.aave.com/user",AF=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),_F=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),PF=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),wE=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),CF=/^0x[0-9a-fA-F]{40}$/,TF=/^[0-9a-fA-F]{64}$/;function Fr(e,t={}){return{ok:!0,provider:bF,op:e,alertOnly:!0,execution:wF,exec:!1,...t}}function Me(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function ki(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):S(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function Us(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function NF(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return TF.test(r)||Me("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=Us(e.symbol),n=AF[t];return n||Me("unknown symbol",t),n}function OF(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=Us(e.symbol);return _F[t]||`coingecko:${t.toLowerCase()}`}function xE(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&Me("thresholdBps must be a non-negative number"),n}function RF(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))&&Me("no pyth price returned"),r<0?n/10**-r:n*10**r}function LF(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function $F(e,t={}){let n=String(t.pythBaseUrl||vF).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function BF(e,t={}){return`${String(t.llamaCoinsBaseUrl||kF).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function vE(e,t){let n=NF(e),r=await ki($F(n,t),t),o=RF(r);return o>0||Me("pyth price must be positive"),{id:n,price:o}}async function kE(e,t){let n=OF(e),r=await ki(BF(n,t),t);return{coin:n,price:LF(r,n)}}function SE(){return Fr("health",{ok:!0,ops:[...xF],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function $p(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&Me("peg must be a positive number");let r=xE(e,50),o=await vE(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await kE(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return Fr("depeg",{symbol:Us(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function Bp(e={},t={}){let n=xE(e,100),r=await vE(e,t),o=await kE(e,t);o.price>0||Me("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return Fr("oracleDeviation",{symbol:Us(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function MF(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function FF(e,t){return{id:MF(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 DF(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 EE(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return DF(t);try{return EE(JSON.parse(t))}catch{Me("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 UF(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 Mp(e={},t={}){let n=String(e.url||t.hacksUrl||SF),r=e.payload??await ki(n,t),o=UF(EE(r).map(FF));return Fr("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function qF(e){return e===!0||e===1||e==="1"}function HF(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 Fp(e={},t={}){e.asSoleGate===!0&&Me("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();CF.test(n)||Me("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&Me("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||EF).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await ki(i,t),s=HF(a,n);s||Me("goplus returned no result for",n);let c=PF.filter(l=>qF(s.token[l]));return Fr("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 jF(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&Me("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function zF(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||Me("position healthFactor required");let r=jF(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 Dp(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||Me("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${IF}/${a}`);n=await ki(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(zF),i=o.reduce((a,s)=>a?wE[s.rung]<wE[a]?s.rung:a:s.rung,null);return Fr("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 iH=Object.freeze({depeg:$p,oracleDeviation:Bp,exploitFeed:Mp,goplus:Fp,liquidationLadder:Dp});import{existsSync as WF,readFileSync as GF}from"node:fs";import{dirname as KF,join as IE}from"node:path";import{fileURLToPath as YF}from"node:url";var qs=Object.freeze({OK:"OK",FAILED:"FAILED"}),JF=Object.freeze({hl:9,dydx:10,binance:8}),AE=Object.freeze(["hl","dydx","binance"]),XF=IE(KF(YF(import.meta.url)),"../../../fixtures/funding-scanner");function _E(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...AE],note:"Public payload/fixture scan. CEX legs never live-call. Missing venue is FAILED, never 0-funding."}}function ft(e){if(e==null||e==="")return null;let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function QF(e){let t=ft(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function ZF(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=ft(t[e]);if(n!=null&&n>=0)return n}return ft(JF[e])}function qp(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 e4({venue:e,coin:t,hourly:n,feeDragBps:r}){let o=ft(n),i=ft(r);if(!e||!t||o==null||i==null||i<0)throw new Error("funding-scanner: unified row requires venue, coin, hourly, feeDragBps");let a=QF(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:qs.OK})}function Up(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:ft(n),netAnnualizedPct:null,quality:qs.FAILED,error:String(t||"missing venue")})}function t4(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=qp(t[o]?.name),a=ft(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function n4(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=qp(o?.ticker||o?.market||o?.symbol),a=ft(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 r4(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:ft(e.fundingIntervalHours),entries:t}}return{intervalHours:null,entries:[]}}function o4(e){let{intervalHours:t,entries:n}=r4(e),r=[];for(let o of n){let i=qp(o?.symbol||o?.pair),a=ft(o?.fundingIntervalHours)??t,s=ft(o?.lastFundingRate??o?.lastFundingRatePeriod??o?.fundingRate);!i||s==null||!(a>0)||r.push({venue:"binance",coin:i,hourly:s/a})}return r}var i4=Object.freeze({hl:t4,dydx:n4,binance:o4});function a4(e,t){let n=IE(e,`${t}.json`);if(!WF(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(GF(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function s4(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 a4(n,e)}function c4(e,t){let n=i4[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 l4(e,t){let n=e.quality===qs.FAILED||e.netAnnualizedPct==null,r=t.quality===qs.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 PE(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:AE).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||XF,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=ZF(s,i),l=s4(s,r,o);if(l.missing){a.push(Up(s,l.error,c));continue}let u=c4(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(Up(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(e4({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(Up(s,p.message,c))}}return a.sort(l4),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();wo();L();var d4="https://indexer.dydx.trade";function Si(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function p4(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function CE(e=50,t={}){try{let n=await S(`${d4}/v4/perpetualMarkets?limit=${e}`,t);return p4(n).map(o=>{let i=Si(o?.nextFundingRate),a=Si(o?.oraclePrice),s=Si(o?.openInterest),c=Si(o?.volume24H),l=Si(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"}}}L();var m4="https://dlob.drift.trade",TE="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 NE(e={}){try{let n=(await S(`${m4}/v2/markets`,e))?.markets;return!Array.isArray(n)||n.length===0?{error:TE,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:`${TE} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}L();var f4="https://gateway.prod.vertexprotocol.com/v2",OE="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 RE(e={}){try{let n=(await S(`${f4}/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:OE,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:`${OE} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}L();var h4="https://api.aevo.xyz";async function LE(e={}){try{return(await S(`${h4}/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 $E=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function BE(){return{ok:!0,provider:"perp-universal",execution:"prepare-only",exec:!1,signed:!1,broadcast:!1,venues:[...$E],note:"fundingAll ranks LIVE rows by |APR|. FAILED venues stay in failed[]. prepareOrder is unsigned."}}function Hs(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function un(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function Ei({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:Hs(n),fundingRateAprPct:Hs(r),dayNtlVolumeUsd:Hs(o),quality:"LIVE",...i})}async function g4(e,t){try{let n=await t();return n&&n.quality==="FAILED"?un(e,n.error||"FAILED"):n}catch(n){return un(e,n.message||n)}}async function y4(e={}){return{venue:"hl",quality:"LIVE",markets:((await gr({},e)).markets||[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Ei({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 b4(e={}){let t=await CE(50,e);return t?.quality==="FAILED"||t?.error?un("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(r=>r.coin&&r.fundingRateAprPct!=null).map(r=>Ei({venue:"dydx",coin:r.coin,markPx:r.markPx,fundingRateAprPct:r.fundingRateAprPct,dayNtlVolumeUsd:r.dayNtlVolumeUsd}))}}async function w4(e={}){let t=await Zt({chainId:42161},e);return!Array.isArray(t)||t.length===0?un("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=Hs(r.fundingRate??r.funding??r.borrowingRateLong);return Ei({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 x4(e={}){let t=await NE(e);return t?.quality==="FAILED"||t?.error?un("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function v4(e={}){let t=await RE(e);return t?.quality==="FAILED"||t?.error?un("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function k4(e={}){let t=await bh(e);return t?.error?un("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(r=>Ei({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 S4(e={}){let t=await LE(e);return t?.error?un("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 Ei({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 Hp={hl:y4,lighter:k4,gmx:w4,dydx:b4,aevo:S4,drift:x4,vertex:v4};async function ME(e={},t={}){let n=Array.isArray(e.venues)&&e.venues.length?e.venues.map(l=>String(l).toLowerCase()).filter(l=>Hp[l]):[...$E],r=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),i=t.readers||Hp,a=await Promise.all(n.map(l=>g4(l,()=>(i[l]||Hp[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 FE(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 Wa({...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 Vt({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 I4=Math.sqrt(2*Math.PI);function js(e){return Math.exp(-.5*e*e)/I4}function A4(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 dn(e){return .5*(1+A4(e/Math.SQRT2))}function DE({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*dn(p)-s*f*dn(m),g=s*f*dn(-m)-a*dn(-p),w=i==="put"?g:h,x=i==="put"?dn(p)-1:dn(p),b=js(p)/(a*l*d),y=a*js(p)*d/100,v=i==="put"?(-(a*js(p)*l)/(2*d)+c*s*f*dn(-m))/365:(-(a*js(p)*l)/(2*d)-c*s*f*dn(m))/365;return Object.freeze({kind:i,price:w,delta:x,gamma:b,vega:y,theta:v,d1:p,d2:m})}var PH=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function zs(){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 Vs(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=DE({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 UE(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function Ii(e){return String(e||"").trim().toLowerCase()}function P4(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function qE({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=Ii(d.from),m=Ii(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=P4(a),c=new Map;for(let d of t){let p=Ii(d.funder),m=Ii(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]?Ii(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 HE(){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 jE(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 zE(){return{...zs(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function VE(e,t){return Vs(e,t)}function WE(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function GE(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 R4=Object.freeze([]);function KE(){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 YE(e={}){let t=String(e.address||"").toLowerCase(),n=R4.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 JE(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 XE(){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 QE(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 $4(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function ZE(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:$4(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var B4=/^0x[0-9a-fA-F]{8}$/,eI=/^0x[0-9a-fA-F]{40}$/;function tI(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!eI.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(!eI.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!B4.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 jp=/^0x[0-9a-fA-F]{40}$/;function nI(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(!jp.test(n)||!jp.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||!jp.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 cI=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 aI(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Dd,adapters:Object.freeze(Ud.adapters.map(e=>{let t=cI[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function Q4(e,t={}){let n=Qx(e,t),r=cI[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 zp=new Map;function Gs(e={}){let t=e.filePath||void 0,n=t||"__default__";return zp.has(n)||zp.set(n,Sg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),zp.get(n)}var Vp=new Map;function Wp(e={}){let t=e.filePath||void 0,n=t||"__default__";return Vp.has(n)||Vp.set(n,Pg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Vp.get(n)}var Gp=new Map;function Ai(e={}){let t=e.filePath||void 0,n=t||"__default__";return Gp.has(n)||Gp.set(n,wg(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),Gp.get(n)}var Z4={"hl-info":{health:e=>Sf(e),allMids:e=>Et(e),l2Book:(e,t={})=>Jn(t.coin,e),outcomeMeta:e=>co(e),clearinghouse:(e,t={})=>Ji(t.user,e),userFills:(e,t={})=>Ef(t.user,e),meta:e=>If(e),metaAndAssetCtxs:e=>Qe(e),candleSnapshot:(e,t={})=>Xi(t,e),openOrders:(e,t={})=>_f(t.user,e),frontendOpenOrders:(e,t={})=>Pf(t.user,e),userState:(e,t={})=>Xn(t.user,e),spotMeta:e=>Qi(e)},"hl-vaults":{health:e=>Nf(e),summaries:(e,t={})=>jc(t,e),details:(e,t={})=>Zi(t,e),userEquities:(e,t={})=>zc(t,e),tracker:(e,t={})=>Vc(t,e)},"hl-precompiles":{health:e=>Rf(e),read:(e,t={})=>Of(t,e),l1BlockNumber:e=>ea(e),markPx:(e,t={})=>Kc(t,e),oraclePx:(e,t={})=>Yc(t,e),spotPx:(e,t={})=>Jc(t,e),position:(e,t={})=>Xc(t,e),spotBalance:(e,t={})=>Qc(t,e),vaultEquity:(e,t={})=>Zc(t,e),withdrawable:(e,t={})=>el(t,e)},"hl-delta-neutral":{health:()=>th(),scan:(e,t={})=>wl(t,e),quote:(e,t={})=>xl(t,e),prepare:(e,t={})=>vl(t,e),loop:(e,t={})=>ch(t,e)},"lighter-delta-neutral":{health:()=>hh(),scan:(e,t={})=>Il(t,e),quote:(e,t={})=>Al(t,e),prepare:(e,t={})=>_l(t,e),loop:(e,t={})=>kh(t,e)},"poly-public":{health:e=>Eh(e),time:e=>Pl(e),markets:(e,t={})=>Ih(t,e),book:(e,t={})=>Ah(t.tokenId,e),midpoint:(e,t={})=>_h(t.tokenId,e),spread:(e,t={})=>Ph(t.tokenId,e),price:(e,t={})=>Ch(t.tokenId,{side:t.side},e),events:(e,t={})=>Th(t,e)},"evm-rpc":{health:(e,t={})=>Vn(t.chainId??1,e),healthAll:(e,t={})=>lc({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>jr(t.chainId??1,e),chainId:(e,t={})=>sc(t.chainId??1,e),getBalance:(e,t={})=>hn(t.chainId??1,t.address,e),call:(e,t={})=>D(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>cc(t,e),erc20Balance:(e,t={})=>zr(t,e),transactionReceipt:(e,t={})=>Vr(t,e)},portfolio:{health:e=>Ww(e),balances:(e,t={})=>ms(t,e),snapshot:(e,t={})=>dx(t,e),history:(e,t={})=>Sd(t,e),valueGraph:(e,t={})=>px(t,e)},"nft-portfolio":{health:e=>Zw(e),inventory:(e,t={})=>Er(t,e),gallery:(e,t={})=>rx(t,e),pnl:(e,t={})=>nx(t,e),prepareList:(e,t={})=>ex(t,e),traitSnipe:(e,t={})=>tx(t,e)},"contract-risk":{health:e=>mx(e),scan:(e,t={})=>Fn(t,e)},"evm-token-sniper":{health:e=>gx(e),scan:(e,t={})=>hx(t,e)},"evm-simulate":{health:e=>bx(e),simulate:(e,t={})=>di(t,e)},"nft-mint":{health:e=>xx(e),discover:(e,t={})=>ws(t,e),prepare:(e,t={})=>Ad(t,e),priceGas:(e,t={})=>bs(t,e),createTrigger:(e,t={})=>bv(t,e),checkOpen:(e,t={})=>wv(t,e),evaluateMancerOs:(e,t={})=>kv(t,e)},"universal-mint-router":{health:()=>Vx(),capabilities:()=>Md(),prepare:(e,t={})=>Wx(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:aI()}),capabilities:()=>aI(),route:(e,t={})=>Q4(t,e)},"erc8004-identity":{health:()=>yy(),prepareIdentityRegistration:(e,t={})=>xy(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>vy(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Sy(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:Es,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>tv(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:Is,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>av(t,e)},"universal-ordinals-transfer":{health:()=>({provider:As,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>yv(t,e)},"solana-rpc":{health:e=>Oh(e),latestBlockhash:(e,t={})=>Tl(t,e),getBalance:(e,t={})=>da(t,e),tokenAccounts:(e,t={})=>So(t,e),simulate:(e,t={})=>Rh(t,e)},"bitcoin-esplora":{health:e=>Lh(e),tipHeight:e=>$h(e),fees:e=>Bh(e),address:(e,t={})=>ma(t,e),utxos:(e,t={})=>Mh(t,e),tx:(e,t={})=>Fh(t,e),decode:(e,t={})=>Dh(t,e)},"bitcoin-meta":{health:e=>qh(e),runeBalances:(e,t={})=>ha(t,e),inscriptions:(e,t={})=>rr(t,e),inscriptionInfo:(e,t={})=>Hh(t,e),inscriptionChildren:(e,t={})=>jh(t,e),ordBlockInfo:(e,t={})=>zh(t,e)},satflow:{health:e=>Wh(e),collectionFloors:(e,t={})=>Gh(t,e),collectionStats:(e,t={})=>Kh(t,e),item:(e,t={})=>Yh(t,e),walletContents:(e,t={})=>ya(t,e),floorListings:(e,t={})=>Jh(t,e),preparePurchase:(e,t={})=>Qh(t,e),prepareList:(e,t={})=>ba(t,e)},jupiter:{health:e=>a0(e),venues:(e,t={})=>i0(t,e),quote:(e,t={})=>va(t,e),prepare:(e,t={})=>s0(t,e)},defillama:{health:e=>l0(e),prices:(e,t={})=>In(t.coins||[],e),pricesBySymbol:(e,t={})=>m0(t.symbols,e),protocols:e=>u0(e),yields:(e,t={})=>d0(t,e),stablecoins:(e,t={})=>ka(t,e),dexVolumes:(e,t={})=>p0(t,e)},lifi:{health:e=>h0(e),quote:(e,t={})=>Ao(t,e),prepare:(e,t={})=>g0(t,e),chains:e=>y0(e)},dexscreener:{health:e=>lm(e),token:(e,t={})=>gn(t.address||t.tokenAddress,e),search:(e,t={})=>Wr(t.q||t.query,e),pair:(e,t={})=>um(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>Am({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Wn(t,e),prepare:(e,t={})=>Im(t,e),quotePath:(e,t={})=>Em(t,e),ethUsdc:(e,t={})=>wc(t,e),chains:()=>_m()},"uniswap-v4":{health:(e,t={})=>Bm({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Zr(t,e),inspectHook:(e,t={})=>Nm(t,e),prepare:(e,t={})=>Lm(t,e),chains:()=>$m()},x402:{health:()=>eg(),inspect:(e,t={})=>Q0(t),prepare:(e,t={})=>Z0(t,e)},bankr:{health:e=>ag(e),wallet:e=>ou(e),portfolio:e=>og(e),swapQuote:(e,t={})=>ig(t,e)},aerodrome:{health:(e,t={})=>I0({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Sa(t,e),prepare:(e,t={})=>E0(t,e),chains:()=>A0()},zerox:{health:e=>T0(e),price:(e,t={})=>zl(t,e),quote:(e,t={})=>Po(t,e),prepare:(e,t={})=>N0(t,e)},across:{health:e=>O0(e),suggestedFees:(e,t={})=>Vl(t,e)},hop:{health:e=>R0(e),quote:(e,t={})=>Wl(t,e)},relay:{health:e=>L0(e),quote:(e,t={})=>Ia(t,e),prepare:(e,t={})=>$0(t,e)},cowswap:{health:e=>U0(e),quote:(e,t={})=>or(t,e),prepareOrder:(e,t={})=>q0(t,e),order:(e,t={})=>j0(t,e),status:(e,t={})=>H0(t,e),chains:()=>z0()},oneinch:{health:e=>W0(e),quote:(e,t={})=>eu(t,e),prepare:(e,t={})=>G0(t,e),approveSpender:(e,t={})=>tu(t,e)},"hl-ws":{health:e=>sg(e),allMids:e=>cg(e),l2Book:(e,t={})=>lg(t.coin,e),snapshot:(e,t={})=>Ro(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>ug({...e,assetId:t.assetId}),book:(e,t={})=>dg(t.assetId||t.tokenId,e),snapshot:(e,t={})=>Aa(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>Ym(e),collection:(e,t={})=>no(t.slug,e),floor:(e,t={})=>Jm(t.slug,e),bestListings:(e,t={})=>Cc(t,e),bestListing:(e,t={})=>Hi(t,e),bestOffer:(e,t={})=>ji(t,e),accountNfts:(e,t={})=>ro(t,e),accountPnl:(e,t={})=>Ui(t,e),prepareBuy:(e,t={})=>lf(t,e),prepareSweep:(e,t={})=>uf(t,e),prepareMint:(e,t={})=>Vi(t,e),prepareList:(e,t={})=>Wi(t,e),prepareCancel:(e,t={})=>df(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={})=>Ai(e).createListing(t),listListings:(e,t={})=>Ai(e).listListings(t),cancelListing:(e,t={})=>Ai(e).cancelListing(t),createOffer:(e,t={})=>Ai(e).createOffer(t),armFill:(e,t={})=>Ai(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={})=>Gs(e).createIntent(t),listIntents:(e,t={})=>Gs(e).listIntents(t),cancelIntent:(e,t={})=>Gs(e).cancelIntent(t),armPayment:(e,t={})=>Gs(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={})=>Wp(e).registerPack(t),listPacks:(e,t={})=>Wp(e).listPacks(t),revokePack:(e,t={})=>Wp(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>py(t,e),markets:(e,t={})=>cr(t,e),quoteSpecificBuy:(e,t={})=>qo(t,e),quoteSell:(e,t={})=>Ba(t,e),scanCollection:(e,t={})=>Ma(t,e),scanAllMarkets:(e,t={})=>oy(t,e),scanCrossVenueArb:(e,t={})=>Eu(t,e),scanAllMarketsArb:(e,t={})=>iy(t,e),prepareSpecificBuy:(e,t={})=>Xg(t,e),prepareSell:(e,t={})=>Qg(t,e)},stonkbrokers:{health:(e,t={})=>my(t,e),quoteBrokerBuy:(e,t={})=>Fa(t,e),scanBrokerLoot:(e,t={})=>cy(t,e),prepareBrokerBuy:(e,t={})=>ly(t,e),brokerDesk:(e,t={})=>dy(t,e),clockInStatus:(e,t={})=>Ho(t,e),prepareClockIn:(e,t={})=>uy(t,e)},"hl-outcome":{list:e=>fb(e),prepareOrder:(e,t={})=>hb(t,e),prepareCancel:(e,t={})=>gb(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:ns().map(e=>e.id),nativeTemplates:ri().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>ns(),listNative:()=>ri(),gate:(e,t={})=>ti(t.templateId||t.id,e),prepareDeploy:(e,t={})=>Hb(t,e),buildNative:(e,t={})=>oi(t),eval:async()=>(await Promise.resolve().then(()=>(iI(),oI))).runContractsEval()},"poly-clob":{health:()=>Tb(),prepareOrder:(e,t={})=>Nb(t||{},e)},"hl-perps":{health:e=>Du(e),assetInfo:(e,t={})=>zt(t,e),prepareOrder:(e,t={})=>Vt(t,e),prepareCancel:(e,t={})=>bo(t,e),prepareLeverage:(e,t={})=>hl(t,e),prepareIsolatedMargin:(e,t={})=>gl(t,e),prepareBracket:(e,t={})=>yl(t,e),prepareBuilderApproval:(e,t={})=>fl(t,e)},"hl-markets":{health:e=>Du(e),markets:(e,t={})=>gr(t,e),leaderboards:(e,t={})=>jy(t,e),coin:(e,t={})=>zy(t,e),spot:(e,t={})=>Vy(t,e)},"hl-entry-state":{health:e=>ub(e),see:(e,t={})=>Jo(t,e),qualify:(e,t={})=>db(t,e),lock:(e,t={})=>pb(t,e),list:e=>Hu(e),watch:(e,t={})=>mb(t,e)},"magiceden-sol":{health:e=>Cy(e),stats:(e,t={})=>Nu(t,e),listings:(e,t={})=>Ny(t,e),tokenListings:(e,t={})=>Oy(t,e),prepareBuy:(e,t={})=>Ry(t,e),prepareList:(e,t={})=>Ha(t,e),prepareMint:(e,t={})=>Ly(t,e)},"hl-staking":{health:e=>By(e),validators:e=>Lu(e),delegatorSummary:(e,t={})=>$u(t,e),delegations:(e,t={})=>Bu(t,e),rewards:(e,t={})=>My(t,e),history:(e,t={})=>Fy(t,e),preflight:(e,t={})=>Hy(t,e),prepareStakeDeposit:(e,t={})=>Dy(t,e),prepareStakeWithdraw:(e,t={})=>Uy(t,e),prepareDelegate:(e,t={})=>qy(t,e)},"hyperevm-dex":{health:e=>Iy(e),search:(e,t={})=>Ay(t.q||t.query||"HYPE",e),token:(e,t={})=>_y(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>Zb(e),networks:(e,t={})=>Zu(t,e),pool:(e,t={})=>Jb(t,e),token:(e,t={})=>Xb(t,e),ohlcv:(e,t={})=>Qb(t,e)},curve:{health:e=>pw(e),openapi:e=>dw(e),pools:(e,t={})=>td(t,e),quote:(e,t={})=>nd(t,e),prepare:(e,t={})=>mw(t,e)},gmx:{health:e=>nb(e),tickers:(e,t={})=>Zt(t,e),markets:(e,t={})=>eb(t,e),marketsInfo:(e,t={})=>qu(t,e),tokens:(e,t={})=>tb(t,e),prepareOrder:(e,t={})=>Wa(t,e),positions:(e,t={})=>rb(t,e),orderStatus:(e,t={})=>ob(t,e),verifyOrder:(e,t={})=>ib(t,e)},morpho:{health:e=>yw(e),markets:(e,t={})=>gw(t,e),vaults:(e,t={})=>id(t,e),prepareVault:(e,t={})=>bw(t,e)},balancer:{health:e=>Aw(e),pools:(e,t={})=>Iw(t,e),quote:(e,t={})=>cd(t,e),prepare:(e,t={})=>_w(t,e)},pendle:{health:e=>Cw(e),markets:(e,t={})=>ud(t,e),quote:(e,t={})=>Tw(t,e),prepare:(e,t={})=>dd(t,e)},odos:{health:e=>Lw(e),chains:e=>md(e),quote:(e,t={})=>Ow(t,e),prepare:(e,t={})=>Rw(t,e)},blockscout:{health:e=>Hw(e),stats:(e,t={})=>gd(t,e),address:(e,t={})=>Fw(t,e),token:(e,t={})=>Dw(t,e)},paraswap:{health:e=>Ev(e),tokens:(e,t={})=>zd(t,e),price:(e,t={})=>Lr(t,e),quote:(e,t={})=>Lr(t,e),prepare:(e,t={})=>Sv(t,e)},rfq:{health:e=>Fv(e),intent:(e,t={})=>Bv(t,e),quote:(e,t={})=>Mv(t,e)},"polygon-staking":{health:e=>pk(e),validators:(e,t={})=>uk(t,e),validatorDetail:(e,t={})=>dk(t,e)},"aave-v3":{health:e=>gk(e),markets:(e,t={})=>mk(t,e),marketReserves:(e,t={})=>fk(t,e),chains:e=>hk(e)},"babylon-staking":{health:e=>bk(e),stats:e=>wk(e),finalityProviders:e=>xk(e),delegations:(e,t={})=>vk(t,e)},"bisq-markets":{health:e=>Sk(e),markets:e=>Ek(e),ticker:(e,t={})=>Ik(t,e),trades:(e,t={})=>Ak(t,e)},"bob-rootstock":{health:(e,t={})=>Pk(t.chainId,e),stats:(e,t={})=>ip(t,e),addressInfo:(e,t={})=>Ck(t,e),tokenBalances:(e,t={})=>Tk(t,e)},"braiins-insights":{health:e=>Nk(e),priceStats:e=>Ok(e),poolStats:e=>Rk(e)},"cow-protocol":{health:e=>qk(e),auction:e=>Fk(e),openOrders:(e,t={})=>Dk(t,e),recentTrades:(e,t={})=>Uk(t,e)},"hiro-stacks":{health:e=>Hk(e),networkInfo:e=>jk(e),stackingInfo:e=>zk(e),poxCycles:e=>Vk(e),blocks:(e,t={})=>Wk(t,e)},"jito-mev":{health:e=>Yk(e),recentBundles:(e,t={})=>Jk(t,e),tipFloor:e=>Xk(e)},"kamino-strategies":{health:e=>Zk(e),strategies:(e,t={})=>eS(t,e),strategyMetrics:(e,t={})=>tS(t,e)},"liquid-esplora":{health:e=>iS(e),tipHeight:e=>aS(e),addressInfo:(e,t={})=>sS(t,e),assetInfo:(e,t={})=>cS(t,e)},"magiceden-ordinals":{health:e=>dS(e),collectionStat:(e,t={})=>pS(t,e)},"mempool-lightning":{health:e=>fS(e),statistics:e=>hS(e),nodeRankings:(e,t={})=>gS(t,e),nodeCountries:e=>yS(e)},"mempool-mining":{health:e=>xS(e),difficulty:e=>vS(e),poolShare:(e,t={})=>kS(t,e),hashrate:(e,t={})=>SS(t,e),rewardStats:(e,t={})=>ES(t,e)},"meteora-dlmm":{health:e=>_S(e),pools:(e,t={})=>PS(t,e),poolSearch:(e,t={})=>CS(t,e)},"ordinals-runes":{health:e=>NS(e),blockHeight:e=>OS(e),blockInfo:(e,t={})=>RS(t,e),satInfo:(e,t={})=>LS(t,e),runeInfo:(e,t={})=>$S(t,e)},"pyth-price-feeds":{health:e=>FS(e),latestPrice:(e,t={})=>DS(t,e),latestPrices:(e,t={})=>US(t,e),feedDirectory:e=>qS(e)},"relayscan-mev":{health:e=>WS(e),overview:(e,t={})=>kp(t,e),builderProfit:(e,t={})=>zS(t,e),dailyStats:(e,t={})=>VS(t,e)},"sanctum-lst":{health:e=>KS(e),lstList:e=>Ep(e),apyAll:e=>YS(e),apyIndividual:(e,t={})=>JS(t,e)},"solend-lending":{health:e=>eE(e),markets:e=>Ap(e),reserves:(e,t={})=>tE(t,e)},"execution-strategies":{health:()=>rE(),plan:(e,t={})=>nE(t)},"across-bridge":{health:e=>Dv(e),pools:(e,t={})=>Uv(t,e),suggestedFees:(e,t={})=>qv(t,e)},"beefy-yields":{health:e=>Hv(e),apy:(e,t={})=>jv(t,e),apyBreakdown:e=>zv(e)},"birdeye-tokens":{health:e=>Wv(e),tokenList:(e,t={})=>Gv(t,e)},"celestia-da":{health:e=>Kv(e),stats:e=>Yv(e),blockStats:(e,t={})=>Jv(t,e)},"das-assets":{health:e=>Xv(e),assetsByOwner:(e,t={})=>Qv(t,e),searchAssets:(e,t={})=>Zv(t,e),assetProof:(e,t={})=>ek(t,e)},"l2beat-tvl":{health:e=>tk(e),tvl:(e,t={})=>nk(t,e),activity:(e,t={})=>rk(t,e)},"spark-lend":{health:e=>ok(e),markets:(e,t={})=>ik(t,e)},"symbiotic-restaking":{health:e=>ak(e),vaults:(e,t={})=>sk(t,e),vaultDetail:(e,t={})=>ck(t,e)},"limit-order":{health:()=>uE(),prepare:(e,t={})=>pE(t,e),arm:(e,t={})=>mE(t,e)},"jupiter-dca":{health:()=>fE(),prepare:(e,t={})=>yE(t,e),arm:(e,t={})=>bE(t,e)},"protective-monitors":{health:()=>SE(),depeg:(e,t={})=>$p(t,e),oracleDeviation:(e,t={})=>Bp(t,e),exploitFeed:(e,t={})=>Mp(t,e),goplus:(e,t={})=>Fp(t,e),liquidationLadder:(e,t={})=>Dp(t,e)},"funding-scanner":{health:()=>_E(),scan:(e,t={})=>PE(t,e)},"perp-universal":{health:()=>BE(),fundingAll:(e,t={})=>ME(t,e),prepareOrder:(e,t={})=>FE(t,e)},"onchain-options":{health:()=>zs(),rank:(e,t={})=>Vs(t.listings||t,t)},"holder-clusters":{health:()=>UE(),score:(e,t={})=>qE(t)},kalshi:{health:()=>HE(),markets:(e,t={})=>jE(t)},"derive-options":{health:()=>zE(),rank:(e,t={})=>VE(t.listings||t,t)},limitless:{health:()=>WE(),markets:(e,t={})=>GE(t)},"dov-vaults":{health:()=>KE(),read:(e,t={})=>YE(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>JE(t.left||{},t.right||{})},"tee-attestation":{health:()=>XE(),verify:(e,t={})=>QE(t)},"keeper-mirror":{health:e=>ZE(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>tI(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>nI(t)}},sI=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),lI=new Set(["hl-exec"]);function e6(e){return lI.has(String(e||""))}function t6(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(lI.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=Yi().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!sI.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(sI.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(e6(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.`);t6(e,t,n);let o=Dc(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=Z4[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function n6({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||Yi().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 Fe(s,i??8,async d=>{if(!Dc(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await ve(()=>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 r6(e){return e.execution==="prepare"&&uI(e).length?"armed-local":e.execution||"read-only"}function o6(){return Yi().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:r6(e),localSignerSurfaces:uI(e),description:e.description}))}var n7={catalog:o6,health:n6,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{lI as EXECUTION_PROVIDERS,t6 as assertDataOpAllowed,n7 as data,A as dataCall,o6 as dataCatalog,n6 as dataHealth,e6 as isExecutionProvider,Q4 as routeUniversalNftLifecycle,aI as universalNftLifecycleCapabilities};