@oracle-agent/oracle 0.30.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/desk-server.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
var DP=Object.defineProperty;var G=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Tt=(e,t)=>{for(var n in t)DP(e,n,{get:t[n],enumerable:!0})};import tr from"node:net";import qP from"node:dns";function Ka(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 Vl(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 Wl(e){if(tr.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(tr.isIPv6(e)){let t=Ka(e);if(!t)return!1;let n=Ka("::ffff:0:0");return Vl(t,n,96)?Wl([...t.slice(12)].join(".")):Vl(t,Ka("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Vl(t,Ka(o),i)):!1}return!1}function jP(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(HP.has(n)||n.endsWith(".localhost")||n.endsWith(".internal"))return{ok:!1,error:`refused internal host ${n}`};let r=tr.isIP(n);return r!==0&&!Wl(n)?{ok:!1,error:`refused private address ${n}`}:{ok:!0,url:t,host:n,isLiteralIp:r!==0}}async function Gl(e,{lookupFn:t=qP.promises.lookup}={}){let n=jP(e);if(!n.ok)return n;if(n.isLiteralIp)return{ok:!0,url:n.url,addresses:[{address:n.host,family:tr.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=>!Wl(o.address))?{ok:!1,error:`refused: ${n.host} resolves to a non-public address`}:{ok:!0,url:n.url,addresses:r}}async function Kl({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||(tr.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(tr.isIP(p))return[{address:p,family:tr.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=zP((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 zP(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[Yl]=Object.freeze({pin:t}),e}function Jl(e){return typeof e=="function"&&typeof e[Yl]?.pin=="function"}function m0(e,t,n){if(!Jl(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Yl].pin(t,n)}var HP,Yl,f0=G(()=>{HP=new Set(["localhost","metadata.google.internal","metadata.goog"]);Yl=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as VP}from"node:crypto";function JP(e){let t=String(e||"").toLowerCase();return x0.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function XP(e){let t={};for(let[n,r]of Object.entries(e||{}))JP(n)||(t[n]=r);return t}function QP(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 ZP(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function eT(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([...x0,...i])].sort().map(u=>`${u}=${o[u]??""}`).join(`
|
|
3
|
-
`),c=VP("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function tT(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,g0):Math.min(250*2**e,g0)+Math.floor(Math.random()*100)}function Go(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ql(e,t,n){return Go(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ko(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function rT(e){return e?e.byteLength??e.length??0:0}async function w0(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&&(Ko(e),!r))throw Ql(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 Ql(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+=rT(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 Ql(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function b0(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function oT(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,b=t,S=a?{lookupFn:a}:{};if(c&&!s&&!Jl(b))throw Go(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let w=async(y,{status:k=null}={})=>{let v=await Gl(y,S);if(!v.ok)throw Go(k==null?`HTTP refused ${y}: ${v.error}`:`HTTP redirect to ${y} ${v.error}`,k==null?{}:{status:k});let x=new URL(y).hostname;if(s){if(g&&(await g.close(),g=null),!g)try{g=await Kl({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw Go(k==null?`HTTP refused ${y}: ${E?.message||E}`:`HTTP redirect to ${y} refused: ${E?.message||E}`,k==null?{}:{status:k})}g.pin(x,v.addresses),b=g.fetch}else m0(b,x,v.addresses);return v};try{let y=String(e),k={...r||{}};c&&await w(y);for(let v=0;v<=y0;v+=1){let x=await b(y,{method:n,headers:k,body:o,signal:h,redirect:"manual"});if(KP.has(x.status)){if(n!=="GET"&&n!=="HEAD"){let L=await w0(x,l??YP,{url:y,truncate:!0}),F=new Error(`HTTP ${x.status} ${n} ${y} redirected non-idempotent request`);throw F.status=x.status,F.body=b0(L)??L.slice(0,300),F}if(v===y0)throw Ko(x),new Error(`HTTP redirect loop for ${e}`);let P=x.headers?.get?.("location"),N;try{N=QP(P,y)}catch(L){throw Ko(x),L}let I=!ZP(N,y);if(Ko(x),I&&(k=XP(k)),c)await w(N,{status:x.status});else if(I){let L=await Gl(N,S);if(!L.ok){let F=new Error(`HTTP redirect from ${y} ${L.error}`);throw F.status=x.status,F.retryable=!1,F}s&&L.addresses?.length&&(g||(g=await Kl(u?{importUndici:u}:{})),g&&(g.pin(new URL(N).hostname,L.addresses),b=g.fetch))}y=N;continue}if(typeof d=="function")try{await d(x,{url:y})}catch(P){throw Ko(x),Go(P?.message||String(P))}let E=await w0(x,l,{url:y,onOversize:()=>m.abort()}),_=b0(E);if(!x.ok){let P=new Error(`HTTP ${x.status} ${n} ${y}`);throw P.status=x.status,P.retryAfter=x.headers?.get?.("retry-after")??null,P.body=_??E.slice(0,300),P}return _??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),g&&await g.close()}}async function A(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):GP,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 k;for(let v=0;v<=s;v++){m?.throwIfAborted?.();try{return await oT(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(x){k=x;let E=x?.status,_=x?.name==="AbortError"||x?.name==="TimeoutError"||m?.aborted,P=new Set([408,425,429]),N=x?.retryable===!1?!1:E!=null?P.has(E)||WP.has(E)&&h0.has(o):!_&&h0.has(o);if(v===s||!N)throw x;let I=tT(v,x?.retryAfter);m?await new Promise((L,F)=>{let O=setTimeout(L,I);m.addEventListener("abort",()=>{clearTimeout(O),F(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await nT(I)}}throw k};if(!(t.dedupe!==!1&&!m&&o==="GET"&&a==null))return g();let S=eT(o,e,i,{untrustedUrl:u,maxResponseBytes:h}),w=Xl.get(S);if(w)return w;let y=g().finally(()=>Xl.delete(S));return Xl.set(S,y),y}async function $e(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 ot(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 WP,h0,GP,g0,x0,KP,y0,YP,Xl,nT,j=G(()=>{f0();WP=new Set([408,425,429,500,502,503,504]),h0=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),GP=2,g0=4e3,x0=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],KP=new Set([301,302,303,307,308]),y0=3,YP=64*1024;Xl=new Map;nT=e=>new Promise(t=>setTimeout(t,e))});function eu(e){return S0.get(Number(e))||null}function k0(e,t=process.env){let n=eu(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function v0(e){return S0.has(Number(e))}var Zl,S0,E0=G(()=>{Zl={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}},S0=new Map(Object.values(Zl).map(e=>[e.chainId,e]))});var Ja={};Tt(Ja,{PUBLIC_RPC_FALLBACKS:()=>nu,erc20Allowance:()=>au,erc20BalanceOf:()=>Jo,resolveRpcUrl:()=>ru,rpcBlockNumber:()=>Yo,rpcCall:()=>V,rpcChainId:()=>ou,rpcGasPrice:()=>iu,rpcGetBalance:()=>nr,rpcHealth:()=>Mr,rpcHealthAll:()=>su,transactionReceipt:()=>Xo});import{Interface as iT,getAddress as aT}from"ethers";function xn(e,t){try{return aT(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function sT(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 tu(e){return e==null?null:Number.parseInt(String(e),16)}function ru(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=k0(e,n);return r||nu[Number(e)]||null}function lT(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!cT.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 V(e,t,n=[],r={}){let o=String(t||"");lT(o);let i=ru(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 A(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 Mr(e,t={}){let n=await V(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await V(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:eu(e)?.name||null}}async function Yo(e,t={}){let n=await V(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function ou(e,t={}){let n=await V(e,"eth_chainId",[],t);return parseInt(n,16)}async function iu(e,t={}){let n=await V(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function nr(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await V(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function au(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=xn(e.token||e.tokenAddress,"token"),o=xn(e.owner,"owner"),i=xn(e.spender,"spender"),a=Ya.encodeFunctionData("allowance",[o,i]),s=await V(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ya.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 Jo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=xn(e.token||e.tokenAddress,"token"),o=xn(e.account||e.owner||e.address,"account"),i=Ya.encodeFunctionData("balanceOf",[o]),a=await V(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ya.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 Xo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=sT(e.txHash||e.hash||e.transactionHash),o=await V(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=tu(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?xn(e.expectedTo,"expectedTo"):null,u=o.to?xn(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?xn(o.from,"receipt.from"):null,blockNumber:tu(o.blockNumber),transactionIndex:tu(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function su(e={}){let t=e.chainIds||Object.values(Zl).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!v0(r)&&!nu[r]&&!ru(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Mr(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ya,nu,cT,_e=G(()=>{j();E0();Ya=new iT(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);nu={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"};cT=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function A0(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 cu(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=A0(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)||uT.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 I0(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&A0(e,n[0]).address||null}var uT,lu=G(()=>{uT=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function fT(e,t,n){let r=Nt(t),o=Nt(n),i=Nt(e?.baseToken?.address),a=Nt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function hT(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Xa(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||dT).replace(/\/$/,"")}async function _0(e={}){let n=(await A(`${Xa(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function rr(e,t={}){if(!e)throw new Error("tokenAddress required");return A(`${Xa(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Qo(e,t={}){if(!e)throw new Error("query required");return A(`${Xa(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function P0(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return A(`${Xa(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function T0({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Zo({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Zo({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Nt(pT[Number(e)]||e),a=new Set(mT(r).filter(Boolean).map(Nt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>rr(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${Nt(m?.chainId)}:${Nt(m?.dexId)}:${Nt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>Nt(p?.chainId)===i).filter(p=>fT(p,t,n)).filter(p=>!a.size||a.has(Nt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:hT(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}var dT,pT,Nt,mT,Fr=G(()=>{j();lu();dT="https://api.dexscreener.com",pT=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Nt=e=>String(e??"").toLowerCase(),mT=e=>Array.isArray(e)?e:e==null?[]:[e]});import{readFileSync as yT}from"node:fs";import{homedir as wT}from"node:os";import{join as Qa}from"node:path";function bT(){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=wT();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Qa(t,".config","oracle")).trim();return[e,Qa(n,"exec.env")].filter(Boolean)}return[e,Qa(t,".config","oracle","exec.env"),Qa(t,".config","mad-desk","exec.env")].filter(Boolean)}function N0(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of bT())try{let i=yT(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 C0=G(()=>{});var O0=G(()=>{});import{createHash as xT,createHmac as L0,timingSafeEqual as ST}from"node:crypto";function es(e){return Array.isArray(e)?`[${e.map(es).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${es(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function $0(e,{required:t=!1}={}){try{return N0(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function du(e){let{signature:t,...n}=e;return n}function B0(e,{secret:t}={}){let n=$0(t);return n?{...e,signature:L0("sha256",n).update(es(du(e))).digest("hex")}:e}function kT(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 xT("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Pe(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=$0(o);if(i){let m=L0("sha256",i).update(es(du(e))).digest("hex");if(!vT(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>Za||!Number.isInteger(s)||s<0||s>Za||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=AT(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 B0({...du(e),calldataHash:kT(r)},{secret:o})}function vT(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:ST(n,r)}function uu(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function ET(e){let t=e==null?Za: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,Za)}function it({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=uu(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(uu(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,uu(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=ET(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function pu({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=R0,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=it({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)||R0)),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 b=Number((d-g)*10000n/(d===0n?1n:d));if(b>p.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return B0({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 AT(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 pe(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=pu({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Za,R0,Ye=G(()=>{C0();O0();Za=100,R0=2e4});import{createHash as IT,createHmac as _T,timingSafeEqual as aH}from"node:crypto";function mu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(mu).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${mu(e[n])}`).join(",")}}`}function M0(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function F0(e=process.env){return M0(process.env)||M0(e)}function NT(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function or(e){let t=NT(e);return IT("sha256").update(mu(t)).digest("hex")}function CT(e,t=F0()){return t?_T("sha256",t).update(String(e)).digest("hex"):""}function $(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+fu:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>TT)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:PT},m=or(p),f=F0(r),h=f?CT(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var PT,fu,TT,ne=G(()=>{PT=2,fu=300*1e3,TT=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Su={};Tt(Su,{PANCAKE_FEE_TIERS:()=>ts,UNI_V3_CHAINS:()=>Fe,UNI_V3_FEE_TIERS:()=>H0,UNI_V3_VENUES:()=>V0,uniV3Chains:()=>xu,uniV3EthUsdc:()=>rs,uniV3Health:()=>bu,uniV3PrepareExactIn:()=>wu,uniV3QuoteExactIn:()=>Zt,uniV3QuoteExactInPath:()=>yu});import{Interface as D0,getAddress as ei,isAddress as q0}from"ethers";function gu(e,t){let n=Number(e),r=Fe[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Fe).join(", ")})`);let o=V0[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 hu(e,t){let n=Fe[Number(t)];if(!e||e===j0||e===z0||/^eth$/i.test(String(e)))return ei(n.weth);let r=String(e);if(/^weth$/i.test(r))return ei(n.weth);if(/^usdc$/i.test(r))return ei(n.usdc);if(!q0(r))throw new Error(`invalid token address: ${e}`);return ei(r)}function RT(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 LT(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 Zt(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=gu(e.chainId??8453,e.venue),a=hu(e.tokenIn||"WETH",n),s=hu(e.tokenOut||Fe[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:H0,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let v of u){let x=ns.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:v,sqrtPriceLimitX96:0n}]);try{let E=await V(n,"eth_call",[{to:r,data:x},"latest"],t);if(!E||E==="0x"){d.push({fee:v,ok:!1,error:"empty result"});continue}let _=ns.decodeFunctionResult("quoteExactInputSingle",E),P={fee:v,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()};d.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(E){d.push({fee:v,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let v=d.map(x=>`${x.fee}:${x.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${v}`)}let m=e.liquidityUsd==null?await Zo({chainId:n,tokenA:a,tokenB:s,dexIds:RT(e.venue)},t).catch(()=>[]):[],f={};for(let v of m.slice(0,8))if(!(!v.pairAddress||!q0(v.pairAddress)))try{let x=await V(n,"eth_call",[{to:v.pairAddress,data:OT},"latest"],t),E=x&&x!=="0x"&&x.length<=66?Number.parseInt(x,16):NaN;if(!Number.isFinite(E)||E<=0||E>1e6)continue;(f[E]==null||v.liquidityUsd>f[E].liquidityUsd)&&(f[E]=v)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let v=BigInt(p.amountOut),E=d.filter(_=>_.ok&&Number((v-BigInt(_.amountOut))*10000n/v)<=h).filter(_=>f[_.fee]?.liquidityUsd!=null).sort((_,P)=>f[P.fee].liquidityUsd-f[_.fee].liquidityUsd)[0];E&&E.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:E.fee,chosenPoolUsd:f[E.fee].liquidityUsd,bandBps:h},p=E)}let b=f[p.fee]??null,S=m[0]??null,w=b??S,y=e.liquidityUsd??b?.liquidityUsd??S?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":S?"pair":null;return pe({venue:"uniswap-v3",chainId:n,chain:Fe[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:w,liquidityAttribution:k,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 yu(e={},t={}){let{chainId:n,quoter:r,router:o}=gu(e.chainId??8453),i=(e.tokens||[]).map(p=>hu(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=LT(i,a),l=ns.encodeFunctionData("quoteExactInput",[c,s]),u=await V(n,"eth_call",[{to:r,data:l},"latest"],t),d=ns.decodeFunctionResult("quoteExactInput",u);return pe({venue:"uniswap-v3",chainId:n,chain:Fe[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 rs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Zt({chainId:n,tokenIn:Fe[n].weth,tokenOut:Fe[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function wu(e={},t={}){let n=Number(e.chainId??8453),r=gu(n,e.venue),o=ei(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===j0||i===z0||/^eth$/i.test(i),s=await Zt(e,t),c=U0.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=U0.encodeFunctionData("multicall",[d,[c]]);return $({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:Pe(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function bu(e={}){let t=Number(e.chainId??8453);try{let n=await rs({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 xu(){return Object.entries(Fe).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var Fe,H0,OT,ns,U0,j0,z0,ts,V0,ir=G(()=>{_e();Fr();Ye();ne();Fe={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"}},H0=[100,500,3e3,1e4],OT="0xddca3f43",ns=new D0(["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)"]),U0=new D0(["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)"]),j0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",z0="0x0000000000000000000000000000000000000000",ts=[100,500,2500,1e4],V0={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Ru={};Tt(Ru,{UNI_V4_CHAINS:()=>ut,UNI_V4_FEE_TIERS:()=>Eu,computeV4PoolId:()=>as,decodeV4HookPermissions:()=>Iu,uniV4Chains:()=>Cu,uniV4Health:()=>Ou,uniV4InspectHook:()=>Pu,uniV4PrepareExactIn:()=>Nu,uniV4QuoteExactIn:()=>Sn,uniV4QuoteExactOut:()=>Tu});import{AbiCoder as $T,Interface as ku,getAddress as Ht,isAddress as vu,keccak256 as BT}from"ethers";function Iu(e){let t=oi(e),n=Number(BigInt(t)&FT),r=Object.fromEntries(W0.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(W0.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}function ri(e){let t=Number(e),n=ut[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ut).join(", ")})`);return{chainId:t,...n}}function oi(e){if(e==null||e==="")return Je;let t=String(e);if(!vu(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ht(t)}function Ur(e,t){let n=ut[Number(t)];if(ni(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(!vu(r))throw new Error(`invalid token address: ${e}`);return Ht(r)}function ni(e){let t=String(e||"").trim().toLowerCase();return!t||t===HT.toLowerCase()||t===Je.toLowerCase()||t==="eth"}function as({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Je}){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=oi(o);return BT(ti.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function _u({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Je}){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:oi(o)},zeroForOne:l}}function jT({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Iu(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!==Je&&(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===Je&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Je&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Je&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Je,returnsDelta:i,reasons:Object.freeze(s)})}async function Pu(e={},t={}){let n=ri(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Ur(e.tokenIn||"WETH",n.chainId),o=Ur(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=oi(e.hooks),{poolKey:c}=_u({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=as(c),u=t.rpcCall||V,d=os.encodeFunctionData("getSlot0",[l]),p=os.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===Je?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=os.decodeFunctionResult("getSlot0",m),b=os.decodeFunctionResult("getLiquidity",f)[0],S=g[0],w=S>0n,y=s===Je?null:typeof h=="string"&&h!=="0x"&&h.length>4,k=!!(i&Au),v=jT({hook:s,codePresent:y,initialized:w,dynamicFee:k});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:w,sqrtPriceX96:S.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:b.toString(),dynamicFee:k}),hook:Object.freeze({address:s,codePresent:y,codeBytes:y?(h.length-2)/2:0,permissions:Iu(s)}),risk:v})}async function Sn(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=ri(e.chainId??8453),a=Ur(e.tokenIn||"WETH",n),s=Ur(e.tokenOut||ut[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}]:[...Eu],u=e.hooks||Je,d=[],p=null;for(let x of l){let{poolKey:E,zeroForOne:_}=_u({tokenIn:a,tokenOut:s,fee:x.fee,tickSpacing:x.tickSpacing,hooks:u}),P=is.encodeFunctionData("quoteExactInputSingle",[{poolKey:E,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let N=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:P},"latest"],t);if(!N||N==="0x"){d.push({...x,ok:!1,error:"empty result"});continue}let I=is.decodeFunctionResult("quoteExactInputSingle",N),L={fee:x.fee,tickSpacing:x.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:E,zeroForOne:_,poolId:as({...E})};d.push(L),(!p||BigInt(L.amountOut)>BigInt(p.amountOut))&&(p=L)}catch(N){d.push({...x,ok:!1,error:String(N.message||N).slice(0,160)})}}if(!p){let x=d.map(E=>`${E.fee}/${E.tickSpacing}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${x}`)}let m=e.liquidityUsd==null?await Zo({chainId:n,tokenA:a,tokenB:s,dexIds:G0},t).catch(()=>[]):[],f=new Map;for(let x of m){let E=String(x.pairAddress||"").toLowerCase();E&&f.set(E,x)}let h=x=>f.get(String(x.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let x=BigInt(p.amountOut),_=d.filter(P=>P.ok&&Number((x-BigInt(P.amountOut))*10000n/x)<=g).filter(P=>h(P)?.liquidityUsd!=null).sort((P,N)=>h(N).liquidityUsd-h(P).liquidityUsd)[0];_&&_.poolId!==p.poolId&&(b={priceBestFee:p.fee,chosenFee:_.fee,chosenPoolUsd:h(_).liquidityUsd,bandBps:g},p=_)}let S=h(p),w=m[0]??null,y=S??w,k=e.liquidityUsd??S?.liquidityUsd??w?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":S?"pool":w?"pair":null;return pe({venue:"uniswap-v4",chainId:n,chain:ut[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:k,liquiditySource:y,liquidityAttribution:v,liquidityPick:b,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&vu(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&&!ni(e.tokenIn)&&!ni(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Je&&!(p.fee&Au)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:k,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Tu(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=ri(e.chainId??8453),a=Ur(e.tokenIn||"WETH",n),s=Ur(e.tokenOut||ut[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}]:[...Eu],u=e.hooks||Je,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=_u({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),b=is.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!S||S==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let w=is.decodeFunctionResult("quoteExactOutputSingle",S),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:h,zeroForOne:g,poolId:as({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(S){d.push({...f,ok:!1,error:String(S.message||S).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 T0({chainId:n,tokenA:a,tokenB:s,dexIds:G0},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ut[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 Nu(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=ri(r);if(oi(e.hooks)!==Je)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Au)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(ni(e.tokenIn)||ni(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Sn(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=ti.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=ti.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=ti.encode(["address","uint256"],[l.tokenOut,u]),g=ti.encode(["bytes","bytes[]"],[DT,[m,f,h]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,w=MT.encodeFunctionData("execute",[UT,[g],S]);return $({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:qT,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:w,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Cu(){return Object.entries(ut).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 Ou(e={}){let t=ri(e.chainId??8453),n=await V(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var ti,Je,ut,Eu,is,MT,os,W0,FT,Au,UT,DT,qT,HT,G0,Dr=G(()=>{_e();Fr();Ye();ne();ti=$T.defaultAbiCoder(),Je="0x0000000000000000000000000000000000000000",ut={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"}},Eu=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],is=new ku(["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)"]),MT=new ku(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),os=new ku(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),W0=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"]]),FT=(1n<<14n)-1n,Au=8388608;UT="0x10",DT="0x060c0f",qT="0x000000000022D473030F116dDEE9F6B43aC78BA3",HT="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";G0=["uniswap-v4","uniswapv4"]});function dt({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:Y0(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([Y0(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[K0]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${K0}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Y0(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function at(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var K0,kn=G(()=>{K0="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});function jN({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"?HN:qN}async function be(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=jN(t);return A(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cg(e={}){let t=await be({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function tn(e={}){return be({type:"allMids"},e)}async function zr(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return be({type:"l2Book",coin:String(e)},t)}async function hi(e={}){return be({type:"outcomeMeta"},e)}async function xs(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return be({type:"spotClearinghouseState",user:e},t)}async function Og(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return be({type:"userFills",user:e},t)}async function Ss(e={}){return be({type:"meta"},e)}async function bt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),be(t,e)}async function Vr({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 be(i,o)}async function ks({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return be({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Rg(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return be({type:"openOrders",user:e},t)}async function Lg(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return be({type:"frontendOpenOrders",user:e},t)}async function Wr(e,t={}){if(!e)throw new Error("hlUserState requires user");return be({type:"clearinghouseState",user:e},t)}async function vs(e={}){return be({type:"spotMeta"},e)}var qN,HN,mt=G(()=>{j();qN="https://api.hyperliquid.xyz/info",HN="https://api.hyperliquid-testnet.xyz/info"});async function Hg(e={}){let t=Date.now();if(xi.dexs&&t-xi.at<6e4&&!e.fetchImpl)return xi.dexs;let n=await be({type:"perpDexs"},e);return xi={at:t,dexs:Array.isArray(n)?n:[]},xi.dexs}async function jg(e="",t={}){let n=e||"",r=Date.now(),o=qg.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await be({type:"metaAndAssetCtxs",dex:e},t):await bt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return qg.set(n,c),c}function In(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=zg+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function An(e,t){let n=ld(e),r=ld(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=zg+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 ld(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 ud(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:In(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:An(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:ZN(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=An(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 Hg(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 jg(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 b=f[g];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let S=QN+m*1e4+g,w=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:S,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:w.markPx??null}}let{universe:r,ctxs:o}=await jg("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Hg(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 ud({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 ZN(e,t){let n=ld(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var zg,QN,xi,qg,Ts=G(()=>{mt();zg=1e8,QN=1e5,xi={at:0,dexs:null},qg=new Map});function Ue(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 xt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function dr(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=Ue(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 St(e,t="amount"){let n=dr(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Be(e,t,n="amount"){let r=Ue(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 Gr=G(()=>{});function oC(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 Vg(e,t){let n=Ue(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 jt(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=>jt(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)}:${jt(e[r],t)}`).join(",")}}`}function iC(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)||jt(n,"declared order type")!==jt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(jt(n,"declared order type")!==jt({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||jt(n,"declared order type")!==jt({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 aC(e,t,n){let r=Vg(e.s,"signed size"),o=Vg(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Be(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Be(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function sC(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=_n(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(xt(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=dr(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Be(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function Wg(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(Ue(e.s,"hl: signed size")!==Ue(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ue(e.p,"hl: signed price")!==Ue(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(jt(e.t,"signed order type")!==jt(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 Gg(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(Ue(e.s,"hl: bracket protection size")!==Ue(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ue(e.p,"hl: bracket protection price")!==Ue(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(Ue(i.triggerPx,"hl: triggerPx")!==Ue(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function cC(e){let t=String(e||"").replace(/\/$/,"");if(!eC.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function dd(e){return In(e)!=null}function lC(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(dd(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 uC(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(dd(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 Kg(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=_n(n.kind,"kind",48),o=nC[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=cC(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!==rC[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(tC.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=_n(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=In(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(lC(c,t),uC(c,l,t),r==="hip4-order"&&!dd(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");iC(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");Wg(u[0],n,l);let f=1;d!=null&&Gg(u[f++],n,l,d,"tp"),p!=null&&Gg(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");Wg(u[0],n,l)}aC(u[0],n,t),sC(n,t),s=Ue(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=_n(n.usd,"margin usd",64),d=Be(u,6,"hl: margin usd");if(dr(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=Be(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=oC(f,6)}}if(r==="builder-fee-approval"){let c=_n(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(_n(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=_n(n.maxFeeRate,"maxFeeRate",32);if(_n(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=Be(u.slice(0,-1),12,"hl: builder fee percent"),p=Be(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 eC,tC,nC,rC,_n,Yg=G(()=>{Gr();Ts();eC=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),tC=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),nC=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"}),rC=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"}),_n=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function pC(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 Ns(e,t={},n={}){let r=String(e?.kind||""),o=dC[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:pC(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 Kg(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 dC,pd=G(()=>{Yg();dC=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 mC,JsonRpcProvider as fC}from"ethers";function xC(e){return bC.test(String(e||""))}async function Cs(e,{contract:t=hC,rpc:n=yC,chainId:r=gC,balanceOf:o}={}){if(!xC(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new fC(n,r,{staticNetwork:!0}),a=new mC(t,wC,i);return BigInt(await a.balanceOf(e))}var hC,gC,yC,wC,bC,md=G(()=>{hC="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",gC=999,yC="https://rpc.hyperliquid.xyz/evm",wC=["function balanceOf(address owner) view returns (uint256)"],bC=/^0x[a-fA-F0-9]{40}$/});import{existsSync as SC,readFileSync as kC,lstatSync as vC}from"node:fs";import{homedir as Jg}from"node:os";import{join as fd}from"node:path";function IC(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Xg,t)?Xg[t]:AC}function CC(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Qg])return String(e[Qg]);let t=e.ORACLE_CONFIG_DIR||fd(Jg(),".config","oracle");return fd(t,"fee-recipient")}return fd(Jg(),".config","oracle","fee-recipient")}function hd(e=process.env){try{let t=CC(e);if(!SC(t)||vC(t).isSymbolicLink())return"";let n=kC(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function OC(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),EC)}function RC({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[PC]||"").trim(),o=String(e[TC]||NC).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=IC(t),a=OC(e[_C],{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=hd(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 Os({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=RC({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 Cs(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Zg(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function ey(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function ty(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var EC,AC,Xg,_C,PC,TC,Qg,NC,Si=G(()=>{md();EC=100,AC=5,Xg=Object.freeze({swap:5,bridge:5,perps:0,nft:0});_C="ORACLE_INTEGRATOR_FEE_BPS",PC="ORACLE_INTEGRATOR_FEE_RECIPIENT",TC="ORACLE_INTEGRATOR_ID",Qg="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",NC="oracle"});var Id={};Tt(Id,{HL_BUILDER_ADDRESS_ENV:()=>Rs,HL_BUILDER_DEFAULT_FEE_BPS:()=>LC,HL_BUILDER_FEE_ENV:()=>yd,HL_BUILDER_FEE_TIERS:()=>ki,HL_BUILDER_MAX_FEE_BPS:()=>gd,HL_PERP_MAX_SIG_FIGS:()=>ny,HL_PERP_PRICE_DECIMALS:()=>ry,HL_SIGNATURE_CHAIN_ID:()=>bd,MARGIN_MODE:()=>vi,ORDER_TYPES:()=>ct,TIF:()=>Ei,formatPerpPrice:()=>rn,formatPerpSize:()=>sy,hlBuilderFeeBpsForKind:()=>ay,hlPerpAssetInfo:()=>Pn,hlPrepareBracketOrder:()=>Ad,hlPrepareBuilderApproval:()=>kd,hlPrepareCancelOrder:()=>Ai,hlPreparePerpOrder:()=>Jr,hlPrepareUpdateIsolatedMargin:()=>Ed,hlPrepareUpdateLeverage:()=>vd,resolveBuilderFee:()=>xd});function oy(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 $C(e,t){let n=oy(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function BC(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 iy(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 ay(e="perp"){if(e==="perp"||e==="main")return ki.perp;if(e==="spot")return ki.spot;if(e==="hip3")return ki.hip3;if(e==="outcome"||e==="hip4")return ki.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function xd({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Rs]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Rs} must be an EVM address`);let o=hd(e);if(!o||o!==r)return null;let i=e?.[yd],a=ay(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: ${yd} must be a positive number in 0.1 bps increments`);if(s>gd)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${gd} 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 MC(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 be({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 FC(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||Cs;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Sd(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 UC(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 Sd(r,a,n)}function rn(e,t,n={}){let r=ry-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Sd(UC(e,ny,n),r,n)}function sy(e,t){let n=Sd(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 DC(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 Pn(e={},t={}){let n=await ud(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 wd(e,{tif:t=Ei.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case ct.LIMIT:return{limit:{tif:t}};case ct.MARKET:return{limit:{tif:Ei.IOC}};case ct.STOP_MARKET:case ct.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:rn(n,o),tpsl:e===ct.STOP_MARKET?"sl":"tp"}};case ct.STOP_LIMIT:case ct.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:rn(n,o),tpsl:e===ct.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Kr(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:bd,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 Yr(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Ns(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,$(r,{provider:e.provider||"hl-perps",kind:e.kind})}function kd(e={},t={}){let n=xd({env:t.env});if(!n)throw new Error(`hl-perps: ${Rs} 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:bd,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Kr(o,r,t)},e,t)}async function Jr(e={},t={}){let n=await Pn(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??ct.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=iy(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=sy(e.size??e.sz,n.szDecimals),s;if(r===ct.MARKET){let S=Number(n.markPx);if(!Number.isFinite(S)){let v=await tn(t);S=Number(v?.[n.coin]??v?.[String(n.assetId)]??NaN)}if(!Number.isFinite(S))throw new Error("hl-perps: no mark price available for a market order");let w=Number(e.maxSlippageBps??50);if(!Number.isInteger(w)||w<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(w>100)throw new Error(`hl-perps: maxSlippageBps ${w} exceeds the hard 100 bps cap`);let y=o?S*(1+w/1e4):S*(1-w/1e4);s=rn(y,n.szDecimals,{roundDown:o});let k=Math.abs(Number(s)/S-1)*1e4;if(k>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${k.toFixed(2)} bps from mark, above the ${w} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=rn(e.price??e.limitPx,n.szDecimals)}let c=wd(r,{tif:e.tif??(r===ct.MARKET?Ei.IOC:Ei.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=xd({env:t.env,kind:n.kind}),p=await FC(d,e,t),m=p.exempt?null:d,f=await MC(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=DC(a,s);return Yr({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:b,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...Kr(u,g,t)},e,t)}async function Ai(e={},t={}){let n=await Pn(BC(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=oy(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Kr(i,Number(e.nonce??Date.now()),t)},e,t)}async function vd(e={},t={}){let n=await Pn(e,t),r=$C(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||vi.CROSS).toLowerCase();if(o!==vi.CROSS&&o!==vi.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===vi.CROSS,leverage:r};return Yr({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,...Kr(i,Number(e.nonce??Date.now()),t)},e,t)}async function Ed(e={},t={}){let n=await Pn(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=Be(o,6,"hl-perps: usd"),a=iy(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Kr(s,Number(e.nonce??Date.now()),t)},e,t)}async function Ad(e={},t={}){let n=await Jr(e,t),r=await Pn(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:rn(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:wd(ct.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:rn(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:wd(ct.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 Yr({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:rn(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:rn(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Kr(a,Number(e.nonce??Date.now()),t)},e,t)}var ny,ry,bd,LC,gd,Rs,yd,ki,ct,Ei,vi,Ls=G(()=>{mt();Ts();Gr();ne();pd();md();Si();ny=5,ry=6,bd="0x66eee",LC=2,gd=10,Rs="ORACLE_HL_BUILDER_ADDRESS",yd="ORACLE_HL_BUILDER_FEE_BPS",ki=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),ct=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Ei=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),vi=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function Kd(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Cn}var Cn,Gs=G(()=>{Cn="0x000000000000000000000000000000000000dEaD"});var ep={};Tt(ep,{LIFI_API:()=>kw,lifiChains:()=>Zd,lifiHealth:()=>Xd,lifiPrepare:()=>Qd,lifiQuote:()=>On});function Jd(e={}){return(e.baseUrl||process.env.LIFI_API_URL||kw).replace(/\/$/,"")}function WO(e){let t=String(e||Yd).toLowerCase();return t===Yd.toLowerCase()||t===VO}function Sw(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 Xd(e={}){let t=await A(`${Jd(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 On(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Yd,toToken:i,fromAmount:a,fromAddress:s=Cn}=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=it({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 Os({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(ey(u)))c.set(g,b);let d=await A(`${Jd(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=pe(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 Qd(e={},t={}){let n=await On(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(!WO(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:Sw(s,"approval token"),spender:Sw(a,"approval spender"),amount:String(e.fromAmount)}}return $({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:Pe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Zd(e={}){return A(`${Jd(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var kw,Yd,VO,Oi=G(()=>{j();Ye();Gs();ne();Si();kw="https://li.quest/v1";Yd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",VO="0x0000000000000000000000000000000000000000"});var rp={};Tt(rp,{ZEROX_API:()=>Ow,zeroxHealth:()=>tp,zeroxPrepare:()=>np,zeroxPrice:()=>Js,zeroxQuote:()=>Ln});function Rw(e={}){return dt({provider:"zerox",defaultUrl:Ow,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Lw(e={}){return Rw(e).baseUrl}function Ys(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $w(e={}){return at({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Ys(e)},Rw(e).trusted)}async function tp(e={}){if(!Ys(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Js({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 Js(e={},t={}){if(!Ys(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),A(`${Lw(t)}/swap/allowance-holder/price?${s}`,{headers:$w(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ln(e={},t={}){if(!Ys(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=it({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 A(`${Lw(t)}/swap/allowance-holder/quote?${c}`,{headers:$w(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?pe(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 np(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Ln(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 $({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:Pe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var Ow,Li=G(()=>{j();Ye();kn();ne();Ow="https://api.0x.org"});async function Bw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await op({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 op(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||XO).replace(/\/$/,"");return A(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Mw(e={}){try{let t=await ip({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 ip(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=it({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||QO).replace(/\/$/,""),u=await A(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?pe(u,{chainId:Number(e.originChainId||e.chainId||eR[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 Fw(e={}){try{let t=await Xs({user:Cn,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 Xs(e={},t={}){let{user:n=Cn,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=it({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||ZO).replace(/\/$/,""),d=await A(`${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}:pe(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 Uw(e={},t={}){let n=await Xs(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:Pe(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return $({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}var XO,QO,ZO,eR,Dw=G(()=>{j();Ye();Gs();ne();XO="https://across.to/api",QO="https://api.hop.exchange/v1",ZO="https://api.relay.link",eR={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function ap(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function qw(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var y7,Qs=G(()=>{y7=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Zs from"node:fs";import nR from"node:os";import no from"node:path";import{fileURLToPath as rR}from"node:url";function Hw(){return process.env.ORACLE_FAKE_HOME||nR.homedir()}function iR(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function ec(){return iR()?process.env.ORACLE_CONFIG_DIR||no.join(Hw(),".config","oracle"):no.join(Hw(),".config","oracle")}function aR(){return no.join(ec(),"desk.json")}function sR(){return no.join(ec(),"env")}function to({force:e=!1}={}){if(to._done&&!e)return to._result||null;to._done=!0;let t={},n=(o,i)=>{if(i==null)return;let a=String(i).trim();a&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=a,t[o]=a))};try{let o=sR();if(Zs.existsSync(o))for(let i of Zs.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=aR();if(Zs.existsSync(o)){let i=JSON.parse(Zs.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),to._result=Object.keys(t).length?t:null,to._result}var oR,v7,jw=G(()=>{oR=no.dirname(rR(import.meta.url)),v7=no.resolve(oR,"../..");try{to()}catch{}});var tc={};Tt(tc,{armPreparedAction:()=>hR,callSigner:()=>zw,queueOwnerAction:()=>Vw});import{existsSync as cR,readFileSync as lR}from"node:fs";import{request as uR}from"node:http";import dR from"node:path";function mR(e=process.env){let t=String(e.ORACLE_SIGNER_URL||pR).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 fR(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=dR.join(ec(),"signer","signer-token");return cR(t)?lR(t,"utf8").trim():null}function zw(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=mR(r),a=fR(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=uR({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 Vw(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return zw("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function hR(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 Vw(n,t)}var pR,nc=G(()=>{jw();pR="http://127.0.0.1:9462"});var fp={};Tt(fp,{COW_CANCEL_TYPES:()=>Yw,COW_HOSTS:()=>oc,COW_ORDER_TYPES:()=>rc,COW_SETTLEMENT:()=>Ww,COW_VAULT_RELAYER:()=>Gw,armCowOrder:()=>xR,buildArmedCowOrder:()=>pp,cowCancelOrders:()=>IR,cowChains:()=>mp,cowHealth:()=>up,cowOrder:()=>sc,cowOrderStatus:()=>ac,cowOrderUid:()=>SR,cowPrepareCancel:()=>ER,cowPrepareOrder:()=>dp,cowQuote:()=>cn,cowSignCancel:()=>AR,cowSignOrder:()=>kR,cowSubmitSignedOrder:()=>vR,cowVerifyOrderFill:()=>PR});import{TypedDataEncoder as cp,getAddress as $i,isAddress as gR}from"ethers";function ic(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=oc[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function yR(e,t="v1",n={}){let r=ic(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function sn(e,t){let n=String(e||"").trim();if(!gR(n))throw new Error(`cowswap: ${t} must be an address`);return $i(n).toLowerCase()}function ro(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 Jw(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 Xw(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function wR({digest:e,owner:t,validTo:n}={}){let r=Jw(e,"order digest").slice(2),o=sn(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function lp(e){let t=Ww[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:$i(t)}}function bR(e={},t,n){let r=sn(e.sellToken,"sellToken"),o=sn(e.buyToken,"buyToken"),i=sn(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=Jw(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ro(e.sellAmount,"sellAmount"),buyAmount:ro(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:ro(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function up(e={}){try{let t=await cn({chainId:1,sellToken:sp[1],buyToken:Kw[1],sellAmountBeforeFee:"1000000000000000",from:Cn},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 cn(e={},t={}){let n=Number(e.chainId??1),r=Kd(e.from||e.owner),o=e.sellToken||sp[n],i=e.buyToken||Kw[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=sp[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 A(`${ic(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?pe(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function dp(e={},t={}){let n=Number(e.chainId??1),r=sn(Kd(e.from||e.owner||e.signer),"owner"),o=await cn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=bR(o?.quote||o,n,r),a=lp(n),s={domain:a,types:rc,primaryType:"Order",message:i},c=cp.hash(a,rc,i),l=Gw[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return $({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:$i(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:$i(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:$i(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:pp({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 pp(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=oc[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=sn(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=cp.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 xR(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=e.localSignerEnvelope||pp(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function ac(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return A(`${ic(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sc(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return A(`${ic(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function SR(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||cp.hash(lp(n),rc,r),i=e.owner||e.from||e.signer||r.receiver;return wR({digest:o,owner:i,validTo:r.validTo})}async function kR(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function vR(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function ER(e={}){let t=Number(e.chainId??1),n=sn(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((a,s)=>Xw(a,`orderUids[${s}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=lp(t);return $({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:Yw,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function AR(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function IR(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function _R(e={}){return ro(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function PR(e={},t={}){let n=Number(e.chainId??1),r=Xw(e.uid||e.orderUid),o=t.order||await sc({chainId:n,uid:r},t),i=t.status||o.status||await ac({chainId:n,uid:r},t).catch(()=>null),a=t.trades||await A(`${yR(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=Array.isArray(a)?a:[],c=e.expectedOwner?sn(e.expectedOwner,"expectedOwner"):null;if(c&&sn(o.owner||s[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:s};let l=0n;for(let p of s.filter(m=>String(m.orderUid||"").toLowerCase()===r))l+=BigInt(_R(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(ro(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(ro(e.minBuyAmount,"minBuyAmount")):0n,d=l>=u&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:l.toString(),minBuyAmount:e.minBuyAmount??null,trades:s,settlementTxs:[...new Set(s.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function mp(){return Object.keys(oc).map(Number)}var oc,Ww,Gw,sp,Kw,rc,Yw,Bi=G(()=>{j();Ye();Qs();Gs();ne();oc={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"},Ww=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Gw=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),sp={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Kw={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},rc=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"}]}),Yw=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{existsSync as qS,readFileSync as HS}from"node:fs";import{dirname as DS,join as Rc}from"node:path";import{fileURLToPath as Y$}from"node:url";function jS(e){let t=DS(Y$(e));for(let n=0;n<8;n+=1){let r=Rc(t,"package.json");if(qS(r))try{let i=JSON.parse(HS(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=DS(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function zS(e){return JSON.parse(HS(Rc(jS(e),"package.json"),"utf8"))}function Lc(e,t){let n=jS(t),r=Rc(n,e);return qS(r)?r:Rc(n,"dist","assets",e)}var $c=G(()=>{});import{isAddress as J$}from"ethers";function Q$(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:VS,tag:`v${VS}`}),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 Bc(e){let t=xr[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function ia(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function aa(e,t){let n=String(e||"");if(!J$(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function WS(e,t){let n=Bc(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");ia(i,"safe-erc20: supply"),aa(a,"safe-erc20: initialHolder"),aa(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(ia(i,"safe-erc721-drop: cap"),aa(a,"safe-erc721-drop: treasury"),ia(s,"safe-erc721-drop: mintPrice"),ia(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");aa(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;aa(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`)}ia(i,"safe-vesting: durationSeconds")}return n}function GS(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var VS,X$,xr,Mc=G(()=>{VS="5.0.2",X$={"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"]}};xr=Object.freeze(Object.fromEntries(Object.entries(X$).map(([e,t])=>[e,Q$(e,t)])))});import{spawnSync as sm}from"node:child_process";import{existsSync as Sr,readFileSync as Fc,readdirSync as KS,statSync as YS}from"node:fs";import{join as Wt}from"node:path";import{createHash as Z$}from"node:crypto";function Dc(){return Sr(sa)?KS(sa).filter(e=>xr[e]&&YS(Wt(sa,e)).isDirectory()).map(e=>{let t=Wt(sa,e),n=Wt(t,"SECURITY.md");return{id:e,path:t,metadata:Bc(e),securityNotice:Sr(n)?Fc(n,"utf8").slice(0,500):null,disclaimer:Uc}}):[]}function JS(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Wt(e,".foundry/bin/forge")];for(let n of t)if(sm(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function eB(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:sm("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function xo(e,t,n){let r=sm(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 tB(e){let t=Z$("sha256");function n(r){let o=YS(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of KS(r).sort())n(Wt(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(Fc(r)))}return n(e),t.digest("hex")}function ca(e,t={}){let n=Bc(e),r=t.allowSkipStatic!==!1,o=Wt(sa,e);if(!Sr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=JS();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(!Sr(Wt(o,"lib","forge-std"))){let m=xo(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
3
|
+
`),c=VP("sha256").update(s).digest("hex").slice(0,32),l=`${r.untrustedUrl?"untrusted":"trusted"}:${r.maxResponseBytes??"unbounded"}`;return`${e} ${t} ${l} ${c}`}function tT(e,t){let n=Number(t);return Number.isFinite(n)&&n>0?Math.min(n*1e3,g0):Math.min(250*2**e,g0)+Math.floor(Math.random()*100)}function Go(e,t={}){let n=new Error(e);return n.retryable=!1,Object.assign(n,t),n}function Ql(e,t,n){return Go(`HTTP response from ${e} exceeded maxResponseBytes ${n} (${t})`,{oversize:!0})}function Ko(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function rT(e){return e?e.byteLength??e.length??0:0}async function w0(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&&(Ko(e),!r))throw Ql(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 Ql(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+=rT(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 Ql(n,`streamed ${c} bytes`,t);let u=Buffer.concat(s);return(l?u.subarray(0,t):u).toString("utf8")}function b0(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function oT(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,b=t,S=a?{lookupFn:a}:{};if(c&&!s&&!Jl(b))throw Go(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let w=async(y,{status:k=null}={})=>{let v=await Gl(y,S);if(!v.ok)throw Go(k==null?`HTTP refused ${y}: ${v.error}`:`HTTP redirect to ${y} ${v.error}`,k==null?{}:{status:k});let x=new URL(y).hostname;if(s){if(g&&(await g.close(),g=null),!g)try{g=await Kl({requireUndici:!0,...u?{importUndici:u}:{}})}catch(E){throw Go(k==null?`HTTP refused ${y}: ${E?.message||E}`:`HTTP redirect to ${y} refused: ${E?.message||E}`,k==null?{}:{status:k})}g.pin(x,v.addresses),b=g.fetch}else m0(b,x,v.addresses);return v};try{let y=String(e),k={...r||{}};c&&await w(y);for(let v=0;v<=y0;v+=1){let x=await b(y,{method:n,headers:k,body:o,signal:h,redirect:"manual"});if(KP.has(x.status)){if(n!=="GET"&&n!=="HEAD"){let L=await w0(x,l??YP,{url:y,truncate:!0}),F=new Error(`HTTP ${x.status} ${n} ${y} redirected non-idempotent request`);throw F.status=x.status,F.body=b0(L)??L.slice(0,300),F}if(v===y0)throw Ko(x),new Error(`HTTP redirect loop for ${e}`);let P=x.headers?.get?.("location"),N;try{N=QP(P,y)}catch(L){throw Ko(x),L}let I=!ZP(N,y);if(Ko(x),I&&(k=XP(k)),c)await w(N,{status:x.status});else if(I){let L=await Gl(N,S);if(!L.ok){let F=new Error(`HTTP redirect from ${y} ${L.error}`);throw F.status=x.status,F.retryable=!1,F}s&&L.addresses?.length&&(g||(g=await Kl(u?{importUndici:u}:{})),g&&(g.pin(new URL(N).hostname,L.addresses),b=g.fetch))}y=N;continue}if(typeof d=="function")try{await d(x,{url:y})}catch(P){throw Ko(x),Go(P?.message||String(P))}let E=await w0(x,l,{url:y,onOversize:()=>m.abort()}),_=b0(E);if(!x.ok){let P=new Error(`HTTP ${x.status} ${n} ${y}`);throw P.status=x.status,P.retryAfter=x.headers?.get?.("retry-after")??null,P.body=_??E.slice(0,300),P}return _??E}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(f),g&&await g.close()}}async function A(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):GP,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 k;for(let v=0;v<=s;v++){m?.throwIfAborted?.();try{return await oT(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(x){k=x;let E=x?.status,_=x?.name==="AbortError"||x?.name==="TimeoutError"||m?.aborted,P=new Set([408,425,429]),N=x?.retryable===!1?!1:E!=null?P.has(E)||WP.has(E)&&h0.has(o):!_&&h0.has(o);if(v===s||!N)throw x;let I=tT(v,x?.retryAfter);m?await new Promise((L,F)=>{let O=setTimeout(L,I);m.addEventListener("abort",()=>{clearTimeout(O),F(m.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await nT(I)}}throw k};if(!(t.dedupe!==!1&&!m&&o==="GET"&&a==null))return g();let S=eT(o,e,i,{untrustedUrl:u,maxResponseBytes:h}),w=Xl.get(S);if(w)return w;let y=g().finally(()=>Xl.delete(S));return Xl.set(S,y),y}async function $e(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 ot(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 WP,h0,GP,g0,x0,KP,y0,YP,Xl,nT,j=G(()=>{f0();WP=new Set([408,425,429,500,502,503,504]),h0=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),GP=2,g0=4e3,x0=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],KP=new Set([301,302,303,307,308]),y0=3,YP=64*1024;Xl=new Map;nT=e=>new Promise(t=>setTimeout(t,e))});function eu(e){return S0.get(Number(e))||null}function k0(e,t=process.env){let n=eu(e);if(!n)return null;for(let r of n.rpcEnv){let o=(t[r]||"").trim();if(o)return o}return null}function v0(e){return S0.has(Number(e))}var Zl,S0,E0=G(()=>{Zl={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}},S0=new Map(Object.values(Zl).map(e=>[e.chainId,e]))});var Ja={};Tt(Ja,{PUBLIC_RPC_FALLBACKS:()=>nu,erc20Allowance:()=>au,erc20BalanceOf:()=>Jo,resolveRpcUrl:()=>ru,rpcBlockNumber:()=>Yo,rpcCall:()=>V,rpcChainId:()=>ou,rpcGasPrice:()=>iu,rpcGetBalance:()=>nr,rpcHealth:()=>Mr,rpcHealthAll:()=>su,transactionReceipt:()=>Xo});import{Interface as iT,getAddress as aT}from"ethers";function xn(e,t){try{return aT(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function sT(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 tu(e){return e==null?null:Number.parseInt(String(e),16)}function ru(e,{rpcUrl:t,env:n=process.env}={}){if(t)return t;let r=k0(e,n);return r||nu[Number(e)]||null}function lT(e){let t=String(e||""),n=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!cT.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 V(e,t,n=[],r={}){let o=String(t||"");lT(o);let i=ru(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 A(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 Mr(e,t={}){let n=await V(e,"eth_blockNumber",[],t),r=parseInt(n,16),o=await V(e,"eth_chainId",[],t),i=parseInt(o,16);return{ok:Number.isFinite(r)&&i===Number(e),chainId:Number(e),reportedChainId:i,blockNumber:r,name:eu(e)?.name||null}}async function Yo(e,t={}){let n=await V(e,"eth_blockNumber",[],t);return parseInt(n,16)}async function ou(e,t={}){let n=await V(e,"eth_chainId",[],t);return parseInt(n,16)}async function iu(e,t={}){let n=await V(e,"eth_gasPrice",[],t);if(n==null)return null;try{return BigInt(n)}catch{return null}}async function nr(e,t,n={}){if(!t)throw new Error("rpcGetBalance requires address");let r=await V(e,"eth_getBalance",[t,"latest"],n);return{chainId:Number(e),address:t,balanceWei:BigInt(r).toString(),balanceHex:r}}async function au(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=xn(e.token||e.tokenAddress,"token"),o=xn(e.owner,"owner"),i=xn(e.spender,"spender"),a=Ya.encodeFunctionData("allowance",[o,i]),s=await V(n,"eth_call",[{to:r,data:a},e.blockTag||"latest"],t),c=Ya.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 Jo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=xn(e.token||e.tokenAddress,"token"),o=xn(e.account||e.owner||e.address,"account"),i=Ya.encodeFunctionData("balanceOf",[o]),a=await V(n,"eth_call",[{to:r,data:i},e.blockTag||"latest"],t),s=Ya.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 Xo(e={},t={}){let n=Number(e.chainId??t.chainId??1),r=sT(e.txHash||e.hash||e.transactionHash),o=await V(n,"eth_getTransactionReceipt",[r],t);if(!o)return{ok:!1,chainId:n,txHash:r,status:"pending",receipt:null,reason:"receipt pending"};let i=tu(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?xn(e.expectedTo,"expectedTo"):null,u=o.to?xn(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?xn(o.from,"receipt.from"):null,blockNumber:tu(o.blockNumber),transactionIndex:tu(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}async function su(e={}){let t=e.chainIds||Object.values(Zl).map(r=>r.chainId),n={};return await Promise.all(t.map(async r=>{if(!v0(r)&&!nu[r]&&!ru(r,e)){n[r]={ok:!1,error:"no rpc configured",chainId:r};return}try{n[r]=await Mr(r,e)}catch(o){n[r]={ok:!1,chainId:r,error:String(o.message||o)}}})),n}var Ya,nu,cT,_e=G(()=>{j();E0();Ya=new iT(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);nu={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"};cT=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/});function A0(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 cu(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=A0(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)||uT.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 I0(e,t=[]){let n=Array.isArray(t)?t:[];return n.length&&A0(e,n[0]).address||null}var uT,lu=G(()=>{uT=new Set(["usdc","usdt","usdg","dai","usd1","usde","pyusd"])});function fT(e,t,n){let r=Nt(t),o=Nt(n),i=Nt(e?.baseToken?.address),a=Nt(e?.quoteToken?.address);return i===r&&a===o||i===o&&a===r}function hT(e){let t=Number(e?.liquidity?.usd);return Number.isFinite(t)&&t>=0?t:null}function Xa(e={}){return(e.baseUrl||process.env.DEXSCREENER_API_URL||dT).replace(/\/$/,"")}async function _0(e={}){let n=(await A(`${Xa(e)}/latest/dex/search?q=USDC`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3}))?.pairs?.length||0;return{ok:n>0,pairSample:n}}async function rr(e,t={}){if(!e)throw new Error("tokenAddress required");return A(`${Xa(t)}/latest/dex/tokens/${e}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Qo(e,t={}){if(!e)throw new Error("query required");return A(`${Xa(t)}/latest/dex/search?q=${encodeURIComponent(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function P0(e,t,n={}){if(!e||!t)throw new Error("chainId and pairAddress required");return A(`${Xa(n)}/latest/dex/pairs/${e}/${t}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3})}async function T0({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){return(await Zo({chainId:e,tokenA:t,tokenB:n,dexIds:r},o))[0]??null}async function Zo({chainId:e,tokenA:t,tokenB:n,dexIds:r=[]}={},o={}){if(e==null||!t||!n)throw new Error("chainId, tokenA, and tokenB required");let i=Nt(pT[Number(e)]||e),a=new Set(mT(r).filter(Boolean).map(Nt)),s=[...new Set([t,n].map(p=>String(p)).filter(Boolean))],c=await Promise.allSettled(s.map(p=>rr(p,{...o,baseUrl:o.dexscreenerBaseUrl,timeoutMs:o.dexscreenerTimeoutMs??Math.min(Number(o.timeoutMs??4e3),4e3)}))),l=new Set,u=[];for(let p of c)if(p.status==="fulfilled")for(let m of p.value?.pairs||p.value?.data?.pairs||[]){let f=`${Nt(m?.chainId)}:${Nt(m?.dexId)}:${Nt(m?.pairAddress)}`;l.has(f)||(l.add(f),u.push(m))}return u.filter(p=>Nt(p?.chainId)===i).filter(p=>fT(p,t,n)).filter(p=>!a.size||a.has(Nt(p?.dexId))).map(p=>({pairAddress:p.pairAddress??null,dexId:p.dexId??null,chainId:p.chainId??null,liquidityUsd:hT(p),pairCreatedAt:p.pairCreatedAt??null})).filter(p=>p.liquidityUsd!=null).sort((p,m)=>m.liquidityUsd-p.liquidityUsd)}var dT,pT,Nt,mT,Fr=G(()=>{j();lu();dT="https://api.dexscreener.com",pT=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avalanche",999:"hyperevm",4663:"robinhood"}),Nt=e=>String(e??"").toLowerCase(),mT=e=>Array.isArray(e)?e:e==null?[]:[e]});import{readFileSync as yT}from"node:fs";import{homedir as wT}from"node:os";import{join as Qa}from"node:path";function bT(){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=wT();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let n=(process.env.ORACLE_CONFIG_DIR||Qa(t,".config","oracle")).trim();return[e,Qa(n,"exec.env")].filter(Boolean)}return[e,Qa(t,".config","oracle","exec.env"),Qa(t,".config","mad-desk","exec.env")].filter(Boolean)}function N0(e,t,n){let r=e??process.env[t]??process.env[n];if(!String(r||"").trim())for(let o of bT())try{let i=yT(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 C0=G(()=>{});var O0=G(()=>{});import{createHash as xT,createHmac as L0,timingSafeEqual as ST}from"node:crypto";function es(e){return Array.isArray(e)?`[${e.map(es).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${es(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function $0(e,{required:t=!1}={}){try{return N0(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(n){if(t)throw n;return null}}function du(e){let{signature:t,...n}=e;return n}function B0(e,{secret:t}={}){let n=$0(t);return n?{...e,signature:L0("sha256",n).update(es(du(e))).digest("hex")}:e}function kT(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 xT("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function Pe(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=$0(o);if(i){let m=L0("sha256",i).update(es(du(e))).digest("hex");if(!vT(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>Za||!Number.isInteger(s)||s<0||s>Za||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=AT(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 B0({...du(e),calldataHash:kT(r)},{secret:o})}function vT(e,t){let n=Buffer.from(String(e??""),"utf8"),r=Buffer.from(String(t??""),"utf8");return n.length!==r.length||n.length===0?!1:ST(n,r)}function uu(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function ET(e){let t=e==null?Za: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,Za)}function it({liquidityUsd:e,priceChange5m:t=0,quoteAgeMs:n=0,crossChain:r=!1,requestedCapBps:o}={}){let i=uu(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(uu(t,0))*2),c=Math.min(40,Math.floor(Math.max(0,uu(n,0))/5e3)*5),l=Math.max(25,Math.ceil(20+a+s+c)),u=ET(o);return{mode:"auto",requiredBps:l,selectedBps:Math.min(l,u),capBps:u,executable:l<=u}}function pu({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=R0,secret:u}={}){let d=BigInt(n??0);if(d<=0n)throw new Error("auto-slippage guard requires positive quoteAmountOut");let p=it({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)||R0)),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 b=Number((d-g)*10000n/(d===0n?1n:d));if(b>p.capBps)throw new Error(`auto-slippage: realised floor implies ${b} bps, above cap ${p.capBps} \u2014 refusing to issue a guard weaker than advertised`);return B0({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 AT(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 pe(e,{chainId:t,venue:n,amountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c=Date.now(),ttlMs:l}={}){let u=pu({chainId:t,venue:n,quoteAmountOut:r,liquidityUsd:o,priceChange5m:i,crossChain:a,requestedCapBps:s,quotedAtMs:c,ttlMs:l});return{...e,autoSlippage:u,amountOutMinimum:u.minAmountOut}}var Za,R0,Ye=G(()=>{C0();O0();Za=100,R0=2e4});import{createHash as IT,createHmac as _T,timingSafeEqual as cH}from"node:crypto";function mu(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(mu).join(",")}]`:`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${mu(e[n])}`).join(",")}}`}function M0(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function F0(e=process.env){return M0(process.env)||M0(e)}function NT(e){let{prepareHash:t,prepareMac:n,note:r,...o}=e||{};return o}function or(e){let t=NT(e);return IT("sha256").update(mu(t)).digest("hex")}function CT(e,t=F0()){return t?_T("sha256",t).update(String(e)).digest("hex"):""}function $(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+fu:Number(i),u=l-c;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(l)||u<=0||u>TT)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let p={...s,preparedAt:c,expiresAt:l,prepareVersion:PT},m=or(p),f=F0(r),h=f?CT(m,f):void 0,g={...p,prepareHash:m};return h&&(g.prepareMac=h),g}var PT,fu,TT,ne=G(()=>{PT=2,fu=300*1e3,TT=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Su={};Tt(Su,{PANCAKE_FEE_TIERS:()=>ts,UNI_V3_CHAINS:()=>Fe,UNI_V3_FEE_TIERS:()=>H0,UNI_V3_VENUES:()=>V0,uniV3Chains:()=>xu,uniV3EthUsdc:()=>rs,uniV3Health:()=>bu,uniV3PrepareExactIn:()=>wu,uniV3QuoteExactIn:()=>Zt,uniV3QuoteExactInPath:()=>yu});import{Interface as D0,getAddress as ei,isAddress as q0}from"ethers";function gu(e,t){let n=Number(e),r=Fe[n];if(!r)throw new Error(`uniswap-v3: unsupported chainId ${e} (supported: ${Object.keys(Fe).join(", ")})`);let o=V0[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 hu(e,t){let n=Fe[Number(t)];if(!e||e===j0||e===z0||/^eth$/i.test(String(e)))return ei(n.weth);let r=String(e);if(/^weth$/i.test(r))return ei(n.weth);if(/^usdc$/i.test(r))return ei(n.usdc);if(!q0(r))throw new Error(`invalid token address: ${e}`);return ei(r)}function RT(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 LT(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 Zt(e={},t={}){let{chainId:n,quoter:r,router:o,feeTiers:i}=gu(e.chainId??8453,e.venue),a=hu(e.tokenIn||"WETH",n),s=hu(e.tokenOut||Fe[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:H0,u=e.fee!=null?[Number(e.fee)]:e.tryFees===!1?[l[Math.min(2,l.length-1)]]:[...l],d=[],p=null;for(let v of u){let x=ns.encodeFunctionData("quoteExactInputSingle",[{tokenIn:a,tokenOut:s,amountIn:c,fee:v,sqrtPriceLimitX96:0n}]);try{let E=await V(n,"eth_call",[{to:r,data:x},"latest"],t);if(!E||E==="0x"){d.push({fee:v,ok:!1,error:"empty result"});continue}let _=ns.decodeFunctionResult("quoteExactInputSingle",E),P={fee:v,ok:!0,amountOut:_[0].toString(),sqrtPriceX96After:_[1].toString(),initializedTicksCrossed:Number(_[2]),gasEstimate:_[3].toString()};d.push(P),(!p||BigInt(P.amountOut)>BigInt(p.amountOut))&&(p=P)}catch(E){d.push({fee:v,ok:!1,error:String(E.message||E).slice(0,160)})}}if(!p){let v=d.map(x=>`${x.fee}:${x.error||"fail"}`).join("; ");throw new Error(`uniswap-v3 quote failed chain=${n}: ${v}`)}let m=e.liquidityUsd==null?await Zo({chainId:n,tokenA:a,tokenB:s,dexIds:RT(e.venue)},t).catch(()=>[]):[],f={};for(let v of m.slice(0,8))if(!(!v.pairAddress||!q0(v.pairAddress)))try{let x=await V(n,"eth_call",[{to:v.pairAddress,data:OT},"latest"],t),E=x&&x!=="0x"&&x.length<=66?Number.parseInt(x,16):NaN;if(!Number.isFinite(E)||E<=0||E>1e6)continue;(f[E]==null||v.liquidityUsd>f[E].liquidityUsd)&&(f[E]=v)}catch{}let h=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),g=null;if(e.fee==null&&h>0&&BigInt(p.amountOut)>0n){let v=BigInt(p.amountOut),E=d.filter(_=>_.ok&&Number((v-BigInt(_.amountOut))*10000n/v)<=h).filter(_=>f[_.fee]?.liquidityUsd!=null).sort((_,P)=>f[P.fee].liquidityUsd-f[_.fee].liquidityUsd)[0];E&&E.fee!==p.fee&&(g={priceBestFee:p.fee,chosenFee:E.fee,chosenPoolUsd:f[E.fee].liquidityUsd,bandBps:h},p=E)}let b=f[p.fee]??null,S=m[0]??null,w=b??S,y=e.liquidityUsd??b?.liquidityUsd??S?.liquidityUsd??null,k=e.liquidityUsd!=null?"caller":b?"pool":S?"pair":null;return pe({venue:"uniswap-v3",chainId:n,chain:Fe[n].name,quoter:r,tokenIn:a,tokenOut:s,amountIn:c.toString(),fee:p.fee,amountOut:p.amountOut,gasEstimate:p.gasEstimate,liquidityUsd:y,liquiditySource:w,liquidityAttribution:k,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 yu(e={},t={}){let{chainId:n,quoter:r,router:o}=gu(e.chainId??8453),i=(e.tokens||[]).map(p=>hu(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=LT(i,a),l=ns.encodeFunctionData("quoteExactInput",[c,s]),u=await V(n,"eth_call",[{to:r,data:l},"latest"],t),d=ns.decodeFunctionResult("quoteExactInput",u);return pe({venue:"uniswap-v3",chainId:n,chain:Fe[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 rs(e={},t={}){let n=Number(e.chainId??8453),r=e.amountIn??"1000000000000000",o=await Zt({chainId:n,tokenIn:Fe[n].weth,tokenOut:Fe[n].usdc,amountIn:r,fee:e.fee},t),i=Number(o.amountOut)/1e6;return{...o,amountOutUsdc:i,pair:"WETH/USDC"}}async function wu(e={},t={}){let n=Number(e.chainId??8453),r=gu(n,e.venue),o=ei(e.recipient),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===j0||i===z0||/^eth$/i.test(i),s=await Zt(e,t),c=U0.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=U0.encodeFunctionData("multicall",[d,[c]]);return $({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:Pe(s.autoSlippage,{chainId:n,venue:r.router,data:p})}},{provider:"uniswap-v3",kind:"univ3-swap-tx"})}async function bu(e={}){let t=Number(e.chainId??8453);try{let n=await rs({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 xu(){return Object.entries(Fe).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,weth:t.weth,usdc:t.usdc}))}var Fe,H0,OT,ns,U0,j0,z0,ts,V0,ir=G(()=>{_e();Fr();Ye();ne();Fe={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"}},H0=[100,500,3e3,1e4],OT="0xddca3f43",ns=new D0(["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)"]),U0=new D0(["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)"]),j0="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",z0="0x0000000000000000000000000000000000000000",ts=[100,500,2500,1e4],V0={56:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},8453:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},42161:{pancakeswap:{name:"pancakeswap",quoter:"0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997",router:"0x13f4EA83D0bd40E75C8222255bc855a974568Dd4",feeTiers:ts}},999:{hyperswap:{name:"hyperswap",quoter:"0x03A918028f22D9E1473B7959C927AD7425A45C7C",router:"0x4E2960a8cd19B467b82d26D83fAcb0fAE26b094D"}}}});var Ru={};Tt(Ru,{UNI_V4_CHAINS:()=>ut,UNI_V4_FEE_TIERS:()=>Eu,computeV4PoolId:()=>as,decodeV4HookPermissions:()=>Iu,uniV4Chains:()=>Cu,uniV4Health:()=>Ou,uniV4InspectHook:()=>Pu,uniV4PrepareExactIn:()=>Nu,uniV4QuoteExactIn:()=>Sn,uniV4QuoteExactOut:()=>Tu});import{AbiCoder as $T,Interface as ku,getAddress as Ht,isAddress as vu,keccak256 as BT}from"ethers";function Iu(e){let t=oi(e),n=Number(BigInt(t)&FT),r=Object.fromEntries(W0.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(W0.filter(([,a])=>r[a]).map(([,a])=>a)),valid:i.length===0,violations:Object.freeze(i)})}function ri(e){let t=Number(e),n=ut[t];if(!n)throw new Error(`uniswap-v4: unsupported chainId ${e} (supported: ${Object.keys(ut).join(", ")})`);return{chainId:t,...n}}function oi(e){if(e==null||e==="")return Je;let t=String(e);if(!vu(t))throw new Error(`invalid Uniswap V4 hook address: ${e}`);return Ht(t)}function Ur(e,t){let n=ut[Number(t)];if(ni(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(!vu(r))throw new Error(`invalid token address: ${e}`);return Ht(r)}function ni(e){let t=String(e||"").trim().toLowerCase();return!t||t===HT.toLowerCase()||t===Je.toLowerCase()||t==="eth"}function as({currency0:e,currency1:t,fee:n,tickSpacing:r,hooks:o=Je}){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=oi(o);return BT(ti.encode(["address","address","uint24","int24","address"],[s,c,Number(n),Number(r),l]))}function _u({tokenIn:e,tokenOut:t,fee:n,tickSpacing:r,hooks:o=Je}){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:oi(o)},zeroForOne:l}}function jT({hook:e,codePresent:t,initialized:n,dynamicFee:r}){let o=Iu(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!==Je&&(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===Je&&(c="critical",s.push("dynamic-fee pool has no hook authority")),e!==Je&&o.enabled.length===0&&(c="critical",s.push("nonzero hook declares no permissions")),n||(c="critical",s.push("pool is not initialized")),e!==Je&&!t&&(c="critical",s.push("hook address has no deployed bytecode")),Object.freeze({tier:c,audited:!1,requiresReview:e!==Je,returnsDelta:i,reasons:Object.freeze(s)})}async function Pu(e={},t={}){let n=ri(e.chainId??8453);if(!n.stateView)throw new Error(`uniswap-v4: no StateView on chain ${n.chainId}`);let r=Ur(e.tokenIn||"WETH",n.chainId),o=Ur(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=oi(e.hooks),{poolKey:c}=_u({tokenIn:r,tokenOut:o,fee:i,tickSpacing:a,hooks:s}),l=as(c),u=t.rpcCall||V,d=os.encodeFunctionData("getSlot0",[l]),p=os.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===Je?Promise.resolve(null):u(n.chainId,"eth_getCode",[s,"latest"],t)]),g=os.decodeFunctionResult("getSlot0",m),b=os.decodeFunctionResult("getLiquidity",f)[0],S=g[0],w=S>0n,y=s===Je?null:typeof h=="string"&&h!=="0x"&&h.length>4,k=!!(i&Au),v=jT({hook:s,codePresent:y,initialized:w,dynamicFee:k});return Object.freeze({venue:"uniswap-v4",chainId:n.chainId,stateView:n.stateView,poolId:l,poolKey:Object.freeze(c),pool:Object.freeze({initialized:w,sqrtPriceX96:S.toString(),tick:Number(g[1]),protocolFee:Number(g[2]),lpFee:Number(g[3]),liquidity:b.toString(),dynamicFee:k}),hook:Object.freeze({address:s,codePresent:y,codeBytes:y?(h.length-2)/2:0,permissions:Iu(s)}),risk:v})}async function Sn(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=ri(e.chainId??8453),a=Ur(e.tokenIn||"WETH",n),s=Ur(e.tokenOut||ut[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}]:[...Eu],u=e.hooks||Je,d=[],p=null;for(let x of l){let{poolKey:E,zeroForOne:_}=_u({tokenIn:a,tokenOut:s,fee:x.fee,tickSpacing:x.tickSpacing,hooks:u}),P=is.encodeFunctionData("quoteExactInputSingle",[{poolKey:E,zeroForOne:_,exactAmount:c,hookData:"0x"}]);try{let N=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:P},"latest"],t);if(!N||N==="0x"){d.push({...x,ok:!1,error:"empty result"});continue}let I=is.decodeFunctionResult("quoteExactInputSingle",N),L={fee:x.fee,tickSpacing:x.tickSpacing,ok:!0,amountOut:I[0].toString(),gasEstimate:I[1].toString(),poolKey:E,zeroForOne:_,poolId:as({...E})};d.push(L),(!p||BigInt(L.amountOut)>BigInt(p.amountOut))&&(p=L)}catch(N){d.push({...x,ok:!1,error:String(N.message||N).slice(0,160)})}}if(!p){let x=d.map(E=>`${E.fee}/${E.tickSpacing}:${E.error||"fail"}`).join("; ");throw new Error(`uniswap-v4 quote failed chain=${n}: ${x}`)}let m=e.liquidityUsd==null?await Zo({chainId:n,tokenA:a,tokenB:s,dexIds:G0},t).catch(()=>[]):[],f=new Map;for(let x of m){let E=String(x.pairAddress||"").toLowerCase();E&&f.set(E,x)}let h=x=>f.get(String(x.poolId||"").toLowerCase())??null,g=e.liquidityBandBps==null?50:Number(e.liquidityBandBps),b=null;if(!(e.fee!=null&&e.tickSpacing!=null)&&g>0&&BigInt(p.amountOut)>0n){let x=BigInt(p.amountOut),_=d.filter(P=>P.ok&&Number((x-BigInt(P.amountOut))*10000n/x)<=g).filter(P=>h(P)?.liquidityUsd!=null).sort((P,N)=>h(N).liquidityUsd-h(P).liquidityUsd)[0];_&&_.poolId!==p.poolId&&(b={priceBestFee:p.fee,chosenFee:_.fee,chosenPoolUsd:h(_).liquidityUsd,bandBps:g},p=_)}let S=h(p),w=m[0]??null,y=S??w,k=e.liquidityUsd??S?.liquidityUsd??w?.liquidityUsd??null,v=e.liquidityUsd!=null?"caller":S?"pool":w?"pair":null;return pe({venue:"uniswap-v4",chainId:n,chain:ut[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:k,liquiditySource:y,liquidityAttribution:v,liquidityPick:b,triedTiers:d,best:!0,executionReady:!1,prepareReady:typeof e.recipient=="string"&&vu(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&&!ni(e.tokenIn)&&!ni(e.tokenOut)&&(e.hookData==null||String(e.hookData).toLowerCase()==="0x")&&p.poolKey.hooks===Je&&!(p.fee&Au)},{chainId:n,venue:i||r,amountOut:p.amountOut,liquidityUsd:k,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Tu(e={},t={}){let{chainId:n,quoter:r,poolManager:o,universalRouter:i}=ri(e.chainId??8453),a=Ur(e.tokenIn||"WETH",n),s=Ur(e.tokenOut||ut[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}]:[...Eu],u=e.hooks||Je,d=[],p=null;for(let f of l){let{poolKey:h,zeroForOne:g}=_u({tokenIn:a,tokenOut:s,fee:f.fee,tickSpacing:f.tickSpacing,hooks:u}),b=is.encodeFunctionData("quoteExactOutputSingle",[{poolKey:h,zeroForOne:g,exactAmount:c,hookData:"0x"}]);try{let S=await(t.rpcCall||V)(n,"eth_call",[{to:r,data:b},"latest"],t);if(!S||S==="0x"){d.push({...f,ok:!1,error:"empty result"});continue}let w=is.decodeFunctionResult("quoteExactOutputSingle",S),y={fee:f.fee,tickSpacing:f.tickSpacing,ok:!0,amountIn:w[0].toString(),gasEstimate:w[1].toString(),poolKey:h,zeroForOne:g,poolId:as({...h})};d.push(y),(!p||BigInt(y.amountIn)<BigInt(p.amountIn))&&(p=y)}catch(S){d.push({...f,ok:!1,error:String(S.message||S).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 T0({chainId:n,tokenA:a,tokenB:s,dexIds:G0},t).catch(()=>null):null;return{venue:"uniswap-v4",chainId:n,chain:ut[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 Nu(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=ri(r);if(oi(e.hooks)!==Je)throw new Error("uniswap-v4 nonzero hooks are inspect/quote-only until a code-hash-specific adapter exists");if(Number(e.fee)&Au)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(ni(e.tokenIn)||ni(e.tokenOut))throw new Error("uniswap-v4 prepare currently requires ERC-20 tokenIn and tokenOut; native routes are not inferred");let l=await Sn(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=ti.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=ti.encode(["address","uint256"],[l.tokenIn,BigInt(l.amountIn)]),h=ti.encode(["address","uint256"],[l.tokenOut,u]),g=ti.encode(["bytes","bytes[]"],[DT,[m,f,h]]),S=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,w=MT.encodeFunctionData("execute",[UT,[g],S]);return $({provider:"uniswap-v4",prepareReady:!0,calldataReady:!0,executionReady:!1,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,deadline:S,quote:{...l,amountOutMinimum:u.toString(),slippageBps:s},hookInspection:null,requiresApproval:{token:l.tokenIn,spender:qT,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:w,value:"0"}},{provider:"uniswap-v4",kind:"univ4-swap-tx"})}async function Cu(){return Object.entries(ut).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 Ou(e={}){let t=ri(e.chainId??8453),n=await V(t.chainId,"eth_getCode",[t.quoter,"latest"],e),r=typeof n=="string"&&n!=="0x"&&n.length>4;return{ok:r,chainId:t.chainId,quoter:t.quoter,poolManager:t.poolManager,codeBytes:r?(n.length-2)/2:0}}var ti,Je,ut,Eu,is,MT,os,W0,FT,Au,UT,DT,qT,HT,G0,Dr=G(()=>{_e();Fr();Ye();ne();ti=$T.defaultAbiCoder(),Je="0x0000000000000000000000000000000000000000",ut={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"}},Eu=[{fee:100,tickSpacing:1},{fee:500,tickSpacing:10},{fee:3e3,tickSpacing:60},{fee:1e4,tickSpacing:200},{fee:25e3,tickSpacing:8}],is=new ku(["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)"]),MT=new ku(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),os=new ku(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96,int24 tick,uint24 protocolFee,uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),W0=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"]]),FT=(1n<<14n)-1n,Au=8388608;UT="0x10",DT="0x060c0f",qT="0x000000000022D473030F116dDEE9F6B43aC78BA3",HT="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";G0=["uniswap-v4","uniswapv4"]});function dt({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:Y0(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([Y0(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[K0]||"")==="1")return{baseUrl:a,trusted:!1,host:c};if(o)throw new Error(`${e}: refusing to call non-allowlisted host ${c} (set ${K0}=1 to permit it)`);return{baseUrl:a,trusted:!1,host:c}}function Y0(e){let t=new URL(String(e));if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("unsupported protocol");return t.host}function at(e,t,n){let r={...e};if(!n)return r;for(let[o,i]of Object.entries(t||{}))i&&(r[o]=i);return r}var K0,kn=G(()=>{K0="ORACLE_ALLOW_CUSTOM_PROVIDER_URL"});function jN({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"?HN:qN}async function be(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let n=jN(t);return A(n,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Cg(e={}){let t=await be({type:"allMids"},e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,midCount:n}}async function tn(e={}){return be({type:"allMids"},e)}async function zr(e,t={}){if(!e)throw new Error("hlL2Book requires coin");return be({type:"l2Book",coin:String(e)},t)}async function hi(e={}){return be({type:"outcomeMeta"},e)}async function xs(e,t={}){if(!e)throw new Error("hlClearinghouse requires user address");return be({type:"spotClearinghouseState",user:e},t)}async function Og(e,t={}){if(!e)throw new Error("hlUserFills requires user address");return be({type:"userFills",user:e},t)}async function Ss(e={}){return be({type:"meta"},e)}async function bt(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),be(t,e)}async function Vr({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 be(i,o)}async function ks({coin:e,startTime:t,endTime:n},r={}){if(!e)throw new Error("hlFundingHistory requires coin");return be({type:"fundingHistory",coin:String(e),startTime:t??Date.now()-24*3600*1e3,endTime:n??Date.now()},r)}async function Rg(e,t={}){if(!e)throw new Error("hlOpenOrders requires user");return be({type:"openOrders",user:e},t)}async function Lg(e,t={}){if(!e)throw new Error("hlFrontendOpenOrders requires user");return be({type:"frontendOpenOrders",user:e},t)}async function Wr(e,t={}){if(!e)throw new Error("hlUserState requires user");return be({type:"clearinghouseState",user:e},t)}async function vs(e={}){return be({type:"spotMeta"},e)}var qN,HN,mt=G(()=>{j();qN="https://api.hyperliquid.xyz/info",HN="https://api.hyperliquid-testnet.xyz/info"});async function Hg(e={}){let t=Date.now();if(xi.dexs&&t-xi.at<6e4&&!e.fetchImpl)return xi.dexs;let n=await be({type:"perpDexs"},e);return xi={at:t,dexs:Array.isArray(n)?n:[]},xi.dexs}async function jg(e="",t={}){let n=e||"",r=Date.now(),o=qg.get(n);if(o&&r-o.at<3e4&&!t.fetchImpl)return o;let i=e?await be({type:"metaAndAssetCtxs",dex:e},t):await bt(t),a=i?.[0]?.universe??i?.universe??[],s=Array.isArray(i?.[1])?i[1]:[],c={at:r,universe:a,ctxs:s};return qg.set(n,c),c}function In(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=zg+t;return Number.isSafeInteger(o)?{encoding:t,outcome:r,side:n,coin:`#${t}`,assetId:o}:null}function An(e,t){let n=ld(e),r=ld(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=zg+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 ld(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 ud(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let l=e.coin==null?null:In(e.coin);if(e.coin!=null&&!l)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let u=e.outcome==null?null:An(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:ZN(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=An(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 Hg(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 jg(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 b=f[g];if(b.isDelisted)throw new Error(`hl-assets: ${n} is delisted`);let S=QN+m*1e4+g,w=h[g]||{};return{kind:"hip3",coin:b.name||n,assetId:S,szDecimals:b.szDecimals??0,maxLeverage:b.maxLeverage??null,dex:l,dexIndex:m,indexInMeta:g,markPx:w.markPx??null}}let{universe:r,ctxs:o}=await jg("",t),i=n.toUpperCase(),a=r.findIndex(l=>l.name===i);if(a<0){if(t.allowBareBuilderLeaf===!0)try{let l=await Hg(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 ud({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 ZN(e,t){let n=ld(e);if(n!==0&&n!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return n}var zg,QN,xi,qg,Ts=G(()=>{mt();zg=1e8,QN=1e5,xi={at:0,dexs:null},qg=new Map});function Ue(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 xt(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function dr(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=Ue(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 St(e,t="amount"){let n=dr(e,t);if(n<=0n)throw new Error(`${t} must be positive`);return n}function Be(e,t,n="amount"){let r=Ue(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 Gr=G(()=>{});function oC(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 Vg(e,t){let n=Ue(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 jt(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=>jt(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)}:${jt(e[r],t)}`).join(",")}}`}function iC(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)||jt(n,"declared order type")!==jt({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(jt(n,"declared order type")!==jt({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||jt(n,"declared order type")!==jt({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 aC(e,t,n){let r=Vg(e.s,"signed size"),o=Vg(e.p,"signed price"),i=r.decimals+o.decimals,a=r.raw*o.raw,s=Be(t.notionalUsd,i,"hl: notionalUsd");if(s<=0n||a!==s)throw new Error("hl: signed notional must match");let c=Be(n.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function sC(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=_n(n.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hl: order builder address required");if(xt(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=dr(n.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=Be(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function Wg(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(Ue(e.s,"hl: signed size")!==Ue(t.size,"hl: size"))throw new Error("hl: signed size must match");if(Ue(e.p,"hl: signed price")!==Ue(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(jt(e.t,"signed order type")!==jt(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 Gg(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(Ue(e.s,"hl: bracket protection size")!==Ue(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(Ue(e.p,"hl: bracket protection price")!==Ue(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(Ue(i.triggerPx,"hl: triggerPx")!==Ue(r,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function cC(e){let t=String(e||"").replace(/\/$/,"");if(!eC.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function dd(e){return In(e)!=null}function lC(e,t){let n=String(e||""),r=Array.isArray(t.coins)?t.coins.map(String):[];if(dd(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 uC(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(dd(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 Kg(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=_n(n.kind,"kind",48),o=nC[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=cC(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!==rC[r])throw new Error("hl: action type must match kind");let s=n.notionalUsd??0;if(tC.has(r)||r==="perp-cancel"||r==="perp-leverage"||r==="perp-isolated-margin"){let c=_n(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=In(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(lC(c,t),uC(c,l,t),r==="hip4-order"&&!dd(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");iC(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");Wg(u[0],n,l);let f=1;d!=null&&Gg(u[f++],n,l,d,"tp"),p!=null&&Gg(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");Wg(u[0],n,l)}aC(u[0],n,t),sC(n,t),s=Ue(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=_n(n.usd,"margin usd",64),d=Be(u,6,"hl: margin usd");if(dr(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=Be(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),f=d<0n?-d:d;if(f>m)throw new Error("hl: margin notional exceeds cap");s=oC(f,6)}}if(r==="builder-fee-approval"){let c=_n(n.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(_n(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=_n(n.maxFeeRate,"maxFeeRate",32);if(_n(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=Be(u.slice(0,-1),12,"hl: builder fee percent"),p=Be(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 eC,tC,nC,rC,_n,Yg=G(()=>{Gr();Ts();eC=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),tC=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),nC=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"}),rC=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"}),_n=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`hl: bounded ${t} required`);return e}});function pC(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 Ns(e,t={},n={}){let r=String(e?.kind||""),o=dC[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:pC(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 Kg(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 dC,pd=G(()=>{Yg();dC=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 mC,JsonRpcProvider as fC}from"ethers";function xC(e){return bC.test(String(e||""))}async function Cs(e,{contract:t=hC,rpc:n=yC,chainId:r=gC,balanceOf:o}={}){if(!xC(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new fC(n,r,{staticNetwork:!0}),a=new mC(t,wC,i);return BigInt(await a.balanceOf(e))}var hC,gC,yC,wC,bC,md=G(()=>{hC="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",gC=999,yC="https://rpc.hyperliquid.xyz/evm",wC=["function balanceOf(address owner) view returns (uint256)"],bC=/^0x[a-fA-F0-9]{40}$/});import{existsSync as SC,readFileSync as kC,lstatSync as vC}from"node:fs";import{homedir as Jg}from"node:os";import{join as fd}from"node:path";function IC(e){let t=String(e||"swap").toLowerCase();return Object.prototype.hasOwnProperty.call(Xg,t)?Xg[t]:AC}function CC(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[Qg])return String(e[Qg]);let t=e.ORACLE_CONFIG_DIR||fd(Jg(),".config","oracle");return fd(t,"fee-recipient")}return fd(Jg(),".config","oracle","fee-recipient")}function hd(e=process.env){try{let t=CC(e);if(!SC(t)||vC(t).isSymbolicLink())return"";let n=kC(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(n)?n:""}catch{return""}}function OC(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),EC)}function RC({env:e=process.env,action:t="swap",admin:n=!1}={}){let r=String(e[PC]||"").trim(),o=String(e[TC]||NC).trim();if(n===!0)return{bps:0,recipient:"",integrator:o,action:t,applies:!1,reason:"admin-oracle"};let i=IC(t),a=OC(e[_C],{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=hd(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 Os({wallet:e,env:t=process.env,action:n="swap",holderCheck:r={},admin:o=!1}={}){let i=RC({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 Cs(a,r))>0n?{...i,bps:0,applies:!1,reason:"locals-only-holder",holderVerificationStatus:"holder"}:{...i,holderVerificationStatus:"non-holder"}}catch{return{...i,holderVerificationStatus:"unavailable"}}}function Zg(e){return e?.applies?`Oracle routing fee ${e.bps} bps (${(e.bps/100).toFixed(2)}%) to ${e.recipient}.`:e?.reason==="admin-oracle"?"No Oracle fee (admin Oracle).":e?.reason==="locals-only-holder"?"No Oracle fee (Locals Only holder).":"No Oracle fee."}function ey(e){return e?.applies?{integrator:e.integrator,fee:String(e.bps/1e4)}:{}}function ty(e){return e?.applies?{partner:e.integrator,partnerFeeBps:String(e.bps),partnerAddress:e.recipient}:{}}var EC,AC,Xg,_C,PC,TC,Qg,NC,Si=G(()=>{md();EC=100,AC=5,Xg=Object.freeze({swap:5,bridge:5,perps:0,nft:0});_C="ORACLE_INTEGRATOR_FEE_BPS",PC="ORACLE_INTEGRATOR_FEE_RECIPIENT",TC="ORACLE_INTEGRATOR_ID",Qg="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN",NC="oracle"});var Id={};Tt(Id,{HL_BUILDER_ADDRESS_ENV:()=>Rs,HL_BUILDER_DEFAULT_FEE_BPS:()=>LC,HL_BUILDER_FEE_ENV:()=>yd,HL_BUILDER_FEE_TIERS:()=>ki,HL_BUILDER_MAX_FEE_BPS:()=>gd,HL_PERP_MAX_SIG_FIGS:()=>ny,HL_PERP_PRICE_DECIMALS:()=>ry,HL_SIGNATURE_CHAIN_ID:()=>bd,MARGIN_MODE:()=>vi,ORDER_TYPES:()=>ct,TIF:()=>Ei,formatPerpPrice:()=>rn,formatPerpSize:()=>sy,hlBuilderFeeBpsForKind:()=>ay,hlPerpAssetInfo:()=>Pn,hlPrepareBracketOrder:()=>Ad,hlPrepareBuilderApproval:()=>kd,hlPrepareCancelOrder:()=>Ai,hlPreparePerpOrder:()=>Jr,hlPrepareUpdateIsolatedMargin:()=>Ed,hlPrepareUpdateLeverage:()=>vd,resolveBuilderFee:()=>xd});function oy(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 $C(e,t){let n=oy(e,t);if(n<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return n}function BC(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 iy(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 ay(e="perp"){if(e==="perp"||e==="main")return ki.perp;if(e==="spot")return ki.spot;if(e==="hip3")return ki.hip3;if(e==="outcome"||e==="hip4")return ki.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function xd({env:e=process.env,isHolder:t=!1,kind:n="perp"}={}){if(t)return null;let r=String(e?.[Rs]||"").trim().toLowerCase();if(!r)return null;if(!/^0x[a-f0-9]{40}$/.test(r))throw new Error(`hl-perps: ${Rs} must be an EVM address`);let o=hd(e);if(!o||o!==r)return null;let i=e?.[yd],a=ay(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: ${yd} must be a positive number in 0.1 bps increments`);if(s>gd)throw new Error(`hl-perps: builder fee ${s} bps exceeds the ${gd} 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 MC(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 be({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 FC(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||Cs;return BigInt(await o(r))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function Sd(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 UC(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 Sd(r,a,n)}function rn(e,t,n={}){let r=ry-Number(t??0);if(r<0)throw new Error("hl-perps: szDecimals out of range");return Sd(UC(e,ny,n),r,n)}function sy(e,t){let n=Sd(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 DC(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 Pn(e={},t={}){let n=await ud(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 wd(e,{tif:t=Ei.GTC,triggerPx:n,isMarket:r,szDecimals:o}={}){switch(e){case ct.LIMIT:return{limit:{tif:t}};case ct.MARKET:return{limit:{tif:Ei.IOC}};case ct.STOP_MARKET:case ct.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:rn(n,o),tpsl:e===ct.STOP_MARKET?"sl":"tp"}};case ct.STOP_LIMIT:case ct.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:rn(n,o),tpsl:e===ct.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Kr(e,t,n={}){let r=n.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:bd,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 Yr(e,t={},n={}){let r={...e};try{r.localSignerEnvelope=Ns(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,$(r,{provider:e.provider||"hl-perps",kind:e.kind})}function kd(e={},t={}){let n=xd({env:t.env});if(!n)throw new Error(`hl-perps: ${Rs} 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:bd,maxFeeRate:n.disclosure.percent,builder:n.disclosure.address,nonce:r};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:n.disclosure,...Kr(o,r,t)},e,t)}async function Jr(e={},t={}){let n=await Pn(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??ct.LIMIT;if(typeof r!="string"||!r)throw new Error("hl-perps: order type must be a string");let o=iy(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,a=sy(e.size??e.sz,n.szDecimals),s;if(r===ct.MARKET){let S=Number(n.markPx);if(!Number.isFinite(S)){let v=await tn(t);S=Number(v?.[n.coin]??v?.[String(n.assetId)]??NaN)}if(!Number.isFinite(S))throw new Error("hl-perps: no mark price available for a market order");let w=Number(e.maxSlippageBps??50);if(!Number.isInteger(w)||w<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(w>100)throw new Error(`hl-perps: maxSlippageBps ${w} exceeds the hard 100 bps cap`);let y=o?S*(1+w/1e4):S*(1-w/1e4);s=rn(y,n.szDecimals,{roundDown:o});let k=Math.abs(Number(s)/S-1)*1e4;if(k>w+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${k.toFixed(2)} bps from mark, above the ${w} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");s=rn(e.price??e.limitPx,n.szDecimals)}let c=wd(r,{tif:e.tif??(r===ct.MARKET?Ei.IOC:Ei.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=xd({env:t.env,kind:n.kind}),p=await FC(d,e,t),m=p.exempt?null:d,f=await MC(m,e,t),h=f.approved?m:null;h&&(u.builder=h.wire);let g=Number(e.nonce??Date.now()),b=DC(a,s);return Yr({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:b,maxLeverage:n.maxLeverage,markPx:n.markPx,builderFee:h?.disclosure??null,holderExempt:p.exempt,holderVerificationStatus:p.status,builderApprovalRequired:m&&!h?{...d.disclosure,...f}:null,...Kr(u,g,t)},e,t)}async function Ai(e={},t={}){let n=await Pn(BC(e),t),r=e.orderId??e.oid;if(r==null)throw new Error("hl-perps: orderId required");let o=oy(r,"orderId"),i={type:"cancel",cancels:[{a:n.assetId,o}]};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:n.coin,assetId:n.assetId,orderId:o,...Kr(i,Number(e.nonce??Date.now()),t)},e,t)}async function vd(e={},t={}){let n=await Pn(e,t),r=$C(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||vi.CROSS).toLowerCase();if(o!==vi.CROSS&&o!==vi.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:n.assetId,isCross:o===vi.CROSS,leverage:r};return Yr({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,...Kr(i,Number(e.nonce??Date.now()),t)},e,t)}async function Ed(e={},t={}){let n=await Pn(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=Be(o,6,"hl-perps: usd"),a=iy(e,{defaultBuy:!0}),s={type:"updateIsolatedMargin",asset:n.assetId,isBuy:a,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Yr({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:n.coin,assetId:n.assetId,isBuy:a,usd:o,...Kr(s,Number(e.nonce??Date.now()),t)},e,t)}async function Ad(e={},t={}){let n=await Jr(e,t),r=await Pn(e,t),o=n.side==="buy",i=[n.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:r.assetId,b:!o,p:rn(e.takeProfitPx,r.szDecimals),s:n.size,r:!0,t:wd(ct.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:r.szDecimals})}),e.stopLossPx!=null&&i.push({a:r.assetId,b:!o,p:rn(e.stopLossPx,r.szDecimals),s:n.size,r:!0,t:wd(ct.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 Yr({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:rn(e.takeProfitPx,r.szDecimals),stopLossPx:e.stopLossPx==null?null:rn(e.stopLossPx,r.szDecimals),builderFee:n.builderFee,...Kr(a,Number(e.nonce??Date.now()),t)},e,t)}var ny,ry,bd,LC,gd,Rs,yd,ki,ct,Ei,vi,Ls=G(()=>{mt();Ts();Gr();ne();pd();md();Si();ny=5,ry=6,bd="0x66eee",LC=2,gd=10,Rs="ORACLE_HL_BUILDER_ADDRESS",yd="ORACLE_HL_BUILDER_FEE_BPS",ki=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),ct=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Ei=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),vi=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});function Kd(e){let t=String(e||"").trim();return/^0x[0-9a-fA-F]{40}$/.test(t)?t:Cn}var Cn,Gs=G(()=>{Cn="0x000000000000000000000000000000000000dEaD"});var ep={};Tt(ep,{LIFI_API:()=>kw,lifiChains:()=>Zd,lifiHealth:()=>Xd,lifiPrepare:()=>Qd,lifiQuote:()=>On});function Jd(e={}){return(e.baseUrl||process.env.LIFI_API_URL||kw).replace(/\/$/,"")}function WO(e){let t=String(e||Yd).toLowerCase();return t===Yd.toLowerCase()||t===VO}function Sw(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 Xd(e={}){let t=await A(`${Jd(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 On(e={},t={}){let{fromChain:n,toChain:r=n,fromToken:o=Yd,toToken:i,fromAmount:a,fromAddress:s=Cn}=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=it({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 Os({wallet:e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[g,b]of Object.entries(ey(u)))c.set(g,b);let d=await A(`${Jd(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=pe(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 Qd(e={},t={}){let n=await On(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(!WO(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:Sw(s,"approval token"),spender:Sw(a,"approval spender"),amount:String(e.fromAmount)}}return $({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:Pe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"lifi",kind:"lifi-tx"})}async function Zd(e={}){return A(`${Jd(e)}/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3})}var kw,Yd,VO,Oi=G(()=>{j();Ye();Gs();ne();Si();kw="https://li.quest/v1";Yd="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",VO="0x0000000000000000000000000000000000000000"});var rp={};Tt(rp,{ZEROX_API:()=>Ow,zeroxHealth:()=>tp,zeroxPrepare:()=>np,zeroxPrice:()=>Js,zeroxQuote:()=>Ln});function Rw(e={}){return dt({provider:"zerox",defaultUrl:Ow,hosts:["api.0x.org"],url:e.baseUrl||process.env.ZEROX_API_URL})}function Lw(e={}){return Rw(e).baseUrl}function Ys(e={}){return e.apiKey||process.env.ZEROX_API_KEY||process.env.OX_API_KEY||process.env["0X_API_KEY"]||""}function $w(e={}){return at({"0x-version":"v2",accept:"application/json"},{"0x-api-key":Ys(e)},Rw(e).trusted)}async function tp(e={}){if(!Ys(e))return{ok:!1,configured:!1,error:"ZEROX_API_KEY not set"};try{let t=await Js({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 Js(e={},t={}){if(!Ys(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),A(`${Lw(t)}/swap/allowance-holder/price?${s}`,{headers:$w(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Ln(e={},t={}){if(!Ys(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=it({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 A(`${Lw(t)}/swap/allowance-holder/quote?${c}`,{headers:$w(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),u=l?.buyAmount||l?.grossBuyAmount;return u?pe(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 np(e={},t={}){if(!e.taker)throw new Error("0x: taker required for executable prepare");let n=await Ln(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 $({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:Pe(n.autoSlippage,{chainId:o,venue:r.to,data:r.data})}},{provider:"zerox",kind:"zerox-tx"})}var Ow,Li=G(()=>{j();Ye();kn();ne();Ow="https://api.0x.org"});async function Bw(e={}){try{return{ok:!0,estimatedFillTimeSec:(await op({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 op(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||XO).replace(/\/$/,"");return A(`${c}/suggested-fees?${s}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function Mw(e={}){try{let t=await ip({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 ip(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=it({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||QO).replace(/\/$/,""),u=await A(`${l}/quote?${c}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),d=u?.estimatedRecieved||u?.estimatedReceived;return d?pe(u,{chainId:Number(e.originChainId||e.chainId||eR[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 Fw(e={}){try{let t=await Xs({user:Cn,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 Xs(e={},t={}){let{user:n=Cn,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=it({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||ZO).replace(/\/$/,""),d=await A(`${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}:pe(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 Uw(e={},t={}){let n=await Xs(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:Pe(n.autoSlippage,{chainId:r,venue:s.to,data:s.data})}));return $({provider:"relay",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:r,quote:n,autoSlippage:n.autoSlippage,transactions:a},{provider:"relay",kind:"relay-tx"})}var XO,QO,ZO,eR,Dw=G(()=>{j();Ye();Gs();ne();XO="https://across.to/api",QO="https://api.hop.exchange/v1",ZO="https://api.relay.link",eR={ethereum:1,optimism:10,bsc:56,polygon:137,arbitrum:42161,avalanche:43114,base:8453}});function ap(e=process.env){return String(e.ORACLE_AUTONOMOUS_TRADING??"").trim()==="1"}function qw(e=process.env){return String(e.ORACLE_AUTONOMOUS_MINT??process.env.ORACLE_AUTONOMOUS_MINT??"").trim()==="1"}var b7,Qs=G(()=>{b7=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});import Zs from"node:fs";import nR from"node:os";import no from"node:path";import{fileURLToPath as rR}from"node:url";function Hw(){return process.env.ORACLE_FAKE_HOME||nR.homedir()}function iR(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function ec(){return iR()?process.env.ORACLE_CONFIG_DIR||no.join(Hw(),".config","oracle"):no.join(Hw(),".config","oracle")}function aR(){return no.join(ec(),"desk.json")}function sR(){return no.join(ec(),"env")}function to({force:e=!1}={}){if(to._done&&!e)return to._result||null;to._done=!0;let t={},n=(o,i)=>{if(i==null)return;let a=String(i).trim();a&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=a,t[o]=a))};try{let o=sR();if(Zs.existsSync(o))for(let i of Zs.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=aR();if(Zs.existsSync(o)){let i=JSON.parse(Zs.readFileSync(o,"utf8"));i&&typeof i=="object"&&(n("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),n("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),n("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),n("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),n("ORACLE_EXEC_URL",i.execUrl),n("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),to._result=Object.keys(t).length?t:null,to._result}var oR,A7,jw=G(()=>{oR=no.dirname(rR(import.meta.url)),A7=no.resolve(oR,"../..");try{to()}catch{}});var tc={};Tt(tc,{armPreparedAction:()=>hR,callSigner:()=>zw,queueOwnerAction:()=>Vw});import{existsSync as cR,readFileSync as lR}from"node:fs";import{request as uR}from"node:http";import dR from"node:path";function mR(e=process.env){let t=String(e.ORACLE_SIGNER_URL||pR).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 fR(e=process.env){if(e.ORACLE_SIGNER_TOKEN)return String(e.ORACLE_SIGNER_TOKEN);let t=dR.join(ec(),"signer","signer-token");return cR(t)?lR(t,"utf8").trim():null}function zw(e,{method:t="GET",body:n=null,env:r=process.env,timeoutMs:o=4e3}={}){let i=mR(r),a=fR(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=uR({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 Vw(e,t=process.env){if(!e||e.version!==1||!e.surface)throw new Error("queueOwnerAction: version-1 surface envelope required");return zw("/pending",{method:"POST",body:{artifact:e},env:t,timeoutMs:8e3})}async function hR(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 Vw(n,t)}var pR,nc=G(()=>{jw();pR="http://127.0.0.1:9462"});var fp={};Tt(fp,{COW_CANCEL_TYPES:()=>Yw,COW_HOSTS:()=>oc,COW_ORDER_TYPES:()=>rc,COW_SETTLEMENT:()=>Ww,COW_VAULT_RELAYER:()=>Gw,armCowOrder:()=>xR,buildArmedCowOrder:()=>pp,cowCancelOrders:()=>IR,cowChains:()=>mp,cowHealth:()=>up,cowOrder:()=>sc,cowOrderStatus:()=>ac,cowOrderUid:()=>SR,cowPrepareCancel:()=>ER,cowPrepareOrder:()=>dp,cowQuote:()=>cn,cowSignCancel:()=>AR,cowSignOrder:()=>kR,cowSubmitSignedOrder:()=>vR,cowVerifyOrderFill:()=>PR});import{TypedDataEncoder as cp,getAddress as $i,isAddress as gR}from"ethers";function ic(e,t={}){if(t.baseUrl)return t.baseUrl.replace(/\/$/,"");let n=oc[Number(e)];if(!n)throw new Error(`cowswap: unsupported chainId ${e}`);return n}function yR(e,t="v1",n={}){let r=ic(e,n);return t==="v1"?r:r.replace(/\/api\/v1$/,`/api/${t}`)}function sn(e,t){let n=String(e||"").trim();if(!gR(n))throw new Error(`cowswap: ${t} must be an address`);return $i(n).toLowerCase()}function ro(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 Jw(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 Xw(e,t="uid"){let n=String(e||"").trim();if(!/^0x[0-9a-fA-F]{112}$/.test(n))throw new Error(`cowswap: ${t} must be 56-byte order UID hex`);return n.toLowerCase()}function wR({digest:e,owner:t,validTo:n}={}){let r=Jw(e,"order digest").slice(2),o=sn(t,"owner").slice(2).toLowerCase(),i=Number(n);if(!Number.isInteger(i)||i<0||i>4294967295)throw new Error("cowswap: validTo must fit uint32");return`0x${r}${o}${i.toString(16).padStart(8,"0")}`.toLowerCase()}function lp(e){let t=Ww[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:$i(t)}}function bR(e={},t,n){let r=sn(e.sellToken,"sellToken"),o=sn(e.buyToken,"buyToken"),i=sn(e.receiver||n,"receiver"),a=Number(e.validTo);if(!Number.isInteger(a)||a<=0)throw new Error("cowswap: quote.validTo required");let s=Jw(e.appData||e.appDataHash||`0x${"0".repeat(64)}`,"appData");return{sellToken:r,buyToken:o,receiver:i,sellAmount:ro(e.sellAmount,"sellAmount"),buyAmount:ro(e.buyAmount,"buyAmount"),validTo:a,appData:s,feeAmount:ro(e.feeAmount??"0","feeAmount"),kind:String(e.kind||"sell"),partiallyFillable:!!e.partiallyFillable,sellTokenBalance:String(e.sellTokenBalance||"erc20"),buyTokenBalance:String(e.buyTokenBalance||"erc20")}}async function up(e={}){try{let t=await cn({chainId:1,sellToken:sp[1],buyToken:Kw[1],sellAmountBeforeFee:"1000000000000000",from:Cn},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 cn(e={},t={}){let n=Number(e.chainId??1),r=Kd(e.from||e.owner),o=e.sellToken||sp[n],i=e.buyToken||Kw[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=sp[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 A(`${ic(n,t)}/quote`,{method:"POST",body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),l=c?.quote?.buyAmount||c?.buyAmount;return l?pe(c,{chainId:n,venue:"cowswap-order",amountOut:l,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):c}async function dp(e={},t={}){let n=Number(e.chainId??1),r=sn(Kd(e.from||e.owner||e.signer),"owner"),o=await cn({...e,chainId:n,from:r,signingScheme:e.signingScheme||"eip712"},t),i=bR(o?.quote||o,n,r),a=lp(n),s={domain:a,types:rc,primaryType:"Order",message:i},c=cp.hash(a,rc,i),l=Gw[n];if(!l)throw new Error(`cowswap: vault relayer not registered for chain ${n}`);return $({provider:"cowswap",orderReady:!0,executionReady:!1,chainId:n,owner:r,signingScheme:"eip712",settlement:a.verifyingContract.toLowerCase(),vaultRelayer:$i(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:$i(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:$i(l).toLowerCase(),amount:i.sellAmount},localSignerEnvelope:pp({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 pp(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=oc[r];if(!o)throw new Error(`cowswap: unsupported chainId ${r}`);let i=sn(e.owner,"owner"),a=Number(t.nowMs??Date.now()),s=cp.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 xR(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=e.localSignerEnvelope||pp(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}async function ac(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrderStatus requires uid");return A(`${ic(n,t)}/orders/${encodeURIComponent(r)}/status`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sc(e={},t={}){let n=Number(e.chainId??1),r=String(e.uid||e.orderUid||"").trim();if(!r)throw new Error("cowOrder requires uid");return A(`${ic(n,t)}/orders/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function SR(e={}){let t=e.typedData||e,n=Number(e.chainId??t?.domain?.chainId),r=t?.message||e.order||e.message;if(!r)throw new Error("cowswap: typed order message required");let o=e.cowGuard?.typedDataHash||cp.hash(lp(n),rc,r),i=e.owner||e.from||e.signer||r.receiver;return wR({digest:o,owner:i,validTo:r.validTo})}async function kR(e={},t={}){throw new Error("cowswap.cowSignOrder refused: @oracle-agent/oracle is prepare-only. Sign with the user wallet; do not pass private keys here.")}async function vR(e={},t={}){throw new Error("cowswap.cowSubmitSignedOrder refused: @oracle-agent/oracle is prepare-only. Submit signed orders from the user wallet or local operator.")}function ER(e={}){let t=Number(e.chainId??1),n=sn(e.owner||e.from||e.signer,"owner"),r=(e.orderUids||e.uids||[e.uid]).filter(Boolean).map((a,s)=>Xw(a,`orderUids[${s}]`));if(!r.length)throw new Error("cowswap: orderUids required");let o=lp(t);return $({provider:"cowswap",chainId:t,owner:n,orderUids:r,signingScheme:"eip712",typedData:{domain:o,types:Yw,primaryType:"OrderCancellations",message:{orderUids:r}},cancelReady:!0,executableArtifact:!0},{provider:"cowswap",kind:"cow-cancel"})}async function AR(e={},t={}){throw new Error("cowswap.cowSignCancel refused: @oracle-agent/oracle is prepare-only. Cancel-sign with the user wallet.")}async function IR(e={},t={}){throw new Error("cowswap.cowCancelOrders refused: @oracle-agent/oracle is prepare-only. Cancel from the user wallet or local operator.")}function _R(e={}){return ro(e.buyAmount??e.executedBuyAmount??"0","trade.buyAmount")}async function PR(e={},t={}){let n=Number(e.chainId??1),r=Xw(e.uid||e.orderUid),o=t.order||await sc({chainId:n,uid:r},t),i=t.status||o.status||await ac({chainId:n,uid:r},t).catch(()=>null),a=t.trades||await A(`${yR(n,"v2",t)}/trades?orderUid=${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=Array.isArray(a)?a:[],c=e.expectedOwner?sn(e.expectedOwner,"expectedOwner"):null;if(c&&sn(o.owner||s[0]?.owner||c,"owner")!==c)return{ok:!1,provider:"cowswap",chainId:n,uid:r,reason:"owner mismatch",order:o,status:i,trades:s};let l=0n;for(let p of s.filter(m=>String(m.orderUid||"").toLowerCase()===r))l+=BigInt(_R(p));l===0n&&o.executedBuyAmount!=null&&(l=BigInt(ro(o.executedBuyAmount,"executedBuyAmount")));let u=e.minBuyAmount!=null?BigInt(ro(e.minBuyAmount,"minBuyAmount")):0n,d=l>=u&&String(o.status||i?.status||"").toLowerCase()!=="expired";return{ok:d,provider:"cowswap",chainId:n,uid:r,status:o.status||i?.status||null,executedBuyAmount:l.toString(),minBuyAmount:e.minBuyAmount??null,trades:s,settlementTxs:[...new Set(s.map(p=>p.txHash).filter(Boolean))],order:o,orderStatus:i,reason:d?null:"insufficient fill or expired order"}}function mp(){return Object.keys(oc).map(Number)}var oc,Ww,Gw,sp,Kw,rc,Yw,Bi=G(()=>{j();Ye();Qs();Gs();ne();oc={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"},Ww=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Gw=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),sp={1:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",8453:"0x4200000000000000000000000000000000000006",42161:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"},Kw={1:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",8453:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",42161:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},rc=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"}]}),Yw=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{existsSync as qS,readFileSync as HS}from"node:fs";import{dirname as DS,join as Rc}from"node:path";import{fileURLToPath as Y$}from"node:url";function jS(e){let t=DS(Y$(e));for(let n=0;n<8;n+=1){let r=Rc(t,"package.json");if(qS(r))try{let i=JSON.parse(HS(r,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=DS(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function zS(e){return JSON.parse(HS(Rc(jS(e),"package.json"),"utf8"))}function Lc(e,t){let n=jS(t),r=Rc(n,e);return qS(r)?r:Rc(n,"dist","assets",e)}var $c=G(()=>{});import{isAddress as J$}from"ethers";function Q$(e,t){return Object.freeze({id:e,contractName:t.contractName,source:t.source,dependency:Object.freeze({name:"OpenZeppelin Contracts",version:VS,tag:`v${VS}`}),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 Bc(e){let t=xr[String(e||"")];if(!t)throw new Error(`protocol-templates: unknown template "${e}"`);return t}function ia(e,t){try{if(BigInt(e)<=0n)throw new Error}catch{throw new Error(`${t} must be > 0`)}}function aa(e,t){let n=String(e||"");if(!J$(n)||/^0x0{40}$/i.test(n))throw new Error(`${t} must be nonzero address`)}function WS(e,t){let n=Bc(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");ia(i,"safe-erc20: supply"),aa(a,"safe-erc20: initialHolder"),aa(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(ia(i,"safe-erc721-drop: cap"),aa(a,"safe-erc721-drop: treasury"),ia(s,"safe-erc721-drop: mintPrice"),ia(c,"safe-erc721-drop: perWalletCap"),BigInt(c)>BigInt(i))throw new Error("safe-erc721-drop: perWalletCap exceeds cap");aa(l,"safe-erc721-drop: initialOwner")}else if(e==="safe-vesting"){let[r,o,i]=t;aa(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`)}ia(i,"safe-vesting: durationSeconds")}return n}function GS(e){return{authorities:[...e.authority],proxy:!1,upgradeable:!1,arbitraryDelegatecall:!1}}var VS,X$,xr,Mc=G(()=>{VS="5.0.2",X$={"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"]}};xr=Object.freeze(Object.fromEntries(Object.entries(X$).map(([e,t])=>[e,Q$(e,t)])))});import{spawnSync as sm}from"node:child_process";import{existsSync as Sr,readFileSync as Fc,readdirSync as KS,statSync as YS}from"node:fs";import{join as Wt}from"node:path";import{createHash as Z$}from"node:crypto";function Dc(){return Sr(sa)?KS(sa).filter(e=>xr[e]&&YS(Wt(sa,e)).isDirectory()).map(e=>{let t=Wt(sa,e),n=Wt(t,"SECURITY.md");return{id:e,path:t,metadata:Bc(e),securityNotice:Sr(n)?Fc(n,"utf8").slice(0,500):null,disclaimer:Uc}}):[]}function JS(){if(process.env.FORGE_BIN)return process.env.FORGE_BIN;let e=process.env.HOME||"",t=["forge",Wt(e,".foundry/bin/forge")];for(let n of t)if(sm(n,["--version"],{encoding:"utf8"}).status===0)return n;return null}function eB(){return process.env.SLITHER_BIN?process.env.SLITHER_BIN:sm("slither",["--version"],{encoding:"utf8"}).status===0?"slither":null}function xo(e,t,n){let r=sm(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 tB(e){let t=Z$("sha256");function n(r){let o=YS(r);if(o.isDirectory()){if(["lib","out","cache",".git"].includes(r.split("/").pop()))return;for(let i of KS(r).sort())n(Wt(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(Fc(r)))}return n(e),t.digest("hex")}function ca(e,t={}){let n=Bc(e),r=t.allowSkipStatic!==!1,o=Wt(sa,e);if(!Sr(o))throw new Error(`protocol-templates: unknown template "${e}"`);let i=JS();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(!Sr(Wt(o,"lib","forge-std"))){let m=xo(i,["install","foundry-rs/forge-std","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install forge-std failed
|
|
4
4
|
${m.stderr}`)}if(!Sr(Wt(o,"lib","openzeppelin-contracts"))){let m=xo(i,["install","OpenZeppelin/openzeppelin-contracts@v5.0.2","--no-git"],o);if(!m.ok)throw new Error(`protocol-templates: forge install openzeppelin failed
|
|
5
5
|
${m.stderr}`)}let a=Wt(o,"lib","openzeppelin-contracts","package.json"),s=Sr(a)?JSON.parse(Fc(a,"utf8")).version:null;if(s!==n.dependency.version)throw new Error(`protocol-templates: OpenZeppelin ${n.dependency.version} required, found ${s||"unknown"}`);let c=xo(i,["build","-q"],o);if(!c.ok)throw new Error(`protocol-templates: forge build FAILED for ${e}
|
|
6
6
|
${c.stderr}`.slice(0,2e3));let l=xo(i,["test","-q"],o);if(!l.ok)throw new Error(`protocol-templates: forge test FAILED for ${e}
|
|
@@ -138,16 +138,16 @@ anchor-lang = "0.31.1"
|
|
|
138
138
|
- Recovery path: ${i} after ${a} blocks (BIP68 relative locktime)
|
|
139
139
|
- This is a policy scaffold, not a funded address, PSBT, signature, or broadcast
|
|
140
140
|
- Compile and satisfy on regtest/signet with a reviewed Miniscript implementation before mainnet
|
|
141
|
-
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:jc["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:um},psbtPrepared:!1,fundingPrepared:!1}}function ua(){return Object.values(jc).map(e=>({...e,disclaimer:um}))}async function da(e={}){let t=String(e.templateId||"").trim(),n=jc[t];n||At("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?fB(e):hB(e),o=mB(r.files);return $({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 um,tk,jc,pm=G(()=>{ne();um="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",tk="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",jc=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});var sf={};Tt(sf,{PARASWAP_API:()=>LE,paraswapHealth:()=>af,paraswapPrepare:()=>of,paraswapPrice:()=>gn,paraswapTokens:()=>dl});function Ro(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 dl(e={},t={}){let n=Number(e.chainId||1);return A(`${rf(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function gn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Ro(e.srcToken,"srcToken"),destToken:Ro(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 Os({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(ty(o)))r.set(s,c);let i=await A(`${rf(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...pe(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 of(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=Ro(e.userAddress,"userAddress"),o=await gn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Ro(e.srcToken,"srcToken"),destToken:Ro(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=Ro(e.receiver,"receiver"));let c=await A(`${rf(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 $({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:Pe(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function af(e={}){let t=await dl({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var LE,rf,ka=G(()=>{j();Ye();ne();Si();LE="https://api.paraswap.io",rf=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||LE).replace(/\/$/,"")});var e_={};Tt(e_,{CONTRACTS_EVAL_HERE:()=>rq,runContractsEval:()=>nq});import Pl from"node:fs";import Kn from"node:path";import{spawnSync as j5}from"node:child_process";import{fileURLToPath as z5}from"node:url";function Q5(){let e=process.env.HOME||"";for(let t of["forge",Kn.join(e,".foundry/bin/forge")])if(j5(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function Z1(e,t=[]){if(!Pl.existsSync(e))return t;for(let n of Pl.readdirSync(e)){let r=Kn.join(e,n);if(Pl.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;Z1(r,t)}else n.endsWith(".sol")&&!r.includes(`${Kn.sep}lib${Kn.sep}`)&&t.push(r)}return t}function Z5(){let e=[];for(let t of Object.keys(xr)){let n=Kn.join(V5,t),r=Z1(Kn.join(n,"src")),o=[];for(let i of r){let a=Pl.readFileSync(i,"utf8");for(let s of W5)s.test(a)&&o.push(`${Kn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function eq(){return Q5()?Object.keys(xr).map(e=>{try{let t=ca(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(xr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function tq(){let e=[],t=ua();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 da({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:G5,programId:K5,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 da({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[Y5,J5],recoveryPubkey:X5,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 nq(){let e=Z5(),t=eq(),n=await tq(),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 V5,W5,G5,K5,Y5,J5,X5,rq,t_=G(()=>{Mc();qc();pm();$c();V5=Lc("protocols/templates",import.meta.url),W5=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],G5="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",K5="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",Y5="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",J5="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",X5="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";rq=Kn.dirname(z5(import.meta.url))});import{createHash as Iq}from"node:crypto";function Kt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Mo(e){return typeof e=="number"&&Number.isFinite(e)}function Oh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Oh(t);return Object.freeze(e)}for(let t of Object.keys(e))Oh(e[t]);return Object.freeze(e)}function Cr(e){if(Array.isArray(e))return e.map(Cr);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Cr(e[n]);return t}return e}function Nh(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function N_(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Pq(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Tq(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function Nq(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function O_(e){if(!Kt(e))throw new TypeError("evidence artifact must be a plain object");if(!_q.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Kt(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Kt(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Kt(e.train)||!Kt(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Cr({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Cr(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function R_(e){return Iq("sha256").update(JSON.stringify(O_(e)),"utf8").digest("hex")}function Ut(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Ch(e,t){if(!Kt(e)||!Kt(e.metrics))throw new Error(`${t} metrics required`);let n=Ut(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Mo(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function Cq(e,{maxDailyLossPct:t}={}){let n=e.split,r=Ut(n.trainStartIndex,"split.trainStartIndex"),o=Ut(n.trainEndIndex,"split.trainEndIndex"),i=Ut(n.trainBarCount,"split.trainBarCount",1),a=Ut(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Ut(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Ut(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||a!==o+1||s-a+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Mo(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Ch(e.train,"train");let l=Ch(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Mo(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Kt(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=Ut(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),S=Ut(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),w=Ut(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),y=Ut(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||S>=w||w>y||w<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=y,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let k=Ch({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(k.tradeCount<1||k.netPnlUsd<=0||k.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Mo(t)&&k.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Mo(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function L_(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=O_(e),r=Cr({id:e.id,...n});if(JSON.stringify(Cr(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=R_(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Cq(e,t),e}function Rh({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let a=[];if(!Kt(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Kt(n))throw new TypeError("backtestOptions must be a plain object");if(!Mo(r)||r<=0||r>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let s=nt(e),c=Fo(s),l=Fa(t),u=t.length,d=(R=[],U={})=>C_({status:"fail",strategy:s,sHash:c,barsHash:l,split:U.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:U.train||null,holdout:U.holdout||null,walkForward:U.walkForward||{windows:[],passRate:0},flags:[...a,...R]});if(u<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(u*r),m=p,f=u-m;if(p<5||f<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:f}]);let h=t.slice(0,p),g=t.slice(m),b,S;try{b=Jn(s,h,n),S=Jn(s,g,n)}catch(R){return d([{type:"backtest_error",message:String(R.message||R)}])}let w={metrics:Nh(b),costs:N_(b),tradeCount:b.metrics.tradeCount},y={metrics:Nh(S),costs:N_(S),tradeCount:S.metrics.tradeCount},k={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:m,holdoutEndIndex:u-1,holdoutBarCount:f,trainFraction:r},v=[],x=Math.floor(u/(o+1));if(x<3)a.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:x});else for(let R=0;R<o;R++){let U=x*(R+1),Q=U,Y=Math.min(u,Q+x);if(Y-Q<3||U<3){v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Re=t.slice(Q,Y),lt;try{lt=Jn(s,Re,n)}catch{v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let q=Nh(lt),H=Nq(q,s.risk,i);v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:H,reason:H?"pass":"fail_metrics",metrics:q})}let E=v.filter(R=>R.passed).length,_=v.length===0?0:E/v.length,P={windows:v,passRate:_,windowsRun:v.length};y.metrics.tradeCount===0&&w.metrics.tradeCount===0&&a.push({type:"no_trades",message:"no trades in train or holdout"}),y.metrics.tradeCount===0&&a.push({type:"absent_oos_trades",message:"holdout produced no trades"}),y.metrics.netPnlUsd<0&&a.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),w.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<0&&w.metrics.netPnlUsd>Math.abs(y.metrics.netPnlUsd)*.25?a.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):w.metrics.netPnlUsd>0&&y.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<w.metrics.netPnlUsd*.1&&w.metrics.tradeCount>=i&&a.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let N=Pq(y.costs),I=Tq(S);I>0&&N>I&&a.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let L=a.some(R=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(R.type)),F=a.some(R=>R.type==="overfit"),O="fail";return y.metrics.tradeCount>=i&&y.metrics.netPnlUsd>0&&y.metrics.profitFactor>1&&y.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&_>=.6&&!(I>0&&N>I)&&!F&&!a.some(R=>R.type==="severe_oos_collapse"||R.type==="invalid_windowing")?O="pass_live_eligible":!L&&y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&Number.isFinite(y.metrics.netPnlUsd)?(O="pass_paper_only",y.metrics.tradeCount<i&&a.push({type:"undersampled",message:"holdout trades below minTrades"})):F&&y.metrics.tradeCount>0&&w.metrics.netPnlUsd>0?O="fail":y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&!L?O="pass_paper_only":O="fail",y.metrics.netPnlUsd<0&&(O=O==="pass_live_eligible"?"fail":O==="pass_paper_only"?"pass_paper_only":"fail",O="fail"),C_({status:O,strategy:s,sHash:c,barsHash:l,split:k,train:w,holdout:y,walkForward:P,flags:a})}function C_({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c}){let l={status:e,strategyHash:n,compilerHash:Rr,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c};return l.id=R_(l),Oh(Cr(JSON.parse(JSON.stringify(l))))}var _q,Lh=G(()=>{Lr();Or();Rl();_q=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Ua(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Rq(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Bh(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Bh(n,`${t}[${r}]`));return}if(Ua(e))for(let[n,r]of Object.entries(e)){let o=Rq(n);if(Oq.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Bh(r,`${t}.${n}`)}}function $h(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function $_({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Bh({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Ua(e))throw new Error("handoff: strategy required");if(!Ua(t))throw new Error("handoff: evidence required");if(!Ua(n))throw new Error("handoff: shadow required");if(!Ua(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=nt(e,{nowMs:o}),s=rt(a);if(L_(t,{maxDailyLossPct:a.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!$h(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!$h(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!$h(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:Da,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return $(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Oq,B_=G(()=>{Lr();Lh();Or();ne();Oq=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Uo(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Do(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function qa(e){if(Array.isArray(e))for(let t of e)qa(t);else if(e&&typeof e=="object")for(let t of Object.values(e))qa(t);return Object.freeze(e)}function $q(e){let t=Lq[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function Bq(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Do(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Do(Number(o.t),`candles[${r}].t`);if(Do(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:Uo(o.o,`candles[${r}].o`),h:Uo(o.h,`candles[${r}].h`),l:Uo(o.l,`candles[${r}].l`),c:Uo(o.c,`candles[${r}].c`),v:Uo(o.v,`candles[${r}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${r}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${r}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,s)}return qa([...n.values()].sort((r,o)=>r.t-o.t))}function Mq(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Do(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Uo(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function Fq({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),a=!1;for(let s=0;s<16&&i<=n;s++){let c=await ks({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){a=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!a)throw new Error("strategy history exceeds the bounded funding history limit");return Mq(o,n)}function Uq(e,t,n){let r=0,o=null;return e.map(i=>{let a=i.t+n,s=0;for(;r<t.length&&t[r].time<a;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(s+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:s}:{...i,fundingRate:o,fundingPaymentRate:s}})}async function M_(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=$q(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Do(e.endTime,"endTime"),a=e.count==null?1500:e.count;if(!Number.isInteger(a)||a<20||a>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,i-a*o):Do(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Vr({coin:n,interval:r,startTime:s,endTime:i},t),Fq({coin:n,startTime:s,endTime:i},t)]),u=Bq(c,{endTime:i}),d=qa(Uq(u,l,o));return qa({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var Lq,F_=G(()=>{mt();Lq=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function Hq(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))qq.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!Dq.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function jq(e={}){let t=await Ss(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var Dq,qq,U_,D_=G(()=>{mt();B_();F_();Dq=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),qq=new Set(["coin","interval"]);U_=Object.freeze({id:"hyperliquid",validateMarket:Hq,fetchBars:M_,listMarkets:jq,prepareIntent(e){return $_(e)}})});function Vq(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of zq.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function Mh(e){return typeof e!="string"?null:Wq.get(e)??null}function Fh(e){let t=Mh(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var zq,q_,Wq,AY,Uh=G(()=>{D_();zq=Object.freeze(["id","validateMarket","prepareIntent"]);q_=[U_].map(Vq),Wq=new Map(q_.map(e=>[e.id,e])),AY=Object.freeze([...q_])});import{createHash as Gq}from"node:crypto";function _t(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ce(e){return typeof e=="number"&&Number.isFinite(e)}function Y_(e){return Number.isInteger(e)&&e>0}function zh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)zh(t);return Object.freeze(e)}for(let t of Object.keys(e))zh(e[t]);return Object.freeze(e)}function Vh(e){if(Array.isArray(e))return e.map(Vh);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Vh(e[n]);return t}return e}function B(e,t,n){e.push({path:t,message:n})}function Xn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||B(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function Z_(e,t,n,r){if(!Ce(e)||!Ce(t)||!Ce(n)||!Ce(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function jh(e,t,n,r){if(_t(e)){if(Xn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return B(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return B(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!_t(o)||![o.value,o.min,o.max,o.step].every(Y_)?(B(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Y_(e)?e:(B(r,t,"must be a positive integer or {param}"),null)}function J_(e,t,n,r){return _t(e)?(Xn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(B(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(B(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Ce(e)?e:(B(r,t,"must be a finite number or {param}"),null)}function Ll(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function n3(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let a of Ll(i))if(e.has(a)&&n(a))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function r3(e,t){if(!_t(e))return B(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>W_)return B(t,"parameters",`too many parameters (max ${W_})`),null;let r={};for(let o of n){if(!X_.test(o)){B(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!_t(i)){B(t,a,"must be a plain object");continue}Xn(i,j_,a,t);for(let d of j_)d in i||B(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Ce(c)||B(t,`${a}.min`,"must be a finite number"),Ce(l)||B(t,`${a}.max`,"must be a finite number"),(!Ce(u)||u<=0)&&B(t,`${a}.step`,"must be a positive finite number"),Ce(s)||B(t,`${a}.value`,"must be a finite number"),Ce(c)&&Ce(l)&&c>l&&B(t,`${a}.min`,"min must be <= max"),Ce(s)&&Ce(c)&&Ce(l)&&Ce(u)&&u>0&&(Z_(s,c,l,u)||B(t,`${a}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:s,min:c,max:l,step:u}}return r}function o3(e,t,n,r){let o=`nodes.${t}`;if(!_t(e))return B(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!V_[e.type])return B(r,`${o}.type`,"unknown or missing node type"),Xn(e,t3,o,r),null;switch(Xn(e,V_[e.type],o,r),(typeof e.id!="string"||!Q_.test(e.id))&&B(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Kq.has(e.field))&&B(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=J_(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Yq.has(e.indicator))&&B(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,a={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=jh(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string"):a.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))B(r,`${o}.period`,"required field is missing");else{let s=jh(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}if(i==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))B(r,`${o}.${s}`,"required field is missing");else{let c=jh(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?Zq.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be line|signal|histogram"):B(r,`${o}.output`,"required field is missing"),"period"in e&&B(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&B(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))B(r,`${o}.stdDev`,"required field is missing");else{let s=J_(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?B(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?e3.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be upper|middle|lower"):B(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&B(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&B(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!Jq.has(e.op))&&B(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!Xq.has(e.op))&&B(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return B(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let a=0;a<e.inputs.length;a++){let s=e.inputs[a];typeof s!="string"||!s?B(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&B(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&B(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!Qq.has(e.direction))&&B(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function i3(e,t,n){if(!_t(e))return B(t,"risk","must be a plain object"),null;Xn(e,z_,"risk",t);for(let p of z_)(!(p in e)||e[p]==null)&&B(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Ce(o)||o<=0||o>50?B(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Ce(i)||i<=0?B(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Ce(a)||a<=0||a>100?B(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Ce(s)||s<=0||s>100?B(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Ce(c)||c<=0||c>1e3?B(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?B(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Ce(u)||u<=0||u>100?B(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?B(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&B(t,"risk.expiresAt","must be strictly greater than nowMs"):B(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function Wh(e,t={}){let n=[];if(!_t(e))return B(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Xn(e,H_,"",n);for(let d of H_)(!(d in e)||e[d]==null)&&B(n,d,"required field is missing");e.version!==Dh&&B(n,"version",`must be ${Dh}`),(typeof e.id!="string"||!X_.test(e.id))&&B(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>K_)&&B(n,"name",`must be a non-empty string max ${K_}`);let r=Mh(e.venue);r||B(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)_t(e.market)||B(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))B(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)B(n,p.path,p.message)}let i=r3(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))B(n,"nodes","must be an array");else if(e.nodes.length>G_)B(n,"nodes",`too many nodes (max ${G_})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=o3(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&Q_.test(p.id)&&(s.has(p.id)?B(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):s.set(p.id,p)),a.push(p))}for(let d=0;d<a.length;d++){let p=a[d],m=`nodes.${d}`;for(let f of Ll(p))s.has(f)||B(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of Ll(p)){let h=s.get(f);h&&qh.has(h.type)&&B(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of Ll(p)){let h=s.get(f);h&&!qh.has(h.type)&&B(n,m,`node ref "${f}" must be boolean`)}}n3(s)&&B(n,"nodes","graph contains a cycle")}let c=null;if(!_t(e.rules))B(n,"rules","must be a plain object");else{Xn(e.rules,Hh,"rules",n);for(let d of Hh)d in e.rules||B(n,`rules.${d}`,"required field is missing");c={};for(let d of Hh){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){B(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){B(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);qh.has(m.type)||B(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=i3(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=zh({version:Dh,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:a,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function nt(e,t={}){let n=Wh(e,t);if(!n.ok)throw new qo(n.errors);return n.strategy}function a3(e){let t=nt(e);return JSON.stringify(Vh(t))}function Fo(e){let t=a3(e);return Gq("sha256").update(t,"utf8").digest("hex")}function Ha(e,t){if(!_t(e))throw new qo([{path:"",message:"strategy must be a plain object"}]);if(!_t(t))throw new qo([{path:"overrides",message:"must be a plain object"}]);let n=nt(e),r={};for(let[i,a]of Object.entries(n.parameters))r[i]={value:a.value,min:a.min,max:a.max,step:a.step};let o=[];for(let[i,a]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){B(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Ce(a)){B(o,i,"override must be a finite number");continue}if(!Z_(a,s.min,s.max,s.step)){B(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new qo(o);return nt({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let a={...i};return Array.isArray(i.inputs)&&(a.inputs=[...i.inputs]),a}),rules:{...n.rules},risk:{...n.risk}})}var Dh,X_,Q_,Kq,Yq,Jq,Xq,Qq,Zq,e3,qh,H_,j_,Hh,z_,t3,V_,W_,G_,K_,qo,Or=G(()=>{Uh();Dh=1,X_=/^[a-z0-9][a-z0-9._-]{0,63}$/,Q_=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Kq=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),Yq=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Jq=new Set(["gt","gte","lt","lte","eq"]),Xq=new Set(["and","or","not"]),Qq=new Set(["above","below"]),Zq=new Set(["line","signal","histogram"]),e3=new Set(["upper","middle","lower"]),qh=new Set(["compare","logic","cross"]),H_=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),j_=new Set(["value","min","max","step"]),Hh=new Set(["entryLong","entryShort","exitLong","exitShort"]),z_=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),t3=new Set(["id","type"]),V_={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},W_=16,G_=128,K_=100,qo=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function ja(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Qn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function s3(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function tP(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function $l(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let a=0;a<t;a++)r+=e[a];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let a=t;a<e.length;a++)o=i*e[a]+(1-i)*o,n[a]=o;return n}function nP(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let s=1;s<=t;s++){let c=e[s]-e[s-1];c>=0?r+=c:o-=c}let i=r/t,a=o/t;n[t]=eP(i,a);for(let s=t+1;s<e.length;s++){let c=e[s]-e[s-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,a=(a*(t-1)+u)/t,n[s]=eP(i,a)}return n}function eP(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function rP(e,t={}){ja(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Qn(n),Qn(r),Qn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=$l(e,n),a=$l(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function oP(e,t={}){ja(e);let n=t.period,r=t.stdDev;if(Qn(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),a=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:a};let s=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(s+=u,c+=u*u,l>=n){let d=e[l-n];s-=d,c-=d*d}if(l>=n-1){let d=s/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,a[l]=d-r*m}}return{upper:i,middle:o,lower:a}}function iP(e,t){s3(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let a=0;a<e.length;a++){let s=e[a];if(a===0)r[a]=s.h-s.l;else{let c=e[a-1].c;r[a]=Math.max(s.h-s.l,Math.abs(s.h-c),Math.abs(s.l-c))}}let o=0;for(let a=0;a<t;a++)o+=r[a];let i=o/t;n[t-1]=i;for(let a=t;a<e.length;a++)i=(i*(t-1)+r[a])/t,n[a]=i;return n}var aP=G(()=>{});import{createHash as c3}from"node:crypto";var Gh,l3,u3,d3,sP,cP=G(()=>{Gh=2,l3="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",u3="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",d3="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",sP=c3("sha256").update(JSON.stringify({version:Gh,compilerSourceHash:l3,indicatorsSourceHash:u3,schemaSourceHash:d3})).digest("hex")});function Dt(e){return typeof e=="number"&&Number.isFinite(e)}function f3(e){let t=new Map(e.map(s=>[s.id,s])),n=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},r=new Map,o=new Map;for(let s of e)r.set(s.id,0),o.set(s.id,[]);for(let s of e)for(let c of n(s))t.has(c)&&(o.get(c).push(s.id),r.set(s.id,r.get(s.id)+1));let i=[];for(let[s,c]of r)c===0&&i.push(s);let a=[];for(;i.length;){let s=i.shift();a.push(s);for(let c of o.get(s))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(a.length!==e.length)throw new Error("strategy graph is cyclic");return a}function Ho(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function h3(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:a,o:s,h:c,l,c:u,v:d}=i;if(!Dt(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Dt(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==m3[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Dt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Dt(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function $r(e,t,n,r,o,i){if(i.has(e))return i.get(e);let a=t.get(e),s;switch(a.type){case"input":{let c=p3[a.field];s=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];s[l]=u===void 0?null:u}break}case"constant":{let c=Ho(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?Ho(a.period,n):void 0;if(a.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}s=iP(d,c);break}let u=$r(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Dt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=tP(u,c);else if(a.indicator==="ema")s=$l(u,c);else if(a.indicator==="rsi")s=nP(u,c);else if(a.indicator==="macd")s=rP(u,{fastPeriod:Ho(a.fastPeriod,n),slowPeriod:Ho(a.slowPeriod,n),signalPeriod:Ho(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=oP(u,{period:c,stdDev:Ho(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=$r(a.left,t,n,r,o,i),l=$r(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Dt(d)||!Dt(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>$r(l,t,n,r,o,i));s=new Array(o+1);for(let l=0;l<=o;l++)if(a.op==="not"){let u=c[0][l];s[l]=u===!0?!1:u===!1}else if(a.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}s[l]=u}else if(a.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}s[l]=u}else s[l]=!1;break}case"cross":{let c=$r(a.left,t,n,r,o,i),l=$r(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Dt(d)||!Dt(p)||!Dt(m)||!Dt(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function rt(e,t={}){let n=nt(e);t&&Object.keys(t).length&&(n=Ha(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(f3(n.nodes)),i=n.parameters,a=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])a.add(m);let s=Object.freeze([...a].sort()),c=Fo(n);function l(m,f){let h={};for(let b of o){let S=m.get(b);h[b]=S[f]}let g=b=>b!=null&&h[b]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){h3(m,f,n.market.interval);let h=new Map;for(let g of o)$r(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,b)=>Object.freeze(l(h,b))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:Da,compilerHash:Rr,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}var Da,Rr,p3,m3,Lr=G(()=>{Or();aP();cP();Da=Gh,Rr=sP,p3=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),m3=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as g3}from"node:crypto";function w3(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yt(e){return typeof e=="number"&&Number.isFinite(e)}function Kh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Kh(t);return Object.freeze(e)}for(let t of Object.keys(e))Kh(e[t]);return Object.freeze(e)}function Bl(e){if(Array.isArray(e))return e.map(Bl);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Bl(e[n]);return t}return e}function Yh(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((n,r)=>Yh(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))Yh(r,`${t}.${n}`)}}function uP(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:a,l:s,c,v:l}=r;if(!Yt(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c],["v",l]])if(!Yt(d))throw new TypeError(`bars[${n}].${u} must be a finite number`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${u} price must be positive`);if(l<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(a<Math.max(i,c,s))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(s>Math.min(i,c,a))throw new TypeError(`bars[${n}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in r&&r.fundingRate!=null&&!Yt(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!Yt(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!Yt(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function Fa(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&uP(e),g3("sha256").update(JSON.stringify(Bl(e)),"utf8").digest("hex")}function b3(e){if(e==null&&(e={}),!w3(e))throw new TypeError("options must be a plain object");let t={...y3},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!Yt(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!Yt(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!Yt(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function Ml(e){return e/1e4}function x3(e,t,n){let r=Ml(n);return t==="long"?e*(1+r):e*(1-r)}function S3(e,t,n){let r=Ml(n);return t==="long"?e*(1-r):e*(1+r)}function lP(e,t,n){let r=Math.abs(e)*Ml(t),o=Math.abs(e)*Ml(n);return{taker:r,builder:o,total:r+o}}function k3(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function v3(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function E3(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function A3(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function I3(e,t,n){return t==="long"?e.l<=n:e.h>=n}function _3(e,t,n){return t==="long"?e.h>=n:e.l<=n}function P3(e,t,n){return t==="long"?e.l<=n:e.h>=n}function za(e,t){for(let n of e.requiredSeries)if(["fundingRate","openInterest"].includes(n)&&!t.every(r=>Yt(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function T3(e){if(e.length<3)return 0;let t=[];for(let a=1;a<e.length;a++){let s=e[a-1].equity,c=e[a].equity;s>0&&t.push((c-s)/s)}if(t.length<2)return 0;let n=0;for(let a of t)n+=a;let r=n/t.length,o=0;for(let a of t)o+=(a-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function N3(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function Jn(e,t,n={}){let r=b3(n);uP(t);let o=Fa(t);r.nowMs!==void 0&&nt(e,{nowMs:r.nowMs});let i=rt(e);if(za(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let a=i.strategy.risk,s=i.evaluateAll(t),c=r.latencyBars,l=r.slippageBps,u=r.takerFeeBps,d=r.builderFeeBps,p=r.initialEquityUsd,m=0,f=0,h=0,g=0,b=0,S=[],w=[],y=[],k=[],v=[],x=null,E=0,_=null,P=p,N=!1,I=0,L=0,F=[],O=new Array(t.length).fill(0);function D(M){F.push(M)}function R(M){let ae=t[M].v*(r.maxVolumeParticipationPct/100);return Math.max(0,ae-O[M])}function U(M){if(!x)return p;let ae=x.side==="long"?(M-x.entryPrice)*x.qty:(x.entryPrice-M)*x.qty;return p+ae}function Q(M,ae,W){let Ae=W.o,ue=k3(p,a);if(!(ue>0)||!(Ae>0))return;let Ie=x3(Ae,ae,l),xe=ue/Ie,Le=R(M),Vo=Ie*Le;if(xe>Le){y.push({kind:"entry",barIndex:M,time:W.t,side:ae,requestedNotionalUsd:ue,maxFillNotionalUsd:Vo,reason:"volume_participation"});return}O[M]+=xe;let qt=Math.abs(Ie-Ae)*xe,Qt=lP(ue,u,d);p-=Qt.total,m+=Qt.taker,f+=Qt.builder,g+=qt,b+=ue,x={lifecycleEpoch:++L,side:ae,entryBarIndex:M,entryReferencePrice:Ae,entryPrice:Ie,qty:xe,notionalUsd:ue,stop:v3(Ie,ae,a.stopLossPct),take:E3(Ie,ae,a.takeProfitPct),liq:A3(Ie,ae,a.maxLeverage,u+d),entryFees:Qt.taker,entryBuilderFees:Qt.builder,entrySlippageUsd:qt,fundingAccrued:0}}function Y(M,ae,W,Ae){if(!x)return!1;let ue=x.side,Ie=ae,xe=Ie;W!=="liquidation"&&Ae&&(xe=S3(Ie,ue,l));let Le=x.qty,Vo=Le*xe;if(W!=="liquidation"){let p0=R(M),UP=xe*p0;if(Le>p0)return y.push({kind:"exit",barIndex:M,time:t[M].t,side:ue,requestedNotionalUsd:Vo,maxFillNotionalUsd:UP,reason:"volume_participation",triggerReason:W}),!1;O[M]+=Le}let qt=lP(Vo,u,d),Qt=W==="liquidation"?0:Math.abs(xe-Ie)*Le,Wo,zl;ue==="long"?(Wo=(Ie-x.entryReferencePrice)*Le,zl=(xe-x.entryPrice)*Le):(Wo=(x.entryReferencePrice-Ie)*Le,zl=(x.entryPrice-xe)*Le),p+=zl,p-=qt.total,m+=qt.taker,f+=qt.builder,g+=Qt,b+=Vo;let FP={side:ue,entryBarIndex:x.entryBarIndex,entryTime:t[x.entryBarIndex].t,entryPrice:x.entryPrice,exitBarIndex:M,exitTime:t[M].t,exitPrice:xe,exitReason:W,qty:Le,notionalUsd:x.notionalUsd,grossPnlUsd:Wo,feesUsd:x.entryFees+qt.taker,builderFeesUsd:x.entryBuilderFees+qt.builder,fundingUsd:x.fundingAccrued,slippageUsd:x.entrySlippageUsd+Qt,netPnlUsd:Wo-(x.entryFees+qt.taker+x.entryBuilderFees+qt.builder)-x.fundingAccrued-(x.entrySlippageUsd+Qt)};return S.push(FP),W==="liquidation"&&w.push({barIndex:M,time:t[M].t,side:ue,price:xe,tradeIndex:S.length-1}),x=null,L+=1,I=M+1+(a.cooldownBars||0),!0}function Re(M,ae,W,Ae){let ue=M+1;if(ue>=t.length)return;F.some(xe=>xe.kind==="exit"&&xe.side===ae&&xe.fillBar===ue&&xe.epoch===Ae)||D({kind:"exit",side:ae,signalBar:M,fillBar:ue,reason:W,epoch:Ae})}function lt(M){let ae=F.filter(W=>W.fillBar===M);for(let W=F.length-1;W>=0;W--)F[W].fillBar===M&&F.splice(W,1);ae.sort((W,Ae)=>{let ue=Ie=>Ie.kind==="exit"?0:1;return ue(W)-ue(Ae)});for(let W of ae)if(W.kind==="exit"){if(!x||x.side!==W.side||x.lifecycleEpoch!==W.epoch)continue;let Ae=W.reason||"rule";Y(M,t[M].o,Ae,!0)||Re(M,W.side,Ae,W.epoch)}else if(W.kind==="entry"){if(x||W.epoch!==L||M<I)continue;Q(M,W.side,t[M])}}function q(M){if(!x)return;let ae=t[M],W=ae.fundingPaymentRate;if(W==null||!Yt(W)||W===0)return;let Ae=Math.abs(x.qty*ae.c),ue=W*Ae;x.side==="long"?(p-=ue,x.fundingAccrued+=ue,h+=ue):(p+=ue,x.fundingAccrued-=ue,h-=ue)}function H(M){if(!x)return;let ae=t[M].o;(x.side==="long"?ae<=x.liq:ae>=x.liq)&&Y(M,ae,"liquidation",!1)}function te(M){if(!x)return;let ae=t[M],W=x.side,Ae=P3(ae,W,x.liq),ue=I3(ae,W,x.stop),Ie=_3(ae,W,x.take),xe=Le=>W==="long"?Math.min(Le,ae.o):Math.max(Le,ae.o);if(Ae){Y(M,xe(x.liq),"liquidation",!1);return}if(ue&&Ie){Y(M,xe(x.stop),"stop_loss",!0)||Re(M,W,"stop_loss",x.lifecycleEpoch);return}if(ue){Y(M,xe(x.stop),"stop_loss",!0)||Re(M,W,"stop_loss",x.lifecycleEpoch);return}Ie&&(Y(M,x.take,"take_profit",!0)||Re(M,W,"take_profit",x.lifecycleEpoch))}for(let M=0;M<t.length;M++){let ae=Math.floor(t[M].t/864e5);ae!==_&&(_=ae,P=U(t[M].o),N=!1),H(M),lt(M),te(M),q(M),!N&&U(t[M].c)<=P*(1-a.maxDailyLossPct/100)&&(N=!0,k.push({type:"daily_loss_limit",barIndex:M,time:t[M].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let W=s[M].signals,Ae=M+c;if(x)(x.side==="long"&&W.exitLong===!0||x.side==="short"&&W.exitShort===!0)&&Ae<t.length&&(F.some(Le=>Le.kind==="exit"&&Le.side===x.side&&Le.fillBar===Ae&&Le.epoch===x.lifecycleEpoch)||D({kind:"exit",side:x.side,signalBar:M,fillBar:Ae,reason:"rule",epoch:x.lifecycleEpoch}));else{let Ie=W.entryLong===!0,xe=W.entryShort===!0;Ie&&xe?k.push({type:"conflicting_entry_signals",barIndex:M,time:t[M].t,message:"conflicting entry signals; no position opened"}):!N&&(Ie||xe)&&Ae<t.length&&M>=I&&D({kind:"entry",side:Ie?"long":"short",signalBar:M,fillBar:Ae,epoch:L})}let ue=p;x&&(E+=1,ue=U(t[M].c)),v.push({barIndex:M,time:t[M].t,equity:ue,positionSide:x?x.side:null})}let we=null;if(x){let M=t.length-1;if(Y(M,t[M].c,"end_of_data",!0))v[M]={barIndex:M,time:t[M].t,equity:p,positionSide:null};else{let W=U(t[M].c);we={side:x.side,entryBarIndex:x.entryBarIndex,entryTime:t[x.entryBarIndex].t,entryPrice:x.entryPrice,qty:x.qty,notionalUsd:x.notionalUsd,markPrice:t[M].c,markedEquityUsd:W},k.push({type:"open_position_at_end",barIndex:M,time:t[M].t,message:"end-of-data exit missed; position remains open and marked"})}}let We=(x?U(t[t.length-1].c):p)-r.initialEquityUsd,Z=We/r.initialEquityUsd*100,Ee=0,Pt=0,Br=0;for(let M of S)M.netPnlUsd>0?(Ee+=1,Pt+=M.netPnlUsd):M.netPnlUsd<0&&(Br+=-M.netPnlUsd);let Xt=S.length,er=Xt===0?0:Ee/Xt,jl=0;Br>0?jl=Pt/Br:Pt>0&&(jl=1e12);let BP={netPnlUsd:We,netPnlPct:Z,maxDrawdownPct:N3(v),winRate:er,profitFactor:jl,tradeCount:Xt,sharpe:T3(v),turnoverUsd:b,exposurePct:E/t.length*100},MP={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},d0={barsHash:o,strategyHash:i.strategyHash,compilerHash:Rr,compilerVersion:Da,config:MP,trades:S,equityCurve:v,metrics:BP,costs:{feesUsd:m,builderFeesUsd:f,fundingUsd:h,slippageUsd:g},liquidations:w,missedFills:y,openPositionAtEnd:we,flags:k};return Yh(d0),Kh(Bl(d0))}var y3,Rl=G(()=>{Lr();Or();y3=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as C3}from"node:crypto";function U3(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Jh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Jh(t);return Object.freeze(e)}for(let t of Object.keys(e))Jh(e[t]);return Object.freeze(e)}function D3(e){return String(e).trim().replace(/\s+/g," ")}function q3(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function H3(e){for(let n of R3)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function j3(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let n=t[1].toLowerCase();return O3.has(n)?n:null}function z3(e){let t={...$3},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let a=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return a&&(t.maxNotionalUsd=Number(a[1])),t}function V3(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(n=>(e.match(n)??[]).length>1)}function W3(e){let t=C3("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function G3(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function K3(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function Y3(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function J3(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function dP(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function X3({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:s.direction,left:"emaLeft",right:"emaRight"}],l={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?l.entryLong="cross":l.entryShort="cross",s.reverse){let u=s.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?l.exitLong="crossRev":l.exitShort="crossRev"}return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:dP(s.fast),ema_right_period:dP(s.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function Q3({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:s.period},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function Z3({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function pP(e,t={}){if(typeof e!="string")throw new Ve("prompt must be a string");if(e.length>1e3)throw new Ve("prompt length must be <= 1000");if(!U3(t))throw new Ve("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Ve("options.nowMs is required integer epoch ms");let n=t.nowMs,r=F3;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Ve("expiresInMs must be an integer");if(r=t.expiresInMs,r<B3||r>M3)throw new Ve("expiresInMs must be between 1h and 30d")}if(L3.test(e))throw new Ve(`prompt appears to contain secrets and is rejected. ${jo}`);let o=D3(e);if(!o)throw new Ve(`empty prompt. ${jo}`);if(V3(o))throw new Ve(`duplicate interval or risk clause. ${jo}`);let i=q3(o),a=H3(o),s=j3(o);if(!i||!a||!s)throw new Ve(`could not parse side/coin/interval. ${jo}`);let c=z3(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new Ve("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new Ve("position size out of range");let l=n+r,u=W3(o),d=`Draft ${a} ${i}`.slice(0,100),p=G3(o),m=K3(o),f=Y3(o),h=[p,m,f].filter(Boolean);if(h.length!==1)throw new Ve(`unsupported or ambiguous prompt. ${jo}`);if(!J3(o,h[0]))throw new Ve(`unsupported or ambiguous prompt. ${jo}`);let g,b=h[0],S={side:i,coin:a,interval:s,risk:c,expiresAt:l,id:u,name:d,spec:b};b.kind==="ema_cross"?g=X3(S):b.kind==="rsi"?g=Q3(S):g=Z3(S);let w=Wh(g,{nowMs:n});if(!w.ok)throw new Ve(`draft failed validation: ${w.errors.map(y=>y.message).join("; ")}`);return Jh(nt(g,{nowMs:n}))}var Ve,O3,R3,L3,jo,$3,B3,M3,F3,mP=G(()=>{Or();Ve=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},O3=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),R3=new Set(["BTC","ETH","SOL","HYPE"]),L3=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,jo="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",$3=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),B3=36e5,M3=30*864e5,F3=864e5});import{createHash as e8}from"node:crypto";function gP(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function yP(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Qh(t);return Object.freeze(e)}for(let t of Object.keys(e))Qh(e[t]);return Object.freeze(e)}function Va(e){if(Array.isArray(e))return e.map(Va);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Va(e[n]);return t}return e}function Fl(e){return JSON.stringify(Va(e))}function t8(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let s=0;s<=i;s++){let c=t+s*r;if(c>n+1e-9)break;let l=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));l<t-1e-9||l>n+1e-9||o.push(l)}if(o.length===0)return[];let a=o[o.length-1];if(Math.abs(a-n)>1e-9){let s=(n-t)/r;Math.abs(s-Math.round(s))<=1e-9&&o.push(n)}return o}function n8(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let a of n)for(let s of o)i.push({...a,[r]:s});n=i}return n.sort((r,o)=>{let i=Fl(r),a=Fl(o);return i<a?-1:i>a?1:0}),n}function Xh(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let a=Fl(n),s=Fl(o);return a<s}function wP(e,t,n={}){if(!yP(n))throw new TypeError("options must be a plain object");for(let y of Object.keys(n))if(gP(y))throw new TypeError(`options must not include holdout/test/oos key "${y}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let y of Object.keys(n))if(!r.has(y))throw new TypeError(`unknown option "${y}"`);let o=64;if("maxTrials"in n){let y=n.maxTrials;if(!Number.isInteger(y)||y<1||y>fP)throw new TypeError(`maxTrials must be an integer 1..${fP}`);o=y}let i=n.objective??"netPnlUsd";if(!hP.has(i))throw new TypeError(`objective must be one of ${[...hP].join("|")}`);let a=n.backtestOptions??{};if(!yP(a))throw new TypeError("backtestOptions must be a plain object");for(let y of Object.keys(a))if(gP(y))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${y}"`);let s=nt(e),c=Object.keys(s.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let l={},u=1;for(let y of c){let k=t8(s.parameters[y]);if(k.length===0)throw new Error(`parameter "${y}" produces an empty grid`);l[y]=k,u*=k.length}let d=n8(c,l);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),m=[],f=null,h=null;for(let y of p){let k=Ha(s,y),v=Jn(k,t,a);h==null&&(h=v.config);let x={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},E={parameters:{...y},metrics:x};m.push(E),(!f||Xh(i,x,y,f.metrics,f.parameters))&&(f=E)}m.sort((y,k)=>Xh(i,y.metrics,y.parameters,k.metrics,k.parameters)?-1:Xh(i,k.metrics,k.parameters,y.metrics,y.parameters)?1:0);let g={...f.parameters},b=Ha(s,g),S={strategyHash:Fo(s),compilerHash:Rr,trainBarsHash:Fa(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:m.length,candidates:m,bestParameters:g,bestStrategy:b},w={id:e8("sha256").update(JSON.stringify(Va(S)),"utf8").digest("hex"),...S};return Qh(Va(JSON.parse(JSON.stringify(w))))}var fP,hP,bP=G(()=>{Lr();Or();Rl();fP=256,hP=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import bn from"node:fs";import Ul from"node:path";function Dl(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Jt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function o8(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function zo(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>zo(n,`${t}[${r}]`));return}if(Dl(e))for(let[n,r]of Object.entries(e)){let o=o8(n);if(r8.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);zo(r,`${t}.${n}`)}}function i8(e){if(typeof e!="string"||!e||!Ul.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function xP(e){let t;try{t=bn.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function a8(){return{version:e0,runners:[]}}function SP(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Dl(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==e0)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return zo(n,Ul.basename(t)),{version:e0,runners:n.runners.map(r=>Jt(r))}}function kP(e,t){zo(t,"store");let n=Ul.dirname(e);bn.mkdirSync(n,{recursive:!0,mode:448});let r=Ul.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
142
|
-
`;try{bn.writeFileSync(r,o,{mode:384,flag:"wx"}),bn.renameSync(r,e);try{bn.chmodSync(e,384)}catch{}}catch(i){try{bn.unlinkSync(r)}catch{}throw i}}function vP(e={}){let t=e.path;if(i8(t),xP(t),bn.existsSync(t)?SP(bn.readFileSync(t,"utf8"),t):kP(t,a8()),Zh.has(t))return Zh.get(t);let n=!1,r=[];function o(){if(n)return;let f=r.shift();if(f){n=!0;try{let h=f.fn();n=!1,f.resolve(h),o()}catch(h){n=!1,f.reject(h),o()}}}function i(f){if(!n&&r.length===0){n=!0;try{return f()}finally{n=!1,queueMicrotask(o)}}return new Promise((h,g)=>{r.push({fn:f,resolve:h,reject:g}),queueMicrotask(o)})}function a(){return xP(t),SP(bn.readFileSync(t,"utf8"),t)}function s(f){kP(t,f)}function c(f){if(!Dl(f)||typeof f.id!="string"||!f.id)throw new Error("shadow-store: create requires record with string id");zo(f,"record");let h=a();if(h.runners.some(b=>b.id===f.id))throw new Error(`shadow-store: runner id already exists: ${f.id}`);let g=Jt(f);return h.runners.push(g),s(h),Jt(g)}function l(f){let h=a().runners.find(g=>g.id===f);return h?Jt(h):null}function u(){return a().runners.map(f=>Jt(f))}function d(f,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let g=a(),b=g.runners.findIndex(y=>y.id===f);if(b<0)throw new Error(`shadow-store: runner not found: ${f}`);let S=Jt(g.runners[b]),w=h(S);if(!Dl(w)||w.id!==f)throw new Error("shadow-store: updater must return record with same id");return zo(w,"record"),g.runners[b]=Jt(w),s(g),Jt(g.runners[b])}function p(f){let h=a(),g=h.runners.findIndex(S=>S.id===f);if(g<0)throw new Error(`shadow-store: runner not found: ${f}`);let b=Jt(h.runners[g]);return b.status!=="stopped"&&(b.status="stopped",h.runners[g]=b,s(h)),Jt(h.runners[g])}let m={create(f){return i(()=>c(f))},get(f){return l(f)},list(){return u()},update(f,h){return i(()=>d(f,h))},stop(f){return i(()=>p(f))}};return Zh.set(t,m),m}var e0,r8,Zh,EP=G(()=>{e0=1,r8=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Zh=new Map});import{createHash as r0}from"node:crypto";function t0(e){return e==null?e:JSON.parse(JSON.stringify(e))}function n0(e){return Array.isArray(e)?e.map(n0):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,n0(e[t])])):e}function IP(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return r0("sha256").update(JSON.stringify(n0(e))).digest("hex")}function s8(e,t,n,r,o){return r0("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function c8(e,t,n,r){return r0("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function l8(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function AP(e){return e==="entryLong"||e==="entryShort"}function o0({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=vP({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=rt(c),d=l==null?null:String(l),p=n.list().filter(b=>b.status==="running"&&b.strategyHash===u.strategyHash&&b.compilerHash===u.compilerHash&&b.evidenceId===d).sort((b,S)=>b.createdAt-S.createdAt||b.id.localeCompare(S.id))[0];if(p)return t0(p);let m=t(),f=c8(m,u.strategyHash,u.compilerHash,d),h=n.get(f);if(h)return t0(h);let g={id:f,strategy:t0(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:m,updatedAt:m,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(g)}function o(c){return n.get(c)}function i(){return n.list()}function a(c){return n.stop(c)}function s(c,l,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(l))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(l.length===0)return d;let m=rt(d.strategy).evaluateAll(l),f=new Map;for(let I=0;I<l.length;I++)f.set(l[I].t,I);let h=d.cursor,g=[];for(let I=0;I<l.length;I++){let L=l[I].t;(h==null||L>h)&&g.push(I)}if(g.length===0)return d;let b=new Map(d.intendedOrders.map(I=>[I.id,I])),S=new Set(d.fills.map(I=>I.orderId)),w=new Map(d.missedFills.map(I=>[I.orderId,I])),y=(I,L)=>`${I}|${L}`,k=new Map(d.markouts.map(I=>[y(I.orderId,I.horizon),I])),v=d.position?{...d.position}:null,x=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,E=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function _({action:I,signalBarT:L,signalIndex:F}){let O=l8(I),D=s8(d.id,d.strategyHash,L,O,I);if(b.has(D))return b.get(D);let R=F+1,U=R<l.length,Q={id:D,action:I,type:I,side:O,signalBarT:L,fillBarT:U?l[R].t:null,status:U?"open":"missed"};return b.set(D,Q),d.intendedOrders.push(Q),Q}function P(I,L,F){if(S.has(I.id))return;let O={orderId:I.id,action:AP(I.action)?"entry":"exit",side:I.side,price:L.o,barT:L.t,signalBarT:I.signalBarT,barIndex:F};if(d.fills.push(O),S.add(I.id),I.status="filled",I.fillBarT=L.t,w.has(I.id)&&(w.delete(I.id),d.missedFills=d.missedFills.filter(D=>D.orderId!==I.id)),AP(I.action)){v={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:L.t,entryPrice:L.o,entryBarIndex:F};for(let D of u){let R=y(I.id,D);if(k.has(R))continue;let U={orderId:I.id,horizon:D,entryBarT:L.t,entryPrice:L.o,side:v.side,status:"pending",close:null,barT:null};k.set(R,U),d.markouts.push(U)}}else v=null,x=Number(d.strategy?.risk?.cooldownBars)||0,E=L.t}function N(I){if(S.has(I.id)||w.has(I.id))return;let L={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};w.set(I.id,L),d.missedFills.push(L),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||S.has(I.id))continue;let L=f.get(I.signalBarT);if(L==null)continue;let F=L+1;F<l.length&&(h==null||l[F].t>h)&&P(I,l[F],F)}for(let I of g){let L=l[I],F=m[I].signals,O=v,D=U=>{if(v||x>0&&(E==null||L.t>=E))return;let Y=_({action:U,signalBarT:L.t,signalIndex:I}),Re=I+1;Re<l.length?P(Y,l[Re],Re):N(Y)},R=U=>{if(!v||v.side==="long"&&U!=="exitLong"||v.side==="short"&&U!=="exitShort")return;let Q=_({action:U,signalBarT:L.t,signalIndex:I}),Y=I+1;Y<l.length?P(Q,l[Y],Y):N(Q)};O?(F.exitLong&&R("exitLong"),F.exitShort&&R("exitShort")):F.entryLong&&F.entryShort||(F.entryLong&&D("entryLong"),F.entryShort&&D("entryShort")),x>0&&E!=null&&L.t>=E&&(x-=1,x===0&&(E=null)),d.cursor=L.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let L=d.fills.find(D=>D.orderId===I.orderId&&D.action==="entry");if(!L)continue;let F=f.get(L.barT);if(F==null)continue;let O=F+I.horizon;if(O<l.length){I.close=l[O].c,I.barT=l[O].t,I.status="filled";let D=I.entryPrice;I.markout=I.side==="long"?(I.close-D)/D:(D-I.close)/D}}return d.position=v,d.cooldownBarsRemaining=x,d.cooldownStartT=E,d.updatedAt=t(),d})}return{start:r,step:s,list:i,get:o,stop:a}}var _P=G(()=>{Lr();EP()});var NP={};Tt(NP,{runStrategyOperation:()=>y8});import u8 from"node:os";import d8 from"node:path";function Wa(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function m8(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function a0(e){if(Array.isArray(e)){for(let t of e)a0(t);return}if(Wa(e))for(let[t,n]of Object.entries(e)){if(p8.some(r=>m8(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);a0(n)}}function f8(e){if(!Wa(e))throw new TypeError("strategy input must be a plain object");return a0(e),e}function h8(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function i0(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=Fh(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let a=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let s=Array.isArray(a)?a:a?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function s0(e,t){let n=e.backtestOptions??{};if(!Wa(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function PP(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!Wa(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:s0(e,r)}}function TP(){return d8.join(u8.homedir(),".oracle","strategy-shadow.json")}function g8(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function y8(e,t={},n={}){n.signal?.throwIfAborted?.();let r=f8(t),o=h8(r,n);if(e==="draft")return{strategy:pP(r.prompt,{nowMs:o})};if(e==="validate"){let i=rt(r.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=rt(r.strategy),a=await i0(i.strategy,r,n,o);za(i,a);let s=Rh(PP(r,i.strategy,a,o));return e==="evidence"?s:{backtest:Jn(i.strategy,a,s0(r,o)),evidence:s}}if(e==="optimize"){let i=rt(r.strategy),a=await i0(i.strategy,r,n,o);za(i,a);let s=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(s!=null&&c!=null&&s!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let l=s??c??.7;if(typeof l!="number"||l<=0||l>=1)throw new TypeError("trainFraction must be in (0,1)");let u=a.slice(0,Math.floor(a.length*l)),d=r.options??{};if(!Wa(d))throw new TypeError("options must be a plain object");let p=wP(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:s0(r,o)}),m=p.bestStrategy;return{strategy:m,optimization:p,evidence:Rh(PP(r,m,a,o,{trainFraction:l}))}}if(e==="shadow"){let i=o0({storePath:n.storePath??TP(),clock:()=>o}),a=r.action;if(a==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(a==="list")return await i.list();if(a==="get")return await i.get(r.id);if(a==="stop")return await i.stop(r.id);if(a==="step"){let s=await i.get(r.id);if(!s)throw new Error(`shadow runner not found: ${r.id}`);let c=await i0(s.strategy,r,n,o);return za(rt(s.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${a}`)}if(e==="prepare"){let i=rt(r.strategy),a=Fh(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await o0({storePath:n.storePath??TP(),clock:()=>o}).get(r.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let l=r.caps??g8(i.strategy,o);return a.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:IP(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:l,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var p8,CP=G(()=>{Rl();Lr();Lh();mP();bP();_P();Uh();p8=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import{createServer as w8}from"node:http";import{randomBytes as b8}from"node:crypto";import{verifyMessage as x8}from"ethers";ir();Dr();j();kn();ne();import{readFileSync as GT,existsSync as KT}from"node:fs";import{getAddress as YT,Interface as cs,TypedDataEncoder as Mu,parseUnits as JT}from"ethers";var zT=/^(0|[1-9][0-9]*)$/,Lu=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function ar(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(!zT.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 VT(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function WT(e={}){return e.maxFeePerGas!=null?ar(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?ar(e.gasPrice,"gasPrice"):null}function $u(e={}){try{let t=VT(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=ar(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=ar(n.gasLimit??n.gas,"gasLimit"),s=WT(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=ar(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=ar(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:ar(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 J0(e={}){let t=$u(e);if(!t.ok)throw new Lu(t);return t}var XT="https://api.opensea.io/api/v2",QT="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)",ZT=new cs([`function ${QT}`]),ss=new cs(["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"]),eN=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"]),tN=new Set(eN),ng=new Set(["solana","flow"]),ii="0x0000000000000000000000000000000000000000";function nN(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!KT(e))return"";try{for(let t of GT(e,"utf8").split(`
|
|
141
|
+
`)];return{family:"bitcoin",network:n,projectName:t,protocolModel:jc["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:um},psbtPrepared:!1,fundingPrepared:!1}}function ua(){return Object.values(jc).map(e=>({...e,disclaimer:um}))}async function da(e={}){let t=String(e.templateId||"").trim(),n=jc[t];n||At("protocol-templates",`unknown native template "${t}"`);let r=t==="solana-safe-vault"?fB(e):hB(e),o=mB(r.files);return $({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 um,tk,jc,pm=G(()=>{ne();um="Reviewed scaffold and source checks only; NOT a paid security audit. Testnet simulation and independent review are required before mainnet use.",tk="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",jc=Object.freeze({"solana-safe-vault":Object.freeze({id:"solana-safe-vault",family:"solana",language:"Rust / Anchor",supportStatus:"GUIDED_BUILD",protocolModel:"Solana program with PDA-owned vault state",prepareOnly:!0,firmAudit:!1}),"bitcoin-tapscript-vault":Object.freeze({id:"bitcoin-tapscript-vault",family:"bitcoin",language:"Miniscript / Tapscript policy",supportStatus:"GUIDED_BUILD",protocolModel:"UTXO policy; not a general-purpose smart contract",prepareOnly:!0,firmAudit:!1})})});var sf={};Tt(sf,{PARASWAP_API:()=>LE,paraswapHealth:()=>af,paraswapPrepare:()=>of,paraswapPrice:()=>gn,paraswapTokens:()=>dl});function Ro(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 dl(e={},t={}){let n=Number(e.chainId||1);return A(`${rf(t)}/tokens/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function gn(e={},t={}){let n=Number(e.chainId||e.network||1);if(e.amount==null)throw new Error("amount required");let r=new URLSearchParams({srcToken:Ro(e.srcToken,"srcToken"),destToken:Ro(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 Os({wallet:e.userAddress||e.fromAddress,env:t.env,action:e.feeAction||"swap",holderCheck:t.holderCheck});for(let[s,c]of Object.entries(ty(o)))r.set(s,c);let i=await A(`${rf(t)}/prices?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),a=i?.priceRoute?.destAmount;return a?{...pe(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 of(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=Ro(e.userAddress,"userAddress"),o=await gn(e,t),i=o?.priceRoute,a=String(i?.contractAddress||"").toLowerCase();if(!a)throw new Error("paraswap: price route missing contractAddress");let s={srcToken:Ro(e.srcToken,"srcToken"),destToken:Ro(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=Ro(e.receiver,"receiver"));let c=await A(`${rf(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 $({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:Pe(o.autoSlippage,{chainId:n,venue:c.to,data:c.data})}},{provider:"paraswap",kind:"paraswap-tx"})}async function af(e={}){let t=await dl({chainId:1},e),n=Array.isArray(t?.tokens)?t.tokens.length:Object.keys(t?.tokens||{}).length;return{ok:n>0,tokenSample:n}}var LE,rf,ka=G(()=>{j();Ye();ne();Si();LE="https://api.paraswap.io",rf=(e={})=>(e.baseUrl||process.env.PARASWAP_API_URL||LE).replace(/\/$/,"")});var e_={};Tt(e_,{CONTRACTS_EVAL_HERE:()=>rq,runContractsEval:()=>nq});import Pl from"node:fs";import Kn from"node:path";import{spawnSync as j5}from"node:child_process";import{fileURLToPath as z5}from"node:url";function Q5(){let e=process.env.HOME||"";for(let t of["forge",Kn.join(e,".foundry/bin/forge")])if(j5(t,["--version"],{encoding:"utf8"}).status===0)return!0;return!1}function Z1(e,t=[]){if(!Pl.existsSync(e))return t;for(let n of Pl.readdirSync(e)){let r=Kn.join(e,n);if(Pl.statSync(r).isDirectory()){if(["lib","out","cache","node_modules"].includes(n))continue;Z1(r,t)}else n.endsWith(".sol")&&!r.includes(`${Kn.sep}lib${Kn.sep}`)&&t.push(r)}return t}function Z5(){let e=[];for(let t of Object.keys(xr)){let n=Kn.join(V5,t),r=Z1(Kn.join(n,"src")),o=[];for(let i of r){let a=Pl.readFileSync(i,"utf8");for(let s of W5)s.test(a)&&o.push(`${Kn.basename(i)}:${s}`)}e.push({language:"Solidity",templateId:t,ok:r.length>0&&o.length===0,files:r.length,hits:o})}return e}function eq(){return Q5()?Object.keys(xr).map(e=>{try{let t=ca(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(xr).map(e=>({language:"Solidity",templateId:e,ok:!0,skipped:!0,reason:"forge-not-installed"}))}async function tq(){let e=[],t=ua();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 da({templateId:"solana-safe-vault",projectName:"eval_vault",network:"devnet",authority:G5,programId:K5,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 da({templateId:"bitcoin-tapscript-vault",projectName:"eval_treasury",network:"signet",threshold:2,signerPubkeys:[Y5,J5],recoveryPubkey:X5,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 nq(){let e=Z5(),t=eq(),n=await tq(),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 V5,W5,G5,K5,Y5,J5,X5,rq,t_=G(()=>{Mc();qc();pm();$c();V5=Lc("protocols/templates",import.meta.url),W5=[/\bselfdestruct\s*\(/i,/\bdelegatecall\s*\(/i,/\btx\.origin\b/,/\bassembly\s*\{/],G5="4wBqpZM9xaSheZzJSMawUKKwhdpChKbZ5eu5ky4Vigw",K5="6Ckm2BrZsQhcNZ6AcXjB9UbcK1jTn1nao3HSBKv5qvWY",Y5="031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078f",J5="024d4b6cd1361032ca9bd2aeb9d900aa4d45d9ead80ac9423374c451a7254d0766",X5="02531fe6068134503d2723133227c867ac8fa6c83c537e9a44c3c5bdbdcb1fe337";rq=Kn.dirname(z5(import.meta.url))});import{createHash as Iq}from"node:crypto";function Kt(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Mo(e){return typeof e=="number"&&Number.isFinite(e)}function Oh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Oh(t);return Object.freeze(e)}for(let t of Object.keys(e))Oh(e[t]);return Object.freeze(e)}function Cr(e){if(Array.isArray(e))return e.map(Cr);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Cr(e[n]);return t}return e}function Nh(e){return{netPnlUsd:e.metrics.netPnlUsd,netPnlPct:e.metrics.netPnlPct,maxDrawdownPct:e.metrics.maxDrawdownPct,winRate:e.metrics.winRate,profitFactor:e.metrics.profitFactor,tradeCount:e.metrics.tradeCount,sharpe:e.metrics.sharpe,turnoverUsd:e.metrics.turnoverUsd,exposurePct:e.metrics.exposurePct}}function N_(e){return{feesUsd:e.costs.feesUsd,builderFeesUsd:e.costs.builderFeesUsd,fundingUsd:e.costs.fundingUsd,slippageUsd:e.costs.slippageUsd}}function Pq(e){return(e.feesUsd||0)+(e.builderFeesUsd||0)+Math.max(0,e.fundingUsd||0)+(e.slippageUsd||0)}function Tq(e){let t=0;for(let n of e.trades)n.grossPnlUsd>0&&(t+=n.grossPnlUsd);return t}function Nq(e,t,n){return!(!e||e.tradeCount<Math.max(1,Math.min(n,3))||!(e.netPnlUsd>0)||!(e.profitFactor>1)||!(e.maxDrawdownPct<=t.maxDailyLossPct))}function O_(e){if(!Kt(e))throw new TypeError("evidence artifact must be a plain object");if(!_q.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!Kt(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!Kt(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!Kt(e.train)||!Kt(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return Cr({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>Cr(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function R_(e){return Iq("sha256").update(JSON.stringify(O_(e)),"utf8").digest("hex")}function Ut(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function Ch(e,t){if(!Kt(e)||!Kt(e.metrics))throw new Error(`${t} metrics required`);let n=Ut(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!Mo(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function Cq(e,{maxDailyLossPct:t}={}){let n=e.split,r=Ut(n.trainStartIndex,"split.trainStartIndex"),o=Ut(n.trainEndIndex,"split.trainEndIndex"),i=Ut(n.trainBarCount,"split.trainBarCount",1),a=Ut(n.holdoutStartIndex,"split.holdoutStartIndex"),s=Ut(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Ut(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||a!==o+1||s-a+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!Mo(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");Ch(e.train,"train");let l=Ch(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(Mo(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,m=-1;for(let h=0;h<d.length;h++){let g=d[h];if(!Kt(g)||g.index!==h||typeof g.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let b=Ut(g.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),S=Ut(g.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),w=Ut(g.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),y=Ut(g.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(b!==0||S>=w||w>y||w<=m)throw new Error("walk-forward windows must be chronological and disjoint");if(m=y,g.passed){if(p+=1,g.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let k=Ch({metrics:g.metrics,tradeCount:g.metrics?.tradeCount},`walkForward.windows[${h}]`);if(k.tradeCount<1||k.netPnlUsd<=0||k.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(Mo(t)&&k.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(g.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let f=p/d.length;if(!Mo(u.passRate)||Math.abs(u.passRate-f)>Number.EPSILON||f<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function L_(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=O_(e),r=Cr({id:e.id,...n});if(JSON.stringify(Cr(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=R_(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&Cq(e,t),e}function Rh({strategy:e,bars:t,backtestOptions:n={},trainFraction:r=.7,walkForwardWindows:o=3,minTrades:i=10}={}){let a=[];if(!Kt(e))throw new TypeError("strategy must be a plain object");if(!Array.isArray(t))throw new TypeError("bars must be an array");if(!Kt(n))throw new TypeError("backtestOptions must be a plain object");if(!Mo(r)||r<=0||r>=1)throw new TypeError("trainFraction must be in (0,1)");if(!Number.isInteger(o)||o<1)throw new TypeError("walkForwardWindows must be a positive integer");if(!Number.isInteger(i)||i<0)throw new TypeError("minTrades must be an integer >= 0");let s=nt(e),c=Fo(s),l=Fa(t),u=t.length,d=(R=[],U={})=>C_({status:"fail",strategy:s,sHash:c,barsHash:l,split:U.split||{trainStartIndex:0,trainEndIndex:-1,trainBarCount:0,holdoutStartIndex:0,holdoutEndIndex:-1,holdoutBarCount:0,trainFraction:r},train:U.train||null,holdout:U.holdout||null,walkForward:U.walkForward||{windows:[],passRate:0},flags:[...a,...R]});if(u<10)return d([{type:"insufficient_bars",message:"need at least 10 bars for evidence"}]);let p=Math.floor(u*r),m=p,f=u-m;if(p<5||f<3)return d([{type:"invalid_windowing",message:"train/holdout split too small",trainCount:p,holdoutCount:f}]);let h=t.slice(0,p),g=t.slice(m),b,S;try{b=Jn(s,h,n),S=Jn(s,g,n)}catch(R){return d([{type:"backtest_error",message:String(R.message||R)}])}let w={metrics:Nh(b),costs:N_(b),tradeCount:b.metrics.tradeCount},y={metrics:Nh(S),costs:N_(S),tradeCount:S.metrics.tradeCount},k={trainStartIndex:0,trainEndIndex:p-1,trainBarCount:p,holdoutStartIndex:m,holdoutEndIndex:u-1,holdoutBarCount:f,trainFraction:r},v=[],x=Math.floor(u/(o+1));if(x<3)a.push({type:"invalid_windowing",message:"walk-forward window size too small",wfSize:x});else for(let R=0;R<o;R++){let U=x*(R+1),Q=U,Y=Math.min(u,Q+x);if(Y-Q<3||U<3){v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"window_too_small",metrics:null});continue}let Re=t.slice(Q,Y),lt;try{lt=Jn(s,Re,n)}catch{v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:!1,reason:"backtest_error",metrics:null});continue}let q=Nh(lt),H=Nq(q,s.risk,i);v.push({index:R,trainStartIndex:0,trainEndIndex:U-1,evalStartIndex:Q,evalEndIndex:Y-1,passed:H,reason:H?"pass":"fail_metrics",metrics:q})}let E=v.filter(R=>R.passed).length,_=v.length===0?0:E/v.length,P={windows:v,passRate:_,windowsRun:v.length};y.metrics.tradeCount===0&&w.metrics.tradeCount===0&&a.push({type:"no_trades",message:"no trades in train or holdout"}),y.metrics.tradeCount===0&&a.push({type:"absent_oos_trades",message:"holdout produced no trades"}),y.metrics.netPnlUsd<0&&a.push({type:"holdout_loss",message:"holdout netPnlUsd is negative"}),w.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<0&&w.metrics.netPnlUsd>Math.abs(y.metrics.netPnlUsd)*.25?a.push({type:"overfit",message:"profitable train with losing holdout (OOS collapse)"}):w.metrics.netPnlUsd>0&&y.metrics.netPnlUsd>0&&y.metrics.netPnlUsd<w.metrics.netPnlUsd*.1&&w.metrics.tradeCount>=i&&a.push({type:"severe_oos_collapse",message:"holdout pnl collapsed vs train"});let N=Pq(y.costs),I=Tq(S);I>0&&N>I&&a.push({type:"costs_exceed_gross",message:"holdout costs exceed gross gains"});let L=a.some(R=>["insufficient_bars","invalid_windowing","absent_oos_trades","holdout_loss","no_trades","severe_oos_collapse","backtest_error"].includes(R.type)),F=a.some(R=>R.type==="overfit"),O="fail";return y.metrics.tradeCount>=i&&y.metrics.netPnlUsd>0&&y.metrics.profitFactor>1&&y.metrics.maxDrawdownPct<=s.risk.maxDailyLossPct&&_>=.6&&!(I>0&&N>I)&&!F&&!a.some(R=>R.type==="severe_oos_collapse"||R.type==="invalid_windowing")?O="pass_live_eligible":!L&&y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&Number.isFinite(y.metrics.netPnlUsd)?(O="pass_paper_only",y.metrics.tradeCount<i&&a.push({type:"undersampled",message:"holdout trades below minTrades"})):F&&y.metrics.tradeCount>0&&w.metrics.netPnlUsd>0?O="fail":y.metrics.tradeCount>0&&w.metrics.tradeCount>0&&!L?O="pass_paper_only":O="fail",y.metrics.netPnlUsd<0&&(O=O==="pass_live_eligible"?"fail":O==="pass_paper_only"?"pass_paper_only":"fail",O="fail"),C_({status:O,strategy:s,sHash:c,barsHash:l,split:k,train:w,holdout:y,walkForward:P,flags:a})}function C_({status:e,strategy:t,sHash:n,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c}){let l={status:e,strategyHash:n,compilerHash:Rr,barsHash:r,split:o,train:i,holdout:a,walkForward:s,flags:c};return l.id=R_(l),Oh(Cr(JSON.parse(JSON.stringify(l))))}var _q,Lh=G(()=>{Lr();Or();Rl();_q=Object.freeze(["fail","pass_paper_only","pass_live_eligible"])});function Ua(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Rq(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Bh(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>Bh(n,`${t}[${r}]`));return}if(Ua(e))for(let[n,r]of Object.entries(e)){let o=Rq(n);if(Oq.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);Bh(r,`${t}.${n}`)}}function $h(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function $_({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(Bh({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!Ua(e))throw new Error("handoff: strategy required");if(!Ua(t))throw new Error("handoff: evidence required");if(!Ua(n))throw new Error("handoff: shadow required");if(!Ua(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let a=nt(e,{nowMs:o}),s=rt(a);if(L_(t,{maxDailyLossPct:a.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==s.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==s.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!$h(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>s.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!$h(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>s.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!$h(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=s.strategy.risk.maxNotionalUsd*(s.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==s.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>s.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:s.strategyHash,compilerHash:s.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:s.strategyHash,compilerHash:s.compilerHash,compilerVersion:Da,venue:"hyperliquid",market:{coin:s.strategy.market.coin,kind:"perp",interval:s.strategy.market.interval},risk:{...s.strategy.risk},strategy:JSON.parse(JSON.stringify(s.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return $(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}var Oq,B_=G(()=>{Lr();Lh();Or();ne();Oq=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});function Uo(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function Do(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function qa(e){if(Array.isArray(e))for(let t of e)qa(t);else if(e&&typeof e=="object")for(let t of Object.values(e))qa(t);return Object.freeze(e)}function $q(e){let t=Lq[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function Bq(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");Do(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=Do(Number(o.t),`candles[${r}].t`);if(Do(Number(o.T),`candles[${r}].T`)>t)continue;let s={t:i,o:Uo(o.o,`candles[${r}].o`),h:Uo(o.h,`candles[${r}].h`),l:Uo(o.l,`candles[${r}].l`),c:Uo(o.c,`candles[${r}].c`),v:Uo(o.v,`candles[${r}].v`)};if(s.h<Math.max(s.o,s.c,s.l))throw new TypeError(`candles[${r}].h is below another price`);if(s.l>Math.min(s.o,s.c,s.h))throw new TypeError(`candles[${r}].l is above another price`);if(s.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(s))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,s)}return qa([...n.values()].sort((r,o)=>r.t-o.t))}function Mq(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=Do(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:Uo(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function Fq({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),a=!1;for(let s=0;s<16&&i<=n;s++){let c=await ks({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){a=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!a)throw new Error("strategy history exceeds the bounded funding history limit");return Mq(o,n)}function Uq(e,t,n){let r=0,o=null;return e.map(i=>{let a=i.t+n,s=0;for(;r<t.length&&t[r].time<a;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(s+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:s}:{...i,fundingRate:o,fundingPaymentRate:s}})}async function M_(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=$q(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=Do(e.endTime,"endTime"),a=e.count==null?1500:e.count;if(!Number.isInteger(a)||a<20||a>5e3)throw new TypeError("count must be an integer from 20 to 5000");let s=e.startTime==null?Math.max(0,i-a*o):Do(e.startTime,"startTime");if(s>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Vr({coin:n,interval:r,startTime:s,endTime:i},t),Fq({coin:n,startTime:s,endTime:i},t)]),u=Bq(c,{endTime:i}),d=qa(Uq(u,l,o));return qa({coin:n,interval:r,range:{startTime:s,endTime:i},bars:d})}var Lq,F_=G(()=>{mt();Lq=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});function Hq(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))qq.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!Dq.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function jq(e={}){let t=await Ss(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var Dq,qq,U_,D_=G(()=>{mt();B_();F_();Dq=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),qq=new Set(["coin","interval"]);U_=Object.freeze({id:"hyperliquid",validateMarket:Hq,fetchBars:M_,listMarkets:jq,prepareIntent(e){return $_(e)}})});function Vq(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of zq.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}function Mh(e){return typeof e!="string"?null:Wq.get(e)??null}function Fh(e){let t=Mh(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var zq,q_,Wq,_Y,Uh=G(()=>{D_();zq=Object.freeze(["id","validateMarket","prepareIntent"]);q_=[U_].map(Vq),Wq=new Map(q_.map(e=>[e.id,e])),_Y=Object.freeze([...q_])});import{createHash as Gq}from"node:crypto";function _t(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ce(e){return typeof e=="number"&&Number.isFinite(e)}function Y_(e){return Number.isInteger(e)&&e>0}function zh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)zh(t);return Object.freeze(e)}for(let t of Object.keys(e))zh(e[t]);return Object.freeze(e)}function Vh(e){if(Array.isArray(e))return e.map(Vh);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Vh(e[n]);return t}return e}function B(e,t,n){e.push({path:t,message:n})}function Xn(e,t,n,r){for(let o of Object.keys(e))t.has(o)||B(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function Z_(e,t,n,r){if(!Ce(e)||!Ce(t)||!Ce(n)||!Ce(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function jh(e,t,n,r){if(_t(e)){if(Xn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return B(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return B(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!_t(o)||![o.value,o.min,o.max,o.step].every(Y_)?(B(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return Y_(e)?e:(B(r,t,"must be a positive integer or {param}"),null)}function J_(e,t,n,r){return _t(e)?(Xn(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(B(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(B(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):Ce(e)?e:(B(r,t,"must be a finite number or {param}"),null)}function Ll(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function n3(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let a of Ll(i))if(e.has(a)&&n(a))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function r3(e,t){if(!_t(e))return B(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>W_)return B(t,"parameters",`too many parameters (max ${W_})`),null;let r={};for(let o of n){if(!X_.test(o)){B(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],a=`parameters.${o}`;if(!_t(i)){B(t,a,"must be a plain object");continue}Xn(i,j_,a,t);for(let d of j_)d in i||B(t,`${a}.${d}`,"required field is missing");let{value:s,min:c,max:l,step:u}=i;Ce(c)||B(t,`${a}.min`,"must be a finite number"),Ce(l)||B(t,`${a}.max`,"must be a finite number"),(!Ce(u)||u<=0)&&B(t,`${a}.step`,"must be a positive finite number"),Ce(s)||B(t,`${a}.value`,"must be a finite number"),Ce(c)&&Ce(l)&&c>l&&B(t,`${a}.min`,"min must be <= max"),Ce(s)&&Ce(c)&&Ce(l)&&Ce(u)&&u>0&&(Z_(s,c,l,u)||B(t,`${a}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:s,min:c,max:l,step:u}}return r}function o3(e,t,n,r){let o=`nodes.${t}`;if(!_t(e))return B(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!V_[e.type])return B(r,`${o}.type`,"unknown or missing node type"),Xn(e,t3,o,r),null;switch(Xn(e,V_[e.type],o,r),(typeof e.id!="string"||!Q_.test(e.id))&&B(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Kq.has(e.field))&&B(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest"),{id:e.id,type:"input",field:e.field};case"constant":{let i=J_(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!Yq.has(e.indicator))&&B(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,a={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string when provided"):a.input=e.input);let s=jh(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}else typeof e.input!="string"||!e.input?B(r,`${o}.input`,"must be a node id string"):a.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))B(r,`${o}.period`,"required field is missing");else{let s=jh(e.period,`${o}.period`,n,r);s!=null&&(a.period=s)}if(i==="macd"){for(let s of["fastPeriod","slowPeriod","signalPeriod"])if(!(s in e))B(r,`${o}.${s}`,"required field is missing");else{let c=jh(e[s],`${o}.${s}`,n,r);c!=null&&(a[s]=c)}"output"in e?Zq.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be line|signal|histogram"):B(r,`${o}.output`,"required field is missing"),"period"in e&&B(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&B(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))B(r,`${o}.stdDev`,"required field is missing");else{let s=J_(e.stdDev,`${o}.stdDev`,n,r);s!=null&&(typeof s=="number"&&s<=0?B(r,`${o}.stdDev`,"must be > 0"):a.stdDev=s)}"output"in e?e3.has(e.output)?a.output=e.output:B(r,`${o}.output`,"must be upper|middle|lower"):B(r,`${o}.output`,"required field is missing");for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}else{"output"in e&&B(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&B(r,`${o}.stdDev`,`forbidden for ${i}`);for(let s of["fastPeriod","slowPeriod","signalPeriod"])s in e&&B(r,`${o}.${s}`,`forbidden for ${i}`)}return a}case"compare":return(typeof e.op!="string"||!Jq.has(e.op))&&B(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!Xq.has(e.op))&&B(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return B(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let a=0;a<e.inputs.length;a++){let s=e.inputs[a];typeof s!="string"||!s?B(r,`${o}.inputs.${a}`,"must be a node id"):i.push(s)}return e.op==="not"?i.length!==1&&B(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&B(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!Qq.has(e.direction))&&B(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&B(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&B(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function i3(e,t,n){if(!_t(e))return B(t,"risk","must be a plain object"),null;Xn(e,z_,"risk",t);for(let p of z_)(!(p in e)||e[p]==null)&&B(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!Ce(o)||o<=0||o>50?B(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!Ce(i)||i<=0?B(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let a=e.positionSizePct;!Ce(a)||a<=0||a>100?B(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=a;let s=e.stopLossPct;!Ce(s)||s<=0||s>100?B(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=s;let c=e.takeProfitPct;!Ce(c)||c<=0||c>1e3?B(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?B(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!Ce(u)||u<=0||u>100?B(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?B(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&B(t,"risk.expiresAt","must be strictly greater than nowMs"):B(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function Wh(e,t={}){let n=[];if(!_t(e))return B(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};Xn(e,H_,"",n);for(let d of H_)(!(d in e)||e[d]==null)&&B(n,d,"required field is missing");e.version!==Dh&&B(n,"version",`must be ${Dh}`),(typeof e.id!="string"||!X_.test(e.id))&&B(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>K_)&&B(n,"name",`must be a non-empty string max ${K_}`);let r=Mh(e.venue);r||B(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)_t(e.market)||B(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))B(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)B(n,p.path,p.message)}let i=r3(e.parameters,n),a=null,s=new Map;if(!Array.isArray(e.nodes))B(n,"nodes","must be an array");else if(e.nodes.length>G_)B(n,"nodes",`too many nodes (max ${G_})`);else{a=[];for(let d=0;d<e.nodes.length;d++){let p=o3(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&Q_.test(p.id)&&(s.has(p.id)?B(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):s.set(p.id,p)),a.push(p))}for(let d=0;d<a.length;d++){let p=a[d],m=`nodes.${d}`;for(let f of Ll(p))s.has(f)||B(n,m,`unknown node ref "${f}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let f of Ll(p)){let h=s.get(f);h&&qh.has(h.type)&&B(n,m,`node ref "${f}" must be numeric`)}if(p.type==="logic")for(let f of Ll(p)){let h=s.get(f);h&&!qh.has(h.type)&&B(n,m,`node ref "${f}" must be boolean`)}}n3(s)&&B(n,"nodes","graph contains a cycle")}let c=null;if(!_t(e.rules))B(n,"rules","must be a plain object");else{Xn(e.rules,Hh,"rules",n);for(let d of Hh)d in e.rules||B(n,`rules.${d}`,"required field is missing");c={};for(let d of Hh){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){B(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!s.has(p)){B(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let m=s.get(p);qh.has(m.type)||B(n,`rules.${d}`,`rule must reference a boolean node, not ${m.type}`),c[d]=p}}let l=i3(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=zh({version:Dh,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:a,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function nt(e,t={}){let n=Wh(e,t);if(!n.ok)throw new qo(n.errors);return n.strategy}function a3(e){let t=nt(e);return JSON.stringify(Vh(t))}function Fo(e){let t=a3(e);return Gq("sha256").update(t,"utf8").digest("hex")}function Ha(e,t){if(!_t(e))throw new qo([{path:"",message:"strategy must be a plain object"}]);if(!_t(t))throw new qo([{path:"overrides",message:"must be a plain object"}]);let n=nt(e),r={};for(let[i,a]of Object.entries(n.parameters))r[i]={value:a.value,min:a.min,max:a.max,step:a.step};let o=[];for(let[i,a]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){B(o,i,`unknown parameter "${i}"`);continue}let s=r[i];if(!Ce(a)){B(o,i,"override must be a finite number");continue}if(!Z_(a,s.min,s.max,s.step)){B(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...s,value:a}}if(o.length)throw new qo(o);return nt({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let a={...i};return Array.isArray(i.inputs)&&(a.inputs=[...i.inputs]),a}),rules:{...n.rules},risk:{...n.risk}})}var Dh,X_,Q_,Kq,Yq,Jq,Xq,Qq,Zq,e3,qh,H_,j_,Hh,z_,t3,V_,W_,G_,K_,qo,Or=G(()=>{Uh();Dh=1,X_=/^[a-z0-9][a-z0-9._-]{0,63}$/,Q_=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Kq=new Set(["open","high","low","close","volume","fundingRate","openInterest"]),Yq=new Set(["sma","ema","rsi","macd","bollinger","atr"]),Jq=new Set(["gt","gte","lt","lte","eq"]),Xq=new Set(["and","or","not"]),Qq=new Set(["above","below"]),Zq=new Set(["line","signal","histogram"]),e3=new Set(["upper","middle","lower"]),qh=new Set(["compare","logic","cross"]),H_=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),j_=new Set(["value","min","max","step"]),Hh=new Set(["entryLong","entryShort","exitLong","exitShort"]),z_=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),t3=new Set(["id","type"]),V_={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},W_=16,G_=128,K_=100,qo=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}}});function ja(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Qn(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function s3(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function tP(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function $l(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let a=0;a<t;a++)r+=e[a];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let a=t;a<e.length;a++)o=i*e[a]+(1-i)*o,n[a]=o;return n}function nP(e,t){ja(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let s=1;s<=t;s++){let c=e[s]-e[s-1];c>=0?r+=c:o-=c}let i=r/t,a=o/t;n[t]=eP(i,a);for(let s=t+1;s<e.length;s++){let c=e[s]-e[s-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,a=(a*(t-1)+u)/t,n[s]=eP(i,a)}return n}function eP(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function rP(e,t={}){ja(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Qn(n),Qn(r),Qn(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=$l(e,n),a=$l(e,r),s=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&a[d]!=null&&(s[d]=i[d]-a[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<s.length;d++)s[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=s[u[h]];let p=d/o,m=u[o-1];c[m]=p,l[m]=s[m]-p;let f=2/(o+1);for(let h=o;h<u.length;h++){let g=u[h];p=f*s[g]+(1-f)*p,c[g]=p,l[g]=s[g]-p}}return{line:s,signal:c,histogram:l}}function oP(e,t={}){ja(e);let n=t.period,r=t.stdDev;if(Qn(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),a=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:a};let s=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(s+=u,c+=u*u,l>=n){let d=e[l-n];s-=d,c-=d*d}if(l>=n-1){let d=s/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let m=Math.sqrt(p);o[l]=d,i[l]=d+r*m,a[l]=d-r*m}}return{upper:i,middle:o,lower:a}}function iP(e,t){s3(e),Qn(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let a=0;a<e.length;a++){let s=e[a];if(a===0)r[a]=s.h-s.l;else{let c=e[a-1].c;r[a]=Math.max(s.h-s.l,Math.abs(s.h-c),Math.abs(s.l-c))}}let o=0;for(let a=0;a<t;a++)o+=r[a];let i=o/t;n[t-1]=i;for(let a=t;a<e.length;a++)i=(i*(t-1)+r[a])/t,n[a]=i;return n}var aP=G(()=>{});import{createHash as c3}from"node:crypto";var Gh,l3,u3,d3,sP,cP=G(()=>{Gh=2,l3="93f9c998260e73756c13871dc1a84dd6cdb26ec6113bd1941f023519939db440",u3="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",d3="f197a38ff1c0f4ebe13326db8cbb8167ea3dd5d62e6033fe97c2fee8d23d96b5",sP=c3("sha256").update(JSON.stringify({version:Gh,compilerSourceHash:l3,indicatorsSourceHash:u3,schemaSourceHash:d3})).digest("hex")});function Dt(e){return typeof e=="number"&&Number.isFinite(e)}function f3(e){let t=new Map(e.map(s=>[s.id,s])),n=s=>{switch(s.type){case"indicator":return s.input?[s.input]:[];case"compare":case"cross":return[s.left,s.right];case"logic":return[...s.inputs];default:return[]}},r=new Map,o=new Map;for(let s of e)r.set(s.id,0),o.set(s.id,[]);for(let s of e)for(let c of n(s))t.has(c)&&(o.get(c).push(s.id),r.set(s.id,r.get(s.id)+1));let i=[];for(let[s,c]of r)c===0&&i.push(s);let a=[];for(;i.length;){let s=i.shift();a.push(s);for(let c of o.get(s))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(a.length!==e.length)throw new Error("strategy graph is cyclic");return a}function Ho(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function h3(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:a,o:s,h:c,l,c:u,v:d}=i;if(!Dt(a)&&(typeof a=="number"&&Number.isFinite(a)),!Number.isFinite(a))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u],["v",d]])if(!Dt(m))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,m]of[["o",s],["h",c],["l",l],["c",u]])if(!(m>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(s,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(s,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(a>r))throw new TypeError("bars t must be strictly increasing");if(a-r!==m3[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=a,"fundingRate"in i&&i.fundingRate!=null&&!Dt(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!Dt(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}}}function $r(e,t,n,r,o,i){if(i.has(e))return i.get(e);let a=t.get(e),s;switch(a.type){case"input":{let c=p3[a.field];s=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];s[l]=u===void 0?null:u}break}case"constant":{let c=Ho(a.value,n);s=new Array(o+1).fill(c);break}case"indicator":{let c=a.period!=null?Ho(a.period,n):void 0;if(a.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let m=r[p];d.push({o:m.o,h:m.h,l:m.l,c:m.c})}s=iP(d,c);break}let u=$r(a.input,t,n,r,o,i).map((d,p)=>{if(d==null||!Dt(d))throw new TypeError(`indicator input ${a.input} has non-finite value at ${p}`);return d});if(a.indicator==="sma")s=tP(u,c);else if(a.indicator==="ema")s=$l(u,c);else if(a.indicator==="rsi")s=nP(u,c);else if(a.indicator==="macd")s=rP(u,{fastPeriod:Ho(a.fastPeriod,n),slowPeriod:Ho(a.slowPeriod,n),signalPeriod:Ho(a.signalPeriod,n)})[a.output];else if(a.indicator==="bollinger")s=oP(u,{period:c,stdDev:Ho(a.stdDev,n)})[a.output];else throw new Error(`unsupported indicator ${a.indicator}`);break}case"compare":{let c=$r(a.left,t,n,r,o,i),l=$r(a.right,t,n,r,o,i);s=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!Dt(d)||!Dt(p)){s[u]=!1;continue}switch(a.op){case"gt":s[u]=d>p;break;case"gte":s[u]=d>=p;break;case"lt":s[u]=d<p;break;case"lte":s[u]=d<=p;break;case"eq":s[u]=d===p;break;default:s[u]=!1}}break}case"logic":{let c=a.inputs.map(l=>$r(l,t,n,r,o,i));s=new Array(o+1);for(let l=0;l<=o;l++)if(a.op==="not"){let u=c[0][l];s[l]=u===!0?!1:u===!1}else if(a.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}s[l]=u}else if(a.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}s[l]=u}else s[l]=!1;break}case"cross":{let c=$r(a.left,t,n,r,o,i),l=$r(a.right,t,n,r,o,i);s=new Array(o+1),s[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],m=c[u],f=l[u];if(d==null||p==null||m==null||f==null||!Dt(d)||!Dt(p)||!Dt(m)||!Dt(f)){s[u]=!1;continue}a.direction==="above"?s[u]=d<=p&&m>f:s[u]=d>=p&&m<f}break}default:throw new Error(`unknown node type ${a.type}`)}return i.set(e,s),s}function rt(e,t={}){let n=nt(e);t&&Object.keys(t).length&&(n=Ha(n,t));let r=new Map(n.nodes.map(m=>[m.id,m])),o=Object.freeze(f3(n.nodes)),i=n.parameters,a=new Set(n.nodes.filter(m=>m.type==="input").map(m=>m.field));if(n.nodes.some(m=>m.type==="indicator"&&m.indicator==="atr"))for(let m of["open","high","low","close"])a.add(m);let s=Object.freeze([...a].sort()),c=Fo(n);function l(m,f){let h={};for(let b of o){let S=m.get(b);h[b]=S[f]}let g=b=>b!=null&&h[b]===!0;return{values:h,signals:{entryLong:g(n.rules.entryLong),entryShort:g(n.rules.entryShort),exitLong:g(n.rules.exitLong),exitShort:g(n.rules.exitShort)}}}function u(m,f){h3(m,f,n.market.interval);let h=new Map;for(let g of o)$r(g,r,i,m,f,h);return h}function d(m,f){return l(u(m,f),f)}function p(m){if(!Array.isArray(m)||m.length===0)throw new TypeError("bars must be a non-empty array");let f=m.length-1,h=u(m,f);return Object.freeze(m.map((g,b)=>Object.freeze(l(h,b))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:Da,compilerHash:Rr,requiredSeries:s,nodeOrder:o,evaluate:d,evaluateAll:p})}var Da,Rr,p3,m3,Lr=G(()=>{Or();aP();cP();Da=Gh,Rr=sP,p3=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest"}),m3=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5})});import{createHash as g3}from"node:crypto";function w3(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Yt(e){return typeof e=="number"&&Number.isFinite(e)}function Kh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Kh(t);return Object.freeze(e)}for(let t of Object.keys(e))Kh(e[t]);return Object.freeze(e)}function Bl(e){if(Array.isArray(e))return e.map(Bl);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Bl(e[n]);return t}return e}function Yh(e,t="result"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`non-finite backtest result at ${t}`);return}if(!(e==null||typeof e!="object")){if(Array.isArray(e)){e.forEach((n,r)=>Yh(n,`${t}[${r}]`));return}for(let[n,r]of Object.entries(e))Yh(r,`${t}.${n}`)}}function uP(e){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r==null||typeof r!="object"||Array.isArray(r))throw new TypeError(`bars[${n}] must be an object`);let{t:o,o:i,h:a,l:s,c,v:l}=r;if(!Yt(o))throw new TypeError(`bars[${n}].t must be finite`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c],["v",l]])if(!Yt(d))throw new TypeError(`bars[${n}].${u} must be a finite number`);for(let[u,d]of[["o",i],["h",a],["l",s],["c",c]])if(!(d>0))throw new TypeError(`bars[${n}].${u} price must be positive`);if(l<0)throw new TypeError(`bars[${n}].v volume must be non-negative`);if(a<Math.max(i,c,s))throw new TypeError(`bars[${n}] high must be >= max(open, close, low)`);if(s>Math.min(i,c,a))throw new TypeError(`bars[${n}] low must be <= min(open, close, high)`);if(t!=null&&!(o>t))throw new TypeError("bars t must be strictly increasing");if(t=o,"fundingRate"in r&&r.fundingRate!=null&&!Yt(r.fundingRate))throw new TypeError(`bars[${n}].fundingRate must be finite when present`);if("fundingPaymentRate"in r&&r.fundingPaymentRate!=null&&!Yt(r.fundingPaymentRate))throw new TypeError(`bars[${n}].fundingPaymentRate must be finite when present`);if("openInterest"in r&&r.openInterest!=null&&!Yt(r.openInterest))throw new TypeError(`bars[${n}].openInterest must be finite when present`)}}function Fa(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");return e.length>0&&uP(e),g3("sha256").update(JSON.stringify(Bl(e)),"utf8").digest("hex")}function b3(e){if(e==null&&(e={}),!w3(e))throw new TypeError("options must be a plain object");let t={...y3},n=new Set(["initialEquityUsd","takerFeeBps","builderFeeBps","slippageBps","latencyBars","maxVolumeParticipationPct","nowMs"]);for(let r of Object.keys(e))if(!n.has(r))throw new TypeError(`unknown option "${r}"`);if("initialEquityUsd"in e){if(!Yt(e.initialEquityUsd)||e.initialEquityUsd<=0)throw new TypeError("initialEquityUsd must be a positive finite number");t.initialEquityUsd=e.initialEquityUsd}for(let r of["takerFeeBps","builderFeeBps","slippageBps"])if(r in e){let o=e[r];if(!Yt(o)||o<0)throw new TypeError(`${r} must be a finite number >= 0`);if(r==="slippageBps"?o>=1e4:o>1e4)throw new TypeError(`${r} exceeds its safe basis-point bound`);t[r]=o}if("latencyBars"in e){let r=e.latencyBars;if(!Number.isInteger(r)||r<1)throw new TypeError("latencyBars must be an integer >= 1");t.latencyBars=r}if("maxVolumeParticipationPct"in e){let r=e.maxVolumeParticipationPct;if(!Yt(r)||r<=0||r>100)throw new TypeError("maxVolumeParticipationPct must be in (0,100]");t.maxVolumeParticipationPct=r}if("nowMs"in e){if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");t.nowMs=e.nowMs}return t}function Ml(e){return e/1e4}function x3(e,t,n){let r=Ml(n);return t==="long"?e*(1+r):e*(1-r)}function S3(e,t,n){let r=Ml(n);return t==="long"?e*(1-r):e*(1+r)}function lP(e,t,n){let r=Math.abs(e)*Ml(t),o=Math.abs(e)*Ml(n);return{taker:r,builder:o,total:r+o}}function k3(e,t){let n=e*(t.positionSizePct/100)*t.maxLeverage;return Math.min(n,t.maxNotionalUsd)}function v3(e,t,n){let r=n/100;return t==="long"?e*(1-r):e*(1+r)}function E3(e,t,n){let r=n/100;return t==="long"?e*(1+r):e*(1-r)}function A3(e,t,n,r){if(!(n>0))return t==="long"?0:Number.POSITIVE_INFINITY;let o=Math.min(.99,1/(2*n)+r/1e4);return t==="long"?e*(1-1/n)/(1-o):e*(1+1/n)/(1+o)}function I3(e,t,n){return t==="long"?e.l<=n:e.h>=n}function _3(e,t,n){return t==="long"?e.h>=n:e.l<=n}function P3(e,t,n){return t==="long"?e.l<=n:e.h>=n}function za(e,t){for(let n of e.requiredSeries)if(["fundingRate","openInterest"].includes(n)&&!t.every(r=>Yt(r?.[n])))throw new Error(`strategy required series is absent: ${n}`)}function T3(e){if(e.length<3)return 0;let t=[];for(let a=1;a<e.length;a++){let s=e[a-1].equity,c=e[a].equity;s>0&&t.push((c-s)/s)}if(t.length<2)return 0;let n=0;for(let a of t)n+=a;let r=n/t.length,o=0;for(let a of t)o+=(a-r)**2;let i=Math.sqrt(o/(t.length-1));return i>0?r/i:0}function N3(e){let t=-1/0,n=0;for(let r of e){let o=r.equity;if(o>t&&(t=o),t>0){let i=(t-o)/t*100;i>n&&(n=i)}}return n}function Jn(e,t,n={}){let r=b3(n);uP(t);let o=Fa(t);r.nowMs!==void 0&&nt(e,{nowMs:r.nowMs});let i=rt(e);if(za(i,t),r.nowMs!==void 0&&i.strategy.risk.expiresAt<=r.nowMs)throw new Error("strategy is expired: risk.expiresAt must be strictly greater than nowMs");let a=i.strategy.risk,s=i.evaluateAll(t),c=r.latencyBars,l=r.slippageBps,u=r.takerFeeBps,d=r.builderFeeBps,p=r.initialEquityUsd,m=0,f=0,h=0,g=0,b=0,S=[],w=[],y=[],k=[],v=[],x=null,E=0,_=null,P=p,N=!1,I=0,L=0,F=[],O=new Array(t.length).fill(0);function D(M){F.push(M)}function R(M){let ae=t[M].v*(r.maxVolumeParticipationPct/100);return Math.max(0,ae-O[M])}function U(M){if(!x)return p;let ae=x.side==="long"?(M-x.entryPrice)*x.qty:(x.entryPrice-M)*x.qty;return p+ae}function Q(M,ae,W){let Ae=W.o,ue=k3(p,a);if(!(ue>0)||!(Ae>0))return;let Ie=x3(Ae,ae,l),xe=ue/Ie,Le=R(M),Vo=Ie*Le;if(xe>Le){y.push({kind:"entry",barIndex:M,time:W.t,side:ae,requestedNotionalUsd:ue,maxFillNotionalUsd:Vo,reason:"volume_participation"});return}O[M]+=xe;let qt=Math.abs(Ie-Ae)*xe,Qt=lP(ue,u,d);p-=Qt.total,m+=Qt.taker,f+=Qt.builder,g+=qt,b+=ue,x={lifecycleEpoch:++L,side:ae,entryBarIndex:M,entryReferencePrice:Ae,entryPrice:Ie,qty:xe,notionalUsd:ue,stop:v3(Ie,ae,a.stopLossPct),take:E3(Ie,ae,a.takeProfitPct),liq:A3(Ie,ae,a.maxLeverage,u+d),entryFees:Qt.taker,entryBuilderFees:Qt.builder,entrySlippageUsd:qt,fundingAccrued:0}}function Y(M,ae,W,Ae){if(!x)return!1;let ue=x.side,Ie=ae,xe=Ie;W!=="liquidation"&&Ae&&(xe=S3(Ie,ue,l));let Le=x.qty,Vo=Le*xe;if(W!=="liquidation"){let p0=R(M),UP=xe*p0;if(Le>p0)return y.push({kind:"exit",barIndex:M,time:t[M].t,side:ue,requestedNotionalUsd:Vo,maxFillNotionalUsd:UP,reason:"volume_participation",triggerReason:W}),!1;O[M]+=Le}let qt=lP(Vo,u,d),Qt=W==="liquidation"?0:Math.abs(xe-Ie)*Le,Wo,zl;ue==="long"?(Wo=(Ie-x.entryReferencePrice)*Le,zl=(xe-x.entryPrice)*Le):(Wo=(x.entryReferencePrice-Ie)*Le,zl=(x.entryPrice-xe)*Le),p+=zl,p-=qt.total,m+=qt.taker,f+=qt.builder,g+=Qt,b+=Vo;let FP={side:ue,entryBarIndex:x.entryBarIndex,entryTime:t[x.entryBarIndex].t,entryPrice:x.entryPrice,exitBarIndex:M,exitTime:t[M].t,exitPrice:xe,exitReason:W,qty:Le,notionalUsd:x.notionalUsd,grossPnlUsd:Wo,feesUsd:x.entryFees+qt.taker,builderFeesUsd:x.entryBuilderFees+qt.builder,fundingUsd:x.fundingAccrued,slippageUsd:x.entrySlippageUsd+Qt,netPnlUsd:Wo-(x.entryFees+qt.taker+x.entryBuilderFees+qt.builder)-x.fundingAccrued-(x.entrySlippageUsd+Qt)};return S.push(FP),W==="liquidation"&&w.push({barIndex:M,time:t[M].t,side:ue,price:xe,tradeIndex:S.length-1}),x=null,L+=1,I=M+1+(a.cooldownBars||0),!0}function Re(M,ae,W,Ae){let ue=M+1;if(ue>=t.length)return;F.some(xe=>xe.kind==="exit"&&xe.side===ae&&xe.fillBar===ue&&xe.epoch===Ae)||D({kind:"exit",side:ae,signalBar:M,fillBar:ue,reason:W,epoch:Ae})}function lt(M){let ae=F.filter(W=>W.fillBar===M);for(let W=F.length-1;W>=0;W--)F[W].fillBar===M&&F.splice(W,1);ae.sort((W,Ae)=>{let ue=Ie=>Ie.kind==="exit"?0:1;return ue(W)-ue(Ae)});for(let W of ae)if(W.kind==="exit"){if(!x||x.side!==W.side||x.lifecycleEpoch!==W.epoch)continue;let Ae=W.reason||"rule";Y(M,t[M].o,Ae,!0)||Re(M,W.side,Ae,W.epoch)}else if(W.kind==="entry"){if(x||W.epoch!==L||M<I)continue;Q(M,W.side,t[M])}}function q(M){if(!x)return;let ae=t[M],W=ae.fundingPaymentRate;if(W==null||!Yt(W)||W===0)return;let Ae=Math.abs(x.qty*ae.c),ue=W*Ae;x.side==="long"?(p-=ue,x.fundingAccrued+=ue,h+=ue):(p+=ue,x.fundingAccrued-=ue,h-=ue)}function H(M){if(!x)return;let ae=t[M].o;(x.side==="long"?ae<=x.liq:ae>=x.liq)&&Y(M,ae,"liquidation",!1)}function te(M){if(!x)return;let ae=t[M],W=x.side,Ae=P3(ae,W,x.liq),ue=I3(ae,W,x.stop),Ie=_3(ae,W,x.take),xe=Le=>W==="long"?Math.min(Le,ae.o):Math.max(Le,ae.o);if(Ae){Y(M,xe(x.liq),"liquidation",!1);return}if(ue&&Ie){Y(M,xe(x.stop),"stop_loss",!0)||Re(M,W,"stop_loss",x.lifecycleEpoch);return}if(ue){Y(M,xe(x.stop),"stop_loss",!0)||Re(M,W,"stop_loss",x.lifecycleEpoch);return}Ie&&(Y(M,x.take,"take_profit",!0)||Re(M,W,"take_profit",x.lifecycleEpoch))}for(let M=0;M<t.length;M++){let ae=Math.floor(t[M].t/864e5);ae!==_&&(_=ae,P=U(t[M].o),N=!1),H(M),lt(M),te(M),q(M),!N&&U(t[M].c)<=P*(1-a.maxDailyLossPct/100)&&(N=!0,k.push({type:"daily_loss_limit",barIndex:M,time:t[M].t,message:"daily loss limit reached; new entries blocked for UTC day"}));let W=s[M].signals,Ae=M+c;if(x)(x.side==="long"&&W.exitLong===!0||x.side==="short"&&W.exitShort===!0)&&Ae<t.length&&(F.some(Le=>Le.kind==="exit"&&Le.side===x.side&&Le.fillBar===Ae&&Le.epoch===x.lifecycleEpoch)||D({kind:"exit",side:x.side,signalBar:M,fillBar:Ae,reason:"rule",epoch:x.lifecycleEpoch}));else{let Ie=W.entryLong===!0,xe=W.entryShort===!0;Ie&&xe?k.push({type:"conflicting_entry_signals",barIndex:M,time:t[M].t,message:"conflicting entry signals; no position opened"}):!N&&(Ie||xe)&&Ae<t.length&&M>=I&&D({kind:"entry",side:Ie?"long":"short",signalBar:M,fillBar:Ae,epoch:L})}let ue=p;x&&(E+=1,ue=U(t[M].c)),v.push({barIndex:M,time:t[M].t,equity:ue,positionSide:x?x.side:null})}let we=null;if(x){let M=t.length-1;if(Y(M,t[M].c,"end_of_data",!0))v[M]={barIndex:M,time:t[M].t,equity:p,positionSide:null};else{let W=U(t[M].c);we={side:x.side,entryBarIndex:x.entryBarIndex,entryTime:t[x.entryBarIndex].t,entryPrice:x.entryPrice,qty:x.qty,notionalUsd:x.notionalUsd,markPrice:t[M].c,markedEquityUsd:W},k.push({type:"open_position_at_end",barIndex:M,time:t[M].t,message:"end-of-data exit missed; position remains open and marked"})}}let We=(x?U(t[t.length-1].c):p)-r.initialEquityUsd,Z=We/r.initialEquityUsd*100,Ee=0,Pt=0,Br=0;for(let M of S)M.netPnlUsd>0?(Ee+=1,Pt+=M.netPnlUsd):M.netPnlUsd<0&&(Br+=-M.netPnlUsd);let Xt=S.length,er=Xt===0?0:Ee/Xt,jl=0;Br>0?jl=Pt/Br:Pt>0&&(jl=1e12);let BP={netPnlUsd:We,netPnlPct:Z,maxDrawdownPct:N3(v),winRate:er,profitFactor:jl,tradeCount:Xt,sharpe:T3(v),turnoverUsd:b,exposurePct:E/t.length*100},MP={initialEquityUsd:r.initialEquityUsd,takerFeeBps:r.takerFeeBps,builderFeeBps:r.builderFeeBps,slippageBps:r.slippageBps,latencyBars:r.latencyBars,maxVolumeParticipationPct:r.maxVolumeParticipationPct},d0={barsHash:o,strategyHash:i.strategyHash,compilerHash:Rr,compilerVersion:Da,config:MP,trades:S,equityCurve:v,metrics:BP,costs:{feesUsd:m,builderFeesUsd:f,fundingUsd:h,slippageUsd:g},liquidations:w,missedFills:y,openPositionAtEnd:we,flags:k};return Yh(d0),Kh(Bl(d0))}var y3,Rl=G(()=>{Lr();Or();y3=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100})});import{createHash as C3}from"node:crypto";function U3(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Jh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Jh(t);return Object.freeze(e)}for(let t of Object.keys(e))Jh(e[t]);return Object.freeze(e)}function D3(e){return String(e).trim().replace(/\s+/g," ")}function q3(e){let t=e.match(/\b(long|short)\b/i);return t?t[1].toLowerCase():null}function H3(e){for(let n of R3)if(new RegExp(`\\b${n}\\b`,"i").test(e))return n;let t=e.match(/\b([A-Z][A-Z0-9]{1,11})\b/);return t?t[1]:null}function j3(e){let t=e.match(/\bon\s+(1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/i);if(!t)return"15m";let n=t[1].toLowerCase();return O3.has(n)?n:null}function z3(e){let t={...$3},n=e.match(/stop\s*loss\s*(\d+(?:\.\d+)?)\s*%?/i);n&&(t.stopLossPct=Number(n[1]));let r=e.match(/take\s*profit\s*(\d+(?:\.\d+)?)\s*%?/i);r&&(t.takeProfitPct=Number(r[1]));let o=e.match(/leverage\s*(\d+(?:\.\d+)?)/i);o&&(t.maxLeverage=Number(o[1]));let i=e.match(/position\s*size\s*(\d+(?:\.\d+)?)\s*%?/i);i&&(t.positionSizePct=Number(i[1]));let a=e.match(/max\s*notional\s*(?:usd\s*)?\$?\s*(\d+(?:\.\d+)?)/i);return a&&(t.maxNotionalUsd=Number(a[1])),t}function V3(e){return[/\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/\bleverage\s*\d+(?:\.\d+)?/gi,/\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi].some(n=>(e.match(n)??[]).length>1)}function W3(e){let t=C3("sha256").update(e,"utf8").digest("hex").slice(0,10),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),o=`${n.length?n:"draft"}-${t}`.replace(/[^a-z0-9._-]/g,"").slice(0,64);return/^[a-z0-9]/.test(o)?o:`d${o}`.slice(0,64)}function G3(e){let t=e.match(/\bema\s*(\d+)\s*cross(?:es)?\s*(above|below)\s*ema\s*(\d+)\b/i);if(!t)return null;let n=Number(t[1]),r=t[2].toLowerCase(),o=Number(t[3]);if(!(n>0)||!(o>0)||n===o)return null;let i=/\b(exit\s+on\s+reverse|reverse\s+exit)\b/i.test(e);return{kind:"ema_cross",fast:n,slow:o,direction:r,reverse:i}}function K3(e){let t=e.match(/\brsi\s*(\d+)\s*(above|below)\s*(-?\d+(?:\.\d+)?)/i);if(!t)return null;let n=Number(t[3]);return!Number.isFinite(n)||n<=0||n>=100?null:{kind:"rsi",period:Number(t[1]),op:t[2].toLowerCase(),threshold:n}}function Y3(e){let t=e.match(/\bfunding\s*rate\s*(above|below)\s*(-?\d+(?:\.\d+)?)(%?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return t[3]==="%"&&(n=n/100),{kind:"funding",op:t[1].toLowerCase(),threshold:n}}function J3(e){let t=e.match(/\bopen\s*interest\s*(above|below)\s*(-?\d+(?:\.\d+)?)(?=\s|,|$)/i);if(!t)return null;let n=Number(t[2]);return!Number.isFinite(n)||n<0?null:{kind:"open_interest",op:t[1].toLowerCase(),threshold:n}}function X3(e,t){let n=e.replace(/^(long|short)\s+[A-Z][A-Z0-9]{1,11}\s+when\s+/i,"");if(n===e)return!1;t.kind==="ema_cross"?n=n.replace(/^ema\s*\d+\s*cross(?:es)?\s*(?:above|below)\s*ema\s*\d+\b/i,""):t.kind==="rsi"?n=n.replace(/^rsi\s*\d+\s*(?:above|below)\s*\d+(?:\.\d+)?\b/i,""):t.kind==="open_interest"?n=n.replace(/^open\s*interest\s*(?:above|below)\s*-?\d+(?:\.\d+)?(?=\s|,|$)/i,""):n=n.replace(/^funding\s*rate\s*(?:above|below)\s*-?\d+(?:\.\d+)?%?(?=\s|,|$)/i,"");let r=[/(?:,\s*)?\bon\s+(?:1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d)\b/gi,/(?:,\s*)?\bstop\s*loss\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\btake\s*profit\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bleverage\s*\d+(?:\.\d+)?/gi,/(?:,\s*)?\bposition\s*size\s*\d+(?:\.\d+)?\s*%?/gi,/(?:,\s*)?\bmax\s*notional\s*(?:usd\s*)?\$?\s*\d+(?:\.\d+)?/gi];t.kind==="ema_cross"&&r.push(/(?:,\s*)?\b(?:exit\s+on\s+reverse|reverse\s+exit)\b/gi);for(let o of r)n=n.replace(o,"");return n.replace(/[\s,;]+/g,"")===""}function dP(e){let t=Math.max(2,Math.floor(e/2));return{value:e,min:Math.max(2,e-t),max:Math.min(500,e+t),step:1}}function Q3({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"c",type:"input",field:"close"},{id:"emaLeft",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_left_period"}},{id:"emaRight",type:"indicator",indicator:"ema",input:"c",period:{param:"ema_right_period"}},{id:"cross",type:"cross",direction:s.direction,left:"emaLeft",right:"emaRight"}],l={entryLong:null,entryShort:null,exitLong:null,exitShort:null};if(e==="long"?l.entryLong="cross":l.entryShort="cross",s.reverse){let u=s.direction==="above"?"below":"above";c.push({id:"crossRev",type:"cross",direction:u,left:"emaLeft",right:"emaRight"}),e==="long"?l.exitLong="crossRev":l.exitShort="crossRev"}return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{ema_left_period:dP(s.fast),ema_right_period:dP(s.slow)},nodes:c,rules:l,risk:{...r,expiresAt:o}}}function Z3({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"c",type:"input",field:"close"},{id:"rsi",type:"indicator",indicator:"rsi",input:"c",period:s.period},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"rsi",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function e8({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"fr",type:"input",field:"fundingRate"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"fr",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function t8({side:e,coin:t,interval:n,risk:r,expiresAt:o,id:i,name:a,spec:s}){let c=[{id:"oi",type:"input",field:"openInterest"},{id:"thr",type:"constant",value:s.threshold},{id:"sig",type:"compare",op:s.op==="above"?"gt":"lt",left:"oi",right:"thr"}];return{version:1,id:i,name:a,venue:"hyperliquid",market:{coin:t,interval:n},parameters:{},nodes:c,rules:{entryLong:e==="long"?"sig":null,entryShort:e==="short"?"sig":null,exitLong:null,exitShort:null},risk:{...r,expiresAt:o}}}function pP(e,t={}){if(typeof e!="string")throw new Ve("prompt must be a string");if(e.length>1e3)throw new Ve("prompt length must be <= 1000");if(!U3(t))throw new Ve("options must be a plain object");if(!Number.isInteger(t.nowMs))throw new Ve("options.nowMs is required integer epoch ms");let n=t.nowMs,r=F3;if("expiresInMs"in t){if(!Number.isInteger(t.expiresInMs))throw new Ve("expiresInMs must be an integer");if(r=t.expiresInMs,r<B3||r>M3)throw new Ve("expiresInMs must be between 1h and 30d")}if(L3.test(e))throw new Ve(`prompt appears to contain secrets and is rejected. ${jo}`);let o=D3(e);if(!o)throw new Ve(`empty prompt. ${jo}`);if(V3(o))throw new Ve(`duplicate interval or risk clause. ${jo}`);let i=q3(o),a=H3(o),s=j3(o);if(!i||!a||!s)throw new Ve(`could not parse side/coin/interval. ${jo}`);let c=z3(o);if(!(c.maxLeverage>0)||c.maxLeverage>50)throw new Ve("leverage out of range");if(!(c.positionSizePct>0)||c.positionSizePct>100)throw new Ve("position size out of range");let l=n+r,u=W3(o),d=`Draft ${a} ${i}`.slice(0,100),p=G3(o),m=K3(o),f=Y3(o),h=J3(o),g=[p,m,f,h].filter(Boolean);if(g.length!==1)throw new Ve(`unsupported or ambiguous prompt. ${jo}`);if(!X3(o,g[0]))throw new Ve(`unsupported or ambiguous prompt. ${jo}`);let b,S=g[0],w={side:i,coin:a,interval:s,risk:c,expiresAt:l,id:u,name:d,spec:S};S.kind==="ema_cross"?b=Q3(w):S.kind==="rsi"?b=Z3(w):S.kind==="open_interest"?b=t8(w):b=e8(w);let y=Wh(b,{nowMs:n});if(!y.ok)throw new Ve(`draft failed validation: ${y.errors.map(k=>k.message).join("; ")}`);return Jh(nt(b,{nowMs:n}))}var Ve,O3,R3,L3,jo,$3,B3,M3,F3,mP=G(()=>{Or();Ve=class extends Error{constructor(t){super(t),this.name="StrategyDraftError"}},O3=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),R3=new Set(["BTC","ETH","SOL","HYPE"]),L3=/\b(mnemonic|private\s*key|privkey|seed\s*phrase|seed\b|api[_-]?key|secret\s*key|wallet\s*key|passphrase)\b/i,jo="Supported grammar: (1) EMA cross: <long|short> <COIN> when EMA <n> crosses <above|below> EMA <m> [on <interval>] [, exit on reverse] [, risk knobs]; (2) RSI: <long|short> <COIN> when RSI <n> <above|below> <threshold> [on <interval>] [, risk knobs]; (3) funding: <long|short> <COIN> when funding rate <above|below> <decimal|percent%> [on <interval>] [, risk knobs]; (4) open interest: <long|short> <COIN> when open interest <above|below> <non-negative number> [on <interval>] [, risk knobs]. Risk knobs: stop loss %, take profit %, leverage, position size %, max notional USD. Coins: BTC ETH SOL HYPE or uppercase token <=12 chars. Intervals: 1m 3m 5m 15m 30m 1h 2h 4h 8h 12h 1d.",$3=Object.freeze({maxLeverage:1,maxNotionalUsd:100,positionSizePct:5,stopLossPct:2,takeProfitPct:4,cooldownBars:1,maxDailyLossPct:3}),B3=36e5,M3=30*864e5,F3=864e5});import{createHash as n8}from"node:crypto";function gP(e){let t=String(e).toLowerCase();return t==="holdout"||t==="test"||t==="oos"||t.includes("holdout")||t.includes("oos")?!0:t==="testbars"||t.endsWith("testbars")||t.startsWith("test")||t.endsWith("test")?!t.includes("backtest"):!1}function yP(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Qh(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)Qh(t);return Object.freeze(e)}for(let t of Object.keys(e))Qh(e[t]);return Object.freeze(e)}function Va(e){if(Array.isArray(e))return e.map(Va);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Va(e[n]);return t}return e}function Fl(e){return JSON.stringify(Va(e))}function r8(e){let{min:t,max:n,step:r}=e;if(!(r>0)||t>n)return[];let o=[],i=Math.floor((n-t)/r+1e-9);for(let s=0;s<=i;s++){let c=t+s*r;if(c>n+1e-9)break;let l=Math.abs(c-Math.round(c))<1e-9?Math.round(c):Number(c.toPrecision(12));l<t-1e-9||l>n+1e-9||o.push(l)}if(o.length===0)return[];let a=o[o.length-1];if(Math.abs(a-n)>1e-9){let s=(n-t)/r;Math.abs(s-Math.round(s))<=1e-9&&o.push(n)}return o}function o8(e,t){if(e.length===0)return[];let n=[{}];for(let r of e){let o=t[r],i=[];for(let a of n)for(let s of o)i.push({...a,[r]:s});n=i}return n.sort((r,o)=>{let i=Fl(r),a=Fl(o);return i<a?-1:i>a?1:0}),n}function Xh(e,t,n,r,o){let i=0;if(e==="maxDrawdownPct"){if(i=t.maxDrawdownPct-r.maxDrawdownPct,i!==0)return i<0}else if(i=t[e]-r[e],i!==0)return i>0;let a=Fl(n),s=Fl(o);return a<s}function wP(e,t,n={}){if(!yP(n))throw new TypeError("options must be a plain object");for(let y of Object.keys(n))if(gP(y))throw new TypeError(`options must not include holdout/test/oos key "${y}"`);let r=new Set(["maxTrials","objective","backtestOptions"]);for(let y of Object.keys(n))if(!r.has(y))throw new TypeError(`unknown option "${y}"`);let o=64;if("maxTrials"in n){let y=n.maxTrials;if(!Number.isInteger(y)||y<1||y>fP)throw new TypeError(`maxTrials must be an integer 1..${fP}`);o=y}let i=n.objective??"netPnlUsd";if(!hP.has(i))throw new TypeError(`objective must be one of ${[...hP].join("|")}`);let a=n.backtestOptions??{};if(!yP(a))throw new TypeError("backtestOptions must be a plain object");for(let y of Object.keys(a))if(gP(y))throw new TypeError(`backtestOptions must not include holdout/test/oos key "${y}"`);let s=nt(e),c=Object.keys(s.parameters).sort();if(c.length===0)throw new Error("optimizeStrategy requires at least one declared parameter");let l={},u=1;for(let y of c){let k=r8(s.parameters[y]);if(k.length===0)throw new Error(`parameter "${y}" produces an empty grid`);l[y]=k,u*=k.length}let d=o8(c,l);if(d.length===0)throw new Error("parameter grid is empty");let p=d.slice(0,o),m=[],f=null,h=null;for(let y of p){let k=Ha(s,y),v=Jn(k,t,a);h==null&&(h=v.config);let x={netPnlUsd:v.metrics.netPnlUsd,netPnlPct:v.metrics.netPnlPct,maxDrawdownPct:v.metrics.maxDrawdownPct,winRate:v.metrics.winRate,profitFactor:v.metrics.profitFactor,tradeCount:v.metrics.tradeCount,sharpe:v.metrics.sharpe,turnoverUsd:v.metrics.turnoverUsd},E={parameters:{...y},metrics:x};m.push(E),(!f||Xh(i,x,y,f.metrics,f.parameters))&&(f=E)}m.sort((y,k)=>Xh(i,y.metrics,y.parameters,k.metrics,k.parameters)?-1:Xh(i,k.metrics,k.parameters,y.metrics,y.parameters)?1:0);let g={...f.parameters},b=Ha(s,g),S={strategyHash:Fo(s),compilerHash:Rr,trainBarsHash:Fa(t),backtestConfig:h,objective:i,maxTrials:o,trialsRun:m.length,candidates:m,bestParameters:g,bestStrategy:b},w={id:n8("sha256").update(JSON.stringify(Va(S)),"utf8").digest("hex"),...S};return Qh(Va(JSON.parse(JSON.stringify(w))))}var fP,hP,bP=G(()=>{Lr();Or();Rl();fP=256,hP=new Set(["netPnlUsd","profitFactor","sharpe","maxDrawdownPct"])});import bn from"node:fs";import Ul from"node:path";function Dl(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Jt(e){return e==null?e:JSON.parse(JSON.stringify(e))}function a8(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function zo(e,t="record"){if(Array.isArray(e)){e.forEach((n,r)=>zo(n,`${t}[${r}]`));return}if(Dl(e))for(let[n,r]of Object.entries(e)){let o=a8(n);if(i8.some(i=>o.includes(i)))throw new Error(`shadow-store: forbidden secret-like field at ${t}.${n}`);zo(r,`${t}.${n}`)}}function s8(e){if(typeof e!="string"||!e||!Ul.isAbsolute(e))throw new Error("shadow-store: path must be an absolute path")}function xP(e){let t;try{t=bn.lstatSync(e)}catch(r){if(r&&r.code==="ENOENT")return;throw r}if(t.isSymbolicLink())throw new Error("shadow-store: store path must not be a symlink");if(!t.isFile())throw new Error("shadow-store: store path must be a regular file");if(t.mode&511&18)throw new Error("shadow-store: store file must not be group or world writable")}function c8(){return{version:e0,runners:[]}}function SP(e,t){let n;try{n=JSON.parse(e)}catch{throw new Error("shadow-store: malformed JSON")}if(!Dl(n))throw new Error("shadow-store: malformed JSON root");if(n.version!==e0)throw new Error(`shadow-store: unsupported version ${n.version}`);if(!Array.isArray(n.runners))throw new Error("shadow-store: runners must be an array");return zo(n,Ul.basename(t)),{version:e0,runners:n.runners.map(r=>Jt(r))}}function kP(e,t){zo(t,"store");let n=Ul.dirname(e);bn.mkdirSync(n,{recursive:!0,mode:448});let r=Ul.join(n,`.shadow-store.${process.pid}.${Date.now()}.tmp`),o=`${JSON.stringify(t)}
|
|
142
|
+
`;try{bn.writeFileSync(r,o,{mode:384,flag:"wx"}),bn.renameSync(r,e);try{bn.chmodSync(e,384)}catch{}}catch(i){try{bn.unlinkSync(r)}catch{}throw i}}function vP(e={}){let t=e.path;if(s8(t),xP(t),bn.existsSync(t)?SP(bn.readFileSync(t,"utf8"),t):kP(t,c8()),Zh.has(t))return Zh.get(t);let n=!1,r=[];function o(){if(n)return;let f=r.shift();if(f){n=!0;try{let h=f.fn();n=!1,f.resolve(h),o()}catch(h){n=!1,f.reject(h),o()}}}function i(f){if(!n&&r.length===0){n=!0;try{return f()}finally{n=!1,queueMicrotask(o)}}return new Promise((h,g)=>{r.push({fn:f,resolve:h,reject:g}),queueMicrotask(o)})}function a(){return xP(t),SP(bn.readFileSync(t,"utf8"),t)}function s(f){kP(t,f)}function c(f){if(!Dl(f)||typeof f.id!="string"||!f.id)throw new Error("shadow-store: create requires record with string id");zo(f,"record");let h=a();if(h.runners.some(b=>b.id===f.id))throw new Error(`shadow-store: runner id already exists: ${f.id}`);let g=Jt(f);return h.runners.push(g),s(h),Jt(g)}function l(f){let h=a().runners.find(g=>g.id===f);return h?Jt(h):null}function u(){return a().runners.map(f=>Jt(f))}function d(f,h){if(typeof h!="function")throw new Error("shadow-store: updater must be a function");let g=a(),b=g.runners.findIndex(y=>y.id===f);if(b<0)throw new Error(`shadow-store: runner not found: ${f}`);let S=Jt(g.runners[b]),w=h(S);if(!Dl(w)||w.id!==f)throw new Error("shadow-store: updater must return record with same id");return zo(w,"record"),g.runners[b]=Jt(w),s(g),Jt(g.runners[b])}function p(f){let h=a(),g=h.runners.findIndex(S=>S.id===f);if(g<0)throw new Error(`shadow-store: runner not found: ${f}`);let b=Jt(h.runners[g]);return b.status!=="stopped"&&(b.status="stopped",h.runners[g]=b,s(h)),Jt(h.runners[g])}let m={create(f){return i(()=>c(f))},get(f){return l(f)},list(){return u()},update(f,h){return i(()=>d(f,h))},stop(f){return i(()=>p(f))}};return Zh.set(t,m),m}var e0,i8,Zh,EP=G(()=>{e0=1,i8=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];Zh=new Map});import{createHash as r0}from"node:crypto";function t0(e){return e==null?e:JSON.parse(JSON.stringify(e))}function n0(e){return Array.isArray(e)?e.map(n0):e&&typeof e=="object"?Object.fromEntries(Object.keys(e).sort().map(t=>[t,n0(e[t])])):e}function IP(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("shadow-runner: record must be an object");return r0("sha256").update(JSON.stringify(n0(e))).digest("hex")}function l8(e,t,n,r,o){return r0("sha256").update(`${e}|${t}|${n}|${r}|${o}`).digest("hex")}function u8(e,t,n,r){return r0("sha256").update(`shadow|${e}|${t}|${n}|${r??""}`).digest("hex")}function d8(e){return e==="entryLong"||e==="exitShort"?"buy":e==="entryShort"||e==="exitLong"?"sell":e}function AP(e){return e==="entryLong"||e==="entryShort"}function o0({storePath:e,clock:t=Date.now}={}){if(typeof e!="string"||!e)throw new Error("shadow-runner: storePath required");let n=vP({path:e});function r({strategy:c,evidenceId:l=null}={}){let u=rt(c),d=l==null?null:String(l),p=n.list().filter(b=>b.status==="running"&&b.strategyHash===u.strategyHash&&b.compilerHash===u.compilerHash&&b.evidenceId===d).sort((b,S)=>b.createdAt-S.createdAt||b.id.localeCompare(S.id))[0];if(p)return t0(p);let m=t(),f=u8(m,u.strategyHash,u.compilerHash,d),h=n.get(f);if(h)return t0(h);let g={id:f,strategy:t0(u.strategy),strategyHash:u.strategyHash,compilerHash:u.compilerHash,evidenceId:d,status:"running",cursor:null,intendedOrders:[],fills:[],missedFills:[],markouts:[],createdAt:m,updatedAt:m,position:null,cooldownBarsRemaining:0,cooldownStartT:null,lastProcessedBarIndex:-1};return n.create(g)}function o(c){return n.get(c)}function i(){return n.list()}function a(c){return n.stop(c)}function s(c,l,{markoutHorizons:u=[1,4,12]}={}){if(!Array.isArray(l))throw new TypeError("shadow-runner: bars must be an array");return n.update(c,d=>{if(d.status!=="running")throw new Error("shadow-runner: runner is stopped");if(l.length===0)return d;let m=rt(d.strategy).evaluateAll(l),f=new Map;for(let I=0;I<l.length;I++)f.set(l[I].t,I);let h=d.cursor,g=[];for(let I=0;I<l.length;I++){let L=l[I].t;(h==null||L>h)&&g.push(I)}if(g.length===0)return d;let b=new Map(d.intendedOrders.map(I=>[I.id,I])),S=new Set(d.fills.map(I=>I.orderId)),w=new Map(d.missedFills.map(I=>[I.orderId,I])),y=(I,L)=>`${I}|${L}`,k=new Map(d.markouts.map(I=>[y(I.orderId,I.horizon),I])),v=d.position?{...d.position}:null,x=Number.isInteger(d.cooldownBarsRemaining)?Math.max(0,d.cooldownBarsRemaining):0,E=Number.isFinite(d.cooldownStartT)?d.cooldownStartT:null;function _({action:I,signalBarT:L,signalIndex:F}){let O=d8(I),D=l8(d.id,d.strategyHash,L,O,I);if(b.has(D))return b.get(D);let R=F+1,U=R<l.length,Q={id:D,action:I,type:I,side:O,signalBarT:L,fillBarT:U?l[R].t:null,status:U?"open":"missed"};return b.set(D,Q),d.intendedOrders.push(Q),Q}function P(I,L,F){if(S.has(I.id))return;let O={orderId:I.id,action:AP(I.action)?"entry":"exit",side:I.side,price:L.o,barT:L.t,signalBarT:I.signalBarT,barIndex:F};if(d.fills.push(O),S.add(I.id),I.status="filled",I.fillBarT=L.t,w.has(I.id)&&(w.delete(I.id),d.missedFills=d.missedFills.filter(D=>D.orderId!==I.id)),AP(I.action)){v={side:I.action==="entryLong"?"long":"short",entryOrderId:I.id,entryBarT:L.t,entryPrice:L.o,entryBarIndex:F};for(let D of u){let R=y(I.id,D);if(k.has(R))continue;let U={orderId:I.id,horizon:D,entryBarT:L.t,entryPrice:L.o,side:v.side,status:"pending",close:null,barT:null};k.set(R,U),d.markouts.push(U)}}else v=null,x=Number(d.strategy?.risk?.cooldownBars)||0,E=L.t}function N(I){if(S.has(I.id)||w.has(I.id))return;let L={orderId:I.id,action:I.action,side:I.side,signalBarT:I.signalBarT,status:"missed"};w.set(I.id,L),d.missedFills.push(L),I.status="missed"}for(let I of d.intendedOrders){if(I.status==="filled"||S.has(I.id))continue;let L=f.get(I.signalBarT);if(L==null)continue;let F=L+1;F<l.length&&(h==null||l[F].t>h)&&P(I,l[F],F)}for(let I of g){let L=l[I],F=m[I].signals,O=v,D=U=>{if(v||x>0&&(E==null||L.t>=E))return;let Y=_({action:U,signalBarT:L.t,signalIndex:I}),Re=I+1;Re<l.length?P(Y,l[Re],Re):N(Y)},R=U=>{if(!v||v.side==="long"&&U!=="exitLong"||v.side==="short"&&U!=="exitShort")return;let Q=_({action:U,signalBarT:L.t,signalIndex:I}),Y=I+1;Y<l.length?P(Q,l[Y],Y):N(Q)};O?(F.exitLong&&R("exitLong"),F.exitShort&&R("exitShort")):F.entryLong&&F.entryShort||(F.entryLong&&D("entryLong"),F.entryShort&&D("entryShort")),x>0&&E!=null&&L.t>=E&&(x-=1,x===0&&(E=null)),d.cursor=L.t,d.lastProcessedBarIndex=I}for(let I of d.markouts){if(I.status!=="pending")continue;let L=d.fills.find(D=>D.orderId===I.orderId&&D.action==="entry");if(!L)continue;let F=f.get(L.barT);if(F==null)continue;let O=F+I.horizon;if(O<l.length){I.close=l[O].c,I.barT=l[O].t,I.status="filled";let D=I.entryPrice;I.markout=I.side==="long"?(I.close-D)/D:(D-I.close)/D}}return d.position=v,d.cooldownBarsRemaining=x,d.cooldownStartT=E,d.updatedAt=t(),d})}return{start:r,step:s,list:i,get:o,stop:a}}var _P=G(()=>{Lr();EP()});var NP={};Tt(NP,{runStrategyOperation:()=>b8});import p8 from"node:os";import m8 from"node:path";function Wa(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function h8(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function a0(e){if(Array.isArray(e)){for(let t of e)a0(t);return}if(Wa(e))for(let[t,n]of Object.entries(e)){if(f8.some(r=>h8(t).includes(r)))throw new Error(`strategy service: secret-like field "${t}" is forbidden`);a0(n)}}function g8(e){if(!Wa(e))throw new TypeError("strategy input must be a plain object");return a0(e),e}function y8(e,t={}){if(t.nowMs!==void 0){if(!Number.isInteger(t.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");return t.nowMs}let n=Date.now();if(e.nowMs===void 0||e.nowMs===null)return n;if(!Number.isInteger(e.nowMs))throw new TypeError("nowMs must be an integer epoch milliseconds");if(Math.abs(e.nowMs-n)>12e4)throw new Error("nowMs outside allowed wall-clock skew (120s); omit nowMs to use server time");return e.nowMs}async function i0(e,t,n,r){if(Array.isArray(t.bars))return t.bars;let o=Fh(e.venue),i=n.fetchBars??o.fetchBars;if(typeof i!="function")throw new Error(`strategy venue ${o.id} does not support history`);n.signal?.throwIfAborted?.();let a=await i({coin:e.market.coin,interval:e.market.interval,count:t.count??1500,endTime:t.endTime??r},{signal:n.signal});n.signal?.throwIfAborted?.();let s=Array.isArray(a)?a:a?.bars;if(!Array.isArray(s))throw new Error("strategy history provider returned no bars");return s}function s0(e,t){let n=e.backtestOptions??{};if(!Wa(n))throw new TypeError("backtestOptions must be a plain object");return{...n,nowMs:t}}function PP(e,t,n,r,o={}){let i=e.evidenceOptions??{};if(!Wa(i))throw new TypeError("evidenceOptions must be a plain object");return{...i,...o,strategy:t,bars:n,backtestOptions:s0(e,r)}}function TP(){return m8.join(p8.homedir(),".oracle","strategy-shadow.json")}function w8(e,t){return{perStrategyNotionalUsd:e.risk.maxNotionalUsd,maxLeverage:e.risk.maxLeverage,dailyLossCapUsd:e.risk.maxNotionalUsd*(e.risk.maxDailyLossPct/100),chainAllowlist:[e.venue],assetAllowlist:[e.market.coin],expiresAt:Math.min(e.risk.expiresAt,t+864e5),killSwitchRequired:!0}}async function b8(e,t={},n={}){n.signal?.throwIfAborted?.();let r=g8(t),o=y8(r,n);if(e==="draft")return{strategy:pP(r.prompt,{nowMs:o})};if(e==="validate"){let i=rt(r.strategy);if(i.strategy.risk.expiresAt<=o)throw new Error("strategy is expired");return{valid:!0,strategy:i.strategy,strategyHash:i.strategyHash,compilerHash:i.compilerHash,compilerVersion:i.compilerVersion,requiredSeries:i.requiredSeries}}if(e==="backtest"||e==="evidence"){let i=rt(r.strategy),a=await i0(i.strategy,r,n,o);za(i,a);let s=Rh(PP(r,i.strategy,a,o));return e==="evidence"?s:{backtest:Jn(i.strategy,a,s0(r,o)),evidence:s}}if(e==="optimize"){let i=rt(r.strategy),a=await i0(i.strategy,r,n,o);za(i,a);let s=r.trainFraction,c=r.evidenceOptions?.trainFraction;if(s!=null&&c!=null&&s!==c)throw new TypeError("conflicting trainFraction controls are forbidden");let l=s??c??.7;if(typeof l!="number"||l<=0||l>=1)throw new TypeError("trainFraction must be in (0,1)");let u=a.slice(0,Math.floor(a.length*l)),d=r.options??{};if(!Wa(d))throw new TypeError("options must be a plain object");let p=wP(i.strategy,u,{...d,...r.maxTrials==null?{}:{maxTrials:r.maxTrials},backtestOptions:s0(r,o)}),m=p.bestStrategy;return{strategy:m,optimization:p,evidence:Rh(PP(r,m,a,o,{trainFraction:l}))}}if(e==="shadow"){let i=o0({storePath:n.storePath??TP(),clock:()=>o}),a=r.action;if(a==="start")return await i.start({strategy:r.strategy,evidenceId:r.evidenceId??r.evidence?.id??null});if(a==="list")return await i.list();if(a==="get")return await i.get(r.id);if(a==="stop")return await i.stop(r.id);if(a==="step"){let s=await i.get(r.id);if(!s)throw new Error(`shadow runner not found: ${r.id}`);let c=await i0(s.strategy,r,n,o);return za(rt(s.strategy),c),await i.step(r.id,c,r.stepOptions??{})}throw new Error(`unknown shadow action: ${a}`)}if(e==="prepare"){let i=rt(r.strategy),a=Fh(i.strategy.venue);if(typeof r.shadowId!="string"||!r.shadowId)throw new Error("strategy prepare requires a matching shadow runner id");let c=await o0({storePath:n.storePath??TP(),clock:()=>o}).get(r.shadowId);if(!c)throw new Error("strategy prepare shadow runner not found");if(c.status!=="running")throw new Error("strategy prepare requires an active shadow runner");if(!Number.isFinite(c.cursor))throw new Error("strategy prepare requires a stepped shadow runner");if(c.strategyHash!==i.strategyHash||c.compilerHash!==i.compilerHash)throw new Error("strategy prepare shadow runner does not match strategy artifacts");if(c.evidenceId!==r.evidence?.id)throw new Error("strategy prepare shadow runner does not match evidence artifact");let l=r.caps??w8(i.strategy,o);return a.prepareIntent({strategy:i.strategy,evidence:r.evidence,shadow:{id:c.id,stateHash:IP(c),status:c.status,cursor:c.cursor,updatedAt:c.updatedAt},caps:l,nowMs:o,env:n.env??process.env})}throw new Error(`unknown strategy operation: ${e}`)}var f8,CP=G(()=>{Rl();Lr();Lh();mP();bP();_P();Uh();f8=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"]});import{createServer as x8}from"node:http";import{randomBytes as S8}from"node:crypto";import{verifyMessage as k8}from"ethers";ir();Dr();j();kn();ne();import{readFileSync as GT,existsSync as KT}from"node:fs";import{getAddress as YT,Interface as cs,TypedDataEncoder as Mu,parseUnits as JT}from"ethers";var zT=/^(0|[1-9][0-9]*)$/,Lu=class extends Error{constructor(t){super(`nft gas-war limit: ${t.reason}`),this.name="NftGasWarLimitError",this.verdict=t}};function ar(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(!zT.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 VT(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("chainId must be a positive integer");return t}function WT(e={}){return e.maxFeePerGas!=null?ar(e.maxFeePerGas,"maxFeePerGas"):e.gasPrice!=null?ar(e.gasPrice,"gasPrice"):null}function $u(e={}){try{let t=VT(e.chainId??e.tx?.chainId),n=e.tx||e,r=e.policy||e,o=r.grant?.maxGasWei??e.grant?.maxGasWei,i=ar(r.maxTotalGasWei??r.maxGasWei??o,"maxTotalGasWei"),a=ar(n.gasLimit??n.gas,"gasLimit"),s=WT(n);if(s==null)throw new Error("maxFeePerGas or gasPrice required");let c=ar(r.maxFeePerGasWei,"maxFeePerGasWei",{required:!1}),l=ar(r.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei",{required:!1}),u=n.maxPriorityFeePerGas==null?null:ar(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 J0(e={}){let t=$u(e);if(!t.ok)throw new Lu(t);return t}var XT="https://api.opensea.io/api/v2",QT="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)",ZT=new cs([`function ${QT}`]),ss=new cs(["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"]),eN=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"]),tN=new Set(eN),ng=new Set(["solana","flow"]),ii="0x0000000000000000000000000000000000000000";function nN(){let e=process.env.OPENSEA_ENV_FILE||`${process.env.HOME||""}/.config/locals-only/opensea.env`;if(!KT(e))return"";try{for(let t of GT(e,"utf8").split(`
|
|
143
143
|
`)){let n=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(n)return n[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function en(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||nN()}function rg(e={}){return dt({provider:"opensea",defaultUrl:XT,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function sr(e={}){return rg(e).baseUrl}function cr(e={}){return at({accept:"application/json"},{"x-api-key":en(e)},rg(e).trusted)}function og(e){let t=String(e||"ethereum").trim().toLowerCase();if(!tN.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function ie(e,t="address"){try{return YT(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function ig(e,t=null){let n=String(e||"").trim();if(!n)throw new Error("opensea: account address required");if(t&&!ng.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(n))return ie(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 rN(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 oN(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 X0(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 iN(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 ag(e={}){if(!en(e))return{ok:!1,configured:!1,error:"OPENSEA_API_KEY not set"};try{let t=await si("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 si(e,t={}){if(!e)throw new Error("collection slug required");if(!en(t))throw new Error("OPENSEA_API_KEY required");return A(`${sr(t)}/collections/${encodeURIComponent(e)}`,{headers:cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function sg(e,t={}){let n=await si(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 ci(e={},t={}){if(!en(t))throw new Error("OPENSEA_API_KEY required");let n=og(e.chain),r=ig(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(`${sr(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 A(l.toString(),{headers:cr(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let d of Array.isArray(u?.nfts)?u.nfts:[])a.push(iN(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 ls(e={},t={}){if(!en(t))throw new Error("OPENSEA_API_KEY required");let n=ig(e.address||e.owner),r=await A(`${sr(t)}/account/${encodeURIComponent(n)}/pnl`,{headers:cr(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 us=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 li(e){let t=String(e||"").trim().toLowerCase(),n=us[t];if(!n)throw new Error(`opensea: unsupported EVM chain ${t||"(missing)"}`);return{chain:t,chainId:n}}function st(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 aN(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 ai(e){let t=String(e??"").trim();if(!/^\d+$/.test(t))throw new Error("opensea: tokenId must be an unsigned integer string");return t}function cg(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 lg(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 sN(e){return!!e&&typeof e=="object"&&[0,1].includes(Number(e.itemType))}function cN(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=ie(e?.token,t);if(n===0&&r!==ii)throw new Error(`opensea: ${t} native payment item must use the zero address`);if(n===1&&r===ii)throw new Error(`opensea: ${t} ERC20 payment item must name a non-zero token contract`);return r}function lN(e,t){let n=st(e?.startAmount,`${t} startAmount`),r=st(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 Bu(e,t,{required:n=!0}={}){let r=(Array.isArray(e)?e:[]).filter(sN);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=cN(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+=lN(a,`${t} payment amount`)}return{paymentToken:o,totalWei:i,count:r.length}}var uN=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 pt(e,t){let n=String(e??"").trim();if(!/^\d+$/.test(n))throw new Error(`opensea: ${t} must be an unsigned integer`);return n}function Q0(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 ug(e,t){return{itemType:Number(pt(e?.itemType,`${t} itemType`)),token:ie(e?.token,`${t} token`),identifierOrCriteria:pt(e?.identifierOrCriteria,`${t} identifierOrCriteria`),startAmount:pt(e?.startAmount,`${t} startAmount`),endAmount:pt(e?.endAmount,`${t} endAmount`)}}function dN(e,t){return{...ug(e,t),recipient:ie(e?.recipient,`${t} recipient`)}}function pN(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:ie(e.offerer,`${t} offerer`),zone:ie(e.zone,`${t} zone`),offer:n.map((o,i)=>ug(o,`${t} offer[${i}]`)),consideration:r.map((o,i)=>dN(o,`${t} consideration[${i}]`)),orderType:Number(pt(e.orderType,`${t} orderType`)),startTime:pt(e.startTime,`${t} startTime`),endTime:pt(e.endTime,`${t} endTime`),zoneHash:Q0(e.zoneHash,`${t} zoneHash`),salt:pt(e.salt,`${t} salt`),conduitKey:Q0(e.conduitKey,`${t} conduitKey`),counter:pt(e.counter,`${t} counter`)}}function dg(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=pN(t,n);if(Mu.hashStruct("OrderComponents",uN,o).toLowerCase()!==r)throw new Error(`opensea: ${n} order hash does not match its canonical Seaport parameters`);return r}function pg(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=ie(e?.token,`${t} contract`),o=ai(e?.identifierOrCriteria),i=st(e?.startAmount,`${t} startAmount`,{positive:!0}),a=st(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 mN(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 pg(r[0],`${t} offer NFT`)}function fN(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=pg(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 hN(e,t,n,r){if(!(!e||typeof e!="object")){if(e.contract!=null&&String(e.contract).trim()!==""&&ie(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 gN(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 mg(e,t,n,r){let o=pt(t?.startTime,`${r} startTime`),i=pt(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=lg(i,n,`${r} expiry`),c=e?.expiration_time??e?.expirationTime;if(c!=null&&String(c).trim()!==""&&gN(c)!==Number(i))throw new Error(`opensea: ${r} display expiry disagrees with the canonical order endTime`);return s}function yN(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(us[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=mN(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;hN(e.asset,s,c,"listing");let l=st(e.price?.current?.value,"listing price",{positive:!0}),u=dg(e,i,"listing"),d=Bu(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:ie(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:mg(e,i,n,"listing"),counter:pt(i?.counter,"listing counter")}}async function Fu(e={},t={}){if(!en(t))throw new Error("OPENSEA_API_KEY required");let n=li(e.chain);n.contract=e.contract?ie(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(`${sr(t)}/listings/collection/${encodeURIComponent(r)}/best`);i.searchParams.set("limit",String(o)),e.next&&i.searchParams.set("next",String(e.next));let a=await A(i.toString(),{headers:cr(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=>yN(l,n,c)),next:a?.next?String(a.next):null,exec:!1,readOnly:!0}}async function ds(e={},t={}){let n=ai(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 Fu({...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 wN(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=fN(i,n,"offer").contract;if(t.contract&&s!==t.contract)throw new Error("opensea: OpenSea returned an offer for the wrong contract");let c=st(e.price?.current?.value??e.price?.value,"offer value",{positive:!0}),l=Bu(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=Bu(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:dg(e,i,"offer"),chain:t.chain,chainId:t.chainId,protocolAddress:ie(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:mg(e,i,r,"offer"),counter:pt(i.counter,"offer counter"),exec:!1,readOnly:!0}}async function ps(e={},t={}){if(!en(t))throw new Error("OPENSEA_API_KEY required");let n=li(e.chain);n.contract=e.contract?ie(e.contract,"NFT contract"):null;let r=String(e.slug||"").trim();if(!r)throw new Error("opensea: collection slug required");let o=ai(e.tokenId),i=await A(`${sr(t)}/offers/collection/${encodeURIComponent(r)}/nfts/${encodeURIComponent(o)}/best`,{headers:cr(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 wN(a,n,o,s)}function bN(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 fg(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"&&fg(n))}function hg(e){return!e||typeof e!="object"?!1:Object.keys(e).some(t=>/^(?:signed.*|rawtransaction|serializedtransaction|txsigned|r|s|v)$/i.test(t))}function gg(e){return!e||typeof e!="object"?!1:hg(e)?!0:Object.values(e).some(t=>t&&typeof t=="object"&&gg(t))}function yg(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"&&yg(o,t,n);return t}function Z0(e){return e&&typeof e=="object"&&typeof e.value=="string"?e.value:e}function wg(e,{buyer:t,chainId:n,targets:r}){if(!e||typeof e!="object")throw new Error("opensea: transaction object required");if(hg(e))throw new Error("opensea: signed transaction material refused");if((e.from?ie(Z0(e.from),"transaction buyer"):t)!==t)throw new Error("opensea: OpenSea returned a transaction for the wrong buyer");let i=ie(Z0(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=ZT.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=aN(e.value_hex??e.valueHex??e.value??0);return{from:t,to:i,data:c,value:d.hex,chainId:n,valueWei:d.amount}}function ms(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 Uu(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}=ms(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(()=>(_e(),Ja)),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(()=>(_e(),Ja)),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 xN(e,t){if(fg(e))throw new Error("opensea: approval steps are not permitted in NFT buy, sweep, or mint preparation");if(gg(e))throw new Error("opensea: signed transaction material refused");let n=yg(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=>wg(r,t))}function SN(e,t,n={}){return $({...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 bg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}async function xg(e={},t={}){throw new Error("opensea: public buy preparation disabled until canonical Seaport calldata is independently decoded and fully bound")}function kN(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=ie(o.address,"collection NFT contract");if(i!==n)throw new Error("opensea: OpenSea returned the wrong collection contract");return i}async function fs(e={},t={}){if(!en(t))throw new Error("OPENSEA_API_KEY required");bN(e);let{chain:n,chainId:r}=li(e.chain),o=ie(e.buyer||e.minter||e.address,"buyer"),i=ie(e.contract,"NFT contract"),a=cg(e.quantity),s=st(e.priceWei,"priceWei"),c=st(e.maxTotalWei,"maxTotalWei"),l=Number.isFinite(Number(t.nowMs))?Number(t.nowMs):Date.now(),u=lg(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 si(d,t),m=kN(p,n,i),f=s*BigInt(a);if(f>c)throw new Error("opensea: mint total exceeds total cap");let h=await A(`${sr(t)}/drops/${encodeURIComponent(d)}/mint`,{method:"POST",headers:cr(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,b=Array.isArray(g)?g:g?[g]:[];if(!b.length)throw new Error("opensea: reviewed SeaDrop mintTarget required");let S=new Set(b.map(O=>ie(O,"SeaDrop mint target"))),w=xN(h,{buyer:o,chainId:r,targets:S});if(w.length!==1)throw new Error("opensea: mint must contain exactly one SeaDrop transaction");let y,k,v=null,x;try{y=ss.decodeFunctionData("mintPublic",w[0].data),k="public",x=ss.encodeFunctionData("mintPublic",[y[0],y[1],y[2],y[3]])}catch{try{y=ss.decodeFunctionData("mintAllowList",w[0].data),k="allowlist";let O=y[4],D=[...y[5]].map(String);if(D.length<1||D.length>64||D.some(Y=>!/^0x[0-9a-fA-F]{64}$/.test(Y)))throw new Error("opensea: allowlist mint requires a bounded canonical Merkle proof");let R=BigInt(O.startTime),U=BigInt(O.endTime),Q=BigInt(Math.floor(l/1e3));if(R>Q||U<=Q)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");x=ss.encodeFunctionData("mintAllowList",[y[0],y[1],y[2],y[3],O,D]),v={mintPrice:BigInt(O.mintPrice).toString(),maxTotalMintableByWallet:BigInt(O.maxTotalMintableByWallet).toString(),startTime:R.toString(),endTime:U.toString(),dropStageIndex:BigInt(O.dropStageIndex).toString(),maxTokenSupplyForStage:BigInt(O.maxTokenSupplyForStage).toString(),feeBps:Number(O.feeBps),restrictFeeRecipients:!!O.restrictFeeRecipients,proof:D}}catch(O){throw/opensea:/.test(String(O?.message||""))?O:new Error("opensea: mint transaction must call reviewed SeaDrop mintPublic or mintAllowList")}}let E=ie(y[0],"mint NFT contract"),_=ie(y[1],"mint fee recipient"),P=ie(y[2],"mint recipient");if(E!==m)throw new Error("opensea: mint calldata collection mismatch");if(P!==o)throw new Error("opensea: mint calldata recipient mismatch");if(BigInt(y[3])!==BigInt(a))throw new Error("opensea: mint calldata quantity mismatch");if(x.toLowerCase()!==w[0].data.toLowerCase())throw new Error("opensea: mint calldata must be canonical with no suffix");let N=w.reduce((O,D)=>O+D.valueWei,0n);if(N!==f)throw new Error("opensea: mint transaction total does not match exact approved price and quantity");if(N>c)throw new Error("opensea: mint total exceeds total cap");let I=await Uu(w,r,{...t,provider:e.provider||t.provider});if(I.simulated!==!0)throw new Error("opensea: mint RPC simulation required");let L=e.gasPolicy||t.gasPolicy||{maxTotalGasWei:e.maxGasWei,maxFeePerGasWei:e.maxFeePerGasWei,maxPriorityFeePerGasWei:e.maxPriorityFeePerGasWei},F=J0({chainId:r,tx:w[0],policy:L});return SN({action:"mint",mintType:k,...v?{stage:v}:{},chain:n,chainId:r,slug:d,buyer:o,contract:m,quantity:a,priceWei:s.toString(),totalWei:N.toString(),maxTotalWei:c.toString(),mintTarget:w[0].to,feeRecipient:_,expiry:u,transactions:w.map(ms),gasWar:F,...I},"nft-mint",{nowMs:l,expiresAtMs:Math.min(l+fu,Date.parse(u),v?Number(BigInt(v.endTime)*1000n):Number.MAX_SAFE_INTEGER)})}function vN(e={}){let t=og(e.chain);if(ng.has(t))throw new Error("opensea: listing actions currently require an EVM NFT chain");let n=e.startTime||e.start_time?X0(e.startTime||e.start_time,"startTime"):{text:new Date().toISOString(),ms:Date.now()},r=X0(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:ie(e.contract,"NFT contract"),token_id:o,quantity:oN(e.quantity??1,"quantity"),price:{amount:rN(e.price?.amount??e.amount??e.priceAmount,"price amount"),currency:ie(e.price?.currency??e.currency??ii,"price currency")},start_time:n.text,end_time:r.text}}var qr={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"}]},eg=new cs(["function setApprovalForAll(address operator,bool approved)"]),EN=new cs(["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 tg(e,t){return e?.[t]||(e?.action===t?e:null)}function AN(e,{seller:t,item:n,chainId:r}){let o=Array.isArray(e?.steps)?e.steps:[],i=o.map(w=>tg(w,"createListingsAction")).find(Boolean)||o.find(w=>/createListings/i.test(String(w?.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=ie(c.verifyingContract,"listing protocol"),u=s.message;if(ie(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(ie(d.token,"listing collection")!==n.contract||String(d.identifierOrCriteria)!==n.token_id)throw new Error("opensea: listing NFT mismatch");if(String(d.startAmount)!==String(n.quantity)||String(d.endAmount)!==String(n.quantity))throw new Error("opensea: listing quantity mismatch");if(Number(u.orderType)!==2)throw new Error("opensea: only FULL_RESTRICTED listings are executable");if(!Array.isArray(u.consideration)||!u.consideration.length)throw new Error("opensea: listing consideration required");let p=0n;for(let w of u.consideration){if(Number(w.itemType)!==0||ie(w.token,"listing payment token")!==ii)throw new Error("opensea: executable listings currently require native fixed-price consideration");let y=BigInt(w.startAmount),k=BigInt(w.endAmount);if(y<=0n||y!==k)throw new Error("opensea: listing consideration must be fixed and positive");ie(w.recipient,"listing consideration recipient"),p+=y}let m=JT(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=Mu.hashStruct("OrderComponents",qr,u),b=o.map(w=>tg(w,"itemApprovalAction")).find(Boolean)||o.find(w=>/setApprovalForAll/i.test(String(w?.action||""))),S=null;if(b){let w=b.transaction||b.itemApprovalAction?.transaction,y=wg(w,{buyer:t,chainId:r,targets:new Set([n.contract])}),k;try{k=eg.decodeFunctionData("setApprovalForAll",y.data)}catch{throw new Error("opensea: listing approval must be setApprovalForAll")}let v=ie(k[0],"listing approval operator");if(k[1]!==!0||y.valueWei!==0n)throw new Error("opensea: listing approval must grant one exact operator with zero value");if(eg.encodeFunctionData("setApprovalForAll",[v,!0]).toLowerCase()!==y.data.toLowerCase())throw new Error("opensea: listing approval calldata must be canonical");S={...y,operator:v}}return{protocolAddress:l,typedData:{domain:c,types:qr,primaryType:"OrderComponents",message:u},orderHash:g,priceWei:p,approval:S}}async function hs(e={},t={}){if(!en(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=ie(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(vN);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=ie(e.taker,"taker"));let c=await A(`${sr(t)}/listings/actions`,{method:"POST",headers:cr(t),body:s,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3,retries:0,dedupe:!1}),{chainId:l}=li(o[0].chain),u=AN(c,{seller:n,item:o[0],chainId:l}),d=u.approval?[u.approval]:[],p=d.length?await Uu(d,l,{...t,provider:e.provider||t.provider}):{simulated:!0};return $({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(ms),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 Sg(e={},t={}){if(e.userConfirmed!==!0)throw new Error("opensea: userConfirmed=true required for listing cancellation");let{chain:n,chainId:r}=li(e.chain),o=ie(e.seller||e.address||e.owner,"seller"),i=ie(e.protocolAddress,"reviewed Seaport protocol address"),a=ie(e.contract,"NFT contract"),s=ai(e.tokenId),c=cg(e.quantity),l=e.typedData;if(!l||l.primaryType!=="OrderComponents"||!l.domain||!l.message)throw new Error("opensea: exact Seaport OrderComponents typedData required for cancellation");for(let[E,_]of Object.entries(qr)){let P=l.types?.[E];if(!Array.isArray(P)||P.length!==_.length||P.some((N,I)=>N?.name!==_[I].name||N?.type!==_[I].type))throw new Error("opensea: cancellation requires canonical Seaport types")}if(Object.keys(l.types||{}).filter(E=>E!=="EIP712Domain").sort().join(",")!==Object.keys(qr).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=ie(d.verifyingContract,"Seaport cancellation target");if(p!==i)throw new Error("opensea: cancellation target mismatch");let m=l.message;if(ie(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(ie(f.token,"cancellation NFT contract")!==a)throw new Error("opensea: cancellation NFT contract mismatch");if(ai(f.identifierOrCriteria)!==s)throw new Error("opensea: cancellation tokenId mismatch");let h=st(f.startAmount,"cancellation offer startAmount",{positive:!0}),g=st(f.endAmount,"cancellation offer endAmount",{positive:!0});if(h!==BigInt(c)||g!==BigInt(c))throw new Error("opensea: cancellation quantity mismatch");for(let E of m.consideration){if(Number(E.itemType)!==0||ie(E.token,"cancellation payment token")!==ii)throw new Error("opensea: cancellation requires native fixed-price consideration");let _=st(E.startAmount,"cancellation consideration startAmount",{positive:!0}),P=st(E.endAmount,"cancellation consideration endAmount",{positive:!0});if(_!==P)throw new Error("opensea: cancellation consideration must be fixed and positive");ie(E.recipient,"cancellation consideration recipient")}let b=st(m.startTime,"cancellation startTime");if(st(m.endTime,"cancellation endTime",{positive:!0})<=b)throw new Error("opensea: cancellation listing time bounds invalid");let w=Mu.hashStruct("OrderComponents",qr,m),y=String(e.orderHash||"").trim().toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(y)||y!==w.toLowerCase())throw new Error("opensea: cancellation order hash mismatch");let k=EN.encodeFunctionData("cancel",[[m]]),v=[{from:o,to:p,data:k,value:"0x0",valueWei:0n,chainId:r}],x=await Uu(v,r,{...t,provider:e.provider||t.provider});if(x.simulated!==!0)throw new Error("opensea: cancellation RPC simulation required");return $({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:w,typedData:{domain:d,types:qr,primaryType:"OrderComponents",message:m},transactions:v.map(ms),...x,requiresUserSignature:!0},{provider:"opensea-nft",kind:"nft-cancel"})}_e();Fr();var gs=Object.freeze(["blockNumber","nativeBalance","tokenBalance","resolveToken","resolvePools","scanBlocks","scoreRisk","quote","sellSimulation","prepareUnsignedTx"]),re=Object.freeze({LIVE:"LIVE",CACHED:"CACHED",STALE:"STALE",UNKNOWN:"UNKNOWN",UNAVAILABLE:"UNAVAILABLE"}),J=Object.freeze({PASS:"PASS",CAUTION:"CAUTION",FAIL:"FAIL",UNKNOWN:"UNKNOWN"}),_N=/^0x[0-9a-fA-F]{40}$/;function PN(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}_N.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))gs.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 TN(e){let{ok:t,errors:n,warnings:r}=PN(e);if(!t)throw new Error(`invalid scanner for ${e?.key??"<unknown>"}:
|
|
144
144
|
- ${n.join(`
|
|
145
145
|
- `)}`);let o=e.capabilities||{},i=gs.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:gs.filter(s=>!i.includes(s))}},supports(s){return i.includes(s)}};for(let s of gs)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 Du=new Map;function kg(e){let t=TN(e);return Du.set(t.chainId,t),t}function Hr(e){return Du.get(Number(e))||null}function ys(){return[...Du.values()]}_e();var Hu={getAmountsOut:"d06ca61f",swapExactTokensForTokens:"38ed1739",swapExactETHForTokens:"7ff36ab5"},wt=e=>BigInt(e).toString(16).padStart(64,"0"),ui=e=>e.slice(2).toLowerCase().padStart(64,"0");function NN(e,t){return`0x${Hu.getAmountsOut}`+wt(e)+wt(64)+wt(t.length)+t.map(ui).join("")}function CN(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 qu(e,t="router"){return(e?.venues||[]).find(r=>r.kind===t)?.address??null}var ju=100;function ON(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>ju)throw new Error(`slippageBps ${n} exceeds the ${ju} 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 vg(e){let{chainId:t,wrappedNative:n}=e;async function r(o,i,a,s){let c=await V(t,"eth_call",[{to:o,data:NN(i,a)},"latest"],s);return CN(c?.result??c)}return{async quote({tokenIn:o,tokenOut:i,amountIn:a,path:s},c={}){let l=qu(c.scanner);if(!l)return{chainId:t,evidence:re.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:re.LIVE,note:"exact-input quote at current reserves; not a guaranteed fill"}:{chainId:t,router:l,path:u,evidence:re.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=qu(s.scanner),l=a||n;if(l&&String(o).toLowerCase()===String(l).toLowerCase())return{chainId:t,token:o,verdict:J.UNKNOWN,evidence:re.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:J.UNKNOWN,evidence:re.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:J.FAIL,evidence:re.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:J.FAIL,evidence:re.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:J.FAIL,evidence:re.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=J.PASS,g="round trip completes with expected fee/impact loss";return f<5e3?(h=J.FAIL,g=`round trip returns only ${(f/100).toFixed(2)}% -- punitive tax or no real liquidity`):f<9e3&&(h=J.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:re.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=qu(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!==re.LIVE)throw new Error(`cannot prepare without a live quote (${h.evidence}: ${h.reason??"no reason given"})`);let g=ON(h.amountOut,c);if(g<=0n)throw new Error("computed minOut is zero -- refusing to prepare");let b=BigInt(Math.floor(Date.now()/1e3)+Number(l)),S=n&&f[0].toLowerCase()===n.toLowerCase()&&d.useNative,w=S?`0x${Hu.swapExactETHForTokens}`+wt(g)+wt(128)+ui(s)+wt(b)+wt(f.length)+f.map(ui).join(""):`0x${Hu.swapExactTokensForTokens}`+wt(a)+wt(g)+wt(160)+ui(s)+wt(b)+wt(f.length)+f.map(ui).join("");return{unsigned:!0,signedBy:"user-wallet",chainId:t,tx:{to:m,data:w,value:S?`0x${BigInt(a).toString(16)}`:"0x0"},guard:{quotedOut:h.amountOut,minOut:g.toString(),slippageBps:c,maxSlippageBps:ju,deadline:b.toString()},requires:S?[]:[{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."}}}}_e();var RN=[100,500,3e3,1e4],Eg={quoteExactInputSingle:"c6a5026a",exactInputSingle:"04e45aaf"},lr=e=>BigInt(e).toString(16).padStart(64,"0"),di=e=>e.slice(2).toLowerCase().padStart(64,"0"),Ag=/^0x[0-9a-fA-F]{40}$/,Vu=100;function LN(e,t){let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error("slippageBps must be a non-negative number");if(n>Vu)throw new Error(`slippageBps ${n} exceeds the ${Vu} 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 zu(e,t){return(e?.venues||[]).find(n=>n.kind===t)?.address??null}function Ig(e){let{chainId:t,wrappedNative:n}=e;async function r({quoter:i,tokenIn:a,tokenOut:s,amountIn:c,fee:l},u){let d=`0x${Eg.quoteExactInputSingle}`+di(a)+di(s)+lr(c)+lr(l)+lr(0),p=await V(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 RN){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=zu(c.scanner,"quoter");if(!l)return{chainId:t,evidence:re.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(!Ag.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:re.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:re.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=zu(c.scanner,"quoter"),u=(e.stableQuoteAssets||[]).map(k=>String(k).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:J.UNKNOWN,evidence:re.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:J.UNKNOWN,evidence:re.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:J.UNKNOWN,evidence:re.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 k=u.find(v=>v&&v!==String(f).toLowerCase()&&v!==String(i).toLowerCase());if(k){let v=await o({quoter:l,tokenIn:k,tokenOut:i,amountIn:a},c);if(v.best){let x=await o({quoter:l,tokenIn:i,tokenOut:k,amountIn:v.best.amountOut},c);if(x.best){let E=x.best.amountOut,_=Number(E*10000n/BigInt(a)),P=J.PASS,N="round trip vs dollar book completes with expected fee/impact loss";return _<5e3?(P=J.FAIL,N=`round trip vs dollar book returns only ${(_/100).toFixed(2)}% -- punitive tax or no real liquidity`):_<9e3&&(P=J.CAUTION,N=`round trip vs dollar book returns ${(_/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:P,reason:N,amountIn:String(a),bought:v.best.amountOut.toString(),returned:E.toString(),retentionBps:_,buyFee:v.best.fee,sellFee:x.best.fee,evidence:re.LIVE,note:"Quoted against the dollar book, not wrapped native. A missing WETH pool is not a honeypot."}}}}return{chainId:t,token:i,verdict:J.FAIL,evidence:re.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 k=u.find(v=>v&&v!==String(f).toLowerCase()&&v!==String(i).toLowerCase());if(k){let v=await o({quoter:l,tokenIn:k,tokenOut:i,amountIn:a},c),x=v.best?await o({quoter:l,tokenIn:i,tokenOut:k,amountIn:v.best.amountOut},c):{best:null};if(v.best&&x.best){let E=x.best.amountOut,_=Number(E*10000n/BigInt(a)),P=J.PASS,N="round trip vs dollar book completes; missing WETH sell pool is not a honeypot";return _<5e3?(P=J.FAIL,N=`dollar-book round trip returns only ${(_/100).toFixed(2)}%`):_<9e3&&(P=J.CAUTION,N=`dollar-book round trip returns ${(_/100).toFixed(2)}%`),{chainId:t,venue:"uniswap-v3",token:i,base:k,quoteAsset:k,verdict:P,reason:N,amountIn:String(a),bought:v.best.amountOut.toString(),returned:E.toString(),retentionBps:_,buyFee:v.best.fee,sellFee:x.best.fee,evidence:re.LIVE,note:"Sell vs wrapped native failed; dollar book succeeded. Not labelled honeypot."}}}return{chainId:t,token:i,verdict:J.FAIL,evidence:re.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 b=g.best.amountOut,S=Number(b*10000n/BigInt(a)),w=J.PASS,y="round trip completes with expected fee/impact loss";return S<5e3?(w=J.FAIL,y=`round trip returns only ${(S/100).toFixed(2)}% -- punitive tax or no real liquidity`):S<9e3&&(w=J.CAUTION,y=`round trip returns ${(S/100).toFixed(2)}% -- transfer tax or thin liquidity at this size`),{chainId:t,venue:"uniswap-v3",token:i,base:f,verdict:w,reason:y,amountIn:String(a),bought:h.best.amountOut.toString(),returned:b.toString(),retentionBps:S,buyFee:h.best.fee,sellFee:g.best.fee,evidence:re.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=zu(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(!Ag.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!==re.LIVE)throw new Error(`cannot prepare without a live quote (${m.evidence}: ${m.reason??"no reason given"})`);let f=u??m.fee,h=LN(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(),b=`0x${Eg.exactInputSingle}`+di(i)+di(a)+lr(f)+di(c)+lr(s)+lr(h)+lr(0);return{unsigned:!0,signedBy:"user-wallet",chainId:t,venue:"uniswap-v3",tx:{to:p,data:b,value:g?String(s):"0x0"},guard:{quotedOut:m.amountOut,minOut:h.toString(),slippageBps:l,maxSlippageBps:Vu,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."}}}}lu();var ws={decimals:"0x313ce567",symbol:"0x95d89b41",name:"0x06fdde03",totalSupply:"0x18160ddd",owner:"0x8da5cb5b"};function _g(e){if(!e||e==="0x")return null;try{return BigInt(e)}catch{return null}}function Pg(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 $N(e){let{chainId:t}=e;async function n(r,o,i){return V(t,"eth_call",[{to:r,data:o},"latest"],i)}return{async blockNumber(r={}){let o=await Yo(t,r);return{chainId:t,blockNumber:o?.blockNumber??o,evidence:re.LIVE}},async nativeBalance(r,o={}){let i=await nr(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:re.LIVE}},async tokenBalance({token:r,owner:o},i={}){let a=await Jo({chainId:t,token:r,owner:o},i);return{chainId:t,token:r,owner:o,raw:a?.balance??a,evidence:re.LIVE}},async resolveToken(r,o={}){if(!/^0x[0-9a-fA-F]{40}$/.test(r||""))return{chainId:t,token:r,evidence:re.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,ws.decimals,o).catch(()=>null),n(r,ws.symbol,o).catch(()=>null),n(r,ws.name,o).catch(()=>null),n(r,ws.totalSupply,o).catch(()=>null)]),l=_g(i?.result??i),u=l!==null||a?.result||s?.result;return{chainId:t,address:r,decimals:l===null?null:Number(l),symbol:Pg(a?.result??a),name:Pg(s?.result??s),totalSupply:(_g(c?.result??c)??null)?.toString()??null,evidence:u?re.LIVE:re.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:re.UNAVAILABLE,reason:"no dexscreenerSlug configured for this chain; pool discovery is unavailable rather than guessed"};let a=await rr(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=cu(r,c,{stables:e.stableQuoteAssets||[],wrappedNative:e.wrappedNative});return{chainId:t,token:r,pools:l,topPool:l[0]||null,quoteAsset:I0(r,l),evidence:l.length?re.LIVE:re.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 V(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:re.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:re.LIVE}},async scoreRisk(r,o={}){let i=[],a=J.PASS,s=u=>{let d={[J.PASS]:0,[J.CAUTION]:1,[J.UNKNOWN]:2,[J.FAIL]:3};d[u]>d[a]&&(a=u)},c=await this.resolveToken(r,o);c.evidence!==re.LIVE?(i.push({check:"erc20-metadata",result:J.UNKNOWN,detail:c.warning}),s(J.UNKNOWN)):i.push({check:"erc20-metadata",result:J.PASS,detail:`${c.symbol} / ${c.decimals}d`});let l=await this.resolvePools(r,o);if(l.evidence===re.UNAVAILABLE)i.push({check:"liquidity",result:J.UNKNOWN,detail:l.reason}),s(J.UNKNOWN);else if(!l.pools.length)i.push({check:"liquidity",result:J.FAIL,detail:"no pool with liquidity found"}),s(J.FAIL);else{let u=l.pools[0],d=u.liquidityUsd??0;d<5e3?(i.push({check:"liquidity",result:J.CAUTION,detail:`top pool only $${d}`}),s(J.CAUTION)):i.push({check:"liquidity",result:J.PASS,detail:`$${d} on ${u.dex}`}),u.createdAt&&Date.now()-u.createdAt<24*3600*1e3&&(i.push({check:"age",result:J.CAUTION,detail:"pool under 24h old"}),s(J.CAUTION))}if(typeof this.sellSimulation=="function"){let u=await this.sellSimulation({token:r,amountIn:(10n**16n).toString()},o).catch(d=>({verdict:J.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:J.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(J.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 Tg(e){let n={...$N(e)},r=new Set((e.venues||[]).map(i=>i.kind));e.venueKind==="uniswap-v3"&&r.has("quoter")&&r.has("router")?Object.assign(n,Ig({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,vg({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 jr=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 pi(){return jr.map(e=>kg(Tg(e)))}var mi=new Map,BN=Object.keys(Fe).map(Number),MN=Object.keys(ut).map(Number),FN=jr.map(e=>e.chainId),UN=[...new Set(Object.values(us))],Wu=new Set,Ng=!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(Ng&&Wu.has(t))throw new Error(`registerProvider refuses to overwrite built-in provider: ${t}`);return mi.set(t,{chainIds:e.chainIds||[],auth:e.auth||"none",description:e.description||"",baseEnv:e.baseEnv||[],...e,id:t}),mi.get(t)}function fi(e){return mi.get(e)||null}function bs({venue:e,op:t}={}){let n=[...mi.values()];return e&&(n=n.filter(r=>r.venue===e)),t&&(n=n.filter(r=>r.ops.includes(t))),n}function DN(){Wu.clear();for(let e of mi.keys())Wu.add(e);Ng=!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:FN,auth:"none",ops:["health","scan"],execution:"prepare",localSignerSurfaces:["evm-swap"],baseEnv:jr.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:BN,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:MN,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:UN,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."});DN();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."});j();mt();mt();var VN=/^0x[0-9a-fA-F]{40}$/,gi="0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";function Gu(e,t){let n=String(e||"").trim();if(!VN.test(n))throw new Error(`hl-vaults: ${t} must be a 0x EVM address`);return n.toLowerCase()}function $g(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Bg(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 WN(e){return[...e].sort((t,n)=>($g(n.tvl)??-1)-($g(t.tvl)??-1))}function Ku(e){return e.hlInfo||be}function Yu(e){return{...e,exec:!1,execution:"read-only",armed:!1}}async function Ju(e={},t={}){let n=await Ku(t)({type:"vaultSummaries"},t),r=WN((Array.isArray(n)?n:[]).map(Bg));return Yu({provider:"hl-vaults",count:r.length,vaults:r,raw:n})}async function Es(e={},t={}){let r={type:"vaultDetails",vaultAddress:Gu(e.vaultAddress||e.address,"vaultAddress")};e.user&&(r.user=Gu(e.user,"user"));let o=await Ku(t)(r,t);return Yu({provider:"hl-vaults",vault:Bg(o||{}),raw:o})}async function Xu(e={},t={}){let n=Gu(e.user||e.address,"user"),r=await Ku(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 Yu({provider:"hl-vaults",user:n,count:o.length,positions:o,raw:r})}async function Qu(e={},t={}){let n=String(e.mode||"hlp").toLowerCase();if(n==="hlp")return Es({...e,vaultAddress:gi},t);if(n==="summaries")return Ju(e,t);if(n==="details")return Es(e,t);if(n==="mine")return Xu(e,t);throw new Error("hl-vaults: mode must be hlp, summaries, details, or mine")}async function Mg(e={}){try{let t=await Qu({mode:"hlp"},e);return{ok:t.vault.vaultAddress===gi&&!!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}}}_e();import{AbiCoder as KN}from"ethers";var Zu=999;var He=Object.freeze({position:"0x0000000000000000000000000000000000000800",spotBalance:"0x0000000000000000000000000000000000000801",vaultEquity:"0x0000000000000000000000000000000000000802",withdrawable:"0x0000000000000000000000000000000000000803",delegations:"0x0000000000000000000000000000000000000804",delegatorSummary:"0x0000000000000000000000000000000000000805",markPx:"0x0000000000000000000000000000000000000806",oraclePx:"0x0000000000000000000000000000000000000807",spotPx:"0x0000000000000000000000000000000000000808",l1BlockNumber:"0x0000000000000000000000000000000000000809"}),ed=Object.freeze({exec:!1,execution:"read-only",armed:!1,signing:!1,broadcasting:!1}),YN=KN.defaultAbiCoder();function yi(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 wi(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 ur(e,t){return e.length?YN.encode(e,t):"0x"}function nn(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 JN(e,t=0){let n=nn(e,t);return(n>=2n**255n?n-2n**256n:n).toString()}async function vn(e,t,n={}){if(typeof n.ethCall=="function")return n.ethCall({to:e,data:t,chainId:Zu});let r=await V(Zu,"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 En(e){return{provider:"hl-precompiles",chainId:Zu,...ed,...e}}async function As(e={}){let t=await vn(He.l1BlockNumber,"0x",e);return En({op:"l1BlockNumber",precompile:He.l1BlockNumber,l1BlockNumber:nn(t).toString(),raw:t})}async function td(e={},t={}){let n=wi(e.index??e.assetId??0,"index",32),r=await vn(He.markPx,ur(["uint32"],[n]),t);return En({op:"markPx",precompile:He.markPx,index:n,markPx:nn(r).toString(),raw:r})}async function nd(e={},t={}){let n=wi(e.index??e.assetId??0,"index",32),r=await vn(He.oraclePx,ur(["uint32"],[n]),t);return En({op:"oraclePx",precompile:He.oraclePx,index:n,oraclePx:nn(r).toString(),raw:r})}async function rd(e={},t={}){let n=wi(e.index??e.assetId??0,"index",32),r=await vn(He.spotPx,ur(["uint32"],[n]),t);return En({op:"spotPx",precompile:He.spotPx,index:n,spotPx:nn(r).toString(),raw:r})}async function od(e={},t={}){let n=yi(e.user,"user"),r=wi(e.perp??e.assetId??0,"perp",16),o=await vn(He.position,ur(["address","uint16"],[n,r]),t);return En({op:"position",precompile:He.position,user:n,perp:r,szi:JN(o,0),raw:o})}async function id(e={},t={}){let n=yi(e.user,"user"),r=wi(e.token??0,"token",64),o=await vn(He.spotBalance,ur(["address","uint64"],[n,r]),t);return En({op:"spotBalance",precompile:He.spotBalance,user:n,token:r,total:nn(o,0).toString(),hold:nn(o,1).toString(),raw:o})}async function ad(e={},t={}){let n=yi(e.user,"user"),r=yi(e.vaultAddress??e.vault??gi,"vault"),o=await vn(He.vaultEquity,ur(["address","address"],[n,r]),t);return En({op:"vaultEquity",precompile:He.vaultEquity,user:n,vaultAddress:r,hlp:r===gi,equity:nn(o,0).toString(),raw:o})}async function sd(e={},t={}){let n=yi(e.user,"user"),r=await vn(He.withdrawable,ur(["address"],[n]),t);return En({op:"withdrawable",precompile:He.withdrawable,user:n,withdrawable:nn(r).toString(),raw:r})}async function Fg(e={},t={}){let n=String(e.op||e.mode||"l1BlockNumber");if(n==="l1BlockNumber")return As(t);if(n==="markPx")return td(e,t);if(n==="oraclePx")return nd(e,t);if(n==="spotPx")return rd(e,t);if(n==="position")return od(e,t);if(n==="spotBalance")return id(e,t);if(n==="vaultEquity"||n==="hlp")return ad(e,t);if(n==="withdrawable")return sd(e,t);throw new Error("hl-precompiles: op must be l1BlockNumber, markPx, oraclePx, spotPx, position, spotBalance, vaultEquity, or withdrawable")}async function Ug(e={}){try{let t=await As(e);return{ok:BigInt(t.l1BlockNumber)>0n,provider:"hl-precompiles",...ed,l1BlockNumber:t.l1BlockNumber,precompiles:He}}catch(t){return{ok:!1,provider:"hl-precompiles",...ed,error:String(t?.message||t).slice(0,160)}}}mt();ne();function Dg(e={}){let t=e.spotSizes??e.spotHeldSizes;return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function _s(e={},t,n){let r=String(t||""),o=Dg(e);if(o){let a=bi(o[r]);if(a==null)throw new Error(`${n}: held spot required for ${r}`);return a}let i=bi(e.spotSize??e.spotHeldSize);if(i==null)throw new Error(`${n}: prepare requires spotSize of held spot`);return i}function Ps(e={},t=[],n){let r=Dg(e);if(t.length>1){if(!r)throw new Error(`${n}: multi-coin live loop requires spotSizes map`);for(let o of t)if(bi(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(r){let o=t[0];if(o&&bi(r[o])==null)throw new Error(`${n}: held spot required for ${o}`);return}if(bi(e.spotSize??e.spotHeldSize)==null)throw new Error(`${n}: live loop requires spotSize of held spot`)}var cd=Number.MAX_SAFE_INTEGER,Is=String(cd);function bi(e){if(typeof e=="number")return Number.isFinite(e)&&e>0&&e<=cd?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e))return null;let[t,n=""]=e.split(".");if(t.length>Is.length||t.length===Is.length&&t>Is||t===Is&&/[1-9]/.test(n))return null;let r=Number(e);return Number.isFinite(r)&&r>0&&r<=cd?r:null}function cy(){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 on(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function ly(e){let t=on(e);if(t==null)throw new Error("hl-delta-neutral: funding rate required");return t*24*365*100}function qC(e,t,n=4){let r=on(e),o=on(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 uy(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=on(a.funding),l=on(a.markPx??a.oraclePx),u=on(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:on(a.oraclePx),openInterest:u,fundingAprPct:ly(c)})}return r}function dy(e,t){if(!e?.coin)throw new Error("hl-delta-neutral: coin required");let n=on(e.funding);if(n==null)throw new Error("hl-delta-neutral: funding required");let r=ly(n),o=n>0,i={coin:e.coin,notionalUsd:on(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?qC(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 _d(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),r=Number(e.minOpenInterest??0),o=await bt(t),i=uy(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 Pd(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 bt(t),i=uy(o).find(a=>a.coin===n);if(!i)throw new Error(`hl-delta-neutral: ${n} not in Hyperliquid meta`);return dy(i,r)}async function Td(e={},t={}){my(e,t,"hl-delta-neutral");let n=fy(e.maxNotionalUsd??25e3,"hl-delta-neutral"),r=await Pd(e,t);if(r.verdict==="skip")return $({...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=_s(e,r.coin,"hl-delta-neutral");if(!py.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(()=>(Ls(),Id)),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 $({...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 py=/^0x[0-9a-fA-F]{40}$/;function my(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 HC(e,t,n){my(e,t,n)}function jC(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=fy(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"hl-delta-neutral");if(t==="live"&&n.length===0)throw new Error("hl-delta-neutral: live loop requires a coin allowlist");if(t==="live"&&Ps(e,n,"hl-delta-neutral"),t==="live"&&!py.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 fy(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 hy(e={},t={}){HC(e,t,"hl-delta-neutral");let n=jC(e),r=await _d({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=dy(s,a);if(c.verdict!=="carry")continue;if(i.length>=n.maxCoins)break;if(n.mode==="shadow"){i.push({...c,mode:"shadow",surface:"hl",prepared:!1,signed:!1,broadcast:!1});continue}let l=await Td({coin:c.coin,notionalUsd:c.notionalUsd,owner:e.owner,orderType:e.orderType,price:e.price,maxNotionalUsd:a,spotSize:e.spotSize??e.spotHeldSize,spotSizes:e.spotSizes??e.spotHeldSizes},{fetchImpl:t.fetchImpl,nowMs:t.nowMs});i.push({...l,mode:"live",surface:"hl"})}return{loop:!0,mode:n.mode,surface:"hl",signer:"hl",considered:r.considered,actions:i,nextWaitMs:n.intervalMs,signed:i.some(s=>s.signed===!0),broadcast:i.some(s=>s.broadcast===!0),posture:"one tick. Prepares an unsigned hedge for oracle signer. Armed, not automated. Farm loop never signs or broadcasts."}}j();ne();Gr();var VC=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Ii=14,gy=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`lighter: bounded ${t} required`);return e};function Xr(e,t,n){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${n} must be exact numeric ${t}`)}function Nd(e){let t=String(e||"").replace(/\/$/,"");if(!VC.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function yy(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=gy(n.kind,"kind",48);if(r!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=Nd(n.submitTo),i=n.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(dr(n.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let s=Number(dr(n.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: clientOrderIndex required");Xr(n.orderType,0,"orderType"),Xr(n.timeInForce,1,"timeInForce"),Xr(n.reduceOnly,0,"reduceOnly"),Xr(n.triggerPrice,0,"triggerPrice"),Xr(n.orderExpiry,-1,"orderExpiry");let c=gy(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=St(n.baseAmount,"lighter: baseAmount"),d=St(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,b=u*d,S=Be(n.notionalUsd,g,"lighter: notionalUsd");if(S<=0n)throw new Error("lighter: notionalUsd required");if(b!==S)throw new Error("lighter: notionalUsd must match size and price");let w=Be(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,g,"lighter: maxNotionalUsd");if(b>w)throw new Error("lighter: notional exceeds cap");let y=Ue(n.notionalUsd,"lighter: notionalUsd");return Xr(n.txType,Ii,"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 WC(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 wy(e,t={},n={}){if(String(e?.kind)!=="lighter-order")throw new Error("lighter: prepared kind is not a local-signer surface");let r=Number(n.nowMs??Date.now()),o=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),i=Nd(e.submitTo),a={version:1,surface:"lighter",action:"order",owner:WC(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??Ii,submitTo:i,accountIndex:e.accountIndex??t.accountIndex??null,orderType:e.orderType,timeInForce:e.timeInForce,reduceOnly:e.reduceOnly,triggerPrice:e.triggerPrice,orderExpiry:e.orderExpiry}};return yy(a,{lighterMarkets:t.lighterMarkets||["*"],maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER}),a}var xy="https://mainnet.zklighter.elliot.ai",Sy="https://testnet.zklighter.elliot.ai";function GC(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?Sy:xy}function ky(){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 Tn(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function KC(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 vy(e){let t=Tn(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function YC(e,t,n=4){let r=Tn(e),o=Tn(t),i=Number.isInteger(Number(n))?Number(n):4;if(!(r>0))throw new Error("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 by(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function Ey(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=by(a.market_id);s!=null&&o.set(s,a)}let i=[];for(let a of n){if(String(a.exchange||"")!=="lighter")continue;let s=by(a.market_id);if(s==null)continue;let c=o.get(s),l=Tn(c?.mark_price??c?.index_price),u=Tn(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:Tn(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:vy(u)})}return i}function Ay(e,t){if(!e?.symbol&&!e?.coin)throw new Error("lighter: symbol required");let n=Tn(e.funding);if(n==null)throw new Error("lighter: funding required");let r=vy(n),o=n>0,i={coin:e.symbol||e.coin,symbol:e.symbol||e.coin,marketIndex:e.marketIndex,notionalUsd:Tn(t),markPx:e.markPx,fundingHourly:n,fundingAprPct:r,targetDelta:0,spot:o?"hold-existing":"short-spot-not-in-light-path",perpSide:o?"sell":"buy",baseAmount:o?YC(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 Iy(e={}){let t=GC(e),n=e.fetchImpl,r=await A(`${t}/api/v1/funding-rates`,{fetchImpl:n,retries:0}),o=await A(`${t}/api/v1/orderBookDetails`,{fetchImpl:n,retries:0});return{funding:r,books:o}}async function Cd(e={},t={}){let n=Math.min(24,Math.max(1,Number(e.limit??8)||8)),{funding:r,books:o}=await Iy(t),i=Ey(r,o).filter(a=>a.funding>0).sort((a,s)=>s.funding-a.funding||s.openInterest-a.openInterest).slice(0,n);return{live:!0,source:"Lighter funding-rates + orderBookDetails",considered:Array.isArray(r?.funding_rates)?r.funding_rates.filter(a=>a.exchange==="lighter").length:0,candidates:i,posture:"read-only Lighter funding scan. Positive funding only. No signing."}}async function Od(e={},t={}){let n=String(e.coin||e.symbol||"").trim();if(!n)throw new Error("lighter: coin required");let r=Number(e.notionalUsd??e.notional??1e3),{funding:o,books:i}=await Iy(t),a=Ey(o,i).find(s=>s.symbol===n);if(!a)throw new Error(`lighter: ${n} not in Lighter funding`);return Ay(a,r)}async function Rd(e={},t={}){Py(e,t,"lighter");let n=Ty(e.maxNotionalUsd??25e3,"lighter");if(typeof e.accountIndex!="number"||!Number.isSafeInteger(e.accountIndex)||e.accountIndex<0)throw new Error("lighter: accountIndex required");let r=e.accountIndex,o=await Od(e,t);if(o.verdict==="skip")return $({...o,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=_s(e,o.coin,"lighter");if(!_y.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=KC(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:Ii,submitTo:`${s?Sy:xy}/api/v1/sendTx`,signed:!1,broadcast:!1},d=null,p=null;try{d=wy(u,{...e,maxNotionalUsd:n},t)}catch(f){p=String(f?.message||f).slice(0,200)}return $({...u,prepared:!!d,signing:d?"awaiting-lighter-signer":"blocked",localSignerEnvelope:d,localSignerBlockedReason:p,oraclePrepared:!!d},{provider:"lighter-delta-neutral",kind:"lighter-order"})}var _y=/^0x[0-9a-fA-F]{40}$/;function Py(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 JC(e,t,n){Py(e,t,n)}function XC(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=Ty(e.maxNotionalUsd??e.notionalUsd??e.notional??1e3,"lighter");if(t==="live"&&n.length===0)throw new Error("lighter: live loop requires a coin allowlist");if(t==="live"&&Ps(e,n,"lighter"),t==="live"&&!_y.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 Ty(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 Ny(e={},t={}){JC(e,t,"lighter");let n=XC(e),r=await Cd({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=Ay(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 Rd({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."}}j();var ZC="https://clob.polymarket.com",eO="https://gamma-api.polymarket.com";function _i(e={}){return(e.clobUrl||process.env.POLY_CLOB_URL||ZC).replace(/\/$/,"")}function Cy(e={}){return(e.gammaUrl||process.env.POLY_GAMMA_URL||eO).replace(/\/$/,"")}async function Ld(e={}){return A(`${_i(e)}/time`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function Oy(e={}){let t=await Ld(e);return{ok:t!=null&&t!=="",time:t}}async function Ry({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 A(`${Cy(r)}/markets?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}async function Ly(e,t={}){if(!e)throw new Error("polyBook requires tokenId");let n=new URLSearchParams({token_id:String(e)});return A(`${_i(t)}/book?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function $y(e,t={}){if(!e)throw new Error("polyMidpoint requires tokenId");let n=new URLSearchParams({token_id:String(e)});return A(`${_i(t)}/midpoint?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function By(e,t={}){if(!e)throw new Error("polySpread requires tokenId");let n=new URLSearchParams({token_id:String(e)});return A(`${_i(t)}/spread?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function My(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 A(`${_i(n)}/price?${r}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs})}async function Fy({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 A(`${Cy(r)}/events?${o}`,{fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs})}_e();j();import{createHash as Uy}from"node:crypto";var Qr="mainnet-beta",nO="https://api.mainnet-beta.solana.com",$d="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";function rO(e={}){return String(e.rpcUrl||process.env.SOLANA_RPC_URL||nO).trim()}function ve(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 oO(e,t){return t?[...e,{commitment:t}]:e}async function Pi(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 A(rO(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 Bd(e={},t={}){let n=e.commitment?[{commitment:e.commitment}]:[],r=await Pi("getLatestBlockhash",n,t);return{provider:"solana-rpc",cluster:Qr,blockhash:r?.value?.blockhash||null,lastValidBlockHeight:r?.value?.lastValidBlockHeight??null,slot:r?.context?.slot??null,raw:r}}async function Dy(e={}){try{let[t,n]=await Promise.all([Pi("getHealth",[],e),Bd({},e)]);return{ok:t==="ok",provider:"solana-rpc",cluster:Qr,health:t,latestBlockhash:n,exec:!1}}catch(t){return{ok:!1,provider:"solana-rpc",cluster:Qr,error:String(t?.message||t),exec:!1}}}async function $s(e={},t={}){let n=ve(e.address||e.owner,"address"),r=await Pi("getBalance",oO([n],e.commitment),t);return{provider:"solana-rpc",cluster:Qr,address:n,lamports:String(r?.value??0),slot:r?.context?.slot??null,raw:r}}function iO(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 Ti(e={},t={}){let n=ve(e.owner||e.address,"owner"),r=e.mint?{mint:ve(e.mint,"mint")}:{programId:ve(e.programId||$d,"token program")},o={encoding:"jsonParsed"};e.commitment&&(o.commitment=e.commitment);let i=await Pi("getTokenAccountsByOwner",[n,r,o],t),a=Array.isArray(i?.value)?i.value.map(iO):[];return{provider:"solana-rpc",cluster:Qr,owner:n,filter:r,slot:i?.context?.slot??null,accounts:a,raw:i}}function aO(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 sO(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 cO(e){let t=Buffer.from(e,"base64");try{let n=sO(t,0),r=n.offset+n.value*64;if(r>=t.length)throw new Error("missing message");return Uy("sha256").update(t.subarray(r)).digest("hex")}catch{return Uy("sha256").update(t).digest("hex")}}async function qy(e={},t={}){let n=aO(e.transaction||e.swapTransaction),r={encoding:"base64",sigVerify:!!e.sigVerify,replaceRecentBlockhash:e.replaceRecentBlockhash!==!1};e.commitment&&(r.commitment=e.commitment);let o=await Pi("simulateTransaction",[n,r],t),i=o?.value||{};return{provider:"solana-rpc",cluster:Qr,ok:i.err==null,transactionHash:cO(n),err:i.err??null,logs:i.logs||[],unitsConsumed:i.unitsConsumed??null,replacementBlockhash:i.replacementBlockhash||null,slot:o?.context?.slot??null,raw:o}}j();var uO="mainnet",dO="https://mempool.space/api",pO="https://mempool.space/testnet/api";function zt(e={}){return String(e.network||process.env.BTC_NETWORK||uO).trim().toLowerCase()==="testnet"?"testnet":"mainnet"}function Fd(e={}){return e.baseUrl?String(e.baseUrl).replace(/\/$/,""):process.env.BTC_ESPLORA_URL?String(process.env.BTC_ESPLORA_URL).replace(/\/$/,""):zt(e)==="testnet"?pO:dO}function Md(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 mO(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 Ud(e,t={}){let n=`${Fd(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 Bs(e,t={}){let n=await Ud(e,t);try{return JSON.parse(n)}catch{return n}}async function Hy(e={}){try{let t=await Ud("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"bitcoin-esplora",network:zt(e),baseUrl:Md(Fd(e)),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"bitcoin-esplora",network:zt(e),baseUrl:Md(Fd(e)),error:Md(t?.message||t),exec:!1}}}async function jy(e={}){let t=await Ud("/blocks/tip/height",e);return{provider:"bitcoin-esplora",network:zt(e),tipHeight:Number(t)}}async function zy(e={}){try{let t=await Bs("/v1/fees/recommended",e);return{provider:"bitcoin-esplora",network:zt(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:zt(e),fastestFee:null,halfHourFee:null,hourFee:null,note:"fee endpoint unavailable on this Esplora host"}}}async function Ms(e={},t={}){let n=Ct(e.address||e.addr,"address"),r=await Bs(`/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:zt(t),address:n,balanceSats:String(a-s),chainStats:o,mempoolStats:i,raw:r}}async function Vy(e={},t={}){let n=Ct(e.address||e.addr,"address"),r=await Bs(`/address/${n}/utxo`,t),o=Array.isArray(r)?r:[];return{provider:"bitcoin-esplora",network:zt(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 Wy(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 Bs(`/tx/${n}`,t);return{provider:"bitcoin-esplora",network:zt(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 Gy(e={},t={}){let n=mO(e.txHex||e.hex||e.transaction,"txHex");return{provider:"bitcoin-esplora",network:zt(t),encoding:"hex",txHex:n,byteLength:n.length/2,note:"full decode is wallet/client-side or via bitcoinjs; Esplora returns broadcast acceptance only"}}kn();var Dd="https://ordinals.com";function Fs(e={}){return String(e.baseUrl||process.env.BTC_META_API_URL||process.env.UNISAT_API_URL||"").trim().replace(/\/$/,"")}var hO=["open-api.unisat.io","open-api-testnet.unisat.io","api.bestinslot.xyz","api.hiro.so"];function Ky(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=Fs(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=hO.includes(o)&&(i==="https:"||a)}}catch{n=!1}return at({accept:"application/json","user-agent":"oracle-btc-meta/0.1"},{authorization:t?`Bearer ${t}`:"","x-api-key":t},n)}async function Zr(e,t={}){let r=await(t.fetchImpl||fetch)(e,{method:"GET",headers:Ky(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 Yy(e={}){let t=Fs(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:Ky(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 Us(e={},t={}){let n=Ct(e.address||e.addr,"address"),r=Fs(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 Zr(a,t),c=gO(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 gO(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 eo(e={},t={}){let n=Ct(e.address||e.addr,"address"),r=Fs(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 Zr(s,t),l=yO(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 Jy(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||Dd,o=await Zr(`${r}/r/inscription/${n}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,inscriptionId:n,info:o}}async function Xy(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||Dd,o=Number(e.page||0),i=await Zr(`${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 Qy(e={},t={}){let n=t.ordinalsBase||Dd,r=e.height??await Zr(`${n}/r/blockheight`,t),o=await Zr(`${n}/r/blockinfo/${Number(r)}`,t);return{provider:"bitcoin-meta",source:"ordinals.com/r",keyless:!0,height:Number(r),info:o}}function yO(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}))}kn();ne();var bO=["unsigned","notsigned","tosign","signable"],xO=new Set(["requiresusersignature","requiressignature","needssignature","signaturerequired","signaturesrequired","signingready","signaturecount","signaturethreshold","requiredsignatures","signatureneeded","hassignature","allowsignatures","requestsignature","multisig","cosig","msig"]),SO=new Set(["sig","sigs","scriptsig","witness","psbt","finalizedpsbt","completepsbt","finalpsbt","psbtfinalized","serializedtransaction"]);function qd(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function kO(e){return bO.some(t=>e.startsWith(t))||xO.has(e)}function vO(e){let t=String(e);if(!/^[\x20-\x7e]+$/.test(t))return!0;let n=qd(t);return kO(n)?!1:SO.has(n)?!0:n.includes("signed")||n.includes("signature")||n.endsWith("sig")||n.endsWith("sigs")}function EO(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 Hd(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=>Hd(c,t+1,n,r));let o=[];for(let[c,l]of Object.entries(e)){if(vO(c)){o.push(c);continue}o.push(...Hd(l,t+1,n,r))}let a=Object.keys(e).map(qd).some(c=>c.endsWith("psbt")||c.endsWith("psbtbase64")),s=Object.entries(e).some(([c,l])=>/complete|finalized|isfinal/.test(qd(c))&&l===!0);return a&&s&&o.push("psbt(complete)"),EO(e)&&o.push("v/r/s"),o}function an(e,t){let n=Hd(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 AO="https://api.satflow.com/v1";function Zy(e={}){return dt({provider:"satflow",defaultUrl:AO,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Ds(e={}){return Zy(e).baseUrl}function zd(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function IO(e={}){return at({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":zd(e)},Zy(e).trusted)}async function Nn(e,{method:t="GET",body:n,opts:r={}}={}){if(!zd(r))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Ds(r)}${e.startsWith("/")?e:`/${e}`}`,s=await(r.fetchImpl||fetch)(i,{method:t,headers:IO(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 ew(e={}){if(!!!zd(e))return{ok:!1,provider:"satflow",baseUrl:Ds(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 Nn("/collection/stats/floors?type=ordinals",{opts:e}),{ok:!0,provider:"satflow",baseUrl:Ds(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:Ds(e),apiKeyPresent:!0,error:String(n?.message||n).slice(0,200),magicEdenOrdinals:"deprecated-dead"}}}async function tw(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 Nn(`/collection/stats/floors?${r}`,{opts:t});return{provider:"satflow",type:n,floors:o,magicEdenOrdinals:"deprecated-dead"}}async function nw(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 Nn(`/collection/stats?${r}`,{opts:t});return{provider:"satflow",collectionId:n,stats:o}}async function rw(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 Nn(`/item?${r}`,{opts:t})}}async function qs(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 Nn(`/address/wallet-contents?${r}`,{opts:t});return{provider:"satflow",address:n,contents:o}}async function ow(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 Nn(`/orders/floor?${r}`,{opts:t})}}var _O=new Set(["body","execute","fetchImpl","opts","apiKey","baseUrl","timeoutMs","maxSats","operator"]);function iw(e={},t=null){let n=e.body&&typeof e.body=="object"?e.body:e,r={};for(let[o,i]of Object.entries(n))_O.has(o)||t&&!t.has(o)||i!==void 0&&(r[o]=i);return r}var PO=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"]),TO=new Set(["inscription_id","inscriptionId","runes_output","runesOutput","ord_address","receive_address","price","tap_key","collection_slug","expires_at"]);function jd(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 NO(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 aw(e={},t={}){let n=iw(e,PO);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=jd(n);if(i!=null&&i>o)throw new Error(`satflow: requested price ${i} sats exceeds maxSats cap ${o}`);let a=await Nn("/intent/satflow-purchase",{method:"POST",body:n,opts:t}),s=jd(a)??jd(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`);an("satflow",a);let c=a?.unsignedPSBTBase64||a?.unsignedPsbtBase64||a?.unsigned_psbt||null,l=null,u=null;try{l=NO(e,{psbt:c,priceSats:s,nowMs:t.nowMs})}catch(d){u=String(d?.message||d).slice(0,200)}return $({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 Hs(e={},t={}){let n=iw(e,TO);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 Nn("/intent/sell",{method:"POST",body:n,opts:t});return an("satflow",r),$({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."})}j();ne();var zs="https://lite-api.jup.ag/swap/v1",Vd="So11111111111111111111111111111111111111112",lw="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",OO=100,sw=2e4;function uw(e={}){return String(e.baseUrl||process.env.JUPITER_SWAP_API_URL||zs).replace(/\/$/,"")}function Ni(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 dw(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>OO)throw new Error("jupiter: slippage exceeds hard 100 bps cap");return t}function js(e,t){return e==null?t:!!e}function RO(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 LO(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 pw(e){let t=Buffer.from(e,"base64"),n=LO(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 Ci(e={},{quotedAtMs:t=Date.now(),ttlMs:n=sw}={}){let r=ve(e.inputMint,"inputMint"),o=ve(e.outputMint,"outputMint"),i=Ni(e.inAmount,"inAmount"),a=Ni(e.outAmount,"outAmount"),s=Ni(e.otherAmountThreshold??e.outAmount,"otherAmountThreshold"),c=dw(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)||sw,1e3),3e4)}}function Wd({userPublicKey:e,guard:t,swapTransaction:n,args:r={},response:o={}}){if(t.inputMint!==Vd)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=pw(n),a=Ni(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 $O=new Set(["BPFLoaderUpgradeab1e11111111111111111111111","BPFLoader2111111111111111111111111111111111","BPFLoader1111111111111111111111111111111111"]),BO="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function cw(e){if(typeof e!="string"||!e.length)return!1;let t=0n;for(let o of e){let i=BO.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 mw(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(`${zs}/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])=>cw(p)),c=[],l=a.filter(([p])=>!cw(p)).map(([p,m])=>({programId:p,label:m,reason:"malformed program id"}));if(e.verify===!1)return{source:`${zs}/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[b,S]=m[g];h&&h.executable===!0&&$O.has(h.owner)?c.push({programId:b,label:S,owner:h.owner}):l.push({programId:b,label:S,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:`${zs}/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 fw(e={}){try{return{ok:!0,provider:"jupiter",outAmount:(await Vs({inputMint:Vd,outputMint:lw,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 Vs(e={},t={}){let n=ve(e.inputMint||e.fromMint||Vd,"inputMint"),r=ve(e.outputMint||e.toMint||lw,"outputMint"),o=Ni(e.amount||e.inAmount,"amount"),i=dw(e.slippageBps??e.maxSlippageBps??50),a=new URL(`${uw(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 A(a.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),c=Ci({...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 MO(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function hw(e={},t={}){let n=ve(e.userPublicKey||e.owner||e.wallet,"userPublicKey"),r=e.quoteResponse?{quote:e.quoteResponse,solanaGuard:Ci(e.quoteResponse,t)}:await Vs(e,t),o=r.quote,i=r.solanaGuard||Ci(o,t);if(js(e.dynamicSlippage,!1)===!0)throw new Error("jupiter: dynamicSlippage would override the enforced slippage ceiling \u2014 pass an explicit slippageBps instead");let a=await A(`${uw(t)}/swap`,{method:"POST",body:MO({quoteResponse:o,userPublicKey:n,wrapAndUnwrapSol:js(e.wrapAndUnwrapSol,!0),dynamicComputeUnitLimit:js(e.dynamicComputeUnitLimit,!0),dynamicSlippage:!1,asLegacyTransaction:js(e.asLegacyTransaction,!0),prioritizationFeeLamports:e.prioritizationFeeLamports??0}),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),s=RO(a?.swapTransaction);pw(s),an("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=Wd({userPublicKey:n,guard:i,swapTransaction:s,args:e,response:a})}catch(m){p=String(m?.message||m).slice(0,200)}return $({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"})}j();var UO="https://coins.llama.fi",DO="https://api.llama.fi",qO="https://yields.llama.fi",HO="https://stablecoins.llama.fi";function jO(e={}){return(e.baseUrl||process.env.DEFILLAMA_COINS_URL||UO).replace(/\/$/,"")}function gw(e={}){return(e.baseUrl||process.env.DEFILLAMA_API_URL||DO).replace(/\/$/,"")}async function Ot(e,t={}){if(!Array.isArray(e)||!e.length)throw new Error("llamaPrices requires coins[]");let n=e.map(encodeURIComponent).join(",");return A(`${jO(t)}/prices/current/${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function yw(e={}){let n=(await Ot(["coingecko:ethereum"],e))?.coins?.["coingecko:ethereum"];return{ok:!!n?.price,ethUsd:n?.price??null}}async function Gd(e={}){return A(`${gw(e)}/protocols`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??2e4})}async function ww(e={},t={}){let n=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||qO).replace(/\/$/,""),r=await A(`${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 Ws(e={},t={}){let n=(t.stablecoinsBaseUrl||process.env.DEFILLAMA_STABLECOINS_URL||HO).replace(/\/$/,""),r=e.includePrices!==!1;return A(`${n}/stablecoins?includePrices=${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function bw(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 A(`${gw(t)}/overview/dexs/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4})}async function xw(e=["ethereum","bitcoin","solana"],t={}){let n=e.map(i=>`coingecko:${String(i).toLowerCase()}`),r=await Ot(n,t),o={};for(let i of e){let a=`coingecko:${String(i).toLowerCase()}`;o[i]=r?.coins?.[a]||null}return o}Oi();Fr();ir();Dr();_e();Ye();ne();import{Interface as Aw,getAddress as Ri,isAddress as GO}from"ethers";var Rn={8453:{name:"base",quoter:"0x254cF9E1E6e233aa1AC962CB9B05b2cfeAaE15b0",router:"0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",factory:"0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",weth:"0x4200000000000000000000000000000000000006",usdc:"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}},KO=[1,50,100,200,2e3],vw=new Aw(["function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, int24 tickSpacing, uint160 sqrtPriceLimitX96) params) returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)"]),YO=new Aw(["function exactInputSingle((address tokenIn, address tokenOut, int24 tickSpacing, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) payable returns (uint256 amountOut)"]),Iw="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",_w="0x0000000000000000000000000000000000000000";function Pw(e){let t=Number(e),n=Rn[t];if(!n)throw new Error(`aerodrome: unsupported chainId ${e} (supported: ${Object.keys(Rn).join(", ")})`);return{chainId:t,...n}}function Ew(e,t){let n=Rn[Number(t)];if(!e||e===Iw||e===_w||/^eth$/i.test(String(e)))return Ri(n.weth);let r=String(e);if(/^weth$/i.test(r))return Ri(n.weth);if(/^usdc$/i.test(r))return Ri(n.usdc);if(!GO(r))throw new Error(`invalid token address: ${e}`);return Ri(r)}async function Ks(e={},t={}){let{chainId:n,quoter:r,router:o}=Pw(e.chainId??8453),i=Ew(e.tokenIn||"WETH",n),a=Ew(e.tokenOut||Rn[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]:[...KO],l=[],u=null;for(let d of c){let p=vw.encodeFunctionData("quoteExactInputSingle",[{tokenIn:i,tokenOut:a,amountIn:s,tickSpacing:d,sqrtPriceLimitX96:0n}]);try{let m=await V(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=vw.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 pe({venue:"aerodrome",chainId:n,chain:Rn[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 Tw(e={},t={}){let n=Number(e.chainId??8453),r=Pw(n),o=Ri(e.recipient||e.from||e.userAddress),i=String(e.tokenIn||"WETH"),a=!e.tokenIn||i===Iw||i===_w||/^eth$/i.test(i),s=await Ks(e,t),c=Math.min(600,Math.max(30,Number(e.deadlineSeconds??300))),u=Number(t.nowSeconds??Math.floor(Date.now()/1e3))+c,d=YO.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 $({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:Pe(s.autoSlippage,{chainId:n,venue:r.router,data:d})}},{provider:"aerodrome",kind:"aerodrome-exact-in"})}async function Nw(e={}){let t=Number(e.chainId??8453);try{let n=await Ks({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:Rn[t]?.router,quoter:Rn[t]?.quoter}}catch(n){return{ok:!1,chainId:t,error:String(n.message||n).slice(0,200)}}}async function Cw(){return Object.entries(Rn).map(([e,t])=>({chainId:Number(e),name:t.name,quoter:t.quoter,router:t.router,factory:t.factory,weth:t.weth,usdc:t.usdc}))}Li();Dw();Bi();j();Ye();kn();ne();var TR="https://api.1inch.dev/swap/v6.0";function Qw(e={}){return dt({provider:"oneinch",defaultUrl:TR,hosts:["api.1inch.dev"],url:e.baseUrl||process.env.ONEINCH_API_URL})}function hp(e={}){return Qw(e).baseUrl}function Mi(e={}){return e.apiKey||process.env.ONEINCH_API_KEY||process.env.ONE_INCH_API_KEY||""}function gp(e={}){let t=Mi(e);return at({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},Qw(e).trusted)}async function Zw(e={}){if(!Mi(e))return{ok:!1,configured:!1,error:"ONEINCH_API_KEY not set"};try{return{ok:!0,configured:!0,dstAmount:(await Fi({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 Fi(e={},t={}){if(!Mi(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 A(`${hp(t)}/${n}/quote?${a}`,{headers:gp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});return s?.dstAmount?pe(s,{chainId:n,venue:"1inch-quote",amountOut:s.dstAmount,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}):s}function NR(e){return/^(eth|native|0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)$/i.test(String(e||""))}async function yp(e={},t={}){if(!Mi(t))throw new Error("ONEINCH_API_KEY required for 1inch");let n=Number(e.chainId??1);return A(`${hp(t)}/${n}/approve/spender`,{headers:gp(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function eb(e={},t={}){if(!Mi(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=it({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 A(`${hp(t)}/${n}/swap?${c}`,{headers:gp(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=pe(l,{chainId:n,venue:u.to,amountOut:d,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps}),m=null;if(!NR(r)){let f=l?.spender||l?.approvalAddress||(await yp({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 $({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:Pe(p.autoSlippage,{chainId:n,venue:u.to,data:u.data})}},{provider:"oneinch",kind:"oneinch-tx"})}ne();var OR=96*1024,tb=50;function RR(e){if(e&&typeof e=="object"&&!Array.isArray(e))return e;let t=String(e||"").trim();if(!t||t.length>OR)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 ln(e,t){let n=String(e||"").trim();if(!n)throw new Error(`x402: ${t} required`);return n}function rb(e,t){let n=ln(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 LR(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 $R(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`x402: accepts[${t}] must be an object`);let n=ln(e.scheme,`accepts[${t}].scheme`).toLowerCase();return Object.freeze({scheme:n,network:ln(e.network,`accepts[${t}].network`),amount:rb(e.amount,`accepts[${t}].amount`),asset:ln(e.asset,`accepts[${t}].asset`),payTo:ln(e.payTo,`accepts[${t}].payTo`),maxTimeoutSeconds:Number(e.maxTimeoutSeconds),extra:LR(e.extra)})}function wp(e){let t=RR(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>tb)throw new Error(`x402: accepts must contain 1-${tb} requirements`);let n=t.resource&&typeof t.resource=="object"&&!Array.isArray(t.resource)?Object.freeze({url:ln(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($R));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 nb(e,t){return String(e)===String(t)}function BR(e,t={}){let n=wp(e),r=ln(t.network,"network"),o=ln(t.asset,"asset"),i=ln(t.payTo,"payTo"),a=BigInt(rb(t.maxAmount,"maxAmount")),s=n.accepts.filter(l=>l.scheme==="exact"&&l.network===r&&nb(l.asset,o)&&nb(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 ob(e={}){return e.paymentRequired??e.header??e.body}function ib(e={}){return wp(ob(e))}function ab(e={},t={}){let n=wp(ob(e)),r=BR(n,e);return $({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 sb(){return{ok:!0,configured:!0,x402Version:2,schemes:["exact"],custody:"prepare-only",signingReady:!1,broadcastReady:!1}}j();kn();var FR="https://api.bankr.bot";function bp(e={}){return dt({provider:"bankr",defaultUrl:FR,hosts:["api.bankr.bot"],url:e.baseUrl||process.env.BANKR_API_URL})}function cb(e={}){return e.apiKey||process.env.BANKR_API_KEY||""}function UR(e={}){let t=cb(e);if(!t)throw new Error("BANKR_API_KEY required for Bankr");return t}function lb(e={},t=!1){let n=UR(e),r=bp(e);return at({accept:"application/json",...t?{"content-type":"application/json"}:{}},{"X-API-Key":n},r.trusted)}async function ub(e,t={}){return A(`${bp(t).baseUrl}${e}`,{headers:lb(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,retries:0})}async function xp(e={}){return ub("/wallet/me",e)}async function db(e={}){return ub("/wallet/portfolio",e)}function Ui(e,t){let n=String(e||"").trim();if(!n)throw new Error(`bankr: ${t} required`);return n}function DR(e){let t=Ui(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 pb(e={},t={}){let n={fromChain:Ui(e.fromChain,"fromChain"),fromToken:Ui(e.fromToken,"fromToken"),toChain:Ui(e.toChain,"toChain"),toToken:Ui(e.toToken,"toToken"),amount:DR(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 A(`${bp(t).baseUrl}/wallet/swap-quote`,{method:"POST",headers:lb(t,!0),body:JSON.stringify(n),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4,retries:0})}async function mb(e={}){if(!cb(e))return{ok:!1,configured:!1,error:"BANKR_API_KEY not set"};try{return{ok:!0,configured:!0,walletConfigured:!!await xp(e),custody:"vendor-wallet-read-only",execution:!1}}catch(t){return{ok:!1,configured:!0,error:String(t?.message||t).slice(0,160)}}}var HR=process.env.HL_WS_URL||"wss://api.hyperliquid.xyz/ws";async function Di(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||HR,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 fb(e={}){try{let t=await Di({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 hb(e={}){let t=await Di({type:"allMids"},e),n=t.last||{};return{ms:t.ms,mids:n.data?.mids||n.data||{},channel:n.channel}}async function gb(e,t={}){if(!e)throw new Error("coin required");let n=await Di({type:"l2Book",coin:String(e)},t);return{ms:n.ms,book:n.last?.data||n.last,channel:n.last?.channel}}var zR=process.env.POLY_WS_URL||"wss://ws-subscriptions-clob.polymarket.com/ws/market";async function cc(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||zR,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 b;try{b=JSON.parse(typeof g.data=="string"?g.data:String(g.data))}catch{b={raw:String(g.data).slice(0,300)}}d.push(b),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 yb(e={}){let t=e.assetId||"98022490269692409998126496127597032490334070080325855126491859374983463996227";try{let n=await cc([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 wb(e,t={}){if(!e)throw new Error("assetId required");let n=await cc([e],t);return{ms:n.ms,assetId:String(e),data:n.last,messages:n.messages}}import vb from"node:path";import{homedir as o2}from"node:os";import{createHash as i2,randomUUID as a2}from"node:crypto";import ge from"node:fs";import lc from"node:path";import{createHash as WR,randomUUID as bb}from"node:crypto";var Sp=1,Rt=class extends Error{constructor(t,n="DURABLE_STORE_ERROR"){super(t),this.name="DurableStoreError",this.code=n}};function $n(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($n).join(",")}]`;if(e&&typeof e=="object")return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${$n(e[n])}`).join(",")}}`;throw new TypeError(`durable store values must be JSON-safe, got ${typeof e}`)}function xb(e){return WR("sha256").update($n(e)).digest("hex")}function uc(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 dc(e){return e===void 0?void 0:JSON.parse(JSON.stringify(e))}function Sb(e){ge.mkdirSync(e,{recursive:!0,mode:448});try{ge.chmodSync(e,448)}catch{}}function kp(e){try{let t=ge.statSync(e);return{...JSON.parse(ge.readFileSync(e,"utf8")),mtimeMs:t.mtimeMs}}catch{return null}}function oo({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=()=>bb()}={}){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 w=n();return r(w),{schemaVersion:Sp,kind:t,generation:0,data:w}}function d(w){let y;try{y=JSON.parse(w)}catch(x){throw new Rt(`corrupt ${t} snapshot: invalid JSON (${x.message})`,"STORE_CORRUPT")}if(!y||typeof y!="object"||Array.isArray(y))throw new Rt(`corrupt ${t} snapshot: root must be an object`,"STORE_CORRUPT");if(y.schemaVersion!==Sp)throw new Rt(`unsupported ${t} schemaVersion ${String(y.schemaVersion)}`,"STORE_SCHEMA");if(y.kind!==t||!Number.isSafeInteger(y.generation)||y.generation<0)throw new Rt(`corrupt ${t} snapshot metadata`,"STORE_CORRUPT");let{integrity:k,...v}=y;if(typeof k!="string"||!/^[a-f0-9]{64}$/.test(k)||xb(v)!==k)throw new Rt(`corrupt ${t} snapshot: checksum mismatch`,"STORE_CORRUPT");try{r(y.data)}catch(x){throw new Rt(`corrupt ${t} snapshot: ${x.message}`,"STORE_CORRUPT")}return v}function p(){if(!ge.existsSync(e))return u();let w=ge.statSync(e);if(!w.isFile()||w.size>i)throw new Rt(`${t} snapshot is not a bounded regular file`,"STORE_BOUNDS");try{ge.chmodSync(e,384)}catch{}return d(ge.readFileSync(e,"utf8"))}function m(){Sb(lc.dirname(e));let w=uc(o),y=String(c()),k=`${JSON.stringify({schemaVersion:1,lockId:y,pid:process.pid,acquiredAt:w})}
|
|
146
146
|
`,v=()=>{let P;try{return P=ge.openSync(l,"wx",384),ge.writeFileSync(P,k,"utf8"),ge.fsyncSync(P),ge.closeSync(P),{lockId:y}}catch(N){let I=P!==void 0;if(I)try{ge.closeSync(P)}catch{}if(I)try{ge.unlinkSync(l)}catch{}if(N?.code!=="EEXIST")throw N;return null}},E=uc(o)+s,_=new Int32Array(new SharedArrayBuffer(4));for(;;){let P=v();if(P)return P;let N=uc(o),I=kp(l),L=!1;if(I){let O=N-Number(I.acquiredAt??I.mtimeMs);L=Number.isFinite(O)&&O>=a}else try{L=N-ge.statSync(l).mtimeMs>=a}catch{L=!1}if(L){let O=kp(l);if(I?O?.lockId===I.lockId:O===null){try{ge.unlinkSync(l)}catch(R){if(R?.code!=="ENOENT")throw R}continue}}let F=E-N;if(F<=0)throw new Rt(`${t} store is busy`,"STORE_BUSY");Atomics.wait(_,0,0,Math.min(10,F))}}function f(w){if(kp(l)?.lockId===w.lockId)try{ge.unlinkSync(l)}catch(k){if(k?.code!=="ENOENT")throw k}}function h(w){r(w.data);let y={...w,integrity:xb(w)},k=`${$n(y)}
|
|
147
|
-
`;if(Buffer.byteLength(k)>i)throw new Rt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let v=lc.dirname(e);Sb(v);let x=lc.join(v,`.${lc.basename(e)}.${process.pid}.${bb()}.tmp`),E;try{E=ge.openSync(x,"wx",384),ge.writeFileSync(E,k,"utf8"),ge.fsyncSync(E),ge.closeSync(E),E=void 0,ge.renameSync(x,e);try{ge.chmodSync(e,384)}catch{}try{let _=ge.openSync(v,"r");try{ge.fsyncSync(_)}finally{ge.closeSync(_)}}catch{}}finally{if(E!==void 0)try{ge.closeSync(E)}catch{}try{ge.unlinkSync(x)}catch(_){if(_?.code!=="ENOENT")throw _}}}function g(){return dc(p().data)}function b(){let w=p();return{schemaVersion:w.schemaVersion,kind:w.kind,generation:w.generation,data:dc(w.data)}}function S(w){if(typeof w!="function")throw new TypeError("mutator must be a function");let y=m();try{let k=p(),v=dc(k.data),x=w(v,{generation:k.generation,now:uc(o)});return r(v),h({schemaVersion:Sp,kind:t,generation:k.generation+1,data:v}),dc(x)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:b,mutate:S})}import{wordlists as GR}from"ethers";var KR=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),YR=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],JR=new Set([12,15,18,21,24]);function XR(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return JR.has(t.length)&&t.every(n=>GR.en.getWordIndex(n)>=0)}var QR=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,ZR=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,e2=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function t2(e){let t=kb(e);return e2.has(t)||ZR.test(t)}var qi=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function kb(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function n2(e){let t=kb(e);return[...KR].some(n=>t.includes(n))}function r2(e,t,n){if(typeof t=="string"){if(YR.some(r=>r.test(t))||XR(t))throw new qi(n);if(QR.test(t)&&!t2(e))throw new qi(n)}}function vp(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return r2(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)=>vp(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(n2(o))throw new qi(i);e[o]!==void 0&&(r[o]=vp(e[o],i,o))}return r}function un(e){return vp(e)}var mc=1,Eb="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",ej=Object.freeze(["listing","offer","arm","instruct"]),s2=Object.freeze(["open","cancelled","expired","armed","submitted"]),tj=Object.freeze(["arm","sign-and-broadcast"]),c2=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."}),l2=/^(?:0|[1-9][0-9]*)$/,u2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,d2=/^0x[a-fA-F0-9]{40}$/,p2=/^0x[a-fA-F0-9]{64}$/,m2=/[\u0000-\u001f\u007f]/,f2=new Set(s2),Ip=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function ee(e,t){throw new Ip(e,t)}function fr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))fr(t);Object.freeze(e)}return e}function ji(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&ee(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||m2.test(o))&&ee(`${t} is invalid`),r?o.toLowerCase():o}function Xe(e,t){let n=ji(e,t,{max:128});return u2.test(n)||ee(`${t} must be a bounded id`),n}function Hi(e,t,{positive:n=!1}={}){typeof e=="number"&&ee(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return l2.test(r)||ee(`${t} must be a canonical integer string`),n&&r==="0"&&ee(`${t} must be positive`),r}function mr(e,t){let n=ji(e,t,{max:42,lower:!0});return d2.test(n)||ee(`${t} must be a 20-byte EVM address`),n}function Ab(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ee(`${t} must be a plain object`),e}function pr(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 must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Ep(e){return new Date(e).toISOString()}function h2(e){return i2("sha256").update($n(e),"utf8").digest("hex")}function g2(e=process.env){let t=e.ORACLE_CONFIG_DIR||vb.join(o2(),".config","oracle");return vb.join(t,"local-marketplace.v1.json")}function pc(e){let t=e.status==="submitted";return fr({schemaVersion:mc,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:f2.has(e.status)?e.status:ee("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>fr({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:Eb,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function y2(e){(!e||e.schemaVersion!==mc||!Array.isArray(e.listings))&&ee("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&ee("marketplace capacity exceeded","STORE_LIMIT")}function Ap(e,t){return fr({schemaVersion:mc,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:Eb,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function w2(e,t,n){typeof e=="string"&&ee("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=Ab(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&ee("generic signHash is refused","SIGNHASH_REFUSED");let o=mr(r.from??r.offerer??t.seller,"artifact.from"),i=mr(r.to??r.recipient??n.buyer,"artifact.to"),a=Hi(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&ee("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&ee("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&ee("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&ee("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function b2(e,t){if(e==null)return{action:"arm"};let n=Ab(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ee("generic signHash is refused","SIGNHASH_REFUSED");let r=ji(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ee("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ee("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&ee("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&ee("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&ee("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&ee("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function Ib({filePath:e=g2(),clock:t=()=>Date.now(),idFactory:n=()=>a2()}={}){let r=oo({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:mc,listings:[]}),validateData:y2});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={}){un(h);let g=Xe(h.tenantId,"tenantId"),b=mr(h.seller,"seller"),S=ji(h.asset,"asset",{max:128}),w=Hi(h.amount,"amount",{positive:!0}),y=Hi(h.price,"price",{positive:!0}),k=Hi(h.chainId,"chainId",{positive:!0}),v=pr(t),x=Ep(v),E=h.expiresAt==null?Ep(v+864e5):ji(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(E))||Date.parse(E)<=v)&&ee("expiresAt must be after now");let _=Xe(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(P=>{P.listings.some(L=>L.listingId===_)&&ee("listingId already exists","DUPLICATE");let N={listingId:_,tenantId:g,seller:b,asset:S,amount:w,price:y,chainId:k,status:"open",createdAt:x,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},I={...N,listingHash:h2(N)};return P.listings.push(I),pc(I)})}function s({tenantId:h}={}){let g=Xe(h,"tenantId"),b=pr(t);return fr(r.read().listings.filter(S=>o(S,g)).map(S=>pc(i({...S,offers:S.offers.map(w=>({...w}))},b))))}function c({tenantId:h,listingId:g,actor:b}={}){let S=Xe(h,"tenantId"),w=Xe(g,"listingId"),y=mr(b,"actor"),k=pr(t);return r.mutate(v=>{let x=v.listings.find(E=>o(E,S)&&E.listingId===w);return x||ee("listing not found","NOT_FOUND"),i(x,k),x.seller!==y&&ee("only the seller can cancel","FORBIDDEN"),x.status!=="open"&&ee("listing is not open","NOT_OPEN"),x.status="cancelled",pc(x)})}function l(h={}){un(h);let g=Xe(h.tenantId,"tenantId"),b=Xe(h.listingId,"listingId"),S=mr(h.buyer,"buyer"),w=Hi(h.amount,"amount",{positive:!0}),y=pr(t),k=Xe(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(v=>{let x=v.listings.find(E=>o(E,g)&&E.listingId===b);return x||ee("listing not found","NOT_FOUND"),i(x,y),x.status!=="open"&&ee("listing is not open","NOT_OPEN"),x.seller===S&&ee("seller cannot offer on their own listing","FORBIDDEN"),x.offers.some(E=>E.offerId===k)&&ee("offerId already exists","DUPLICATE"),x.offers.push({offerId:k,buyer:S,amount:w,status:"open",createdAt:Ep(y)}),pc(x)})}function u(h,{tenantId:g,listingId:b,offerId:S,actor:w,now:y,allowed:k=["open","armed"]}){let v=h.listings.find(E=>o(E,g)&&E.listingId===b);v||ee("listing not found","NOT_FOUND"),i(v,y),k.includes(v.status)||ee("listing is not open","NOT_OPEN"),v.seller!==w&&ee("only the seller can arm a fill","FORBIDDEN");let x=v.offers.find(E=>E.offerId===S);return(!x||!["open","armed"].includes(x.status))&&ee("offer not found","NOT_FOUND"),{row:v,offer:x}}function d({tenantId:h,listingId:g,offerId:b,actor:S}={}){let w=Xe(h,"tenantId"),y=Xe(g,"listingId"),k=Xe(b,"offerId"),v=mr(S,"actor"),x=pr(t);return r.mutate(E=>{let{row:_,offer:P}=u(E,{tenantId:w,listingId:y,offerId:k,actor:v,now:x});return _.status="armed",P.status="armed",Ap(_,P)})}async function p({tenantId:h,listingId:g,offerId:b,actor:S,instruction:w,executor:y}={}){let k=Xe(h,"tenantId"),v=Xe(g,"listingId"),x=Xe(b,"offerId"),E=mr(S,"actor"),_=pr(t),P=r.mutate(R=>{let{row:U,offer:Q}=u(R,{tenantId:k,listingId:v,offerId:x,actor:E,now:_,allowed:["open","armed"]}),Y=b2(w,U);return U.status="armed",Q.status="armed",{armed:Ap(U,Q),instruction:Y,listingHash:U.listingHash}});if(P.instruction.action==="arm")return P.armed;let N=r.read().listings.find(R=>R.listingId===v&&R.tenantId===k),I=N?.offers.find(R=>R.offerId===x),L=w2(P.instruction.artifact,N,I);(!y||typeof y.executeConfirmedArtifact!="function")&&ee("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&ee("generic signHash executors are refused","SIGNHASH_REFUSED");let F=await y.executeConfirmedArtifact(L,P.instruction.nonce,y),O=F?.receipt?.transactionHash??F?.transactionHash;(typeof O!="string"||!p2.test(O))&&ee("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let D=F?.receipt?.status??F?.status;return D!==1&&D!=="0x1"&&ee("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(R=>{let{row:U,offer:Q}=u(R,{tenantId:k,listingId:v,offerId:x,actor:E,now:pr(t),allowed:["armed"]});return U.status="submitted",Q.status="submitted",U.transactionHash=O.toLowerCase(),fr({...Ap(U,Q),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:U.transactionHash,review:`Local P2 fill ${U.listingId} signed and broadcast through the instructed local signer. transactionHash=${U.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Xe(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&ee("consult text required"),fr({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 c2}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import _b from"node:path";import{homedir as x2}from"node:os";import{createHash as S2,randomUUID as k2}from"node:crypto";var hc=1,Pb="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",cj=Object.freeze(["open","cancelled","armed","submitted"]),v2=/^(?:0|[1-9][0-9]*)$/,E2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,A2=/^0x[a-fA-F0-9]{40}$/,I2=/^0x[a-fA-F0-9]{64}$/,_2=/[\u0000-\u001f\u007f]/,Tp=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function oe(e,t){throw new Tp(e,t)}function zi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))zi(t);Object.freeze(e)}return e}function Vi(e,t,{max:n=256}={}){typeof e!="string"&&oe(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||_2.test(r))&&oe(`${t} is invalid`),r}function dn(e,t){let n=Vi(e,t,{max:128});return E2.test(n)||oe(`${t} must be a bounded id`),n}function fc(e,t,{positive:n=!1}={}){typeof e=="number"&&oe(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return v2.test(r)||oe(`${t} must be a canonical integer string`),n&&r==="0"&&oe(`${t} must be positive`),r}function hr(e,t){let n=Vi(e,t,{max:42}).toLowerCase();return A2.test(n)||oe(`${t} must be a 20-byte EVM address`),n}function P2(e){let t=Vi(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{oe("resource must be an https URL")}return n.protocol!=="https:"&&oe("resource must be https"),(n.username||n.password)&&oe("resource must not contain credentials"),n.toString()}function Tb(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&oe(`${t} must be a plain object`),e}function T2(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&oe("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function N2(e){return new Date(e).toISOString()}function C2(e=process.env){let t=e.ORACLE_CONFIG_DIR||_b.join(x2(),".config","oracle");return _b.join(t,"local-x402.v1.json")}function _p(e){let t=e.status==="submitted";return zi({schemaVersion:hc,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:Pb,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function O2(e){(!e||e.schemaVersion!==hc||!Array.isArray(e.intents))&&oe("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&oe("x402 capacity exceeded","STORE_LIMIT")}function Pp(e){return zi({schemaVersion:hc,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:Pb,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function R2(e,t){typeof e=="string"&&oe("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=Tb(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=hr(n.from??t.payer,"artifact.from"),o=hr(n.to??t.payTo,"artifact.to"),i=fc(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&oe("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&oe("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&oe("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&oe("amount exceeds maxBudget","BUDGET"),n}function L2(e,t){if(e==null)return{action:"arm"};let n=Tb(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=Vi(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&oe("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&oe("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&oe("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&oe("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function Nb({filePath:e=C2(),clock:t=()=>Date.now(),idFactory:n=()=>k2()}={}){let r=oo({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:hc,intents:[]}),validateData:O2});function o(l={}){un(l);let u=dn(l.tenantId,"tenantId"),d=hr(l.payer,"payer"),p=hr(l.payTo,"payTo"),m=P2(l.resource),f=fc(l.amount,"amount",{positive:!0}),h=fc(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&oe("amount exceeds maxBudget","BUDGET");let g=Vi(l.asset??"USDC","asset",{max:32}),b=fc(l.chainId,"chainId",{positive:!0}),S=T2(t),w=dn(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(x=>x.intentId===w)&&oe("intentId already exists","DUPLICATE");let k={intentId:w,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:b,status:"open",createdAt:N2(S),custody:"none",execution:"armed-local"},v={...k,intentHash:S2("sha256").update($n(k),"utf8").digest("hex")};return y.intents.push(v),_p(v)})}function i({tenantId:l}={}){let u=dn(l,"tenantId");return zi(r.read().intents.filter(d=>d.tenantId===u).map(_p))}function a({tenantId:l,intentId:u,actor:d}={}){let p=dn(l,"tenantId"),m=dn(u,"intentId"),f=hr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&oe("intent is not open","NOT_OPEN"),g.status="cancelled",_p(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=dn(l,"tenantId"),m=dn(u,"intentId"),f=hr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||oe("intent is not open","NOT_OPEN"),g.status="armed",Pp(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=dn(l,"tenantId"),h=dn(u,"intentId"),g=hr(d,"actor"),b=r.mutate(x=>{let E=x.intents.find(P=>P.tenantId===f&&P.intentId===h);E||oe("intent not found","NOT_FOUND"),E.payer!==g&&oe("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||oe("intent is not open","NOT_OPEN");let _=L2(p,E);return E.status="armed",{armed:Pp(E),instruction:_}});if(b.instruction.action==="arm")return b.armed;let S=r.read().intents.find(x=>x.tenantId===f&&x.intentId===h),w=R2(b.instruction.artifact,S);(!m||typeof m.executeConfirmedArtifact!="function")&&oe("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&oe("generic signHash executors are refused","SIGNHASH_REFUSED");let y=await m.executeConfirmedArtifact(w,b.instruction.nonce,m),k=y?.receipt?.transactionHash??y?.transactionHash;(typeof k!="string"||!I2.test(k))&&oe("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let v=y?.receipt?.status??y?.status;return v!==1&&v!=="0x1"&&oe("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(x=>{let E=x.intents.find(_=>_.tenantId===f&&_.intentId===h);return(!E||E.status!=="armed")&&oe("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=k.toLowerCase(),zi({...Pp(E),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:E.transactionHash,review:`Oracle local x402 ${E.intentId} signed and broadcast. transactionHash=${E.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import Cb from"node:path";import{homedir as $2}from"node:os";import{randomUUID as B2}from"node:crypto";var Op=1,M2="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",yj=Object.freeze(["listed","revoked"]),F2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,U2=/[\u0000-\u001f\u007f]/,D2=/^[a-f0-9]{64}$/,q2=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,H2=new Set(["read","prepare","none"]),Cp=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function Me(e,t){throw new Cp(e,t)}function Rp(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Rp(t);Object.freeze(e)}return e}function Bn(e,t,{max:n=256}={}){typeof e!="string"&&Me(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||U2.test(r))&&Me(`${t} is invalid`),r}function Wi(e,t){let n=Bn(e,t,{max:128});return F2.test(n)||Me(`${t} must be a bounded id`),n}function Ob(e,t){let n=Bn(e,t,{max:64}).toLowerCase();return D2.test(n)||Me(`${t} must be 64 lowercase hex`),n}function j2(e,t){let n=Bn(e,t,{max:2048}),r;try{r=new URL(n)}catch{Me(`${t} must be an https URL`)}return r.protocol!=="https:"&&Me(`${t} must be https`),(r.username||r.password)&&Me(`${t} must not contain credentials`),r.toString()}function z2(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Me("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Bn(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!q2.test(r)||r==="0.0.0.0")&&Me(`outboundHosts[${n}] is not an allowlisted host`),r}))}function Rb(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&Me("clock invalid","CLOCK_INVALID"),n}function Lb(e){return new Date(e).toISOString()}function V2(e=process.env){let t=e.ORACLE_CONFIG_DIR||Cb.join($2(),".config","oracle");return Cb.join(t,"local-pack-registry.v1.json")}function Np(e){return Rp({schemaVersion:Op,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:M2,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function W2(e){(!e||e.schemaVersion!==Op||!Array.isArray(e.packs))&&Me("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Me("pack registry capacity exceeded","STORE_LIMIT")}function $b({filePath:e=V2(),clock:t=()=>Date.now(),idFactory:n=()=>B2()}={}){let r=oo({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Op,packs:[]}),validateData:W2});function o(l={}){un(l);let u=Wi(l.tenantId,"tenantId"),d=Bn(l.name,"name",{max:128}),p=Bn(l.version,"version",{max:64}),m=Bn(l.publisher,"publisher",{max:128}),f=Ob(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Ob(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:j2(l.homepage,"homepage"),b=z2(l.outboundHosts),S=Bn(l.spendScope??"none","spendScope",{max:16});H2.has(S)||Me("spendScope must be read, prepare, or none"),S!=="none"&&S!=="read"&&Me("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let w=Rb(t),y=Wi(String(l.packId??`pack-${n()}`),"packId");return r.mutate(k=>{k.packs.some(x=>x.packId===y||x.tenantId===u&&x.name===d&&x.version===p&&x.status==="listed")&&Me("pack already listed","DUPLICATE");let v={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:b,spendScope:S,status:"listed",createdAt:Lb(w),revokedAt:null,execution:"none",pluginExecution:!1};return k.packs.push(v),Np(v)})}function i({tenantId:l}={}){let u=Wi(l,"tenantId");return Rp(r.read().packs.filter(d=>d.tenantId===u).map(Np))}function a({tenantId:l,packId:u}={}){let d=Wi(l,"tenantId"),p=Wi(u,"packId"),m=Rb(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||Me("pack not found","NOT_FOUND"),h.status!=="listed"&&Me("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=Lb(m),Np(h)})}function s(){Me("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){Me("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}j();import{getAddress as Z2,Interface as ao,keccak256 as Bp}from"ethers";import{createHash as Mp,createHmac as eL,timingSafeEqual as Jb}from"node:crypto";Dr();_e();import{Interface as Fb,getAddress as Lp,isAddress as G2}from"ethers";var K2="0x0000000000000000000000000000000000000000",Ub=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),Y2=new Fb(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),J2=new Fb(["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 X2(e){let t=Number(e??4663),n=Ub[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Bb(e,t){if(/^weth$/i.test(String(e||"")))return Lp(Ub[t].weth);if(!G2(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Lp(e)}function Q2(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function Mb(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 Db(e,t={},n={}){try{let r=X2(t.chainId),o=Bb(t.tokenIn,r.chainId),i=Bb(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=Q2(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||V,l=await Mb(c,r.chainId,r.factory,Y2,"getPool",[o,i,s]),u=Lp(l[0]);if(u.toLowerCase()===K2)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 Mb(c,r.chainId,r.quoter,J2,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 qb(e={},t={}){return Db("exact-input",e,t)}async function Hb(e={},t={}){return Db("exact-output",e,t)}ne();var X=4663,gc="https://anvil.clutch.market",tL=`${gc}/api/markets/snapshot?chainId=${X}`,nL=`${gc}/api/rpc?chainId=${X}`,rL=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),ft="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Fp="0x0000000000000000000000000000000000000000",gr=1e5,oL=256e3,jb=256,iL=3e4,aL=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"}),kt=Object.freeze({chainId:X,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ge=new ao(["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"]),sL=new ao(["function allowance(address owner,address spender) view returns (uint256)"]),Xb=new ao(["function decimals() view returns (uint8)"]),zb=new ao(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),vt=new ao(["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)"]),Mn=new ao(["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 K(e,t){try{return Z2(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function mn(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 ht(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 se(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(X,"eth_call",[{to:K(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function Qb(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 Vb(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>jb)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${jb}`);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)!==X)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${X}`);return{name:n.name||n.collectionName||null,chainId:X,collection:K(n.collection||n.collectionAddress,"Anvil collection"),market:K(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?K(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 cL(e,t,n=[],r={}){if(Number(e)!==X)throw new Error(`stonkbrokers: Anvil supports chain ${X} only`);if(!rL.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await A(nL,{method:"POST",headers:{origin:gc,referer:`${gc}/`,"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 Lt(e={}){return e.rpcCall||((t,n,r)=>cL(t,n,r,e))}async function so(e={},t={}){if(e.snapshot){let s=Vb(e.snapshot),c={kind:"anvil-markets",chainId:X,total:s.length,contentHash:Mp("sha256").update(io(s)).digest("hex")},l=Up(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 A(tL,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:oL,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=Vb(r),i={kind:"anvil-markets",chainId:X,total:o.length,contentHash:Mp("sha256").update(io(o)).digest("hex")},a=Up(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 yc(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 Zb({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 so({},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=aL[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=Lt(n),c=yc(await s(X,"eth_blockNumber",[])),l=await s(X,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||yc(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(X,"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=Bp(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+iL}}function ex(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:X,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 Ki(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=mn(e.tokenId),i=await Zb({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([se(a,n,Ge,"quoteSpecificBuy",[BigInt(o)],s),se(a,n,Ge,"inventory",[BigInt(o)],s),se(a,r,vt,"ownerOf",[BigInt(o)],s),se(a,n,Ge,"collection",[],s),se(a,n,Ge,"token",[],s),se(a,n,Ge,"robinhoodSwapFeeWei",[],s)]),f=K(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=K(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await se(a,h,Xb,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let b=BigInt(m[0]).toString(),S=ex(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:b}),w=!!c[4],y=!!l[0],k=K(u[0],"NFT owner")===n,v=w&&y&&k;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:X,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:b,fees:Qb(c[2],c[3]),available:v,evidence:{quoteAvailable:w,inventory:y,ownerIsMarket:k,marketCollection:f,attestation:S},reason:v?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function wc(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await Zb({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([se(i,n,Ge,"quoteSellNFT",[],a),se(i,n,Ge,"collection",[],a),se(i,n,Ge,"token",[],a),se(i,n,Ge,"robinhoodSwapFeeWei",[],a)]),d=K(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=K(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await se(i,p,Xb,"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=ex(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:X,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:Qb(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function tx(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 pn(e,t){let n=ht(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function nx({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:X,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:pn(o,"gasLimit").toString(),maxFeePerGas:pn(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=pn(a,"maxPriorityFeePerGasWei").toString()),c}function rx(e,t){return $({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 ox(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=K(e.market,"Anvil market"),o=K(e.collection,"NFT collection"),i=mn(e.tokenId),a=pn(e.maxTotalCostRaw,"maxTotalCostRaw"),s=ht(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 Ki({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=pn(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=K(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,b={blockHash:g.blockHash,requireCanonical:!0},S=BigInt((await se(Lt(t),f,sL,"allowance",[n,r],b))[0]);if(S<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[nx({...w,to:r,data:Ge.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],k={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},v={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:k,preconditions:{allowanceVerified:!0,allowanceRaw:S.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:tx(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:k,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return rx(v,l)}async function ix(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Lt(t),r=K(e.seller,"seller"),o=K(e.market,"Anvil market"),i=K(e.collection,"NFT collection"),a=mn(e.tokenId),s=pn(e.minPayoutRaw,"minPayoutRaw"),c=ht(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 wc({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([se(n,i,vt,"ownerOf",[BigInt(a)],p).then(P=>K(P[0],"NFT owner")),se(n,i,vt,"getApproved",[BigInt(a)],p).then(P=>K(P[0],"NFT approval")),se(n,i,vt,"isApprovedForAll",[r,o],p).then(P=>!!P[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),b=pn(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(b!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let S=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=K(u.paymentToken,"Anvil payment token"),k=Number(u.paymentTokenDecimals),v={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},x=[nx({...v,to:o,data:Ge.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},_={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:E,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:b.toString()},tradeId:tx(e.tradeId),slippageBps:0,expiresAtMs:S+w,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:x}};return rx(_,u)}async function lL(e={},t={}){if(Array.isArray(e.tokenIds)){let S=e.tokenIds.map(k=>mn(k)),w={kind:"anvil-inventory",chainId:X,market:K(e.market,"Anvil market"),collection:K(e.collection,"NFT collection"),total:S.length,contentHash:Mp("sha256").update(io(S)).digest("hex")},y=Up(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:S,total:S.length,scanned:S.length,complete:y.valid,continuation:y.valid?null:{offset:S.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=Lt(t),r=K(e.market,"Anvil market"),o=yc(await n(X,"eth_blockNumber",[])),i=await n(X,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||yc(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await se(n,r,Ge,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>gr)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${gr}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>gr))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${gr}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:gr};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await se(n,r,Ge,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let S=f.toString();g.add(S),h.push(S),f=BigInt((await se(n,r,Ge,"getNextTokenId",[f],s))[0])}let b=h.length===l;return{ids:h,total:l,scanned:h.length,complete:b,continuation:b?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function uL(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 dL(e,t,n){let r=Lt(n);try{let o=String((await se(r,e,vt,"tokenURI",[BigInt(t)]))[0]),i=uL(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await A(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 se(r,e,vt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function ax(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 pL(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 bc(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await lL({...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=Lt(t),p=(await ot(i,s,async h=>{try{let g=await se(u,r,vt,"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 ot(p,s,async h=>{try{let g=await Ki({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:X,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 ot(i,s,async u=>{try{let[d,p]=await Promise.all([dL(r,u,t),Ki({market:n,collection:r,tokenId:u},t)]),m=ax(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?pL(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:X,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 sx(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Wb(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 cx(e={}){return{maxMarkets:Wb(e,"maxMarkets",gr),maxItemsPerMarket:Wb(e,"maxItemsPerMarket",gr)}}function lx(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Gi(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function ux(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 dx(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=cx(e),o=await so(e,t),i=lx(o,e,n),a=t.scanCollection||bc,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await ot(i,s,async l=>{let u=sx(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await a(d,t);return{...l,status:"ok",scan:p,...Gi(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Gi(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:X,marketCount:i.length,...ux(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 px(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=cx(e),o=await so(e,t),i=o.snapshotCoverage?.complete===!0,a=lx(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Dp,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await ot(a,l,async d=>{let p=sx(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Gi(d,null)};try{let f={...e,...p,market:d.market,collection:d.collection,slug:m,includeAll:p.includeAll??!p.raritySource};r!=null&&(f.maxItems=r);let h=await c(f,t),g=Gi(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),...Gi(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:X,marketCount:a.length,...ux(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 Gb(e,t){return e>t?"ARB":"PASS"}async function mL(e={},t={}){let n=String(e.direction||""),r=ht(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=K(e.paymentToken,"Anvil payment token"),i={chainId:X,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:Lt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Hb)({chainId:X,tokenIn:ft,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:ft,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||Tu)({...i,tokenIn:ft,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:ft,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||qb)({chainId:X,tokenIn:o,tokenOut:ft,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:ft,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||Sn)({...i,tokenIn:o,tokenOut:ft,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:ft,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 Kb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=K(e.quoteToken,"conversion quote token");if(n!==ft)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=ht(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=ht(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function fL(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 io(e){return Array.isArray(e)?`[${e.map(io).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${io(e[t])}`).join(",")}}`:JSON.stringify(e)}function mx(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:eL("sha256",n).update(io(r)).digest("hex")}}function hL(e,t){return mx(e,t)}function Up(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=hL(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!Jb(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 gL(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:fL(e,t)}function $p(e,t,n,r,o,i){let a=gL(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==X)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=mx(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!Jb(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&&K(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=ht(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=pn(a.gasLimit,`${r} evidence gasLimit`),g=pn(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let b=a.simulation;if(!b||typeof b!="object"||Array.isArray(b))throw new Error(`${r} simulation evidence is required`);if(Number(b.chainId)!==X)throw new Error(`${r} simulation chainId mismatch`);if(String(b.route||"")!==t||String(b.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(b.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(b.blockHash||"").toLowerCase()!==o.blockHash||String(b.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(b.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(K(b.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=K(b.sender,`${r} simulation sender`),y=K(b.owner,`${r} simulation owner`);if(!o.owner||w!==o.owner||y!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(ht(b.valueWei,`${r} simulation valueWei`))!==String(ht(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(b.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&K(b.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(b.success!==!0||b.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(b.result??"")))throw new Error(`${r} simulation did not return a successful result`);let k=Number(b.quotedAtMs),v=Number(b.expiresAtMs);if(!Number.isFinite(k)||!Number.isFinite(v)||k>n||v<=n||v<=k)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 Yb(e){let t=K(e,"OpenSea payment token");if(t!==Fp&&t!==ft)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Dp(e={},t={}){let n=await bc(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=K(e.owner,"execution owner")}catch{}let a=(b,S,w,y={})=>({calldataHash:b==null?null:String(b).toLowerCase(),blockNumber:String(S?.blockNumber??""),blockHash:String(S?.blockHash||"").toLowerCase(),leg:w,owner:i,...y}),s=(b,S,w,y,k)=>$p(e.gasEvidence??e.gasCostEvidence,b,r,`${S} gas`,a(w,y,S,k),o),c=(b,S)=>{let w=null;try{w=K(b?.target,"conversion target")}catch{}let y=a(b?.calldataHash,b,"conversion",{target:w,valueWei:String(b?.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 k=$p(e.conversionGasEvidence??e.conversionGasCostEvidence,S,r,"conversion gas",y,o);if(k.amount!=null||b?.gasEstimate==null)return k;let v=$p(e.gasPriceEvidence,S,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(v.amount==null)return{amount:null,evidence:null,error:v.error};let x=ht(b.gasEstimate,"conversion gasEstimate");return{amount:x*v.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:S,leg:"conversion",gasEstimate:x.toString(),gasPriceEvidence:v.evidence},error:null}},l=(b,S,w,y,k)=>{try{let v=String(S?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(v))throw new Error("exact Seaport order hash is required");let x=K(S?.protocolAddress,"Seaport protocol address"),E=String(S?.executionCalldataHash||"").toLowerCase(),_=/^0x[0-9a-f]{64}$/.test(E)?E:null,P=y==="seaport-fulfillment"&&k===Fp?String(S?.priceWei??""):"0",N={orderHash:v,protocolAddress:x,target:x,valueWei:P},I=s(b,y,_,w,N);if(I.amount==null)throw new Error(I.error);if(I.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let L=I.evidence?.approvalRequired;if(typeof L!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof S?.approvalRequired=="boolean"&&S.approvalRequired!==L)throw new Error("Seaport approval requirement evidence mismatch");let F=[I];if(L){let D=String(S?.approvalCalldataHash||"").toLowerCase(),R=/^0x[0-9a-f]{64}$/.test(D)?D:null,U=y==="seaport-offer-acceptance"?n.collection:k;F.push(s(b,"seaport-approval",R,w,{...N,target:U,valueWei:"0"}))}if(k===Fp){let D=b==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",R=String(S?.prerequisiteCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(R)?R:null,Q=D==="wrap-native-to-weth"?String(S?.sellerNetWei??""):"0";F.push(s(b,D,U,w,{...N,target:ft,valueWei:Q}))}let O=F.find(D=>D.amount==null);if(O)throw new Error(O.error);return{amount:F.reduce((D,R)=>D+R.amount,0n),evidence:F.map(D=>D.evidence),error:null}}catch(v){return{amount:null,evidence:null,error:String(v.message||v)}}},u=ht(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||ds,p=t.openSeaBestOffer||ps,m=t.paymentTokenConversion||(b=>mL({...b,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await wc({market:n.market,collection:n.collection},t),h=[];for(let b of n.candidates){let S=null;try{S=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId},t)}catch{}let w=b.quote,y=Bp(Ge.encodeFunctionData("buySpecificNFT",[BigInt(b.tokenId),BigInt(w.totalCostRaw)])).toLowerCase(),k=s("anvil-to-opensea","anvil-call",y,w.evidence.attestation,{target:n.market,valueWei:w.nativeSwapFeeWei}),v=null,x=null;if(S)try{v=Yb(S.paymentToken)}catch(R){x=String(R.message||R)}let E=x||!S?{amount:null,evidence:null,error:x||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",S,w.evidence.attestation,"seaport-offer-acceptance",v),_={route:"anvil-to-opensea",tokenId:b.tokenId,stars:b.stars,paymentToken:w.paymentToken,amountUnits:w.amountUnits,anvilTotalCostRaw:w.totalCostRaw,anvilBaseCostRaw:w.baseCostRaw,anvilFeeRaw:w.fees.totalFeeRaw,paymentTokenDecimals:w.paymentTokenDecimals,nativeSwapFeeWei:w.nativeSwapFeeWei,openSeaGrossOfferWei:S?.grossOfferWei==null?null:String(S.grossOfferWei),openSeaSellingValueWei:S?.sellerNetWei==null?null:String(S.sellerNetWei),openSeaFeeWei:S?.feeWei==null?null:String(S.feeWei),openSeaPaymentToken:v,gasCostWei:k.amount==null?null:k.amount.toString(),gasEvidence:k.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(S?.sellerNetWei==null||!w.available)h.push({..._,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(x)h.push({..._,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${x}`});else if(k.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${k.error}`});else if(E.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${E.error}`});else if(typeof m!="function")h.push({..._,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let R=Kb(await m({chainId:X,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:ft}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),U=c(R,"anvil-to-opensea");if(U.amount==null)h.push({..._,conversion:R,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${U.error}`});else{let Q=k.amount+E.amount+U.amount,Y=BigInt(S.sellerNetWei)-BigInt(R.amountInWei)-BigInt(w.nativeSwapFeeWei)-Q;h.push({..._,conversionGasCostWei:U.amount.toString(),conversionGasEvidence:U.evidence,totalExecutionGasWei:Q.toString(),anvilCostInWethWei:R.amountInWei,conversion:R,netWei:Y.toString(),decision:Gb(Y,u),reason:Y>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(R){h.push({..._,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(R.message||R)}`})}let P=null;try{P=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!P)continue;let N=Bp(Ge.encodeFunctionData("sellNFT",[BigInt(b.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),I=s("opensea-to-anvil","anvil-call",N,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),L=null,F=null;try{L=Yb(P.paymentToken)}catch(R){F=String(R.message||R)}let O=F?{amount:null,evidence:null,error:F}:l("opensea-to-anvil",P,f.evidence.attestation,"seaport-fulfillment",L),D={route:"opensea-to-anvil",tokenId:b.tokenId,stars:b.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(P.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:L,gasCostWei:I.amount==null?null:I.amount.toString(),gasEvidence:I.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(F){h.push({...D,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${F}`});continue}if(I.amount==null){h.push({...D,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${I.error}`});continue}if(O.amount==null){h.push({...D,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({...D,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let R=Kb(await m({chainId:X,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:ft}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),U=c(R,"opensea-to-anvil");if(U.amount==null)h.push({...D,conversion:R,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${U.error}`});else{let Q=I.amount+O.amount+U.amount,Y=BigInt(R.amountOutWei)-BigInt(P.priceWei)-BigInt(f.nativeSwapFeeWei)-Q;h.push({...D,conversionGasCostWei:U.amount.toString(),conversionGasEvidence:U.evidence,totalExecutionGasWei:Q.toString(),anvilPayoutInWethWei:R.amountOutWei,conversion:R,netWei:Y.toString(),decision:Gb(Y,u),reason:Y>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(R){h.push({...D,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(R.message||R)}`})}}let g=n.complete===!0?h:h.map(b=>b.decision==="ARB"?{...b,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:b);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:X,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((b,S)=>{let w=BigInt(b.netWei??"-1"),y=BigInt(S.netWei??"-1");return y>w?1:y<w?-1:0}),arbCount:g.filter(b=>b.decision==="ARB").length,exec:!1,readOnly:!0}}async function xc(e={},t={}){let n=Lt(t),r=mn(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([se(n,kt.ammVault,zb,"quoteSpecificBuy",[BigInt(r)]),se(n,kt.ammVault,zb,"inventory",[BigInt(r)]),se(n,kt.nft,vt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:K(a[0],"broker owner")===kt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:X,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 fx(e,t){try{return K((await se(t,kt.nft,vt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return K((await se(t,kt.nft,vt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function hx(e={},t={}){let n=Lt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await ot(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=mn(a.brokerTokenId,"brokerTokenId"),c=mn(a.nestedTokenId,"nestedTokenId"),l=K(a.tba,"TBA"),u=K(a.nestedCollection,"nested collection"),d=ax({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([fx(s,n),se(n,u,vt,"ownerOf",[BigInt(c)]).then(g=>K(g[0],"nested owner")),xc({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:X,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function gx(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=mn(e.brokerTokenId,"brokerTokenId"),o=ht(e.maxTokenCostWei,"maxTokenCostWei"),i=ht(e.maxEthFeeWei,"maxEthFeeWei"),a=await xc({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 $({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:X,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:kt.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 Yi(e={},t={}){let n=Lt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?kt.overtimeBooster:kt.stockBooster,[i,a,s,c,l,u]=await Promise.all([se(n,o,Mn,"pendingEth"),se(n,o,Mn,"minDropWei"),se(n,o,Mn,"roundActive"),se(n,o,Mn,"currentRound"),se(n,o,Mn,"roundState").catch(()=>null),se(n,o,Mn,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:X,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=>K(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function yx(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?kt.overtimeBooster:kt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Mn.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Mn.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return $({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:X,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:X,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function wx(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>mn(s,"brokerTokenId")):[],r=Lt(t),o=await ot(n,8,async s=>{let[c,l]=await Promise.all([se(r,kt.nft,vt,"ownerOf",[BigInt(s)]).then(u=>K(u[0],"broker owner")),fx(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Yi({which:"stock"},t),Yi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:X,owner:e.owner?K(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function bx(e={},t={}){try{let n=await so(e,t);return{ok:!0,chainId:X,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function xx(e={},t={}){try{let n=await Yi({which:"stock"},t);return{ok:!0,chainId:X,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180)}}}ne();import{createHash as wL}from"node:crypto";var Sc="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",bL=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"}]),yr=Object.freeze(Object.fromEntries(bL.map(e=>[e.name,e.selector]))),xL=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),SL=new Set(["name","endpoint","version","skills","domains"]),kL=new Set(["agentId","agentRegistry"]),Sx=new Set(["reputation","crypto-economic","tee-attestation"]),vL=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,EL=64*1024;function Ji(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 qp(e,t,n){for(let r of Object.keys(e)){if(vL.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 co(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 kx(e,t,{service:n=!1}={}){let r=co(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 Hp(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 kc(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function jp(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 zp(e){let t=kc(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Hp(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Ex(){let e=[];try{let t=kc(process.env.ORACLE_ERC8004_CHAIN_ID);zp(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 AL(e){return JSON.parse(JSON.stringify(e))}function vc(e){let t=Ji(e,"registration file");if(qp(t,xL,"registration"),t.type!==Sc)throw new Error("erc8004: registration-v1 type required");let n={type:Sc,name:co(t.name,"name",128),description:co(t.description,"description",4096),image:kx(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=Ji(a,`services[${s}]`);qp(c,SL,`services[${s}]`);let l=co(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:kx(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=co(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=Ji(a,`registrations[${s}]`);qp(c,kL,`registrations[${s}]`);let l=jp(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>Sx.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!Sx.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>EL)throw new Error("erc8004: registration metadata oversized");return AL(n)}function IL(e){if(Ji(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Sc)throw new Error("erc8004: registration-v1 type required");return vc({type:Sc,...e})}function _L(e){let t=vc(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Xi(e){return BigInt(e).toString(16).padStart(64,"0")}function Ax(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Xi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function PL(e){return`${yr.register}${Xi(32)}${Ax(e)}`}function TL(e,t){return`${yr.setAgentURI}${Xi(e)}${Xi(64)}${Ax(t)}`}function NL(e,t){return`${e}${Xi(t)}`}function CL(e){return wL("sha256").update(e,"utf8").digest("hex")}function Vp(e,t){Ji(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 Ix(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=kc(e.chainId),c=Hp(e.owner,"owner"),l=zp(s),u=Number(t?.nowMs??Date.now());return $({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:CL(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 _x(e={},t={}){Vp(e,new Set(["chainId","owner","registration"]));let n=_L(IL(e.registration));return Ix(e,t,{kind:"erc8004-register",uri:n,selector:yr.register,data:PL(n)})}function Px(e={},t={}){Vp(e,new Set(["chainId","owner","agentId","agentURI"]));let n=jp(e.agentId),r=Tx(e.agentURI);return Ix(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:yr.setAgentURI,data:TL(n,r),id:n})}function Tx(e){let t=co(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 vc(o),t}function vx(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 Hp(`0x${e.slice(-40)}`,t)}function OL(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 Nx(e={},t={}){Vp(e,new Set(["chainId","agentId"]));let n=kc(e.chainId),r=jp(e.agentId),o=zp(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:NL(d,r)},"latest"]),[a,s,c]=await Promise.all([i(yr.ownerOf),i(yr.tokenURI),i(yr.getAgentWallet)]),l=Tx(OL(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=vc(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:vx(a,"owner"),tokenURI:l,agentURI:l,agentWallet:vx(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}Fr();_e();var Cx=999;async function Ox(e={}){let t={chainId:Cx,rpc:null,dex:null};try{t.rpc=await Mr(Cx,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Qo("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 Rx(e="HYPE",t={}){let r=(await Qo(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 Lx(e,t={}){return rr(e,t)}j();kn();ne();var $L="https://api-mainnet.magiceden.dev/v2",Qi=1e9;function $x(e={}){return dt({provider:"magiceden",defaultUrl:$L,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function uo(e={}){return $x(e).baseUrl}function wr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function po(e={}){let t=wr(e);return at({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},$x(e).trusted)}function Wp(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 lo(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 BL(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 ML(e){return Math.round(lo(e,"priceSol")*Qi)}function FL(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 UL({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function DL(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=UL(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Bx(e={}){try{let t=await Gp({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!wr(e),readTier:"keyless",prepareTier:wr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!wr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Gp(e={},t={}){let n=Wp(e.symbol||e.collection),r=await A(`${uo(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:po(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/Qi:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Qi:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Qi:null,exec:!1,raw:r}}function Mx(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*Qi):null,tokenSize:e.tokenSize??1}}async function Fx(e={},t={}){let n=Wp(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(`${uo(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 A(i.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Mx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Ux(e={},t={}){let n=ve(e.tokenMint||e.mint,"tokenMint"),r=await A(`${uo(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Mx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Dx(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=ve(e.buyer||e.userPublicKey,"buyer"),r=ve(e.seller,"seller"),o=ve(e.tokenMint,"tokenMint"),i=ve(e.tokenATA||e.tokenAddress,"tokenATA"),a=ve(e.auctionHouse,"auctionHouse"),s=lo(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:lo(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${uo(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 A(l.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});an("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 $({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:ML(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ec(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=ve(e.seller||e.userPublicKey,"seller"),r=ve(e.tokenMint,"tokenMint"),o=ve(e.tokenATA||e.tokenAddress,"tokenATA"),i=ve(e.auctionHouse,"auctionHouse"),a=lo(e.priceSol??e.price,"priceSol"),s=FL(e.expiry),c=DL(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${uo(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",ve(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await A(l.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});an("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 $({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 qx(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=ve(e.buyer||e.userPublicKey,"buyer"),r=Wp(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=lo(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:lo(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${uo(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await A(a.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=BL(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`);an("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 $({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})}ne();pd();j();mt();var mo=8,Kp=10n**BigInt(mo),HL="0xa4b1",Hx=7,Yp=1,jL=2n**64n-1n;function zL(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 ea(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function ho(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 Zi(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>mo)throw new Error(`hl-staking: ${t} has more than ${mo} decimals`);let i=BigInt(r)*Kp+BigInt((o+"0".repeat(mo)).slice(0,mo)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>jL)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function fo(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function fn(e){let t=BigInt(String(e||"0")),n=t/Kp,r=(t%Kp).toString().padStart(mo,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function jx(e={}){try{let t=await Jp(e);return{ok:t.count>0,provider:"hl-staking",chain:ea(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 Jp(e={}){let t=await be({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 Xp(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({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 Qp(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({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 zx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Vx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Zp(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 Ac(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||HL)}function VL(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ac(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function em({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:ea(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:zL(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:VL(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=Ns(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,$(l,{provider:"hl-staking",kind:e})}function Wx(e={},t={}){let n=Zi(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Zi(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${fn(n)} HYPE exceeds maxHype cap ${fn(r)} HYPE`);let o=Zp(e),i=ea(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ac(t),wei:fo(n),nonce:o};return em({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:fo(n),nonce:o},opts:t,args:e,caps:{amountHype:fn(n),maxHype:r?fn(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 Gx(e={},t={}){let n=Zi(e.amountHype??e.amount,"amountHype"),r=Zp(e),o=ea(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ac(t),wei:fo(n),nonce:r};return em({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:fo(n),nonce:r},opts:t,args:e,caps:{amountHype:fn(n)},notes:[`Starts the ${Hx} 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 Kx(e={},t={}){let n=ho(e.validator,"validator"),r=Zi(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:Zi(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${fn(r)} HYPE exceeds maxHype cap ${fn(s)} HYPE`);let c=Zp(e),l=ea(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ac(t),validator:n,wei:fo(r),isUndelegate:a,nonce:c};return em({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:fo(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:fn(r),maxHype:s?fn(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Yp} 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 ${Yp} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Yx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await Xp({user:n},t),o=await Qp({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Hx,validatorLockupDays:Yp,exec:!1}}mt();async function tm(e={}){let t=Date.now();try{let n=await tn(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 GL=24*365,KL=8;function Ke(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function YL(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Ic(e={},t={}){let[n,r]=await Promise.all([bt(t),tn(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=Ke(u.markPx),p=Ke(u.prevDayPx),m=Ke(u.openInterest),f=Ke(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ke(u.oraclePx),midPx:Ke(u.midPx)??Ke(r?.[c.name]),prevDayPx:p,change24hPct:YL(d,p),dayNtlVolumeUsd:Ke(u.dayNtlVlm),premium:Ke(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(GL/KL)*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 Jx(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Ic(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 Xx(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([Ic({},t),Vr({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),zr(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:Ke(h.o),high:Ke(h.h),low:Ke(h.l),close:Ke(h.c),volume:Ke(h.v)})),p=l?.levels??[],m=Ke(p?.[0]?.[0]?.px),f=Ke(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 Qx(e={},t={}){let n=await vs(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 f$,readFileSync as h$,readdirSync as g$,renameSync as y$,writeFileSync as w$}from"node:fs";import{homedir as b$}from"node:os";import{join as Nc}from"node:path";var ta=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});j();_e();ne();import{Interface as nm,getAddress as iS,isAddress as XL}from"ethers";var Zx=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),eS=Object.freeze({42161:{name:"arbitrum",api:Zx[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Zx[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),tS="0x0000000000000000000000000000000000000000",QL=`0x${"0".repeat(64)}`,nS=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),rS=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),_c=new nm(["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"]),aS=new nm(["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)"]),ZL=new nm(["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)"]),e$=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function yo(e){let t=Number(e??42161),n=eS[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(eS).join(", ")})`);return{chainId:t,...n}}function Pc(e,t={}){let n=yo(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function Et(e,t){if(!XL(e))throw new Error(`${t} must be a valid EVM address`);return iS(e)}function le(e){return iS(e).toLowerCase()}function go(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 br(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 t$(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 n$(e){let t=String(e||"marketIncrease").trim();if(!(t in nS))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:nS[t]}}function r$(e){let t=String(e||"noSwap").trim();if(!(t in rS))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:rS[t]}}function o$(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function i$(e,t){let n=le(t);return e.find(r=>le(r.marketToken||r.market||r.address)===n)||null}function a$(e,t){let n=le(t);return e.find(r=>le(r.tokenAddress||r.address)===n)||null}function s$({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=go(e?.minPrice,"gmx minPrice"),i=go(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 c$(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function l$(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Vt(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 u$(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:Vt(t,"account",a=>le(a)),market:Vt(t,"market",a=>le(a)),initialCollateralToken:Vt(t,"initialCollateralToken",a=>le(a)),key:Vt(o,"key",a=>String(a).toLowerCase()),reason:Vt(i,"reason",a=>String(a)),sizeDeltaUsd:Vt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:Vt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:Vt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:Vt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:Vt(r,"isLong",a=>!!a)}}function d$(e={},t){if(le(e.address)!==le(t.eventEmitter))return null;let n;try{n=ZL.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=e$[r];if(!o)return null;let i=u$(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||l$(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?le(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 oS(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function p$(e=[],{chainId:t}={}){let n=yo(t);return(Array.isArray(e)?e:[]).map(r=>d$(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function sS(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rm(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function cS(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function wo(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function lS(e={}){let t=await wo({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function uS(e={},t={}){let n=yo(e.chainId??42161),r=Et(e.account||e.owner||e.user,"gmx account"),o=br(e.start??0,"gmx start"),i=br(e.end??e.limit??20,"gmx end"),a=aS.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),account:le(r),raw:c}}async function dS(e={},t={}){let n=yo(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=aS.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),key:r,raw:a}}async function pS(e={},t={}){let n=yo(e.chainId??42161),r=t.receipt||await Xo({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=p$(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)=>oS(d.status)>=oS(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?le(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:le(n.eventEmitter),events:s,receipt:r}}async function mS(e={},t={}){let n=yo(e.chainId??42161),r=n$(e.orderType||e.type),o=r$(e.decreasePositionSwapType),i=Et(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=Et(e.receiver||i,"gmx receiver"),s=Et(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?Et(e.callbackContract,"gmx callbackContract"):tS,l=e.uiFeeReceiver?Et(e.uiFeeReceiver,"gmx uiFeeReceiver"):tS,u=Et(e.market||e.marketToken,"gmx market"),d=Et(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?go(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):br(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=go(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=go(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 b=t$(e.maxSlippageBps??e.slippageBps,50),S=e.isLong==null?!0:!!e.isLong,[w,y]=await Promise.all([rm({chainId:n.chainId},t),wo({chainId:n.chainId},t)]),k=i$(o$(w,"markets"),u);if(!k)throw new Error("gmx market not found in public registry");if(k.isListed===!1)throw new Error("gmx market is not listed");let v=Et(k.indexToken,"gmx market indexToken"),x=Et(k.longToken,"gmx market longToken"),E=Et(k.shortToken,"gmx market shortToken"),_=le(d);if(![le(x),le(E)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let P=c$(k,S);if(P>0n&&m>P)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let N=a$(y,v);if(!N)throw new Error("gmx index ticker not found");let I=e.acceptablePrice?go(e.acceptablePrice,"gmx acceptablePrice").toString():s$({ticker:N,isLong:S,typeKey:r.key,maxSlippageBps:b}),L=(e.swapPath||[]).map(we=>Et(we,"gmx swapPath market"));if(L.length>3)throw new Error("gmx swapPath too long for guarded slice");let F=br(e.triggerPrice??"0","gmx triggerPrice"),O=br(e.callbackGasLimit??"0","gmx callbackGasLimit"),D=br(e.minOutputAmount??"0","gmx minOutputAmount"),R=br(e.validFromTime??"0","gmx validFromTime"),U=!!e.shouldUnwrapNativeToken,Q=e.autoCancel==null?!0:!!e.autoCancel,Y=String(e.referralCode||QL);if(!/^0x[0-9a-fA-F]{64}$/.test(Y))throw new Error("gmx referralCode must be bytes32 hex");let Re=Array.isArray(e.dataList)?e.dataList:[];for(let we of Re)if(!/^0x[0-9a-fA-F]{64}$/.test(String(we)))throw new Error("gmx dataList entries must be bytes32 hex");let lt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:L},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:F,acceptablePrice:BigInt(I),executionFee:f,callbackGasLimit:O,minOutputAmount:D,validFromTime:R},orderType:r.code,decreasePositionSwapType:o.code,isLong:S,shouldUnwrapNativeToken:U,autoCancel:Q,referralCode:Y,dataList:Re},q=[];r.key==="marketIncrease"&&p>0n&&q.push(_c.encodeFunctionData("sendTokens",[d,n.orderVault,p])),q.push(_c.encodeFunctionData("sendWnt",[n.orderVault,f])),q.push(_c.encodeFunctionData("createOrder",[lt]));let H=_c.encodeFunctionData("multicall",[q]),te={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:le(i),receiver:le(a),exchangeRouter:le(n.exchangeRouter),router:le(n.router),orderVault:le(n.orderVault),market:le(u),indexToken:le(v),initialCollateralToken:le(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:I,maxSlippageBps:b,isLong:S,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return $({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:le(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:le(d),spender:le(n.router),amount:p.toString()}:null,gmxGuard:te,transaction:{chainId:n.chainId,from:le(i),to:le(n.exchangeRouter),data:H,value:f.toString(),gmxGuard:te}},{provider:"gmx",kind:"gmx-order"})}mt();var Fn="oracle.hl.entry-state.v1",x$=8,S$=24*365;function Se(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function bo(e){return e==null||e===0?0:e>0?1:-1}function na(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function k$(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Nc(b$(),".config","oracle")}function gS(e={}){return Nc(k$(e),"hl-entry-states")}function Tc(e,t,n){return n==null&&e.push(t),n}function v$(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 hn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function E$(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:Se(a.time),rate:Se(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return hn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)bo(o[a].rate)!==bo(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 A$(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return hn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=Se(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}:hn("defillama.stablecoins","no peggedUSD")}function fS(e,t){let n=Se(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 I$(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 hn("gmx.tickers","no matching symbol");let c=fS(s.minPrice,n),l=fS(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return hn("gmx.tickers","unreadable price");let d=n!=null&&n>0?na(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?hn("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 _$({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?hn("hl-info.fundingHistory","not fetched"):E$(r,{coin:e,asOfMs:n}),llamaStables:o==null?hn("defillama.stablecoins","not fetched"):A$(o,n),gmxTicker:i==null?hn("gmx.tickers","not fetched"):I$(i,{coin:e,hlMark:t,asOfMs:n})}}function hS(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=Se(s?.px),l=Se(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 P$(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=Se(i.szi),s=Se(i.positionValue)!=null&&a?Math.abs(Se(i.positionValue)/a):null,c=Se(i.entryPx),l=Se(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:Se(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function T$({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:Fn,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=v$(n,e);if(!d)return{schema:Fn,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Tc(u,"markPx",Se(m.markPx)),h=Tc(u,"oraclePx",Se(m.oraclePx)),g=Se(m.midPx),b=Se(m.premium),S=Tc(u,"fundingRate",Se(m.funding)),w=Tc(u,"openInterestCoin",Se(m.openInterest)),y=Se(m.dayNtlVlm),k=Array.isArray(m.impactPxs)?m.impactPxs:[],v=Se(k[0]),x=Se(k[1]),E=S==null?null:S*(S$/x$)*100,_=w==null||f==null?null:w*f,P=i==null||i===0||w==null?null:(w-i)/i*100;P==null&&u.push("oiDeltaPct");let N=r?.levels,I=Array.isArray(N)?N[0]:[],L=Array.isArray(N)?N[1]:[],F=Se(I?.[0]?.px),O=Se(L?.[0]?.px);F==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let D=hS(L,Number(t)||0,"buy"),R=hS(I,Number(t)||0,"sell");D.fillable||u.push("book.buyFillable"),R.fillable||u.push("book.sellFillable");let U=g??f,Q=D.avgFillPx==null||U==null?null:na(D.avgFillPx,U),Y=R.avgFillPx==null||U==null?null:na(U,R.avgFillPx),Re=P$(o,e);for(let te of Re.unknown||[])u.push(te);let lt=Se(m.prevDayPx),q=f==null||lt==null||lt===0?null:(f-lt)/lt*100;q==null&&u.push("change24hPct");let H=_$({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return H.fundingPath.unknown&&u.push("overlays.fundingPath"),H.llamaStables.unknown&&u.push("overlays.llamaStables"),H.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Fn,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:b,markOracleBps:na(f,h),fundingRate:S,fundingAprPct:E,openInterestCoin:w,openInterestUsd:_,oiDeltaPct:P,dayNtlVolumeUsd:y,change24hPct:q,impactBidPx:v,impactAskPx:x,maxLeverage:p.maxLeverage??null,book:{bidPx:F,askPx:O,spreadBps:F==null||O==null?null:na(O,F),notionalUsd:Number(t)||0,buy:D,sell:R,buySlipBps:Q,sellSlipBps:Y},position:Re,overlays:H,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function yS(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 N$(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 C$({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Fn||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=N$(n),a=yS(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Fn,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:ta.ALERT_ONLY},c=gS({...o,configDir:r||o.configDir});f$(c,{recursive:!0,mode:448});let l=Nc(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return w$(u,`${JSON.stringify(s,null,2)}
|
|
148
|
-
`,{mode:384}),y$(u,l),s}function om(e={}){let t=gS(e),n=[];try{n=g$(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(h$(Nc(t,r),"utf8")))}function O$(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:ta.ALERT_ONLY};let r=e.see,o=t;bo(r.fundingRate)!==bo(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),bo(r.premium)!==bo(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:Fn,id:e.id,coin:e.see.coin,side:e.side,actionMode:ta.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function wS(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await bt(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 ra(e={},t={}){let n=e.coin,r=Se(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([bt(t),n?zr(n,t).catch(()=>null):Promise.resolve(null),e.user?Wr(e.user,t).catch(()=>null):Promise.resolve(null),n?ks({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Ws({},t).catch(()=>null),wo({chainId:42161},t).catch(()=>null)]);return T$({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:Se(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function bS(e={},t={}){let n=e.see&&e.see.schema===Fn?e.see:await ra(e,t);return{see:n,...yS(n,e.side)}}async function xS(e={},t={}){let n=e.see&&e.see.schema===Fn?e.see:await ra(e,t);return C$({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function SS(e={},t={}){let n=e.locked||om(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:ta.ALERT_ONLY};let r=await ra({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return O$(n,r)}mt();Ts();Ls();async function kS(e={}){let t=await hi(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function vS(e={},t={}){let n=e.coin,r=e.outcome==null?null:An(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=AS(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=im(i)));let a=n==null?null:In(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 hi(t))?.outcomes||[]).find(f=>{try{return An(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=im(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=An(r,i).coin}if(a=In(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,Jr(c,t)}async function ES(e={},t={}){let n=e.coin,r=e.outcome==null?null:An(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=AS(e.outcomeSide):(o=e.side,o!=null&&(o=im(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=An(r,o).coin}let i=In(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,Ai(a,t)}function AS(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function im(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")}ne();Gr();var sz="0x"+"00".repeat(32);function $$(e){let t=typeof e=="bigint"?e:St(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 IS(e,t){let n=St(e.makerAmount,"poly: makerAmount"),r=St(e.takerAmount,"poly: takerAmount");return $$(t==="BUY"?n:r)}Gr();var B$=new Set(["https://clob.polymarket.com/order"]),oa=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),dz=Object.freeze(oa.map(e=>e[0])),M$=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),F$="0xe111180000d2663c0091e4f400237545b87b996b",U$="0xe2222d279d744050d28e00520010520000310f59",_S=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function PS(e){let t=String(e||"").replace(/\/$/,"");if(!B$.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function TS(e){let t=xt(e,"poly: exchange").toLowerCase();if(!M$.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function NS(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=_S(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(xt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(PS(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(TS(o.verifyingContract),TS(n.exchange),xt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==xt(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?U$:F$;if(xt(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!==oa.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let x=0;x<oa.length;x+=1)if(s[x]?.name!==oa[x][0]||s[x]?.type!==oa[x][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(xt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(xt(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=_S(n.tokenId,"tokenId",80);if(xt(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=St(a.makerAmount,"poly: makerAmount"),m=St(a.takerAmount,"poly: takerAmount"),f=St(n.makerAmount,"poly: prepared makerAmount"),h=St(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,b=d==="BUY"?m:p,S=Be(n.quantity,6,"poly: quantity");if(S<=0n||S!==b)throw new Error("poly: quantity must match CLOB v2 amounts");let w=Be(n.price,6,"poly: price");if(w<=0n||w>=1000000n)throw new Error("poly: price must be within (0,1)");if(b*w!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Be(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let k=IS(a,d);if(Be(k,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let v=t.maxNotionalUsd??t.maxNotionalUsdc;if(v!=null){let x=Be(v,6,"poly: maxNotionalUsd");if(g>x)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:k,submitTo:PS(n.submitTo)})}function D$(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 CS(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:D$({...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 NS(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as wz,randomInt as q$}from"node:crypto";import{keccak256 as xz,concat as Sz,zeroPadValue as kz,getCreate2Address as vz,AbiCoder as Ez}from"ethers";var BS=137;var H$="0xE111180000d2663C0091e4f400237545B87B996B",j$="0xe2222d279d744050d28e00520010520000310F59",OS="0x0000000000000000000000000000000000000000000000000000000000000000",am=6;var z$={name:"Polymarket CTF Exchange",version:"2",chainId:BS},V$={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"}]},RS={"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 Cc(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Oc(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function LS(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function MS(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function W$(e,t,n,r){let o=MS(Number(n),r.price);if(e==="BUY"){let c=Oc(Number(t),r.size),l=c*o;return Cc(l)>r.amount&&(l=LS(l,r.amount+4),Cc(l)>r.amount&&(l=Oc(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=Oc(Number(t),r.size),s=a*o;return Cc(s)>r.amount&&(s=LS(s,r.amount+4),Cc(s)>r.amount&&(s=Oc(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function $S(e){let t=Number(e).toFixed(am),[n,r=""]=t.split(".");return(n+r.padEnd(am,"0").slice(0,am)).replace(/^0+/,"")||"0"}function G$(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=OS,builder:p=OS}=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=RS[String(c)]||RS["0.01"],g=MS(m,h.price),{rawMakerAmt:b,rawTakerAmt:S}=W$(n,f,g,h),w=$S(b),y=$S(S),k=String(q$(1,2**31-1)),v=Date.now().toString(),x=n==="BUY"?0:1,E=s?j$:H$,_={salt:k,maker:i,signer:a,tokenId:String(t),makerAmount:w,takerAmount:y,side:x,signatureType:u,timestamp:v,metadata:d,builder:p},P={...z$,verifyingContract:E},N=n==="BUY"?b:S;return{domain:P,types:V$,value:_,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?S:b),notionalUsdc:N,exchange:E,negRisk:s}}function FS(){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 US(e={},t={}){let n=G$(e),r={provider:"poly-clob",kind:"poly-order",chainId:BS,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=CS(r,e,t)}catch{r.oraclePrepared=!1}return $(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as nB,keccak256 as QS}from"ethers";ne();qc();Mc();var rB=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function oB(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=un(e);for(let o of Object.keys(n))if(!rB.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 ZS(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=WS(n,o),a=XS(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 nB(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}:{...oB(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return $({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:QS(s),authorityReport:GS(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:QS(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:Uc},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"})}qc();pm();Ls();j();var gB="https://api.geckoterminal.com/api/v2",zc=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||gB).replace(/\/$/,""),So=e=>encodeURIComponent(String(e));async function mm(e={},t={}){let n=Math.max(1,Number(e.page||1));return A(`${zc(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sk(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return A(`${zc(t)}/networks/${So(e.network)}/pools/${So(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ck(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return A(`${zc(t)}/networks/${So(e.network)}/tokens/${So(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function lk(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)),A(`${zc(t)}/networks/${So(e.network)}/pools/${So(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function uk(e={}){let t=await mm({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}j();_e();Ye();ne();import{Interface as fk,getAddress as hk,isAddress as wB}from"ethers";var bB="https://api.curve.finance/v1",gk=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||bB).replace(/\/$/,""),xB=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),yk="0x0000000000000000000000000000000000000000",fm=new fk(["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)"]),dk=new fk(["function coins(uint256) view returns (address)"]);function wk(e){let t=xB[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function pa(e,t){if(!wB(e))throw new Error(`${t} must be a valid EVM address`);return hk(e)}function SB(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 pk(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 bk(e,t,n){return[e,t,n,...Array(8).fill(yk)]}function xk(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Sk(e){return[e,...Array(4).fill(yk)]}async function kB({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=dk.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=dk.decodeFunctionResult("coins",c);i.push(hk(l[0]))}return i}function mk(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 kk(e={}){return A(`${gk(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function hm(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 A(`${gk(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function vk(e={}){let t=await hm({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function gm(e={},t={}){let n=Number(e.chainId??8453),r=wk(n),o=pa(e.pool,"curve pool"),i=pa(e.tokenIn,"curve tokenIn"),a=pa(e.tokenOut,"curve tokenOut"),s=SB(e.amountIn,"curve amountIn"),c=pk(e.nCoins??2,"curve nCoins",2,8),l=pk(e.poolType,"curve poolType",1,4),u=t.rpcCall||V,d=await kB({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=mk(d,i,"tokenIn"),m=mk(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=bk(i,o,a),h=xk(p,m,l,c),g=Sk(o),b=fm.encodeFunctionData("get_dy",[f,h,s,g]),S=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),w=fm.decodeFunctionResult("get_dy",S),y=BigInt(w[0]);if(y<=0n)throw new Error("curve quote returned zero output");return pe({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(k=>k.map(v=>v.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ek(e={},t={}){let n=Number(e.chainId??8453),r=wk(n),o=pa(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=pa(e.receiver||e.recipient||o,"curve receiver"),a=await gm({...e,sender:o},t),s=bk(a.tokenIn,a.pool,a.tokenOut),c=xk(a.i,a.j,a.poolType,a.nCoins),l=Sk(a.pool),u=fm.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return $({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:Pe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}j();_e();ne();import{Interface as EB,getAddress as AB,isAddress as IB,keccak256 as Ak,toUtf8Bytes as Ik}from"ethers";var _B="https://api.morpho.org/graphql",Vc=new EB(["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)"]),PB=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||_B;async function wm(e,t,n={}){return A(PB(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var TB="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 } } } }",NB="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 ma(e,t){let n=String(e||"").trim();if(!IB(n))throw new Error(`morpho: ${t} must be an address`);return AB(n).toLowerCase()}function CB(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 ym(e){return Array.isArray(e)?`[${e.map(ym).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ym(e[t])}`).join(",")}}`:JSON.stringify(e)}async function fa(e,t,n,r,o={}){let i=Vc.encodeFunctionData(n,r),s=await(o.rpcCall||V)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Vc.decodeFunctionResult(n,s)}function OB(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function _k(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return wm(TB,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function bm(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return wm(NB,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Pk(e={}){return{ok:(await wm("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Tk(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=ma(e.vault||e.vaultAddress,"vault"),i=ma(e.owner||e.from||e.sender,"owner"),a=ma(e.receiver||i,"receiver"),s=CB(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await bm({chainId:n,first:100},t),u=OB(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 fa(n,o,"asset",[],t),m=ma(p,"vault asset");if((u?.asset?.address?ma(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[S]=await fa(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[w]=await fa(n,o,"previewDeposit",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:w.toString()},h=Vc.encodeFunctionData("deposit",[s,a])}else{let[S]=await fa(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[w]=await fa(n,o,"previewWithdraw",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:w.toString()},h=Vc.encodeFunctionData("withdraw",[s,a,i])}let b={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:Ak(Ik(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=Ak(Ik(ym(b))),$({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:b,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:b}},{provider:"morpho",kind:"erc4626-vault"})}j();_e();Ye();ne();import{Interface as LB,getAddress as xm,isAddress as $B}from"ethers";var BB="https://api-v3.balancer.fi/",MB=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||BB;async function Ok(e,t,n={}){return A(MB(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var FB="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Nk=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"}}),UB="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",DB="0x0000000000000000000000000000000000000000",Sm=new LB(["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 Rk(e){let t=Number(e??8453),n=Nk[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Nk).join(", ")})`);return{chainId:t,...n}}function Lk(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===DB||t===UB.toLowerCase()}function Wc(e,t){if(!$B(e))throw new Error(`${t} must be a valid EVM address`);return xm(e)}function Ck(e,t,n){let r=String(e||"");return Lk(r)||/^weth$/i.test(r)?xm(t.weth):/^usdc$/i.test(r)?xm(t.usdc):Wc(r,n)}function qB(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 $k(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 Bk(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 Ok(FB,{first:n,chains:r,where:{chainIn:r}},t)}async function Mk(e={}){return{ok:(await Ok("query { __typename }",{},e))?.data?.__typename==="Query"}}async function km(e={},t={}){let n=Rk(e.chainId),r=Wc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Ck(o,n,"balancer tokenIn"),a=Ck(e.tokenOut||"USDC",n,"balancer tokenOut"),s=qB(e.amountIn,"balancer amountIn"),c=Wc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Sm.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,$k(e.userData)]),d=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Sm.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return pe({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 Fk(e={},t={}){let n=Rk(e.chainId),r=Wc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Lk(o),a=await km({...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=Sm.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,$k(e.userData)]);return $({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:Pe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}j();Ye();ne();import{getAddress as jB}from"ethers";var zB="https://api-v2.pendle.finance/core",VB=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),WB="0x0000000000000000000000000000000000000000",GB="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Uk=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||zB).replace(/\/$/,"");function Gc(e,t){try{return jB(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function ko(e,t){return Gc(e,t).toLowerCase()}function KB(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===GB||t===WB}function vm(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 YB(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Gc(t.token,`pendle input ${n} token`),amount:vm(t.amount,`pendle input ${n} amount`)}))}function JB(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Gc(t,`pendle output ${n} token`))}function XB(e){let t=VB[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function QB(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 vm(t,"pendle output amount")}function ZB(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!KB(r.token)).map(r=>({token:ko(r.token,"pendle approval token"),spender:ko(t,"pendle approval spender"),amount:vm(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Em(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)),A(`${Uk(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Dk(e={}){let t=await Em({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Am(e={},t={}){let n=Number(e.chainId??42161),r=XB(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Gc(e.receiver||o,"pendle receiver"),a=YB(e.inputs),s=JB(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=it({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 A(`${Uk(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(ko(p.to,"pendle tx target")!==ko(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&ko(p.from,"pendle tx sender")!==ko(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=QB(u),f=pe(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return $({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:ZB(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:Pe(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function qk(e={},t={}){let n=await Am(e,t),{transaction:r,...o}=n;return o}j();Ye();ne();import{isAddress as tM}from"ethers";var nM="https://api.odos.xyz",Im=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||nM).replace(/\/$/,"");async function _m(e={}){return A(`${Im(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function rM(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(!tM(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Hk(e={},t={}){let n=rM(e),r=it({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 A(`${Im(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 jk(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Hk(e,t);return{...pe(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 zk(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Hk(e,t),i=await A(`${Im(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=pe(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 $({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:Pe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function Vk(e={}){let t=await _m(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}j();var Wk=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,iM=/[<>&`*_~[\]()|\\]/g,aM=/[\u0000-\u001F\u007F]/g;function Pm(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Wk,"").replace(aM,"").replace(iM,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Tm(e){if(e==null)return!1;let t=String(e);return Wk.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Gk=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 Kc(e,t={}){let n=Number(e),r=t.baseUrl||Gk[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Kk(e){return!!Gk[Number(e)]}async function Nm(e={},t={}){return A(`${Kc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Yk(e={},t={}){if(!e.address)throw new Error("address required");return A(`${Kc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Jk(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return A(`${Kc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Xk(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Kc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await A(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function Qk(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=Pm(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Pm(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:Tm(o.symbol)||Tm(o.name)||void 0})}return n}async function Zk(e={}){let t=await Nm({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as cM}from"ethers";j();_e();mt();var lM="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",tv=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 Un(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function Yc(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function ev(e){if(!e)return null;try{return cM(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function kr(e={},t=process.env){let n=e.addresses||{},r=ev(n.evm||e.evmAddress||Yc(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||Yc(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||Yc(t,"ORACLE_BITCOIN_ADDRESS"),a=ev(n.hyperliquid||e.hyperliquidAddress||Yc(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?ve(o,"portfolio Solana address"):null,bitcoin:i?Ct(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function ha(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 vo(e){let t=Number(e);return Number.isFinite(t)?t:null}function Jc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Dn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function nv(e,t){let n=tv[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 uM(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:ha(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 Cm(e,t){return{family:e,status:"unsupported",reason:t}}function Om(e,t){if(!e||e.status!=="ok")return e;let n=nv(t,e.symbol),r=vo(e.amount),o=r!=null&&n.priceUsd!=null?Jc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function rv(e={}){let t=kr({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Xc(e={},t={}){let n=new Date().toISOString(),r=kr(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(jr.map(q=>[q.chainId,q])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(tv))],u=o?$e(()=>Ot(l,Un(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=ot(c,e.concurrency||5,async q=>{let H=s.get(q);if(!H)return{family:"evm",chainId:q,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:q,name:H.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let te={...Un(t,"evm"),rpcUrl:e.rpcUrls?.[q]||t.evm?.rpcUrls?.[q]},we=await $e(()=>nr(q,r.evm,te));if(!we.ok)return{family:"evm",chainId:q,name:H.name,address:r.evm,status:"unavailable",latencyMs:we.ms,error:we.error};let qe=H.nativeCurrency?.decimals??18,We=H.nativeCurrency?.symbol||"NATIVE",Z=we.data.balanceWei,Ee={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Kk(q)){let Pt=await $e(()=>Xk({chainId:q,address:r.evm},{...Un(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Pt.ok?Ee={status:"ok",assets:Qk(Pt.data,{fungibleOnly:!0}).map(Xt=>{let er=ha(Xt.amountRaw,Xt.decimals);return{...Xt,amount:er,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Pt.ms}:Ee={status:"unavailable",assets:[],reason:Pt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Pt.ms}}return{family:"evm",chainId:q,name:H.name,address:r.evm,status:"ok",latencyMs:we.ms,native:{status:"ok",symbol:We,amountRaw:Z,decimals:qe,amount:ha(Z,qe)},fungibleTokens:Ee,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:Ee.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 q=Un(t,"solana"),H=await $e(()=>$s({address:r.solana},q)),te=i||a?await Promise.all([$e(()=>Ti({owner:r.solana,programId:$d},q)).then(Ee=>({...Ee,program:"spl-token"})),$e(()=>Ti({owner:r.solana,programId:lM},q)).then(Ee=>({...Ee,program:"token-2022"}))]):[],we=uM(te),qe=we.filter(Ee=>Ee.classification==="collectible-candidate"),We=we.filter(Ee=>Ee.classification!=="collectible-candidate"),Z=te.filter(Ee=>!Ee.ok).map(Ee=>Ee.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:H.ok||te.some(Ee=>Ee.ok)?"ok":"unavailable",native:H.ok?{status:"ok",symbol:"SOL",amountRaw:H.data.lamports,decimals:9,amount:ha(H.data.lamports,9),slot:H.data.slot}:{status:"unavailable",symbol:"SOL",error:H.error},fungibleTokens:{status:i?Z.length===te.length?"unavailable":Z.length?"partial":"ok":"not-requested",assets:i?We:[],errors:Z,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?Z.length===te.length?"unavailable":"partial":"not-requested",assets:a?qe:[],errors:Z,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 q=Un(t,"bitcoin"),H=Un(t,"bitcoinMeta"),[te,we,qe]=await Promise.all([$e(()=>Ms({address:r.bitcoin},q)),i?$e(()=>Us({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?$e(()=>eo({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),We=we.ok?we.data:null,Z=qe.ok?qe.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:te.ok||We?.ok||Z?.ok?"ok":"unavailable",native:te.ok?{status:"ok",symbol:"BTC",amountRaw:te.data.balanceSats,decimals:8,amount:ha(te.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:te.error},fungibleTokens:{status:i?We?.ok?"ok":"unavailable":"not-requested",assets:We?.balances||[],error:We?.ok?null:We?.error||we.error,verification:"indexer-reported"},collectibles:{status:a?Z?.ok?"ok":"unavailable":"not-requested",assets:Z?.inscriptions||[],error:Z?.ok?null:Z?.error||qe.error,unknownNotEmpty:!!Z?.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 q=Un(t,"hyperliquid"),[H,te,we]=await Promise.all([$e(()=>xs(r.hyperliquid,q)),$e(()=>Wr(r.hyperliquid,q)),$e(()=>tn(q))]),qe=(H.ok&&Array.isArray(H.data?.balances)?H.data.balances:[]).filter(Z=>Dn(Z.total)||Dn(Z.hold)).map(Z=>({coin:Z.coin||null,total:String(Z.total??"0"),hold:String(Z.hold??"0"),priceUsd:null,usdValue:null})),We=(te.ok&&Array.isArray(te.data?.assetPositions)?te.data.assetPositions:[]).map(Z=>Z.position||Z).filter(Z=>Dn(Z.szi)).map(Z=>({coin:Z.coin||null,size:String(Z.szi??"0"),entryPrice:Z.entryPx??null,positionValueUsd:Z.positionValue??null,unrealizedPnlUsd:Z.unrealizedPnl??null,liquidationPrice:Z.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:H.ok||te.ok?"ok":"unavailable",spot:{status:H.ok?"ok":"unavailable",balances:qe,error:H.ok?null:H.error},perps:{status:te.ok?"ok":"unavailable",accountValueUsd:te.data?.marginSummary?.accountValue??null,withdrawableUsd:te.data?.withdrawable??null,positions:We,error:te.ok?null:te.error},mids:we.ok?we.data:{},source:"hyperliquid-info"}})(),[h,g,b,S,w]=await Promise.all([d,p,m,f,u]),y=w.ok?w.data:null,k=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),v=[];for(let q of h){if(q.family!=="evm"||q.fungibleTokens?.status!=="ok")continue;let H=k[q.chainId];if(H)for(let te of q.fungibleTokens.assets||[])te.address&&v.push(`${H}:${String(te.address).toLowerCase()}`)}let x=null;if(o&&v.length){let q=[...new Set(v)],H=await $e(()=>Ot(q,Un(t,"prices")));H.ok&&(x=H.data)}let E=h.map(q=>{let H=q.native?{...q,native:Om(q.native,y)}:q;if(H.fungibleTokens?.status==="ok"&&Array.isArray(H.fungibleTokens.assets)){let te=k[H.chainId],we=H.fungibleTokens.assets.map(qe=>{let We=String(qe.symbol||"").toUpperCase(),Z=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(We)&&(Z=1),Z==null&&te&&qe.address&&x?.coins){let Br=`${te}:${String(qe.address).toLowerCase()}`,Xt=x.coins[Br],er=Number(Xt?.price);Number.isFinite(er)&&er>0&&(Z=er)}let Ee=vo(qe.amount),Pt=Ee!=null&&Z!=null?Jc(Ee*Z):null;return{...qe,priceUsd:Z,usdValue:Pt}});H={...H,fungibleTokens:{...H.fungibleTokens,assets:we}}}return H});g.native&&(g.native=Om(g.native,y)),b.native&&(b.native=Om(b.native,y));let _=0,P=0,N=0;for(let q of[...E,g,b]){q.native?.status==="ok"&&Dn(q.native.amount)&&(q.native.usdValue!=null?(_+=q.native.usdValue,P+=1):N+=1);for(let H of q.fungibleTokens?.assets||[])!Dn(H.amount)&&!Dn(H.amountRaw)||(H.usdValue!=null?(_+=H.usdValue,P+=1):N+=1)}let I=nv(y,"HYPE");for(let q of S.spot?.balances||[]){let H=String(q.coin||"").toUpperCase(),te=H==="USDC"||H==="USDT"||H==="USDT0"?1:H==="HYPE"?I.priceUsd||vo(S.mids?.HYPE):vo(S.mids?.[q.coin]),we=vo(q.total);q.priceUsd=te,q.usdValue=we!=null&&te!=null?Jc(we*te):null,Dn(q.total)&&(q.usdValue!=null?(_+=q.usdValue,P+=1):N+=1)}let L=vo(S.perps?.accountValueUsd);L!=null&&L!==0&&(_+=L,P+=1);let F=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(q=>Dn(q.amount)).length,O=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;N+=F+O;let D=[...E,g,b,S],R=q=>D.filter(H=>H.status===q).length,U=[],Q=E.filter(q=>q.fungibleTokens?.status==="unavailable"),Y=E.filter(q=>q.fungibleTokens?.status==="ok");Q.length&&!Y.length?U.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):Q.length&&U.push(`EVM token discovery partial: Blockscout covered ${Y.length} chain(s); ${Q.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&U.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&U.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),w.ok||U.push(`Price provider unavailable: ${w.error}`);let Re=[Cm("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Cm("sui","Sui balance adapter is not installed"),Cm("aptos","Aptos balance adapter is not installed")],lt=D.some(q=>["unavailable","partial","not-configured"].includes(q.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(q.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:D.length,ok:R("ok"),unavailable:R("unavailable"),notConfigured:R("not-configured"),unsupported:R("unsupported")+Re.length,evmChainsRequested:c.length,evmChainsOk:E.filter(q=>q.status==="ok").length},valuation:{knownUsd:Jc(_),label:"known priced value, not a complete portfolio total",pricedItems:P,unpricedNonzeroItems:N,complete:N===0&&!lt&&R("unavailable")===0&&R("not-configured")===0&&Re.length===0,priceSource:o?"DefiLlama":null,priceStatus:w.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,g,b,S],unsupportedFamilies:Re,warnings:U}}import{constants as Zc}from"node:fs";import{chmod as $M,mkdir as BM,open as MM,readFile as FM}from"node:fs/promises";import{createHash as UM,randomUUID as DM}from"node:crypto";import qM from"node:os";import Ao from"node:path";j();j();var pM=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"]),mM=new Set(["image/jpeg","image/png","image/webp"]);function fM(e){let t=String(e||"").toLowerCase();return pM.some(n=>t===n||t.endsWith(`.${n}`))}function hM(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 ov(e){let t=hM(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!fM(n.hostname)?null:n}async function gM(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=ov(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 $e(()=>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=ov(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(!mM.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 Rm(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function yM(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function iv(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 w of a){if(c>=l){s.push({item:w,image:null,error:"gallery page byte cap reached"});continue}try{let y=await gM(w.imageUrl||w.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:w,image:y,error:null})}catch(y){s.push({item:w,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,b=s.map(({item:w,image:y,error:k},v)=>{let x=v%u,E=Math.floor(v/u),_=x*d,P=m+E*p,N=y?`<image x="${_+14}" y="${P+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${_+14}" y="${P+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${P+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,I=Rm(yM(w,v).slice(0,34)),L=Rm(w.chain||"unknown chain");return`${N}<text x="${_+16}" y="${P+350}" fill="#f3f5f7" font-size="17" font-weight="600">${I}</text><text x="${_+16}" y="${P+376}" fill="#8d98a8" font-size="13">${L}${k?" \xB7 placeholder":""}</text>`}).join(""),S=`<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 ${Rm(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(S).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(w=>w.image).length,placeholders:s.filter(w=>!w.image).map(w=>({assetKey:w.item.assetKey||null,name:w.item.name||null,sourceUrl:w.item.imageUrl||null,error:w.error})),rasterOnly:!0,externalScripts:!1}}var wM=[/\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],bM=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,xM=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function SM(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;bM.test(n)&&t.push("url-in-name");let i=wM.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),xM.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 av(e={}){let t=SM(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}ne();var kM=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"}]),vM=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 vr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function ga(e,t){let n=await $e(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function EM(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 AM(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 IM(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 lv(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function _M(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 PM(e,t){let n=lv(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 TM(e){let t=new Map;for(let n of e){let r=lv(n);t.has(r)||t.set(r,n)}return[...t.values()]}function NM(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 uv(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Eo(e={},t={}){let n=new Date().toISOString(),r=kr(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=kM.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=vr(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await ot(l,4,async y=>({row:y,result:await ga(`opensea-${y.chain}`,()=>ci({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:k}of u)if(k.ok){let v=k.data.nfts.map(x=>({...x,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...v),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:k.data.complete?"ok":"partial",count:v.length,complete:k.data.complete,next:k.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:k.error,source:"opensea"});if(!r.evm)for(let y of i.filter(k=>k.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 ga("opensea-solana",()=>ci({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let k=y.data.nfts.map(v=>({...v,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...k),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:k.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 ga("satflow-wallet-contents",()=>qs({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},vr(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let k=EM(y.data.contents).map(x=>AM(x,r.bitcoin));s.push(...k);let v=k.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:v?"ok":"partial",count:k.length,complete:v,source:"satflow"})}else{let k=await ga("bitcoin-meta-inscriptions",()=>eo({address:r.bitcoin},vr(t,"bitcoinMeta")),t.timeoutMs??35e3),v=k.ok&&k.data?.ok&&Array.isArray(k.data.inscriptions)?k.data.inscriptions:[];s.push(...v.map(x=>IM(x,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:v.length?"partial":"unavailable",count:v.length,complete:!1,source:v.length?"bitcoin-meta":"satflow",error:v.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 k=await ga(`opensea-pnl-${y}`,()=>ls({address:y},c),t.timeoutMs??35e3);d.push(k.ok?{status:"ok",...k.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:k.error})}let p=_M(e.costBasis),m=TM(s).map(y=>PM(y,p)).map(y=>av(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))),b=Math.round(g.reduce((y,k)=>y+Number(k.estimatedValueUsd),0)*100)/100,S=f.length-g.length,w=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:vM,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:S,complete:S===0&&w.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:NM(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 sv(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 CM(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 dv(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 hs(e,vr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=sv(e.expiry??e.endTime,"Solana NFT listing expiry");return Ec({...e,expiry:r},vr(t,"magiceden"))}if(n==="satflow"){let r=sv(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Hs({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:CM(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},vr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Lm(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 $m(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Qc(e){return String(e??"").trim().toLowerCase()}function OM(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Qc(t),i=Qc(n);return!o||!i?!1:r.some(a=>Qc(a.trait_type??a.traitType??a.type)===o&&Qc(a.value??a.trait_value??a.traitValue)===i)}function RM(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function cv(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 Bm(e){return Math.round(Number(e)*1e6)/1e6}function qn(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 pv(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return qn(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(x=>e[x]==null||e[x]==="");if(o.length)return qn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Lm(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Lm(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Lm(e.traitFloorEth,"traitFloorEth"),d=$m(e.collectionFloorEth),p=$m(e.maxListingAgeMs),m=$m(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return qn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return qn(e,"invalid-min-trait-sales");if(u<=0)return qn(e,"trait-floor-unavailable");let f=x=>OM(x,e.traitType,e.traitValue)&&RM(x,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(x=>{if(!m)return!0;let E=cv(x,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=Bm(h.reduce((x,E)=>x+Number(E.priceEth??E.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return qn(e,"trait-liquidity-insufficient",{traitSales:b});let S=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(x=>{let E=Number(x.priceEth??x.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let _=cv(x,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(x=>{let E=Number(x.priceEth??x.price),_=Math.round((u-E)/u*1e4);return{...x,priceEth:E,discountBps:_}}).filter(x=>x.discountBps>=s).sort((x,E)=>x.priceEth-E.priceEth||E.discountBps-x.discountBps),w={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:S.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 qn(e,"invalid-min-trait-listings",w);if(S.length<y)return qn(e,"trait-listing-depth-insufficient",w);let k=S[0],v=$({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:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Bm(k.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:w,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Bm(k.priceEth),discountBps:k.discountBps},evidence:w,prepareIntent:v}}async function mv(e={},t={}){let n=await Eo({...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 fv(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Eo({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await iv({...e,items:n},vr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var hv=10*1024*1024,wv=1e3;function Hn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Io(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function gv(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 bv(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 HM(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function xv(e={}){return`portfolio_${UM("sha256").update(HM(e)).digest("hex").slice(0,20)}`}function Sv(e={}){if(e.historyFile)return Ao.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Ao.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Ao.join(qM.homedir(),".hermes");return Ao.join(Ao.resolve(n),"state","oracle","portfolio-history.jsonl")}function jM(e){let t=Hn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Io(t):null}function zM(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Hn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Io(t):null}function VM(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Hn(c.usdValue);return l==null?s:s+l},0),i=Hn(n.perps?.accountValueUsd),a=Io(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Hn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Hn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Io(r)})}return t}function WM(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 GM(e,t){let n=Sv(t),r=`${JSON.stringify(e)}
|
|
147
|
+
`;if(Buffer.byteLength(k)>i)throw new Rt(`${t} snapshot exceeds ${i} bytes`,"STORE_BOUNDS");let v=lc.dirname(e);Sb(v);let x=lc.join(v,`.${lc.basename(e)}.${process.pid}.${bb()}.tmp`),E;try{E=ge.openSync(x,"wx",384),ge.writeFileSync(E,k,"utf8"),ge.fsyncSync(E),ge.closeSync(E),E=void 0,ge.renameSync(x,e);try{ge.chmodSync(e,384)}catch{}try{let _=ge.openSync(v,"r");try{ge.fsyncSync(_)}finally{ge.closeSync(_)}}catch{}}finally{if(E!==void 0)try{ge.closeSync(E)}catch{}try{ge.unlinkSync(x)}catch(_){if(_?.code!=="ENOENT")throw _}}}function g(){return dc(p().data)}function b(){let w=p();return{schemaVersion:w.schemaVersion,kind:w.kind,generation:w.generation,data:dc(w.data)}}function S(w){if(typeof w!="function")throw new TypeError("mutator must be a function");let y=m();try{let k=p(),v=dc(k.data),x=w(v,{generation:k.generation,now:uc(o)});return r(v),h({schemaVersion:Sp,kind:t,generation:k.generation+1,data:v}),dc(x)}finally{f(y)}}return Object.freeze({filePath:e,read:g,inspect:b,mutate:S})}import{wordlists as GR}from"ethers";var KR=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),YR=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],JR=new Set([12,15,18,21,24]);function XR(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return JR.has(t.length)&&t.every(n=>GR.en.getWordIndex(n)>=0)}var QR=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,ZR=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,e2=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function t2(e){let t=kb(e);return e2.has(t)||ZR.test(t)}var qi=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function kb(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function n2(e){let t=kb(e);return[...KR].some(n=>t.includes(n))}function r2(e,t,n){if(typeof t=="string"){if(YR.some(r=>r.test(t))||XR(t))throw new qi(n);if(QR.test(t)&&!t2(e))throw new qi(n)}}function vp(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return r2(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)=>vp(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(n2(o))throw new qi(i);e[o]!==void 0&&(r[o]=vp(e[o],i,o))}return r}function un(e){return vp(e)}var mc=1,Eb="Local catalog only; existing marketplace providers are unchanged. Armed for the owner-local signer. Sign/broadcast require an explicit instruction.",nj=Object.freeze(["listing","offer","arm","instruct"]),s2=Object.freeze(["open","cancelled","expired","armed","submitted"]),rj=Object.freeze(["arm","sign-and-broadcast"]),c2=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."}),l2=/^(?:0|[1-9][0-9]*)$/,u2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,d2=/^0x[a-fA-F0-9]{40}$/,p2=/^0x[a-fA-F0-9]{64}$/,m2=/[\u0000-\u001f\u007f]/,f2=new Set(s2),Ip=class extends Error{constructor(t,n="LOCAL_MARKETPLACE_INVALID"){super(`local-marketplace: ${t}`),this.name="LocalMarketplaceError",this.code=n}};function ee(e,t){throw new Ip(e,t)}function fr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))fr(t);Object.freeze(e)}return e}function ji(e,t,{max:n=256,lower:r=!1}={}){typeof e!="string"&&ee(`${t} must be a string`);let o=e.trim();return(!o||o.length>n||m2.test(o))&&ee(`${t} is invalid`),r?o.toLowerCase():o}function Xe(e,t){let n=ji(e,t,{max:128});return u2.test(n)||ee(`${t} must be a bounded id`),n}function Hi(e,t,{positive:n=!1}={}){typeof e=="number"&&ee(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return l2.test(r)||ee(`${t} must be a canonical integer string`),n&&r==="0"&&ee(`${t} must be positive`),r}function mr(e,t){let n=ji(e,t,{max:42,lower:!0});return d2.test(n)||ee(`${t} must be a 20-byte EVM address`),n}function Ab(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&ee(`${t} must be a plain object`),e}function pr(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 must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function Ep(e){return new Date(e).toISOString()}function h2(e){return i2("sha256").update($n(e),"utf8").digest("hex")}function g2(e=process.env){let t=e.ORACLE_CONFIG_DIR||vb.join(o2(),".config","oracle");return vb.join(t,"local-marketplace.v1.json")}function pc(e){let t=e.status==="submitted";return fr({schemaVersion:mc,listingId:e.listingId,tenantId:e.tenantId,seller:e.seller,asset:e.asset,amount:e.amount,price:e.price,chainId:e.chainId,status:f2.has(e.status)?e.status:ee("invalid listing status","STORE_INVALID"),createdAt:e.createdAt,expiresAt:e.expiresAt,listingHash:e.listingHash,offers:(e.offers||[]).map(n=>fr({offerId:n.offerId,buyer:n.buyer,amount:n.amount,status:n.status,createdAt:n.createdAt})),transactionHash:e.transactionHash||null,label:Eb,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t})}function y2(e){(!e||e.schemaVersion!==mc||!Array.isArray(e.listings))&&ee("invalid marketplace snapshot","STORE_INVALID"),e.listings.length>1e4&&ee("marketplace capacity exceeded","STORE_LIMIT")}function Ap(e,t){return fr({schemaVersion:mc,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:Eb,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0})}function w2(e,t,n){typeof e=="string"&&ee("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let r=Ab(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(r,"signHash")||Object.prototype.hasOwnProperty.call(r,"hashToSign"))&&ee("generic signHash is refused","SIGNHASH_REFUSED");let o=mr(r.from??r.offerer??t.seller,"artifact.from"),i=mr(r.to??r.recipient??n.buyer,"artifact.to"),a=Hi(r.chainId??t.chainId,"artifact.chainId",{positive:!0});return o!==t.seller&&ee("artifact.from must match the seller","ARTIFACT_MISMATCH"),i!==n.buyer&&ee("artifact.to must match the buyer","ARTIFACT_MISMATCH"),a!==t.chainId&&ee("artifact.chainId must match the listing","ARTIFACT_MISMATCH"),r.listingHash&&r.listingHash!==t.listingHash&&ee("artifact.listingHash must match the listing","ARTIFACT_MISMATCH"),r}function b2(e,t){if(e==null)return{action:"arm"};let n=Ab(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&ee("generic signHash is refused","SIGNHASH_REFUSED");let r=ji(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&ee("prepare is refused; arm the listing, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&ee("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),n.confirm!==!0&&ee("sign-and-broadcast requires confirm: true","INSTRUCTION_INVALID"),n.sign!==!0&&ee("sign-and-broadcast requires sign: true","INSTRUCTION_INVALID"),n.broadcast!==!0&&ee("sign-and-broadcast requires broadcast: true","INSTRUCTION_INVALID"),n.listingHash&&n.listingHash!==t.listingHash&&ee("instruction.listingHash must match the listing","ARTIFACT_MISMATCH"),n)}function Ib({filePath:e=g2(),clock:t=()=>Date.now(),idFactory:n=()=>a2()}={}){let r=oo({filePath:e,kind:"oracle-local-marketplace",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:mc,listings:[]}),validateData:y2});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={}){un(h);let g=Xe(h.tenantId,"tenantId"),b=mr(h.seller,"seller"),S=ji(h.asset,"asset",{max:128}),w=Hi(h.amount,"amount",{positive:!0}),y=Hi(h.price,"price",{positive:!0}),k=Hi(h.chainId,"chainId",{positive:!0}),v=pr(t),x=Ep(v),E=h.expiresAt==null?Ep(v+864e5):ji(h.expiresAt,"expiresAt",{max:64});(!Number.isFinite(Date.parse(E))||Date.parse(E)<=v)&&ee("expiresAt must be after now");let _=Xe(String(h.listingId??`listing-${n()}`),"listingId");return r.mutate(P=>{P.listings.some(L=>L.listingId===_)&&ee("listingId already exists","DUPLICATE");let N={listingId:_,tenantId:g,seller:b,asset:S,amount:w,price:y,chainId:k,status:"open",createdAt:x,expiresAt:E,offers:[],custody:"none",execution:"armed-local"},I={...N,listingHash:h2(N)};return P.listings.push(I),pc(I)})}function s({tenantId:h}={}){let g=Xe(h,"tenantId"),b=pr(t);return fr(r.read().listings.filter(S=>o(S,g)).map(S=>pc(i({...S,offers:S.offers.map(w=>({...w}))},b))))}function c({tenantId:h,listingId:g,actor:b}={}){let S=Xe(h,"tenantId"),w=Xe(g,"listingId"),y=mr(b,"actor"),k=pr(t);return r.mutate(v=>{let x=v.listings.find(E=>o(E,S)&&E.listingId===w);return x||ee("listing not found","NOT_FOUND"),i(x,k),x.seller!==y&&ee("only the seller can cancel","FORBIDDEN"),x.status!=="open"&&ee("listing is not open","NOT_OPEN"),x.status="cancelled",pc(x)})}function l(h={}){un(h);let g=Xe(h.tenantId,"tenantId"),b=Xe(h.listingId,"listingId"),S=mr(h.buyer,"buyer"),w=Hi(h.amount,"amount",{positive:!0}),y=pr(t),k=Xe(String(h.offerId??`offer-${n()}`),"offerId");return r.mutate(v=>{let x=v.listings.find(E=>o(E,g)&&E.listingId===b);return x||ee("listing not found","NOT_FOUND"),i(x,y),x.status!=="open"&&ee("listing is not open","NOT_OPEN"),x.seller===S&&ee("seller cannot offer on their own listing","FORBIDDEN"),x.offers.some(E=>E.offerId===k)&&ee("offerId already exists","DUPLICATE"),x.offers.push({offerId:k,buyer:S,amount:w,status:"open",createdAt:Ep(y)}),pc(x)})}function u(h,{tenantId:g,listingId:b,offerId:S,actor:w,now:y,allowed:k=["open","armed"]}){let v=h.listings.find(E=>o(E,g)&&E.listingId===b);v||ee("listing not found","NOT_FOUND"),i(v,y),k.includes(v.status)||ee("listing is not open","NOT_OPEN"),v.seller!==w&&ee("only the seller can arm a fill","FORBIDDEN");let x=v.offers.find(E=>E.offerId===S);return(!x||!["open","armed"].includes(x.status))&&ee("offer not found","NOT_FOUND"),{row:v,offer:x}}function d({tenantId:h,listingId:g,offerId:b,actor:S}={}){let w=Xe(h,"tenantId"),y=Xe(g,"listingId"),k=Xe(b,"offerId"),v=mr(S,"actor"),x=pr(t);return r.mutate(E=>{let{row:_,offer:P}=u(E,{tenantId:w,listingId:y,offerId:k,actor:v,now:x});return _.status="armed",P.status="armed",Ap(_,P)})}async function p({tenantId:h,listingId:g,offerId:b,actor:S,instruction:w,executor:y}={}){let k=Xe(h,"tenantId"),v=Xe(g,"listingId"),x=Xe(b,"offerId"),E=mr(S,"actor"),_=pr(t),P=r.mutate(R=>{let{row:U,offer:Q}=u(R,{tenantId:k,listingId:v,offerId:x,actor:E,now:_,allowed:["open","armed"]}),Y=b2(w,U);return U.status="armed",Q.status="armed",{armed:Ap(U,Q),instruction:Y,listingHash:U.listingHash}});if(P.instruction.action==="arm")return P.armed;let N=r.read().listings.find(R=>R.listingId===v&&R.tenantId===k),I=N?.offers.find(R=>R.offerId===x),L=w2(P.instruction.artifact,N,I);(!y||typeof y.executeConfirmedArtifact!="function")&&ee("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof y.signHash=="function"&&ee("generic signHash executors are refused","SIGNHASH_REFUSED");let F=await y.executeConfirmedArtifact(L,P.instruction.nonce,y),O=F?.receipt?.transactionHash??F?.transactionHash;(typeof O!="string"||!p2.test(O))&&ee("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let D=F?.receipt?.status??F?.status;return D!==1&&D!=="0x1"&&ee("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(R=>{let{row:U,offer:Q}=u(R,{tenantId:k,listingId:v,offerId:x,actor:E,now:pr(t),allowed:["armed"]});return U.status="submitted",Q.status="submitted",U.transactionHash=O.toLowerCase(),fr({...Ap(U,Q),recordType:"local-marketplace-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,refusesSignHash:!0,transactionHash:U.transactionHash,review:`Local P2 fill ${U.listingId} signed and broadcast through the instructed local signer. transactionHash=${U.transactionHash}`})})}function m({tenantId:h,text:g}={}){return Xe(h,"tenantId"),(typeof g!="string"||g.trim()==="")&&ee("consult text required"),fr({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 c2}return Object.freeze({createListing:a,listListings:s,cancelListing:c,createOffer:l,armFill:d,instructFill:p,ingestUntrustedConsult:m,agentCard:f})}import _b from"node:path";import{homedir as x2}from"node:os";import{createHash as S2,randomUUID as k2}from"node:crypto";var hc=1,Pb="Oracle local x402 budget. Armed for the owner-local signer. Pay requires an explicit instruction. Not Telegram A2A.",uj=Object.freeze(["open","cancelled","armed","submitted"]),v2=/^(?:0|[1-9][0-9]*)$/,E2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,A2=/^0x[a-fA-F0-9]{40}$/,I2=/^0x[a-fA-F0-9]{64}$/,_2=/[\u0000-\u001f\u007f]/,Tp=class extends Error{constructor(t,n="LOCAL_X402_INVALID"){super(`local-x402: ${t}`),this.name="LocalX402Error",this.code=n}};function oe(e,t){throw new Tp(e,t)}function zi(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))zi(t);Object.freeze(e)}return e}function Vi(e,t,{max:n=256}={}){typeof e!="string"&&oe(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||_2.test(r))&&oe(`${t} is invalid`),r}function dn(e,t){let n=Vi(e,t,{max:128});return E2.test(n)||oe(`${t} must be a bounded id`),n}function fc(e,t,{positive:n=!1}={}){typeof e=="number"&&oe(`${t} must be an exact integer string`);let r=typeof e=="bigint"?e.toString():String(e??"");return v2.test(r)||oe(`${t} must be a canonical integer string`),n&&r==="0"&&oe(`${t} must be positive`),r}function hr(e,t){let n=Vi(e,t,{max:42}).toLowerCase();return A2.test(n)||oe(`${t} must be a 20-byte EVM address`),n}function P2(e){let t=Vi(e,"resource",{max:2048}),n;try{n=new URL(t)}catch{oe("resource must be an https URL")}return n.protocol!=="https:"&&oe("resource must be https"),(n.username||n.password)&&oe("resource must not contain credentials"),n.toString()}function Tb(e,t){return(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&oe(`${t} must be a plain object`),e}function T2(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&oe("clock must return a safe integer millisecond timestamp","CLOCK_INVALID"),n}function N2(e){return new Date(e).toISOString()}function C2(e=process.env){let t=e.ORACLE_CONFIG_DIR||_b.join(x2(),".config","oracle");return _b.join(t,"local-x402.v1.json")}function _p(e){let t=e.status==="submitted";return zi({schemaVersion:hc,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:Pb,custody:"none",execution:t?"local-signer-instructed":"armed-local",armed:!t,signed:t,broadcast:t,telegram:!1,pluginExecution:!1})}function O2(e){(!e||e.schemaVersion!==hc||!Array.isArray(e.intents))&&oe("invalid x402 snapshot","STORE_INVALID"),e.intents.length>1e4&&oe("x402 capacity exceeded","STORE_LIMIT")}function Pp(e){return zi({schemaVersion:hc,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:Pb,custody:"none",execution:"armed-local",armed:!0,signed:!1,broadcast:!1,requiresWalletSignature:!0,backendSigner:!1,refusesSignHash:!0,telegram:!1})}function R2(e,t){typeof e=="string"&&oe("raw hash artifacts are refused; pass a typed local-signer artifact","SIGNHASH_REFUSED");let n=Tb(e,"instruction.artifact");(Object.prototype.hasOwnProperty.call(n,"signHash")||Object.prototype.hasOwnProperty.call(n,"hashToSign"))&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=hr(n.from??t.payer,"artifact.from"),o=hr(n.to??t.payTo,"artifact.to"),i=fc(n.amount??t.amount,"artifact.amount",{positive:!0});r!==t.payer&&oe("artifact.from must match payer","ARTIFACT_MISMATCH"),o!==t.payTo&&oe("artifact.to must match payTo","ARTIFACT_MISMATCH"),i!==t.amount&&oe("artifact.amount must match the armed intent","ARTIFACT_MISMATCH");let a=BigInt(t.maxBudget);return BigInt(i)>a&&oe("amount exceeds maxBudget","BUDGET"),n}function L2(e,t){if(e==null)return{action:"arm"};let n=Tb(e,"instruction");Object.prototype.hasOwnProperty.call(n,"signHash")&&n.signHash!==!1&&oe("generic signHash is refused","SIGNHASH_REFUSED");let r=Vi(n.action??"arm","instruction.action",{max:64});return r==="arm"?{action:"arm"}:(r==="prepare"&&oe("prepare is refused; arm the payment, then instruct sign-and-broadcast","INSTRUCTION_INVALID"),r!=="sign-and-broadcast"&&oe("instruction.action must be arm or sign-and-broadcast","INSTRUCTION_INVALID"),(n.confirm!==!0||n.sign!==!0||n.broadcast!==!0)&&oe("sign-and-broadcast requires confirm, sign, and broadcast all true","INSTRUCTION_INVALID"),n.intentHash&&n.intentHash!==t.intentHash&&oe("instruction.intentHash must match","ARTIFACT_MISMATCH"),n)}function Nb({filePath:e=C2(),clock:t=()=>Date.now(),idFactory:n=()=>k2()}={}){let r=oo({filePath:e,kind:"oracle-local-x402",clock:t,maxBytes:4194304,initialData:()=>({schemaVersion:hc,intents:[]}),validateData:O2});function o(l={}){un(l);let u=dn(l.tenantId,"tenantId"),d=hr(l.payer,"payer"),p=hr(l.payTo,"payTo"),m=P2(l.resource),f=fc(l.amount,"amount",{positive:!0}),h=fc(l.maxBudget??f,"maxBudget",{positive:!0});BigInt(f)>BigInt(h)&&oe("amount exceeds maxBudget","BUDGET");let g=Vi(l.asset??"USDC","asset",{max:32}),b=fc(l.chainId,"chainId",{positive:!0}),S=T2(t),w=dn(String(l.intentId??`x402-${n()}`),"intentId");return r.mutate(y=>{y.intents.some(x=>x.intentId===w)&&oe("intentId already exists","DUPLICATE");let k={intentId:w,tenantId:u,payer:d,payTo:p,resource:m,amount:f,maxBudget:h,asset:g,chainId:b,status:"open",createdAt:N2(S),custody:"none",execution:"armed-local"},v={...k,intentHash:S2("sha256").update($n(k),"utf8").digest("hex")};return y.intents.push(v),_p(v)})}function i({tenantId:l}={}){let u=dn(l,"tenantId");return zi(r.read().intents.filter(d=>d.tenantId===u).map(_p))}function a({tenantId:l,intentId:u,actor:d}={}){let p=dn(l,"tenantId"),m=dn(u,"intentId"),f=hr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can cancel","FORBIDDEN"),g.status!=="open"&&oe("intent is not open","NOT_OPEN"),g.status="cancelled",_p(g)})}function s({tenantId:l,intentId:u,actor:d}={}){let p=dn(l,"tenantId"),m=dn(u,"intentId"),f=hr(d,"actor");return r.mutate(h=>{let g=h.intents.find(b=>b.tenantId===p&&b.intentId===m);return g||oe("intent not found","NOT_FOUND"),g.payer!==f&&oe("only the payer can arm","FORBIDDEN"),["open","armed"].includes(g.status)||oe("intent is not open","NOT_OPEN"),g.status="armed",Pp(g)})}async function c({tenantId:l,intentId:u,actor:d,instruction:p,executor:m}={}){let f=dn(l,"tenantId"),h=dn(u,"intentId"),g=hr(d,"actor"),b=r.mutate(x=>{let E=x.intents.find(P=>P.tenantId===f&&P.intentId===h);E||oe("intent not found","NOT_FOUND"),E.payer!==g&&oe("only the payer can instruct pay","FORBIDDEN"),["open","armed"].includes(E.status)||oe("intent is not open","NOT_OPEN");let _=L2(p,E);return E.status="armed",{armed:Pp(E),instruction:_}});if(b.instruction.action==="arm")return b.armed;let S=r.read().intents.find(x=>x.tenantId===f&&x.intentId===h),w=R2(b.instruction.artifact,S);(!m||typeof m.executeConfirmedArtifact!="function")&&oe("sign-and-broadcast requires an injected local-signer executor","EXECUTOR_REQUIRED"),typeof m.signHash=="function"&&oe("generic signHash executors are refused","SIGNHASH_REFUSED");let y=await m.executeConfirmedArtifact(w,b.instruction.nonce,m),k=y?.receipt?.transactionHash??y?.transactionHash;(typeof k!="string"||!I2.test(k))&&oe("local-signer receipt must include a 32-byte transaction hash","RECEIPT_INVALID");let v=y?.receipt?.status??y?.status;return v!==1&&v!=="0x1"&&oe("local-signer broadcast did not return a successful receipt","RECEIPT_INVALID"),r.mutate(x=>{let E=x.intents.find(_=>_.tenantId===f&&_.intentId===h);return(!E||E.status!=="armed")&&oe("intent is not armed","NOT_OPEN"),E.status="submitted",E.transactionHash=k.toLowerCase(),zi({...Pp(E),recordType:"local-x402-submitted",execution:"local-signer-instructed",armed:!1,signed:!0,broadcast:!0,backendSigner:!0,requiresWalletSignature:!1,transactionHash:E.transactionHash,review:`Oracle local x402 ${E.intentId} signed and broadcast. transactionHash=${E.transactionHash}`})})}return Object.freeze({createIntent:o,listIntents:i,cancelIntent:a,armPayment:s,instructPay:c})}import Cb from"node:path";import{homedir as $2}from"node:os";import{randomUUID as B2}from"node:crypto";var Op=1,M2="Oracle local pack registry. Catalog only. Packs are never executed. Not Telegram A2A.",bj=Object.freeze(["listed","revoked"]),F2=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,U2=/[\u0000-\u001f\u007f]/,D2=/^[a-f0-9]{64}$/,q2=/^(?:localhost|(?:\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}|(?:\d{1,3}\.){3}\d{1,3})$/i,H2=new Set(["read","prepare","none"]),Cp=class extends Error{constructor(t,n="LOCAL_PACK_INVALID"){super(`local-pack-registry: ${t}`),this.name="LocalPackRegistryError",this.code=n}};function Me(e,t){throw new Cp(e,t)}function Rp(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Rp(t);Object.freeze(e)}return e}function Bn(e,t,{max:n=256}={}){typeof e!="string"&&Me(`${t} must be a string`);let r=e.trim();return(!r||r.length>n||U2.test(r))&&Me(`${t} is invalid`),r}function Wi(e,t){let n=Bn(e,t,{max:128});return F2.test(n)||Me(`${t} must be a bounded id`),n}function Ob(e,t){let n=Bn(e,t,{max:64}).toLowerCase();return D2.test(n)||Me(`${t} must be 64 lowercase hex`),n}function j2(e,t){let n=Bn(e,t,{max:2048}),r;try{r=new URL(n)}catch{Me(`${t} must be an https URL`)}return r.protocol!=="https:"&&Me(`${t} must be https`),(r.username||r.password)&&Me(`${t} must not contain credentials`),r.toString()}function z2(e){return e==null?[]:((!Array.isArray(e)||e.length>16)&&Me("outboundHosts must be a bounded array"),e.map((t,n)=>{let r=Bn(t,`outboundHosts[${n}]`,{max:253}).toLowerCase();return(!q2.test(r)||r==="0.0.0.0")&&Me(`outboundHosts[${n}] is not an allowlisted host`),r}))}function Rb(e){let t=e(),n=t instanceof Date?t.getTime():typeof t=="string"?Date.parse(t):Number(t);return(!Number.isSafeInteger(n)||n<0)&&Me("clock invalid","CLOCK_INVALID"),n}function Lb(e){return new Date(e).toISOString()}function V2(e=process.env){let t=e.ORACLE_CONFIG_DIR||Cb.join($2(),".config","oracle");return Cb.join(t,"local-pack-registry.v1.json")}function Np(e){return Rp({schemaVersion:Op,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:M2,custody:"none",execution:"none",pluginExecution:!1,loaded:!1,spawned:!1,telegram:!1})}function W2(e){(!e||e.schemaVersion!==Op||!Array.isArray(e.packs))&&Me("invalid pack registry snapshot","STORE_INVALID"),e.packs.length>1e3&&Me("pack registry capacity exceeded","STORE_LIMIT")}function $b({filePath:e=V2(),clock:t=()=>Date.now(),idFactory:n=()=>B2()}={}){let r=oo({filePath:e,kind:"oracle-local-pack-registry",clock:t,maxBytes:2097152,initialData:()=>({schemaVersion:Op,packs:[]}),validateData:W2});function o(l={}){un(l);let u=Wi(l.tenantId,"tenantId"),d=Bn(l.name,"name",{max:128}),p=Bn(l.version,"version",{max:64}),m=Bn(l.publisher,"publisher",{max:128}),f=Ob(l.manifestDigest,"manifestDigest"),h=l.sbomDigest==null?null:Ob(l.sbomDigest,"sbomDigest"),g=l.homepage==null?null:j2(l.homepage,"homepage"),b=z2(l.outboundHosts),S=Bn(l.spendScope??"none","spendScope",{max:16});H2.has(S)||Me("spendScope must be read, prepare, or none"),S!=="none"&&S!=="read"&&Me("write/spend pack scopes are refused; registry is catalog-only","SCOPE_REFUSED");let w=Rb(t),y=Wi(String(l.packId??`pack-${n()}`),"packId");return r.mutate(k=>{k.packs.some(x=>x.packId===y||x.tenantId===u&&x.name===d&&x.version===p&&x.status==="listed")&&Me("pack already listed","DUPLICATE");let v={packId:y,tenantId:u,name:d,version:p,publisher:m,manifestDigest:f,sbomDigest:h,homepage:g,outboundHosts:b,spendScope:S,status:"listed",createdAt:Lb(w),revokedAt:null,execution:"none",pluginExecution:!1};return k.packs.push(v),Np(v)})}function i({tenantId:l}={}){let u=Wi(l,"tenantId");return Rp(r.read().packs.filter(d=>d.tenantId===u).map(Np))}function a({tenantId:l,packId:u}={}){let d=Wi(l,"tenantId"),p=Wi(u,"packId"),m=Rb(t);return r.mutate(f=>{let h=f.packs.find(g=>g.tenantId===d&&g.packId===p);return h||Me("pack not found","NOT_FOUND"),h.status!=="listed"&&Me("pack is not listed","NOT_OPEN"),h.status="revoked",h.revokedAt=Lb(m),Np(h)})}function s(){Me("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}function c(){Me("pack execution is refused; this registry is catalog-only","EXECUTION_REFUSED")}return Object.freeze({registerPack:o,listPacks:i,revokePack:a,loadPack:s,executePack:c})}j();import{getAddress as Z2,Interface as ao,keccak256 as Bp}from"ethers";import{createHash as Mp,createHmac as eL,timingSafeEqual as Jb}from"node:crypto";Dr();_e();import{Interface as Fb,getAddress as Lp,isAddress as G2}from"ethers";var K2="0x0000000000000000000000000000000000000000",Ub=Object.freeze({4663:Object.freeze({name:"robinhood",factory:"0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3",quoter:"0x03983AB2C057a2eac211ff01738a1e49ff325B49",router:"0xC062b870E813fcA720f1e002c234369Ab3aB9415",weth:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"})}),Y2=new Fb(["function getPool(address tokenA,address tokenB,int24 tickSpacing) view returns (address pool)"]),J2=new Fb(["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 X2(e){let t=Number(e??4663),n=Ub[t];if(!n)throw new Error(`up33: unsupported chainId ${e}`);return{chainId:t,...n}}function Bb(e,t){if(/^weth$/i.test(String(e||"")))return Lp(Ub[t].weth);if(!G2(String(e||"")))throw new Error(`up33: invalid token ${e}`);return Lp(e)}function Q2(e,t){let n=BigInt(e??0);if(n<=0n)throw new Error(`up33: ${t} must be positive`);return n}async function Mb(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 Db(e,t={},n={}){try{let r=X2(t.chainId),o=Bb(t.tokenIn,r.chainId),i=Bb(t.tokenOut,r.chainId);if(o.toLowerCase()===i.toLowerCase())throw new Error("up33: tokens must differ");let a=Q2(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||V,l=await Mb(c,r.chainId,r.factory,Y2,"getPool",[o,i,s]),u=Lp(l[0]);if(u.toLowerCase()===K2)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 Mb(c,r.chainId,r.quoter,J2,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 qb(e={},t={}){return Db("exact-input",e,t)}async function Hb(e={},t={}){return Db("exact-output",e,t)}ne();var X=4663,gc="https://anvil.clutch.market",tL=`${gc}/api/markets/snapshot?chainId=${X}`,nL=`${gc}/api/rpc?chainId=${X}`,rL=new Set(["eth_call","eth_chainId","eth_blockNumber","eth_getBlockByNumber","eth_getCode"]),ft="0x0bd7d308f8e1639fab988df18a8011f41eacad73",Fp="0x0000000000000000000000000000000000000000",gr=1e5,oL=256e3,jb=256,iL=3e4,aL=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"}),kt=Object.freeze({chainId:X,nft:"0x539cdd042c2f3d93ebc5be7dfff0c79f3b4fabf0",token:"0xe934e36a439c94017b64a3fece66af12099abf50",activationManager:"0xacd5ae3c060c1137fe2ee86b0ab2ef697456f664",stockBooster:"0x038a7f4e4e89448ad74e044337c9ac25c11e726b",overtimeBooster:"0xf9ca5f6d8622c82758914681a12674e2d489259a",ammVault:"0xe302733accf4800146e55fc45b46b4e4ffc032d2",loanVault:"0xa7b9ac696b252b79568a5a01b2fd02177ef23664",registry:"0x28c154cbdeaecbf5f72b6ae48535ab9a431a4161",accountImpl:"0xe946075125843aadb5e40e59f513d929af507c4b",slug:"stonkbrokers-434284142"}),Ge=new ao(["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"]),sL=new ao(["function allowance(address owner,address spender) view returns (uint256)"]),Xb=new ao(["function decimals() view returns (uint8)"]),zb=new ao(["function quoteSpecificBuy(uint256 tokenId) view returns (uint256 tokenCost,uint256 ethFee,bool available)","function inventory(uint256 tokenId) view returns (bool)"]),vt=new ao(["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)"]),Mn=new ao(["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 K(e,t){try{return Z2(String(e||"").trim().toLowerCase()).toLowerCase()}catch{throw new Error(`stonkbrokers: invalid ${t}`)}}function mn(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 ht(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 se(e,t,n,r,o=[],i="latest"){let a=n.encodeFunctionData(r,o),s=await e(X,"eth_call",[{to:K(t,"contract"),data:a},i]);return n.decodeFunctionResult(r,s)}function Qb(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 Vb(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>jb)throw new Error(`stonkbrokers: Anvil snapshot row limit is ${jb}`);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)!==X)throw new Error(`stonkbrokers: Anvil snapshot rows must use chain ${X}`);return{name:n.name||n.collectionName||null,chainId:X,collection:K(n.collection||n.collectionAddress,"Anvil collection"),market:K(n.address||n.market||n.ammVaultAddress,"Anvil market"),tokenAddress:n.tokenAddress?K(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 cL(e,t,n=[],r={}){if(Number(e)!==X)throw new Error(`stonkbrokers: Anvil supports chain ${X} only`);if(!rL.has(String(t)))throw new Error("stonkbrokers: Anvil RPC proxy is read-only");let o=await A(nL,{method:"POST",headers:{origin:gc,referer:`${gc}/`,"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 Lt(e={}){return e.rpcCall||((t,n,r)=>cL(t,n,r,e))}async function so(e={},t={}){if(e.snapshot){let s=Vb(e.snapshot),c={kind:"anvil-markets",chainId:X,total:s.length,contentHash:Mp("sha256").update(io(s)).digest("hex")},l=Up(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 A(tL,{...t.fetchImpl?{fetchImpl:t.fetchImpl}:{},...t.lookupFn?{lookupFn:t.lookupFn}:{},...t.importUndici?{importUndici:t.importUndici}:{},untrustedUrl:!0,validateResponse:n,timeoutMs:t.timeoutMs??2e4,maxResponseBytes:oL,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=Vb(r),i={kind:"anvil-markets",chainId:X,total:o.length,contentHash:Mp("sha256").update(io(o)).digest("hex")},a=Up(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 yc(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 Zb({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 so({},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=aL[e];if(!a)throw new Error("stonkbrokers: Anvil market has no reviewed runtime identity");let s=Lt(n),c=yc(await s(X,"eth_blockNumber",[])),l=await s(X,"eth_getBlockByNumber",[c,!1]),u=String(l?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(u)||yc(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(X,"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=Bp(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+iL}}function ex(e,{paymentToken:t,paymentTokenDecimals:n,nativeSwapFeeWei:r}){return Object.freeze({version:1,source:"anvil-snapshot-rpc-reviewed-runtime",chainId:X,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 Ki(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=mn(e.tokenId),i=await Zb({market:n,collection:r},t),{rpc:a,blockRef:s}=i,[c,l,u,d,p,m]=await Promise.all([se(a,n,Ge,"quoteSpecificBuy",[BigInt(o)],s),se(a,n,Ge,"inventory",[BigInt(o)],s),se(a,r,vt,"ownerOf",[BigInt(o)],s),se(a,n,Ge,"collection",[],s),se(a,n,Ge,"token",[],s),se(a,n,Ge,"robinhoodSwapFeeWei",[],s)]),f=K(d[0],"Anvil market collection");if(f!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let h=K(p[0],"Anvil payment token");if(h!==i.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let g=Number((await se(a,h,Xb,"decimals",[],s))[0]);if(!Number.isSafeInteger(g)||g<0||g>255)throw new Error("stonkbrokers: invalid payment token decimals");let b=BigInt(m[0]).toString(),S=ex(i,{paymentToken:h,paymentTokenDecimals:g,nativeSwapFeeWei:b}),w=!!c[4],y=!!l[0],k=K(u[0],"NFT owner")===n,v=w&&y&&k;return{provider:"stonkbrokers",source:"anvil-exact-buy-quote",chainId:X,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:b,fees:Qb(c[2],c[3]),available:v,evidence:{quoteAvailable:w,inventory:y,ownerIsMarket:k,marketCollection:f,attestation:S},reason:v?null:"nft-not-provably-in-anvil-inventory",exec:!1,readOnly:!0}}async function wc(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await Zb({market:n,collection:r},t),{rpc:i,blockRef:a}=o,[s,c,l,u]=await Promise.all([se(i,n,Ge,"quoteSellNFT",[],a),se(i,n,Ge,"collection",[],a),se(i,n,Ge,"token",[],a),se(i,n,Ge,"robinhoodSwapFeeWei",[],a)]),d=K(c[0],"Anvil market collection");if(d!==r)throw new Error("stonkbrokers: Anvil market collection mismatch");let p=K(l[0],"Anvil payment token");if(p!==o.record.tokenAddress)throw new Error("stonkbrokers: Anvil snapshot payment token mismatch");let m=Number((await se(i,p,Xb,"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=ex(o,{paymentToken:p,paymentTokenDecimals:m,nativeSwapFeeWei:f});return{provider:"stonkbrokers",source:"anvil-sell-quote",chainId:X,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:Qb(s[2],s[3]),evidence:{marketCollection:d,attestation:h},exec:!1,readOnly:!0}}function tx(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 pn(e,t){let n=ht(e,t);if(n<=0n)throw new Error(`stonkbrokers: ${t} must be positive`);return n}function nx({from:e,to:t,data:n,value:r,gasLimit:o,maxFeePerGas:i,maxPriorityFeePerGas:a,nonce:s}){let c={chainId:X,from:e,to:t,data:n,value:BigInt(r).toString(),gasLimit:pn(o,"gasLimit").toString(),maxFeePerGas:pn(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=pn(a,"maxPriorityFeePerGasWei").toString()),c}function rx(e,t){return $({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 ox(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=K(e.market,"Anvil market"),o=K(e.collection,"NFT collection"),i=mn(e.tokenId),a=pn(e.maxTotalCostRaw,"maxTotalCostRaw"),s=ht(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 Ki({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=pn(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=K(l.paymentToken,"Anvil payment token"),h=Number(l.paymentTokenDecimals),g=l.evidence.attestation,b={blockHash:g.blockHash,requireCanonical:!0},S=BigInt((await se(Lt(t),f,sL,"allowance",[n,r],b))[0]);if(S<u)throw new Error("stonkbrokers: pre-existing payment-token allowance is insufficient");let w={from:n,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},y=[nx({...w,to:r,data:Ge.encodeFunctionData("buySpecificNFT",[BigInt(i),u]),value:l.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:c})],k={totalCostRaw:l.totalCostRaw,baseCostRaw:l.baseCostRaw,feeRaw:l.fees.anvilFeeRaw,protocolFeeRaw:l.fees.protocolFeeRaw,available:l.available},v={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:k,preconditions:{allowanceVerified:!0,allowanceRaw:S.toString(),exactQuoteConfirmed:!0,confirmedTotalCostRaw:d.toString()},tradeId:tx(e.tradeId),slippageBps:0,expiresAtMs:p+m,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:n,contract:o,marketCollection:l.evidence.marketCollection,tokenId:i,paymentToken:f,paymentTokenDecimals:h,nativeSwapFeeWei:l.nativeSwapFeeWei,anvilAttestation:g,anvilQuote:k,exactQuoteTotalCostRaw:u.toString(),maxPaymentTokenAmountRaw:u.toString(),transactions:y}};return rx(v,l)}async function ix(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=Lt(t),r=K(e.seller,"seller"),o=K(e.market,"Anvil market"),i=K(e.collection,"NFT collection"),a=mn(e.tokenId),s=pn(e.minPayoutRaw,"minPayoutRaw"),c=ht(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 wc({market:o,collection:i},t),d=u.evidence.attestation,p={blockHash:d.blockHash,requireCanonical:!0},[m,f,h]=await Promise.all([se(n,i,vt,"ownerOf",[BigInt(a)],p).then(P=>K(P[0],"NFT owner")),se(n,i,vt,"getApproved",[BigInt(a)],p).then(P=>K(P[0],"NFT approval")),se(n,i,vt,"isApprovedForAll",[r,o],p).then(P=>!!P[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),b=pn(e.confirmedNetPayoutRaw,"confirmedNetPayoutRaw");if(b!==g)throw new Error("stonkbrokers: confirmed sell economics do not match the exact fresh quote");let S=Number(t.nowMs??Date.now()),w=Math.min(6e4,Math.max(1e3,Number(e.ttlMs??3e4)||3e4)),y=K(u.paymentToken,"Anvil payment token"),k=Number(u.paymentTokenDecimals),v={from:r,maxFeePerGas:e.maxFeePerGasWei,maxPriorityFeePerGas:e.maxPriorityFeePerGasWei},x=[nx({...v,to:o,data:Ge.encodeFunctionData("sellNFT",[BigInt(a),g]),value:u.nativeSwapFeeWei,gasLimit:e.actionGasLimit,nonce:l})],E={netPayoutRaw:u.netPayoutRaw,grossPayoutRaw:u.grossPayoutRaw,feeRaw:u.fees.anvilFeeRaw,protocolFeeRaw:u.fees.protocolFeeRaw},_={version:1,surface:"evm-nft",action:"nft",nftAction:"sell",provider:"anvil-nft",owner:r,destination:o,contract:i,tokenId:a,paymentToken:y,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),marketCollection:u.evidence.marketCollection,anvilAttestation:d,anvilQuote:E,preconditions:{nftApprovalVerified:!0,approvedForAll:h,approvedAddress:f,exactQuoteConfirmed:!0,confirmedNetPayoutRaw:b.toString()},tradeId:tx(e.tradeId),slippageBps:0,expiresAtMs:S+w,fee:{oracleFeeBps:0},artifact:{chainId:X,owner:r,contract:i,marketCollection:u.evidence.marketCollection,tokenId:a,paymentToken:y,paymentTokenDecimals:k,nativeSwapFeeWei:u.nativeSwapFeeWei,anvilAttestation:d,anvilQuote:E,exactQuoteNetPayoutRaw:g.toString(),minPayoutRaw:g.toString(),transactions:x}};return rx(_,u)}async function lL(e={},t={}){if(Array.isArray(e.tokenIds)){let S=e.tokenIds.map(k=>mn(k)),w={kind:"anvil-inventory",chainId:X,market:K(e.market,"Anvil market"),collection:K(e.collection,"NFT collection"),total:S.length,contentHash:Mp("sha256").update(io(S)).digest("hex")},y=Up(e.inventoryCompletenessEvidence,w,Number(t.nowMs??Date.now()),t.completenessEvidenceSecret||t.gasEvidenceSecret||process.env.ORACLE_ROUTE_ATTESTATION_SECRET);return{ids:S,total:S.length,scanned:S.length,complete:y.valid,continuation:y.valid?null:{offset:S.length,evidenceRequired:!0},completenessEvidence:y.evidence,completenessError:y.error}}let n=Lt(t),r=K(e.market,"Anvil market"),o=yc(await n(X,"eth_blockNumber",[])),i=await n(X,"eth_getBlockByNumber",[o,!1]),a=String(i?.hash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(a)||yc(i?.number)!==o)throw new Error("stonkbrokers: Anvil inventory block attestation is invalid");let s={blockHash:a,requireCanonical:!0},c=await se(n,r,Ge,"inventoryLength",[],s),l=Number(c[0]);if(!Number.isSafeInteger(l)||l<0||l>gr)throw new Error(`stonkbrokers: Anvil inventory length exceeds safety maximum ${gr}`);let u=Object.hasOwn(e,"maxItems")&&e.maxItems!=null,d=Number(e.maxItems);if(u&&(!Number.isSafeInteger(d)||d<1||d>gr))throw new Error(`stonkbrokers: maxItems must be an integer from 1 through ${gr}`);let p=u?Math.min(d,l):l,m={source:"anvil-inventoryLength-linked-list",market:r,blockNumber:BigInt(o).toString(),blockHash:a,boundedMaximum:gr};if(l===0)return{ids:[],total:0,scanned:0,complete:!0,continuation:null,completenessEvidence:m};let f=BigInt((await se(n,r,Ge,"oldestTokenId",[],s))[0]),h=[],g=new Set;for(;h.length<l&&h.length<p&&!g.has(f.toString());){let S=f.toString();g.add(S),h.push(S),f=BigInt((await se(n,r,Ge,"getNextTokenId",[f],s))[0])}let b=h.length===l;return{ids:h,total:l,scanned:h.length,complete:b,continuation:b?null:{offset:h.length,tokenId:f.toString()},completenessEvidence:m}}function uL(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 dL(e,t,n){let r=Lt(n);try{let o=String((await se(r,e,vt,"tokenURI",[BigInt(t)]))[0]),i=uL(o);if(i)return i;let a=o.startsWith("ipfs://")?`https://ipfs.io/ipfs/${o.slice(7)}`:o;return await A(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 se(r,e,vt,"rarityOf",[BigInt(t)]);return{attributes:[{trait_type:"Stars",value:Number(i[0])+1}],metadataFallback:"rarityOf"}}}function ax(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 pL(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 bc(e={},t={}){let n=K(e.market,"Anvil market"),r=K(e.collection,"NFT collection"),o=await lL({...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=Lt(t),p=(await ot(i,s,async h=>{try{let g=await se(u,r,vt,"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 ot(p,s,async h=>{try{let g=await Ki({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:X,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 ot(i,s,async u=>{try{let[d,p]=await Promise.all([dL(r,u,t),Ki({market:n,collection:r,tokenId:u},t)]),m=ax(d,e.traitType||"Stars"),f=Array.isArray(e.traitFilters)?e.traitFilters:[];return(f.length?pL(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:X,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 sx(e,t){let n=e.collectionProfiles&&typeof e.collectionProfiles=="object"?e.collectionProfiles:{};return n[t]||n[t.toLowerCase()]||{}}function Wb(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 cx(e={}){return{maxMarkets:Wb(e,"maxMarkets",gr),maxItemsPerMarket:Wb(e,"maxItemsPerMarket",gr)}}function lx(e,t,n){let r=t.includeEmpty===!1?e.filter(o=>o.inventoryCount>0):e;return n==null?r:r.slice(0,n)}function Gi(e,t){let n=Number(t?.inventoryTotal??e.inventoryCount??0),r=Number(e.inventoryCount??0),o=Number(t?.inventoryScanned??t?.scanned??0),i=Number.isFinite(o)?Math.min(Math.max(o,0),n):0,a=Number.isSafeInteger(n)&&n>=0&&n===r,s=!!(a&&t?.complete===!0&&t?.completenessEvidence&&i===n);return{inventoryTotal:n,inventoryScanned:i,inventoryTotalMatchesSnapshot:a,complete:s,truncated:!s,continuation:s?null:t?.continuation??{offset:i}}}function ux(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 dx(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=cx(e),o=await so(e,t),i=lx(o,e,n),a=t.scanCollection||bc,s=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),c=await ot(i,s,async l=>{let u=sx(e,l.collection);try{let d={...e,...u,market:l.market,collection:l.collection,includeAll:u.includeAll??!u.raritySource};r!=null&&(d.maxItems=r);let p=await a(d,t);return{...l,status:"ok",scan:p,...Gi(l,p)}}catch(d){return{...l,status:"error",error:String(d.message||d).slice(0,240),...Gi(l,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-live-scan",chainId:X,marketCount:i.length,...ux(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 px(e={},t={}){let{maxMarkets:n,maxItemsPerMarket:r}=cx(e),o=await so(e,t),i=o.snapshotCoverage?.complete===!0,a=lx(o,e,n),s=e.openseaSlugs&&typeof e.openseaSlugs=="object"?e.openseaSlugs:{},c=t.scanCrossVenue||Dp,l=Math.min(Math.max(Number(e.marketConcurrency??2)||2,1),4),u=await ot(a,l,async d=>{let p=sx(e,d.collection),m=String(p.slug||s[d.collection]||s[d.collection.toLowerCase()]||"").trim();if(!m)return{...d,decision:"WATCH",reason:"exact OpenSea collection slug is required",...Gi(d,null)};try{let f={...e,...p,market:d.market,collection:d.collection,slug:m,includeAll:p.includeAll??!p.raritySource};r!=null&&(f.maxItems=r);let h=await c(f,t),g=Gi(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),...Gi(d,null)}}});return{provider:"anvil-nft",source:"anvil-all-markets-opensea-exact-nft-arb",chainId:X,marketCount:a.length,...ux(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 Gb(e,t){return e>t?"ARB":"PASS"}async function mL(e={},t={}){let n=String(e.direction||""),r=ht(e.amountRaw,"conversion amountRaw");if(r<=0n)throw new Error("stonkbrokers: conversion amountRaw must be positive");let o=K(e.paymentToken,"Anvil payment token"),i={chainId:X,fee:e.fee,tickSpacing:e.tickSpacing,hooks:e.hooks,tryTiers:e.tryTiers,liquidityUsd:e.liquidityUsd},a={...t,rpcCall:Lt(t)};if(n==="acquire-exact-output"){let l=await(t.up33QuoteExactOut||Hb)({chainId:X,tokenIn:ft,tokenOut:o,amountOut:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!l?.error&&l?.amountIn!=null)return{direction:n,paymentToken:o,quoteToken:ft,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||Tu)({...i,tokenIn:ft,tokenOut:o,amountOut:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:ft,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||qb)({chainId:X,tokenIn:o,tokenOut:ft,amountIn:r.toString(),tickSpacing:e.up33TickSpacing??2e3},a);if(!s?.error&&s?.amountOut!=null)return{direction:n,paymentToken:o,quoteToken:ft,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||Sn)({...i,tokenIn:o,tokenOut:ft,amountIn:r.toString()},a);return{direction:n,paymentToken:o,quoteToken:ft,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 Kb(e,t){if(!e||typeof e!="object")throw new Error("exact payment-token conversion quote unavailable");let n=K(e.quoteToken,"conversion quote token");if(n!==ft)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=ht(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=ht(e.amountOutWei,"conversion amountOutWei");if(r<=0n)throw new Error("conversion amountOutWei must be positive");return{...e,quoteToken:n,amountOutWei:r.toString()}}function fL(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 io(e){return Array.isArray(e)?`[${e.map(io).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${io(e[t])}`).join(",")}}`:JSON.stringify(e)}function mx(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:eL("sha256",n).update(io(r)).digest("hex")}}function hL(e,t){return mx(e,t)}function Up(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=hL(e,r).mac,a=Buffer.from(o,"hex"),s=Buffer.from(i,"hex");if(!/^[0-9a-f]{64}$/.test(o)||a.length!==s.length||!Jb(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 gL(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:fL(e,t)}function $p(e,t,n,r,o,i){let a=gL(e,t,o.calldataHash,o.leg);try{if(!a||typeof a!="object")throw new Error(`${r} evidence is required`);if(Number(a.chainId)!==X)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=mx(a,i).mac,l=Buffer.from(s,"hex"),u=Buffer.from(c,"hex");if(!/^[0-9a-f]{64}$/.test(s)||l.length!==u.length||!Jb(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&&K(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=ht(m,`${r} evidence amountWei`);if(f<=0n)throw new Error(`${r} evidence amountWei must be positive`);let h=pn(a.gasLimit,`${r} evidence gasLimit`),g=pn(a.gasPriceWei,`${r} evidence gasPriceWei`);if(h*g!==f)throw new Error(`${r} evidence amount does not match gasLimit times gasPriceWei`);let b=a.simulation;if(!b||typeof b!="object"||Array.isArray(b))throw new Error(`${r} simulation evidence is required`);if(Number(b.chainId)!==X)throw new Error(`${r} simulation chainId mismatch`);if(String(b.route||"")!==t||String(b.leg||"")!==o.leg)throw new Error(`${r} simulation route or leg mismatch`);if(!String(b.source||"").trim())throw new Error(`${r} simulation source is required`);if(String(b.blockHash||"").toLowerCase()!==o.blockHash||String(b.blockNumber)!==o.blockNumber)throw new Error(`${r} simulation block mismatch`);if(String(b.calldataHash||"").toLowerCase()!==o.calldataHash)throw new Error(`${r} simulation calldata mismatch`);if(K(b.target,`${r} simulation target`)!==o.target)throw new Error(`${r} simulation target mismatch`);let w=K(b.sender,`${r} simulation sender`),y=K(b.owner,`${r} simulation owner`);if(!o.owner||w!==o.owner||y!==o.owner)throw new Error(`${r} simulation sender or owner mismatch`);if(String(ht(b.valueWei,`${r} simulation valueWei`))!==String(ht(o.valueWei,`${r} expected simulation valueWei`)))throw new Error(`${r} simulation value mismatch`);if(o.orderHash!=null&&String(b.orderHash||"").toLowerCase()!==o.orderHash)throw new Error(`${r} simulation order mismatch`);if(o.protocolAddress!=null&&K(b.protocolAddress,`${r} simulation protocol address`)!==o.protocolAddress)throw new Error(`${r} simulation protocol mismatch`);if(b.success!==!0||b.reverted!==!1||!/^0x(?:[0-9a-f]{2})*$/i.test(String(b.result??"")))throw new Error(`${r} simulation did not return a successful result`);let k=Number(b.quotedAtMs),v=Number(b.expiresAtMs);if(!Number.isFinite(k)||!Number.isFinite(v)||k>n||v<=n||v<=k)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 Yb(e){let t=K(e,"OpenSea payment token");if(t!==Fp&&t!==ft)throw new Error("OpenSea payment token is not Robinhood native or canonical WETH");return t}async function Dp(e={},t={}){let n=await bc(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=K(e.owner,"execution owner")}catch{}let a=(b,S,w,y={})=>({calldataHash:b==null?null:String(b).toLowerCase(),blockNumber:String(S?.blockNumber??""),blockHash:String(S?.blockHash||"").toLowerCase(),leg:w,owner:i,...y}),s=(b,S,w,y,k)=>$p(e.gasEvidence??e.gasCostEvidence,b,r,`${S} gas`,a(w,y,S,k),o),c=(b,S)=>{let w=null;try{w=K(b?.target,"conversion target")}catch{}let y=a(b?.calldataHash,b,"conversion",{target:w,valueWei:String(b?.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 k=$p(e.conversionGasEvidence??e.conversionGasCostEvidence,S,r,"conversion gas",y,o);if(k.amount!=null||b?.gasEstimate==null)return k;let v=$p(e.gasPriceEvidence,S,r,"gas price",{...y,leg:"conversion-gas-price"},o);if(v.amount==null)return{amount:null,evidence:null,error:v.error};let x=ht(b.gasEstimate,"conversion gasEstimate");return{amount:x*v.amount,evidence:{source:"quote-gas-estimate-times-bound-gas-price",route:S,leg:"conversion",gasEstimate:x.toString(),gasPriceEvidence:v.evidence},error:null}},l=(b,S,w,y,k)=>{try{let v=String(S?.orderHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(v))throw new Error("exact Seaport order hash is required");let x=K(S?.protocolAddress,"Seaport protocol address"),E=String(S?.executionCalldataHash||"").toLowerCase(),_=/^0x[0-9a-f]{64}$/.test(E)?E:null,P=y==="seaport-fulfillment"&&k===Fp?String(S?.priceWei??""):"0",N={orderHash:v,protocolAddress:x,target:x,valueWei:P},I=s(b,y,_,w,N);if(I.amount==null)throw new Error(I.error);if(I.evidence?.approvalChecked!==!0)throw new Error("fresh exact Seaport approval-state check is required");let L=I.evidence?.approvalRequired;if(typeof L!="boolean")throw new Error("exact Seaport approval requirement evidence is required");if(typeof S?.approvalRequired=="boolean"&&S.approvalRequired!==L)throw new Error("Seaport approval requirement evidence mismatch");let F=[I];if(L){let D=String(S?.approvalCalldataHash||"").toLowerCase(),R=/^0x[0-9a-f]{64}$/.test(D)?D:null,U=y==="seaport-offer-acceptance"?n.collection:k;F.push(s(b,"seaport-approval",R,w,{...N,target:U,valueWei:"0"}))}if(k===Fp){let D=b==="anvil-to-opensea"?"wrap-native-to-weth":"unwrap-weth-to-native",R=String(S?.prerequisiteCalldataHash||"").toLowerCase(),U=/^0x[0-9a-f]{64}$/.test(R)?R:null,Q=D==="wrap-native-to-weth"?String(S?.sellerNetWei??""):"0";F.push(s(b,D,U,w,{...N,target:ft,valueWei:Q}))}let O=F.find(D=>D.amount==null);if(O)throw new Error(O.error);return{amount:F.reduce((D,R)=>D+R.amount,0n),evidence:F.map(D=>D.evidence),error:null}}catch(v){return{amount:null,evidence:null,error:String(v.message||v)}}},u=ht(e.minNetWei,"minNetWei","0"),d=t.openSeaBestListing||ds,p=t.openSeaBestOffer||ps,m=t.paymentTokenConversion||(b=>mL({...b,fee:e.conversionFee,tickSpacing:e.conversionTickSpacing,hooks:e.conversionHooks,tryTiers:e.conversionTryTiers,liquidityUsd:e.conversionLiquidityUsd},t)),f=await wc({market:n.market,collection:n.collection},t),h=[];for(let b of n.candidates){let S=null;try{S=await p({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId},t)}catch{}let w=b.quote,y=Bp(Ge.encodeFunctionData("buySpecificNFT",[BigInt(b.tokenId),BigInt(w.totalCostRaw)])).toLowerCase(),k=s("anvil-to-opensea","anvil-call",y,w.evidence.attestation,{target:n.market,valueWei:w.nativeSwapFeeWei}),v=null,x=null;if(S)try{v=Yb(S.paymentToken)}catch(R){x=String(R.message||R)}let E=x||!S?{amount:null,evidence:null,error:x||"exact OpenSea offer is unavailable"}:l("anvil-to-opensea",S,w.evidence.attestation,"seaport-offer-acceptance",v),_={route:"anvil-to-opensea",tokenId:b.tokenId,stars:b.stars,paymentToken:w.paymentToken,amountUnits:w.amountUnits,anvilTotalCostRaw:w.totalCostRaw,anvilBaseCostRaw:w.baseCostRaw,anvilFeeRaw:w.fees.totalFeeRaw,paymentTokenDecimals:w.paymentTokenDecimals,nativeSwapFeeWei:w.nativeSwapFeeWei,openSeaGrossOfferWei:S?.grossOfferWei==null?null:String(S.grossOfferWei),openSeaSellingValueWei:S?.sellerNetWei==null?null:String(S.sellerNetWei),openSeaFeeWei:S?.feeWei==null?null:String(S.feeWei),openSeaPaymentToken:v,gasCostWei:k.amount==null?null:k.amount.toString(),gasEvidence:k.evidence,marketplaceGasCostWei:E.amount==null?null:E.amount.toString(),marketplaceGasEvidence:E.evidence,conversionGasCostWei:null};if(S?.sellerNetWei==null||!w.available)h.push({..._,netWei:null,decision:"WATCH",reason:"exact OpenSea seller net is unavailable or Anvil inventory is not executable"});else if(x)h.push({..._,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${x}`});else if(k.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${k.error}`});else if(E.amount==null)h.push({..._,netWei:null,decision:"WATCH",reason:`fresh exact Seaport and prerequisite gas evidence is required before net arbitrage can be calculated: ${E.error}`});else if(typeof m!="function")h.push({..._,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});else try{let R=Kb(await m({chainId:X,direction:"acquire-exact-output",amountRaw:w.totalCostRaw,paymentToken:w.paymentToken,quoteToken:ft}),{direction:"acquire-exact-output",amountRaw:w.totalCostRaw}),U=c(R,"anvil-to-opensea");if(U.amount==null)h.push({..._,conversion:R,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${U.error}`});else{let Q=k.amount+E.amount+U.amount,Y=BigInt(S.sellerNetWei)-BigInt(R.amountInWei)-BigInt(w.nativeSwapFeeWei)-Q;h.push({..._,conversionGasCostWei:U.amount.toString(),conversionGasEvidence:U.evidence,totalExecutionGasWei:Q.toString(),anvilCostInWethWei:R.amountInWei,conversion:R,netWei:Y.toString(),decision:Gb(Y,u),reason:Y>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(R){h.push({..._,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(R.message||R)}`})}let P=null;try{P=await d({chain:"robinhood",slug:e.slug,contract:n.collection,tokenId:b.tokenId,maxPages:e.openSeaListingMaxPages},t)}catch{}if(!P)continue;let N=Bp(Ge.encodeFunctionData("sellNFT",[BigInt(b.tokenId),BigInt(f.netPayoutRaw)])).toLowerCase(),I=s("opensea-to-anvil","anvil-call",N,f.evidence.attestation,{target:n.market,valueWei:f.nativeSwapFeeWei}),L=null,F=null;try{L=Yb(P.paymentToken)}catch(R){F=String(R.message||R)}let O=F?{amount:null,evidence:null,error:F}:l("opensea-to-anvil",P,f.evidence.attestation,"seaport-fulfillment",L),D={route:"opensea-to-anvil",tokenId:b.tokenId,stars:b.stars,paymentToken:f.paymentToken,amountUnits:f.amountUnits,openSeaBuyPriceWei:String(P.priceWei),anvilGrossPayoutRaw:f.grossPayoutRaw,anvilNetPayoutRaw:f.netPayoutRaw,anvilFeeRaw:f.fees.totalFeeRaw,paymentTokenDecimals:f.paymentTokenDecimals,nativeSwapFeeWei:f.nativeSwapFeeWei,openSeaPaymentToken:L,gasCostWei:I.amount==null?null:I.amount.toString(),gasEvidence:I.evidence,marketplaceGasCostWei:O.amount==null?null:O.amount.toString(),marketplaceGasEvidence:O.evidence,conversionGasCostWei:null};if(F){h.push({...D,netWei:null,decision:"WATCH",reason:`exact OpenSea payment token binding failed: ${F}`});continue}if(I.amount==null){h.push({...D,netWei:null,decision:"WATCH",reason:`fresh exact gas evidence is required before net arbitrage can be calculated: ${I.error}`});continue}if(O.amount==null){h.push({...D,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({...D,netWei:null,decision:"WATCH",reason:"exact payment-token to WETH conversion quote is required before unlike currency values can be compared"});continue}try{let R=Kb(await m({chainId:X,direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw,paymentToken:f.paymentToken,quoteToken:ft}),{direction:"liquidate-exact-input",amountRaw:f.netPayoutRaw}),U=c(R,"opensea-to-anvil");if(U.amount==null)h.push({...D,conversion:R,netWei:null,decision:"WATCH",reason:`fresh exact conversion gas evidence is required before net arbitrage can be calculated: ${U.error}`});else{let Q=I.amount+O.amount+U.amount,Y=BigInt(R.amountOutWei)-BigInt(P.priceWei)-BigInt(f.nativeSwapFeeWei)-Q;h.push({...D,conversionGasCostWei:U.amount.toString(),conversionGasEvidence:U.evidence,totalExecutionGasWei:Q.toString(),anvilPayoutInWethWei:R.amountOutWei,conversion:R,netWei:Y.toString(),decision:Gb(Y,u),reason:Y>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(R){h.push({...D,netWei:null,decision:"WATCH",reason:`exact payment-token conversion failed: ${String(R.message||R)}`})}}let g=n.complete===!0?h:h.map(b=>b.decision==="ARB"?{...b,netWei:null,decision:"WATCH",reason:"complete inventory coverage evidence is required before arbitrage classification"}:b);return{provider:"stonkbrokers",source:"anvil-opensea-exact-nft-arb",chainId:X,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((b,S)=>{let w=BigInt(b.netWei??"-1"),y=BigInt(S.netWei??"-1");return y>w?1:y<w?-1:0}),arbCount:g.filter(b=>b.decision==="ARB").length,exec:!1,readOnly:!0}}async function xc(e={},t={}){let n=Lt(t),r=mn(e.brokerTokenId,"brokerTokenId"),[o,i,a]=await Promise.all([se(n,kt.ammVault,zb,"quoteSpecificBuy",[BigInt(r)]),se(n,kt.ammVault,zb,"inventory",[BigInt(r)]),se(n,kt.nft,vt,"ownerOf",[BigInt(r)])]),s={quoteAvailable:!!o[2],inventory:!!i[0],ownerIsAmm:K(a[0],"broker owner")===kt.ammVault},c=s.quoteAvailable&&s.inventory&&s.ownerIsAmm;return{provider:"stonkbrokers",chainId:X,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 fx(e,t){try{return K((await se(t,kt.nft,vt,"tokenWallet",[BigInt(e)]))[0],"broker TBA")}catch{return K((await se(t,kt.nft,vt,"predictWallet",[BigInt(e)]))[0],"broker TBA")}}async function hx(e={},t={}){let n=Lt(t),r=Math.min(Math.max(Number(e.minStars??4)||4,1),5),i=(await ot(Array.isArray(e.candidates)?e.candidates:[],8,async a=>{let s=mn(a.brokerTokenId,"brokerTokenId"),c=mn(a.nestedTokenId,"nestedTokenId"),l=K(a.tba,"TBA"),u=K(a.nestedCollection,"nested collection"),d=ax({attributes:a.traits},e.traitType||"Stars");if(d==null||d<r)return null;let[p,m,f]=await Promise.all([fx(s,n),se(n,u,vt,"ownerOf",[BigInt(c)]).then(g=>K(g[0],"nested owner")),xc({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:X,count:i.length,candidates:i,exec:!1,readOnly:!0}}async function gx(e={},t={}){if(e.userConfirmed!==!0)throw new Error("stonkbrokers: userConfirmed=true required");let n=K(e.buyer,"buyer"),r=mn(e.brokerTokenId,"brokerTokenId"),o=ht(e.maxTokenCostWei,"maxTokenCostWei"),i=ht(e.maxEthFeeWei,"maxEthFeeWei"),a=await xc({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 $({provider:"stonkbrokers",kind:"stonkbroker-specific-buy-intent",action:"buy-specific-broker",chainId:X,buyer:n,localOnly:!0,requiresLocalVault:!0,transaction:null,intent:{brokerTokenId:r,market:kt.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 Yi(e={},t={}){let n=Lt(t),r=e.which==="overtime"?"overtime":"stock",o=r==="overtime"?kt.overtimeBooster:kt.stockBooster,[i,a,s,c,l,u]=await Promise.all([se(n,o,Mn,"pendingEth"),se(n,o,Mn,"minDropWei"),se(n,o,Mn,"roundActive"),se(n,o,Mn,"currentRound"),se(n,o,Mn,"roundState").catch(()=>null),se(n,o,Mn,"getStockTokens").catch(()=>null)]),d=BigInt(i[0]),p=BigInt(a[0]),m=!!s[0],f=!m&&d>=p,h=m;return{provider:"stonkbrokers",chainId:X,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=>K(g,"stock token")):[],canStart:f,canContinue:h,action:h?"continueDrop":f?"startDropPublic":"wait",exec:!1,readOnly:!0}}function yx(e={},t={}){let r=(e.which==="overtime"?"overtime":"stock")==="overtime"?kt.overtimeBooster:kt.stockBooster,o=e.mode==="continue"||e.mode==="continueDrop"?"continue":"start",i=o==="continue"?Mn.encodeFunctionData("continueDrop",[BigInt(Math.min(Math.max(Number(e.batchSize??50)||50,1),200))]):Mn.encodeFunctionData("startDropPublic",[BigInt(Math.min(Math.max(Number(e.minOutBps??0)||0,0),1e4))]);return $({provider:"stonkbrokers",kind:"stonkbrokers-clock-in",action:o==="continue"?"continueDrop":"startDropPublic",chainId:X,localOnly:!0,requiresLocalVault:!0,transaction:{chainId:X,to:r,data:i,value:"0"}},{provider:"stonkbrokers",kind:"stonkbrokers-clock-in",env:t.env})}async function wx(e={},t={}){let n=Array.isArray(e.brokerTokenIds)?e.brokerTokenIds.map(s=>mn(s,"brokerTokenId")):[],r=Lt(t),o=await ot(n,8,async s=>{let[c,l]=await Promise.all([se(r,kt.nft,vt,"ownerOf",[BigInt(s)]).then(u=>K(u[0],"broker owner")),fx(s,r)]);return{brokerTokenId:s,owner:c,tba:l}}),[i,a]=await Promise.all([Yi({which:"stock"},t),Yi({which:"overtime"},t).catch(s=>({error:String(s.message||s)}))]);return{provider:"stonkbrokers",chainId:X,owner:e.owner?K(e.owner,"owner"):null,brokers:o,clockIn:{stock:i,overtime:a},exec:!1,readOnly:!0}}async function bx(e={},t={}){try{let n=await so(e,t);return{ok:!0,chainId:X,marketCount:n.length,activeMarketCount:n.filter(r=>r.inventoryCount>0).length,readOnly:!0}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180),readOnly:!0}}}async function xx(e={},t={}){try{let n=await Yi({which:"stock"},t);return{ok:!0,chainId:X,blockRead:!0,action:n.action}}catch(n){return{ok:!1,chainId:X,error:String(n.message||n).slice(0,180)}}}ne();import{createHash as wL}from"node:crypto";var Sc="https://eips.ethereum.org/EIPS/eip-8004#registration-v1",bL=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"}]),yr=Object.freeze(Object.fromEntries(bL.map(e=>[e.name,e.selector]))),xL=new Set(["type","name","description","image","services","x402Support","active","registrations","supportedTrust"]),SL=new Set(["name","endpoint","version","skills","domains"]),kL=new Set(["agentId","agentRegistry"]),Sx=new Set(["reputation","crypto-economic","tee-attestation"]),vL=/(private.?key|secret|seed|mnemonic|password|signature|api.?key|bearer|authorization)/i,EL=64*1024;function Ji(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 qp(e,t,n){for(let r of Object.keys(e)){if(vL.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 co(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 kx(e,t,{service:n=!1}={}){let r=co(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 Hp(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 kc(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc8004: positive integer chainId required");return t}function jp(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 zp(e){let t=kc(process.env.ORACLE_ERC8004_CHAIN_ID);if(e!==t)throw new Error(`erc8004: chainId ${e} is not in registry allowlist`);return Hp(process.env.ORACLE_ERC8004_IDENTITY_REGISTRY,"allowlisted registry")}function Ex(){let e=[];try{let t=kc(process.env.ORACLE_ERC8004_CHAIN_ID);zp(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 AL(e){return JSON.parse(JSON.stringify(e))}function vc(e){let t=Ji(e,"registration file");if(qp(t,xL,"registration"),t.type!==Sc)throw new Error("erc8004: registration-v1 type required");let n={type:Sc,name:co(t.name,"name",128),description:co(t.description,"description",4096),image:kx(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=Ji(a,`services[${s}]`);qp(c,SL,`services[${s}]`);let l=co(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:kx(c.endpoint,`services[${s}].endpoint`,{service:!0})};c.version!=null&&(d.version=co(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=Ji(a,`registrations[${s}]`);qp(c,kL,`registrations[${s}]`);let l=jp(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>Sx.size||new Set(t.supportedTrust).size!==t.supportedTrust.length||t.supportedTrust.some(a=>!Sx.has(a)))throw new Error("erc8004: malformed supportedTrust");n.supportedTrust=[...t.supportedTrust]}let i=JSON.stringify(n);if(Buffer.byteLength(i)>EL)throw new Error("erc8004: registration metadata oversized");return AL(n)}function IL(e){if(Ji(e,"registration input"),Object.prototype.hasOwnProperty.call(e,"type")&&e.type!==Sc)throw new Error("erc8004: registration-v1 type required");return vc({type:Sc,...e})}function _L(e){let t=vc(e);return`data:application/json;base64,${Buffer.from(JSON.stringify(t),"utf8").toString("base64")}`}function Xi(e){return BigInt(e).toString(16).padStart(64,"0")}function Ax(e){let t=Buffer.from(e,"utf8").toString("hex");return`${Xi(t.length/2)}${t.padEnd(Math.ceil(t.length/64)*64,"0")}`}function PL(e){return`${yr.register}${Xi(32)}${Ax(e)}`}function TL(e,t){return`${yr.setAgentURI}${Xi(e)}${Xi(64)}${Ax(t)}`}function NL(e,t){return`${e}${Xi(t)}`}function CL(e){return wL("sha256").update(e,"utf8").digest("hex")}function Vp(e,t){Ji(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 Ix(e,t,{kind:n,uri:r,selector:o,data:i,id:a}){let s=kc(e.chainId),c=Hp(e.owner,"owner"),l=zp(s),u=Number(t?.nowMs??Date.now());return $({chainId:s,registry:l,owner:c,taker:c,...a==null?{}:{agentId:Number(a)},agentURI:r,agentURIHash:CL(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 _x(e={},t={}){Vp(e,new Set(["chainId","owner","registration"]));let n=_L(IL(e.registration));return Ix(e,t,{kind:"erc8004-register",uri:n,selector:yr.register,data:PL(n)})}function Px(e={},t={}){Vp(e,new Set(["chainId","owner","agentId","agentURI"]));let n=jp(e.agentId),r=Tx(e.agentURI);return Ix(e,t,{kind:"erc8004-set-agent-uri",uri:r,selector:yr.setAgentURI,data:TL(n,r),id:n})}function Tx(e){let t=co(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 vc(o),t}function vx(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 Hp(`0x${e.slice(-40)}`,t)}function OL(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 Nx(e={},t={}){Vp(e,new Set(["chainId","agentId"]));let n=kc(e.chainId),r=jp(e.agentId),o=zp(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:NL(d,r)},"latest"]),[a,s,c]=await Promise.all([i(yr.ownerOf),i(yr.tokenURI),i(yr.getAgentWallet)]),l=Tx(OL(s,"tokenURI")),u=null;return l.startsWith("data:application/json;base64,")&&(u=vc(JSON.parse(Buffer.from(l.split(",")[1],"base64").toString("utf8")))),{chainId:n,registry:o,agentId:Number(r),owner:vx(a,"owner"),tokenURI:l,agentURI:l,agentWallet:vx(c,"agentWallet"),registration:u,readOnly:!0,custody:"public-keyless"}}Fr();_e();var Cx=999;async function Ox(e={}){let t={chainId:Cx,rpc:null,dex:null};try{t.rpc=await Mr(Cx,e)}catch(n){t.rpc={ok:!1,error:String(n.message||n).slice(0,120)}}try{let n=await Qo("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 Rx(e="HYPE",t={}){let r=(await Qo(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 Lx(e,t={}){return rr(e,t)}j();kn();ne();var $L="https://api-mainnet.magiceden.dev/v2",Qi=1e9;function $x(e={}){return dt({provider:"magiceden",defaultUrl:$L,hosts:["api-mainnet.magiceden.dev","api-devnet.magiceden.dev"],url:e.baseUrl||process.env.MAGICEDEN_API_URL})}function uo(e={}){return $x(e).baseUrl}function wr(e={}){return e.apiKey||process.env.MAGICEDEN_API_KEY||""}function po(e={}){let t=wr(e);return at({accept:"application/json"},{Authorization:t?`Bearer ${t}`:""},$x(e).trusted)}function Wp(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 lo(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 BL(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 ML(e){return Math.round(lo(e,"priceSol")*Qi)}function FL(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 UL({tokenMint:e,priceSol:t,expiry:n}){return`list ${e} on magiceden-sol for ${t} SOL until ${n}`}function DL(e,t){if(e.userConfirmed!==!0)throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");let n=UL(t);if(String(e.confirmation||e.confirmationPhrase||"").trim()!==n)throw new Error(`magiceden: confirmation must equal ${JSON.stringify(n)}`);return n}async function Bx(e={}){try{let t=await Gp({symbol:"mad_lads"},e);return{ok:!0,provider:"magiceden-sol",keyed:!!wr(e),readTier:"keyless",prepareTier:wr(e)?"keyed":"requires MAGICEDEN_API_KEY",floorPriceSol:t.floorPriceSol,exec:!1}}catch(t){return{ok:!1,provider:"magiceden-sol",keyed:!!wr(e),error:String(t?.message||t).slice(0,160),exec:!1}}}async function Gp(e={},t={}){let n=Wp(e.symbol||e.collection),r=await A(`${uo(t)}/collections/${encodeURIComponent(n)}/stats`,{headers:po(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/Qi:null,listedCount:r?.listedCount??null,volume24hrSol:r?.volume24hr!=null?Number(r.volume24hr)/Qi:null,avgPrice24hrSol:r?.avgPrice24hr!=null?Number(r.avgPrice24hr)/Qi:null,exec:!1,raw:r}}function Mx(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*Qi):null,tokenSize:e.tokenSize??1}}async function Fx(e={},t={}){let n=Wp(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(`${uo(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 A(i.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),s=(Array.isArray(a)?a:[]).map(Mx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",symbol:n,count:s.length,listings:s,exec:!1}}async function Ux(e={},t={}){let n=ve(e.tokenMint||e.mint,"tokenMint"),r=await A(`${uo(t)}/tokens/${encodeURIComponent(n)}/listings`,{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3}),o=(Array.isArray(r)?r:[]).map(Mx);return{provider:"magiceden-sol",chain:"solana-mainnet-beta",tokenMint:n,listings:o,exec:!1}}async function Dx(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");let n=ve(e.buyer||e.userPublicKey,"buyer"),r=ve(e.seller,"seller"),o=ve(e.tokenMint,"tokenMint"),i=ve(e.tokenATA||e.tokenAddress,"tokenATA"),a=ve(e.auctionHouse,"auctionHouse"),s=lo(e.priceSol??e.price,"priceSol"),c=e.maxPriceSol==null?s:lo(e.maxPriceSol,"maxPriceSol");if(s>c)throw new Error(`magiceden: listing price ${s} SOL exceeds maxPriceSol cap ${c} SOL`);let l=new URL(`${uo(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 A(l.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});an("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 $({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:ML(s),transaction:p,transactionEncoding:"base64",raw:u})}async function Ec(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");let n=ve(e.seller||e.userPublicKey,"seller"),r=ve(e.tokenMint,"tokenMint"),o=ve(e.tokenATA||e.tokenAddress,"tokenATA"),i=ve(e.auctionHouse,"auctionHouse"),a=lo(e.priceSol??e.price,"priceSol"),s=FL(e.expiry),c=DL(e,{tokenMint:r,priceSol:a,expiry:s}),l=new URL(`${uo(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",ve(e.sellerReferral,"sellerReferral")),s!=null&&l.searchParams.set("expiry",String(s));let u=await A(l.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3});an("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 $({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 qx(e={},t={}){if(!wr(t))throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");let n=ve(e.buyer||e.userPublicKey,"buyer"),r=Wp(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=lo(e.maxPriceSol,"maxPriceSol"),i=e.nftAmount==null?1:lo(e.nftAmount,"nftAmount");if(!Number.isInteger(i))throw new Error("magiceden: nftAmount must be a whole number");let a=new URL(`${uo(t)}/instructions/mint`);a.searchParams.set("symbol",r),a.searchParams.set("wallet",n),a.searchParams.set("nftAmount",String(i));let s=await A(a.toString(),{headers:po(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),c=BL(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`);an("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 $({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})}ne();pd();j();mt();var mo=8,Kp=10n**BigInt(mo),HL="0xa4b1",Hx=7,Yp=1,jL=2n**64n-1n;function zL(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 ea(e={}){return e.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet"}function ho(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 Zi(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>mo)throw new Error(`hl-staking: ${t} has more than ${mo} decimals`);let i=BigInt(r)*Kp+BigInt((o+"0".repeat(mo)).slice(0,mo)||"0");if(i<=0n)throw new Error(`hl-staking: ${t} must be greater than zero`);if(i>jL)throw new Error(`hl-staking: ${t} exceeds the uint64 range the signed action encodes`);return i.toString()}function fo(e){let t=BigInt(e);return t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):e}function fn(e){let t=BigInt(String(e||"0")),n=t/Kp,r=(t%Kp).toString().padStart(mo,"0").replace(/0+$/,"");return r?`${n}.${r}`:String(n)}async function jx(e={}){try{let t=await Jp(e);return{ok:t.count>0,provider:"hl-staking",chain:ea(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 Jp(e={}){let t=await be({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 Xp(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({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 Qp(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({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 zx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({type:"delegatorRewards",user:n},t);return{provider:"hl-staking",user:n,rewards:Array.isArray(r)?r:[],exec:!1}}async function Vx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await be({type:"delegatorHistory",user:n},t);return{provider:"hl-staking",user:n,history:Array.isArray(r)?r:[],exec:!1}}function Zp(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 Ac(e={}){return String(e.signatureChainId||process.env.HL_SIGNATURE_CHAIN_ID||HL)}function VL(e={}){return{name:"HyperliquidSignTransaction",version:"1",chainId:Number(BigInt(Ac(e))),verifyingContract:"0x0000000000000000000000000000000000000000"}}function em({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:ea(i),kind:e,prepareReady:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,requiresUserSignature:!0,signWith:"user wallet (EIP-712 typed data)",submitTo:zL(i),nonce:t.nonce,submitShape:{action:t,nonce:t.nonce,signature:"<user 65-byte signature>"},action:t,typedData:{domain:VL(i),types:n,primaryType:r,message:o},caps:s||null,notes:a,exec:!1};try{l.localSignerEnvelope=Ns(l,c,i)}catch(u){l.localSignerBlockedReason=String(u?.message||u).slice(0,200)}return l.oraclePrepared=!!l.localSignerEnvelope,$(l,{provider:"hl-staking",kind:e})}function Wx(e={},t={}){let n=Zi(e.amountHype??e.amount,"amountHype"),r=e.maxHype==null?null:Zi(e.maxHype,"maxHype");if(r&&BigInt(n)>BigInt(r))throw new Error(`hl-staking: amount ${fn(n)} HYPE exceeds maxHype cap ${fn(r)} HYPE`);let o=Zp(e),i=ea(t),a={type:"cDeposit",hyperliquidChain:i,signatureChainId:Ac(t),wei:fo(n),nonce:o};return em({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:fo(n),nonce:o},opts:t,args:e,caps:{amountHype:fn(n),maxHype:r?fn(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 Gx(e={},t={}){let n=Zi(e.amountHype??e.amount,"amountHype"),r=Zp(e),o=ea(t),i={type:"cWithdraw",hyperliquidChain:o,signatureChainId:Ac(t),wei:fo(n),nonce:r};return em({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:fo(n),nonce:r},opts:t,args:e,caps:{amountHype:fn(n)},notes:[`Starts the ${Hx} 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 Kx(e={},t={}){let n=ho(e.validator,"validator"),r=Zi(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:Zi(e.maxHype,"maxHype");if(!a&&s&&BigInt(r)>BigInt(s))throw new Error(`hl-staking: delegate amount ${fn(r)} HYPE exceeds maxHype cap ${fn(s)} HYPE`);let c=Zp(e),l=ea(t),u={type:"tokenDelegate",hyperliquidChain:l,signatureChainId:Ac(t),validator:n,wei:fo(r),isUndelegate:a,nonce:c};return em({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:fo(r),isUndelegate:a,nonce:c},opts:t,args:e,caps:{amountHype:fn(r),maxHype:s?fn(s):null,validator:n},notes:a?["Returns stake from the validator to your staking balance.",`Delegations carry a ${Yp} 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 ${Yp} day.`,"Check the validator's commission and jail status before delegating.","Oracle prepared this. Your wallet signs it. Nothing was submitted."]})}async function Yx(e={},t={}){let n=ho(e.user||e.address,"user"),r=await Xp({user:n},t),o=await Qp({user:n},t);return{provider:"hl-staking",user:n,stakingBalanceUndelegated:r.undelegatedWei,stakingBalanceDelegated:r.delegatedWei,pendingWithdrawals:r.nPendingWithdrawals,delegations:o.delegations,unstakingQueueDays:Hx,validatorLockupDays:Yp,exec:!1}}mt();async function tm(e={}){let t=Date.now();try{let n=await tn(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 GL=24*365,KL=8;function Ke(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function YL(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function Ic(e={},t={}){let[n,r]=await Promise.all([bt(t),tn(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=Ke(u.markPx),p=Ke(u.prevDayPx),m=Ke(u.openInterest),f=Ke(u.funding);return{coin:c.name,index:l,markPx:d,oraclePx:Ke(u.oraclePx),midPx:Ke(u.midPx)??Ke(r?.[c.name]),prevDayPx:p,change24hPct:YL(d,p),dayNtlVolumeUsd:Ke(u.dayNtlVlm),premium:Ke(u.premium),fundingRate:f,fundingRateAprPct:f==null?null:f*(GL/KL)*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 Jx(e={},t={}){let n=Math.max(1,Math.min(Number(e.limit)||10,50)),{markets:r,asOfMs:o,totals:i}=await Ic(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 Xx(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([Ic({},t),Vr({coin:n,interval:r,startTime:a,endTime:i},t).catch(()=>[]),zr(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:Ke(h.o),high:Ke(h.h),low:Ke(h.l),close:Ke(h.c),volume:Ke(h.v)})),p=l?.levels??[],m=Ke(p?.[0]?.[0]?.px),f=Ke(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 Qx(e={},t={}){let n=await vs(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 f$,readFileSync as h$,readdirSync as g$,renameSync as y$,writeFileSync as w$}from"node:fs";import{homedir as b$}from"node:os";import{join as Nc}from"node:path";var ta=Object.freeze({ALERT_ONLY:"alert_only",EXECUTE:"execute"});j();_e();ne();import{Interface as nm,getAddress as iS,isAddress as XL}from"ethers";var Zx=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),eS=Object.freeze({42161:{name:"arbitrum",api:Zx[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Zx[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}}),tS="0x0000000000000000000000000000000000000000",QL=`0x${"0".repeat(64)}`,nS=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),rS=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),_c=new nm(["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"]),aS=new nm(["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)"]),ZL=new nm(["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)"]),e$=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function yo(e){let t=Number(e??42161),n=eS[t];if(!n)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(eS).join(", ")})`);return{chainId:t,...n}}function Pc(e,t={}){let n=yo(e);return(t.baseUrl||n.api).replace(/\/$/,"")}function Et(e,t){if(!XL(e))throw new Error(`${t} must be a valid EVM address`);return iS(e)}function le(e){return iS(e).toLowerCase()}function go(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 br(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 t$(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 n$(e){let t=String(e||"marketIncrease").trim();if(!(t in nS))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:nS[t]}}function r$(e){let t=String(e||"noSwap").trim();if(!(t in rS))throw new Error(`gmx unsupported decreasePositionSwapType ${t}`);return{key:t,code:rS[t]}}function o$(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function i$(e,t){let n=le(t);return e.find(r=>le(r.marketToken||r.market||r.address)===n)||null}function a$(e,t){let n=le(t);return e.find(r=>le(r.tokenAddress||r.address)===n)||null}function s$({ticker:e,isLong:t,typeKey:n,maxSlippageBps:r}){let o=go(e?.minPrice,"gmx minPrice"),i=go(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 c$(e,t){let n=t?e.availableLiquidityLong:e.availableLiquidityShort;try{return BigInt(String(n??"0"))}catch{return 0n}}function l$(e){let t=String(e||"").toLowerCase();return/^0x[0-9a-f]{64}$/.test(t)?`0x${t.slice(-40)}`:null}function Vt(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 u$(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:Vt(t,"account",a=>le(a)),market:Vt(t,"market",a=>le(a)),initialCollateralToken:Vt(t,"initialCollateralToken",a=>le(a)),key:Vt(o,"key",a=>String(a).toLowerCase()),reason:Vt(i,"reason",a=>String(a)),sizeDeltaUsd:Vt(n,"sizeDeltaUsd",a=>BigInt(a).toString()),initialCollateralDeltaAmount:Vt(n,"initialCollateralDeltaAmount",a=>BigInt(a).toString()),executionFee:Vt(n,"executionFee",a=>BigInt(a).toString()),acceptablePrice:Vt(n,"acceptablePrice",a=>BigInt(a).toString()),isLong:Vt(r,"isLong",a=>!!a)}}function d$(e={},t){if(le(e.address)!==le(t.eventEmitter))return null;let n;try{n=ZL.parseLog({topics:e.topics,data:e.data})}catch{return null}let r=String(n?.args?.eventName||""),o=e$[r];if(!o)return null;let i=u$(n.args.eventData||{}),a=(i.key||String(n.args.topic1||"")).toLowerCase(),s=i.account||l$(n.args.topic2);return{eventName:r,status:o,orderKey:a,account:s?le(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 oS(e){return{executed:5,cancelled:4,frozen:3,created:2,updated:1}[e]||0}function p$(e=[],{chainId:t}={}){let n=yo(t);return(Array.isArray(e)?e:[]).map(r=>d$(r,n)).filter(Boolean).sort((r,o)=>(r.logIndex??0)-(o.logIndex??0))}async function sS(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/markets`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function rm(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/markets/info`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function cS(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/tokens`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function wo(e={},t={}){return A(`${Pc(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function lS(e={}){let t=await wo({chainId:42161},e);return{ok:Array.isArray(t)&&t.length>0,tickerSample:Array.isArray(t)?t.length:0}}async function uS(e={},t={}){let n=yo(e.chainId??42161),r=Et(e.account||e.owner||e.user,"gmx account"),o=br(e.start??0,"gmx start"),i=br(e.end??e.limit??20,"gmx end"),a=aS.encodeFunctionData("getAccountPositions",[n.dataStore,r,o,i]),c=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.reader,data:a},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),account:le(r),raw:c}}async function dS(e={},t={}){let n=yo(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=aS.encodeFunctionData("getOrder",[n.dataStore,r]),a=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.reader,data:o},e.blockTag||"latest"],t);return{provider:"gmx",chainId:n.chainId,reader:le(n.reader),dataStore:le(n.dataStore),key:r,raw:a}}async function pS(e={},t={}){let n=yo(e.chainId??42161),r=t.receipt||await Xo({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=p$(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)=>oS(d.status)>=oS(u.status)?d:u,s[0]),l=e.expectedAccount||e.account?le(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:le(n.eventEmitter),events:s,receipt:r}}async function mS(e={},t={}){let n=yo(e.chainId??42161),r=n$(e.orderType||e.type),o=r$(e.decreasePositionSwapType),i=Et(e.account||e.owner||e.from||e.sender||e.receiver,"gmx account"),a=Et(e.receiver||i,"gmx receiver"),s=Et(e.cancellationReceiver||a,"gmx cancellationReceiver"),c=e.callbackContract?Et(e.callbackContract,"gmx callbackContract"):tS,l=e.uiFeeReceiver?Et(e.uiFeeReceiver,"gmx uiFeeReceiver"):tS,u=Et(e.market||e.marketToken,"gmx market"),d=Et(e.initialCollateralToken||e.collateralToken||n.usdc,"gmx initialCollateralToken"),p=r.key==="marketIncrease"?go(e.initialCollateralDeltaAmount??e.collateralAmount??e.amountIn,"gmx initialCollateralDeltaAmount"):br(e.initialCollateralDeltaAmount??e.collateralAmount??"0","gmx initialCollateralDeltaAmount"),m=go(e.sizeDeltaUsd,"gmx sizeDeltaUsd"),f=go(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 b=t$(e.maxSlippageBps??e.slippageBps,50),S=e.isLong==null?!0:!!e.isLong,[w,y]=await Promise.all([rm({chainId:n.chainId},t),wo({chainId:n.chainId},t)]),k=i$(o$(w,"markets"),u);if(!k)throw new Error("gmx market not found in public registry");if(k.isListed===!1)throw new Error("gmx market is not listed");let v=Et(k.indexToken,"gmx market indexToken"),x=Et(k.longToken,"gmx market longToken"),E=Et(k.shortToken,"gmx market shortToken"),_=le(d);if(![le(x),le(E)].includes(_))throw new Error("gmx collateral token must match market longToken or shortToken for this guarded slice");let P=c$(k,S);if(P>0n&&m>P)throw new Error("gmx sizeDeltaUsd exceeds available market liquidity");let N=a$(y,v);if(!N)throw new Error("gmx index ticker not found");let I=e.acceptablePrice?go(e.acceptablePrice,"gmx acceptablePrice").toString():s$({ticker:N,isLong:S,typeKey:r.key,maxSlippageBps:b}),L=(e.swapPath||[]).map(we=>Et(we,"gmx swapPath market"));if(L.length>3)throw new Error("gmx swapPath too long for guarded slice");let F=br(e.triggerPrice??"0","gmx triggerPrice"),O=br(e.callbackGasLimit??"0","gmx callbackGasLimit"),D=br(e.minOutputAmount??"0","gmx minOutputAmount"),R=br(e.validFromTime??"0","gmx validFromTime"),U=!!e.shouldUnwrapNativeToken,Q=e.autoCancel==null?!0:!!e.autoCancel,Y=String(e.referralCode||QL);if(!/^0x[0-9a-fA-F]{64}$/.test(Y))throw new Error("gmx referralCode must be bytes32 hex");let Re=Array.isArray(e.dataList)?e.dataList:[];for(let we of Re)if(!/^0x[0-9a-fA-F]{64}$/.test(String(we)))throw new Error("gmx dataList entries must be bytes32 hex");let lt={addresses:{receiver:a,cancellationReceiver:s,callbackContract:c,uiFeeReceiver:l,market:u,initialCollateralToken:d,swapPath:L},numbers:{sizeDeltaUsd:m,initialCollateralDeltaAmount:p,triggerPrice:F,acceptablePrice:BigInt(I),executionFee:f,callbackGasLimit:O,minOutputAmount:D,validFromTime:R},orderType:r.code,decreasePositionSwapType:o.code,isLong:S,shouldUnwrapNativeToken:U,autoCancel:Q,referralCode:Y,dataList:Re},q=[];r.key==="marketIncrease"&&p>0n&&q.push(_c.encodeFunctionData("sendTokens",[d,n.orderVault,p])),q.push(_c.encodeFunctionData("sendWnt",[n.orderVault,f])),q.push(_c.encodeFunctionData("createOrder",[lt]));let H=_c.encodeFunctionData("multicall",[q]),te={mode:"gmx-order",provider:"gmx",chainId:n.chainId,chain:n.name,orderType:r.key,orderTypeCode:r.code,decreasePositionSwapType:o.key,account:le(i),receiver:le(a),exchangeRouter:le(n.exchangeRouter),router:le(n.router),orderVault:le(n.orderVault),market:le(u),indexToken:le(v),initialCollateralToken:le(d),initialCollateralDeltaAmount:p.toString(),sizeDeltaUsd:m.toString(),executionFee:f.toString(),acceptablePrice:I,maxSlippageBps:b,isLong:S,asyncExecution:!0,issuedAtMs:Number(t.nowMs??Date.now())};return $({provider:"gmx",chainId:n.chainId,chain:n.name,orderReady:!0,executionReady:!1,asyncExecution:!0,orderType:r.key,market:le(u),requiresApproval:r.key==="marketIncrease"&&p>0n?{token:le(d),spender:le(n.router),amount:p.toString()}:null,gmxGuard:te,transaction:{chainId:n.chainId,from:le(i),to:le(n.exchangeRouter),data:H,value:f.toString(),gmxGuard:te}},{provider:"gmx",kind:"gmx-order"})}mt();var Fn="oracle.hl.entry-state.v1",x$=8,S$=24*365;function Se(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function bo(e){return e==null||e===0?0:e>0?1:-1}function na(e,t){return e==null||t==null||t===0?null:(e-t)/t*1e4}function k$(e={}){return e.configDir||process.env.ORACLE_CONFIG_DIR||Nc(b$(),".config","oracle")}function gS(e={}){return Nc(k$(e),"hl-entry-states")}function Tc(e,t,n){return n==null&&e.push(t),n}function v$(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 hn(e,t){return{source:e,asOfMs:null,unknown:!0,reason:t||"unavailable"}}function E$(e,{coin:t,asOfMs:n}={}){let o=(Array.isArray(e)?e:[]).map(a=>({t:Se(a.time),rate:Se(a.fundingRate)})).filter(a=>a.t!=null&&a.rate!=null).sort((a,s)=>a.t-s.t);if(!o.length)return hn("hl-info.fundingHistory","empty");let i=0;for(let a=1;a<o.length;a+=1)bo(o[a].rate)!==bo(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 A$(e,t=Date.now()){let n=e?.peggedAssets;if(!Array.isArray(n)||!n.length)return hn("defillama.stablecoins","empty");let r=0,o=0;for(let i of n){let a=i.circulating||{},s=Se(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}:hn("defillama.stablecoins","no peggedUSD")}function fS(e,t){let n=Se(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 I$(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 hn("gmx.tickers","no matching symbol");let c=fS(s.minPrice,n),l=fS(s.maxPrice,n),u=c==null||l==null?null:(c+l)/2;if(u==null||u<=0)return hn("gmx.tickers","unreadable price");let d=n!=null&&n>0?na(u,n):null;return n!=null&&(u<n*.5||u>n*1.5)?hn("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 _$({coin:e,hlMark:t,asOfMs:n,fundingHistory:r=null,llamaStables:o=null,gmxTickers:i=null}={}){return{fundingPath:r==null?hn("hl-info.fundingHistory","not fetched"):E$(r,{coin:e,asOfMs:n}),llamaStables:o==null?hn("defillama.stablecoins","not fetched"):A$(o,n),gmxTicker:i==null?hn("gmx.tickers","not fetched"):I$(i,{coin:e,hlMark:t,asOfMs:n})}}function hS(e,t,n){let r=Array.isArray(e)?e:[],o=0,i=0;for(let s of r){let c=Se(s?.px),l=Se(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 P$(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=Se(i.szi),s=Se(i.positionValue)!=null&&a?Math.abs(Se(i.positionValue)/a):null,c=Se(i.entryPx),l=Se(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:Se(i.leverage?.value??i.leverage),liqDistancePct:d,unknown:m}}function T$({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:Fn,venue:"hyperliquid",coin:null,asOfMs:a,unknown:["coin"],verdict:"no"};let d=v$(n,e);if(!d)return{schema:Fn,venue:"hyperliquid",coin:String(e).toUpperCase(),asOfMs:a,unknown:["market"],verdict:"no"};let{asset:p,ctx:m}=d,f=Tc(u,"markPx",Se(m.markPx)),h=Tc(u,"oraclePx",Se(m.oraclePx)),g=Se(m.midPx),b=Se(m.premium),S=Tc(u,"fundingRate",Se(m.funding)),w=Tc(u,"openInterestCoin",Se(m.openInterest)),y=Se(m.dayNtlVlm),k=Array.isArray(m.impactPxs)?m.impactPxs:[],v=Se(k[0]),x=Se(k[1]),E=S==null?null:S*(S$/x$)*100,_=w==null||f==null?null:w*f,P=i==null||i===0||w==null?null:(w-i)/i*100;P==null&&u.push("oiDeltaPct");let N=r?.levels,I=Array.isArray(N)?N[0]:[],L=Array.isArray(N)?N[1]:[],F=Se(I?.[0]?.px),O=Se(L?.[0]?.px);F==null&&u.push("book.bidPx"),O==null&&u.push("book.askPx");let D=hS(L,Number(t)||0,"buy"),R=hS(I,Number(t)||0,"sell");D.fillable||u.push("book.buyFillable"),R.fillable||u.push("book.sellFillable");let U=g??f,Q=D.avgFillPx==null||U==null?null:na(D.avgFillPx,U),Y=R.avgFillPx==null||U==null?null:na(U,R.avgFillPx),Re=P$(o,e);for(let te of Re.unknown||[])u.push(te);let lt=Se(m.prevDayPx),q=f==null||lt==null||lt===0?null:(f-lt)/lt*100;q==null&&u.push("change24hPct");let H=_$({coin:String(p.name),hlMark:f,asOfMs:a,fundingHistory:s,llamaStables:c,gmxTickers:l});return H.fundingPath.unknown&&u.push("overlays.fundingPath"),H.llamaStables.unknown&&u.push("overlays.llamaStables"),H.gmxTicker.unknown&&u.push("overlays.gmxTicker"),{schema:Fn,venue:"hyperliquid",coin:String(p.name),asOfMs:a,markPx:f,oraclePx:h,midPx:g,premium:b,markOracleBps:na(f,h),fundingRate:S,fundingAprPct:E,openInterestCoin:w,openInterestUsd:_,oiDeltaPct:P,dayNtlVolumeUsd:y,change24hPct:q,impactBidPx:v,impactAskPx:x,maxLeverage:p.maxLeverage??null,book:{bidPx:F,askPx:O,spreadBps:F==null||O==null?null:na(O,F),notionalUsd:Number(t)||0,buy:D,sell:R,buySlipBps:Q,sellSlipBps:Y},position:Re,overlays:H,unknown:u,verdict:u.includes("market")?"no":u.length?"wait":"go"}}function yS(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 N$(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 C$({see:e,side:t,receipt:n,configDir:r}={},o={}){if(!e||e.schema!==Fn||!e.coin)throw new Error("entry snapshot refused: SEE object missing");let i=N$(n),a=yS(e,t);if(!a.side)throw new Error("entry snapshot refused: side must be long or short");let s={schema:Fn,id:`${e.coin}-${i.hash||`${i.oid}-${i.tid}`}`,lockedAtMs:Date.now(),side:a.side,receipt:i,see:e,qualify:a,actionMode:ta.ALERT_ONLY},c=gS({...o,configDir:r||o.configDir});f$(c,{recursive:!0,mode:448});let l=Nc(c,`${s.id}.json`),u=`${l}.${process.pid}.tmp`;return w$(u,`${JSON.stringify(s,null,2)}
|
|
148
|
+
`,{mode:384}),y$(u,l),s}function om(e={}){let t=gS(e),n=[];try{n=g$(t).filter(r=>r.endsWith(".json"))}catch{return[]}return n.map(r=>JSON.parse(h$(Nc(t,r),"utf8")))}function O$(e,t){let n=[];if(!e?.see||!t)return{alerts:n,actionMode:ta.ALERT_ONLY};let r=e.see,o=t;bo(r.fundingRate)!==bo(o.fundingRate)&&r.fundingRate!=null&&o.fundingRate!=null&&n.push({key:"fundingSign",level:"thesis-broke",from:r.fundingRate,to:o.fundingRate}),bo(r.premium)!==bo(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:Fn,id:e.id,coin:e.see.coin,side:e.side,actionMode:ta.ALERT_ONLY,alerts:n,verdict:n.some(d=>d.level==="thesis-broke")?"thesis-broke":n.length?"hold":"hold-ok",live:t}}async function wS(e={}){let t=Date.now();try{return{provider:"hl-entry-state",ok:!!(await bt(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 ra(e={},t={}){let n=e.coin,r=Se(e.notionalUsd)??1e4,o=Date.now(),[i,a,s,c,l,u]=await Promise.all([bt(t),n?zr(n,t).catch(()=>null):Promise.resolve(null),e.user?Wr(e.user,t).catch(()=>null):Promise.resolve(null),n?ks({coin:n,startTime:o-24*3600*1e3,endTime:o},t).catch(()=>null):Promise.resolve(null),Ws({},t).catch(()=>null),wo({chainId:42161},t).catch(()=>null)]);return T$({coin:n,notionalUsd:r,meta:i,book:a,userState:s,priorOiCoin:Se(e.priorOiCoin),asOfMs:o,fundingHistory:c,llamaStables:l,gmxTickers:u})}async function bS(e={},t={}){let n=e.see&&e.see.schema===Fn?e.see:await ra(e,t);return{see:n,...yS(n,e.side)}}async function xS(e={},t={}){let n=e.see&&e.see.schema===Fn?e.see:await ra(e,t);return C$({see:n,side:e.side,receipt:e.receipt,configDir:t.configDir},t)}async function SS(e={},t={}){let n=e.locked||om(t).find(o=>o.id===e.id||o.see?.coin===e.coin);if(!n)return{ok:!1,error:"no locked entry",actionMode:ta.ALERT_ONLY};let r=await ra({coin:n.see.coin,notionalUsd:n.see.book?.notionalUsd,user:e.user,priorOiCoin:n.see.openInterestCoin},t);return O$(n,r)}mt();Ts();Ls();async function kS(e={}){let t=await hi(e);return{provider:"hl-outcome",kind:"outcome-meta",outcomes:t?.outcomes||[],questions:t?.questions||[]}}async function vS(e={},t={}){let n=e.coin,r=e.outcome==null?null:An(e.outcome,0).outcome,o=typeof e.side=="string"&&["buy","sell"].includes(e.side.toLowerCase())?e.side.toLowerCase():null,i;e.outcomeSide!=null?i=AS(e.outcomeSide):(i=o?null:e.side,i!=null&&(i=im(i)));let a=n==null?null:In(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 hi(t))?.outcomes||[]).find(f=>{try{return An(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=im(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=An(r,i).coin}if(a=In(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,Jr(c,t)}async function ES(e={},t={}){let n=e.coin,r=e.outcome==null?null:An(e.outcome,0).outcome,o;if(e.outcomeSide!=null?o=AS(e.outcomeSide):(o=e.side,o!=null&&(o=im(o))),!n&&r!=null){if(o==null)throw new Error("hl-outcome: cancel requires explicit side when coin is omitted");n=An(r,o).coin}let i=In(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,Ai(a,t)}function AS(e){if(e===0||e===1)return e;throw new Error("hl-outcome: outcome side must be 0 or 1")}function im(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")}ne();Gr();var lz="0x"+"00".repeat(32);function $$(e){let t=typeof e=="bigint"?e:St(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 IS(e,t){let n=St(e.makerAmount,"poly: makerAmount"),r=St(e.takerAmount,"poly: takerAmount");return $$(t==="BUY"?n:r)}Gr();var B$=new Set(["https://clob.polymarket.com/order"]),oa=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),mz=Object.freeze(oa.map(e=>e[0])),M$=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),F$="0xe111180000d2663c0091e4f400237545b87b996b",U$="0xe2222d279d744050d28e00520010520000310f59",_S=(e,t,n=256)=>{if(typeof e!="string"||!e||e.length>n)throw new Error(`poly: bounded ${t} required`);return e};function PS(e){let t=String(e||"").replace(/\/$/,"");if(!B$.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function TS(e){let t=xt(e,"poly: exchange").toLowerCase();if(!M$.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function NS(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=_S(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(xt(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(PS(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(TS(o.verifyingContract),TS(n.exchange),xt(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==xt(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?U$:F$;if(xt(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!==oa.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let x=0;x<oa.length;x+=1)if(s[x]?.name!==oa[x][0]||s[x]?.type!==oa[x][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(xt(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(xt(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=_S(n.tokenId,"tokenId",80);if(xt(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=St(a.makerAmount,"poly: makerAmount"),m=St(a.takerAmount,"poly: takerAmount"),f=St(n.makerAmount,"poly: prepared makerAmount"),h=St(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,b=d==="BUY"?m:p,S=Be(n.quantity,6,"poly: quantity");if(S<=0n||S!==b)throw new Error("poly: quantity must match CLOB v2 amounts");let w=Be(n.price,6,"poly: price");if(w<=0n||w>=1000000n)throw new Error("poly: price must be within (0,1)");if(b*w!==g*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(Be(n.notionalUsdc,6,"poly: notionalUsdc")!==g)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let k=IS(a,d);if(Be(k,6,"poly: displayed notionalUsdc")!==g)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let v=t.maxNotionalUsd??t.maxNotionalUsdc;if(v!=null){let x=Be(v,6,"poly: maxNotionalUsd");if(g>x)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:k,submitTo:PS(n.submitTo)})}function D$(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 CS(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:D$({...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 NS(a,{polyTokens:t.polyTokens||["*"],maxNotionalUsd:t.maxNotionalUsd??t.maxNotionalUsdc??Number.MAX_SAFE_INTEGER}),a}import{createHmac as xz,randomInt as q$}from"node:crypto";import{keccak256 as kz,concat as vz,zeroPadValue as Ez,getCreate2Address as Az,AbiCoder as Iz}from"ethers";var BS=137;var H$="0xE111180000d2663C0091e4f400237545B87B996B",j$="0xe2222d279d744050d28e00520010520000310F59",OS="0x0000000000000000000000000000000000000000000000000000000000000000",am=6;var z$={name:"Polymarket CTF Exchange",version:"2",chainId:BS},V$={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"}]},RS={"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 Cc(e){let t=String(e);return t.includes(".")?t.split(".")[1].replace(/0+$/,"").length:0}function Oc(e,t){let n=10**t;return Math.floor(e*n+1e-12)/n}function LS(e,t){let n=10**t;return Math.ceil(e*n-1e-12)/n}function MS(e,t){let n=10**t;return Math.round(e*n+Number.EPSILON)/n}function W$(e,t,n,r){let o=MS(Number(n),r.price);if(e==="BUY"){let c=Oc(Number(t),r.size),l=c*o;return Cc(l)>r.amount&&(l=LS(l,r.amount+4),Cc(l)>r.amount&&(l=Oc(l,r.amount))),{rawMakerAmt:l,rawTakerAmt:c}}let a=Oc(Number(t),r.size),s=a*o;return Cc(s)>r.amount&&(s=LS(s,r.amount+4),Cc(s)>r.amount&&(s=Oc(s,r.amount))),{rawMakerAmt:a,rawTakerAmt:s}}function $S(e){let t=Number(e).toFixed(am),[n,r=""]=t.split(".");return(n+r.padEnd(am,"0").slice(0,am)).replace(/^0+/,"")||"0"}function G$(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=OS,builder:p=OS}=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=RS[String(c)]||RS["0.01"],g=MS(m,h.price),{rawMakerAmt:b,rawTakerAmt:S}=W$(n,f,g,h),w=$S(b),y=$S(S),k=String(q$(1,2**31-1)),v=Date.now().toString(),x=n==="BUY"?0:1,E=s?j$:H$,_={salt:k,maker:i,signer:a,tokenId:String(t),makerAmount:w,takerAmount:y,side:x,signatureType:u,timestamp:v,metadata:d,builder:p},P={...z$,verifyingContract:E},N=n==="BUY"?b:S;return{domain:P,types:V$,value:_,orderType:l,side:n,price:String(g),quantity:String(n==="BUY"?S:b),notionalUsdc:N,exchange:E,negRisk:s}}function FS(){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 US(e={},t={}){let n=G$(e),r={provider:"poly-clob",kind:"poly-order",chainId:BS,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=CS(r,e,t)}catch{r.oraclePrepared=!1}return $(r,{provider:"poly-clob",kind:"poly-order"})}import{ContractFactory as nB,keccak256 as QS}from"ethers";ne();qc();Mc();var rB=new Set(["status","chainId","forkBlockNumber","gasUsed","transactionHash","contractAddress","revertReason"]);function oB(e,t){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("prepareTemplateDeploy: localForkSimulationReceipt must be an object");let n=un(e);for(let o of Object.keys(n))if(!rB.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 ZS(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=WS(n,o),a=XS(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 nB(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}:{...oB(d,r),kind:"local-fork",injected:!0,trusted:!1,gateDecision:!1,networkSideEffects:!1},m={chainId:r,to:null,data:u,value:"0x0"};return $({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:QS(s),authorityReport:GS(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:QS(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:Uc},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"})}qc();pm();Ls();j();var gB="https://api.geckoterminal.com/api/v2",zc=(e={})=>(e.baseUrl||process.env.GECKOTERMINAL_API_URL||gB).replace(/\/$/,""),So=e=>encodeURIComponent(String(e));async function mm(e={},t={}){let n=Math.max(1,Number(e.page||1));return A(`${zc(t)}/networks?page=${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function sk(e={},t={}){if(!e.network||!e.poolAddress)throw new Error("network and poolAddress required");return A(`${zc(t)}/networks/${So(e.network)}/pools/${So(e.poolAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function ck(e={},t={}){if(!e.network||!(e.address||e.tokenAddress))throw new Error("network and token address required");return A(`${zc(t)}/networks/${So(e.network)}/tokens/${So(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function lk(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)),A(`${zc(t)}/networks/${So(e.network)}/pools/${So(e.poolAddress)}/ohlcv/${n}?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function uk(e={}){let t=await mm({page:1},e);return{ok:Array.isArray(t?.data)&&t.data.length>0,networkSample:t?.data?.length||0}}j();_e();Ye();ne();import{Interface as fk,getAddress as hk,isAddress as wB}from"ethers";var bB="https://api.curve.finance/v1",gk=(e={})=>(e.baseUrl||process.env.CURVE_API_URL||bB).replace(/\/$/,""),xB=Object.freeze({1:"0x45312ea0eFf7E09C83CBE249fa1d7598c4C8cd4e",10:"0x0DCDED3545D565bA3B19E683431381007245d983",56:"0xA72C85C258A81761433B4e8da60505Fe3Dd551CC",137:"0x0DCDED3545D565bA3B19E683431381007245d983",988:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",999:"0xd2002373543Ce3527023C75e7518C274A51ce712",4663:"0xFF5Cb29241F002fFeD2eAa224e3e996D24A6E8d1",8453:"0x4f37A9d177470499A2dD084621020b023fcffc1F",42161:"0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D",43114:"0x0DCDED3545D565bA3B19E683431381007245d983"}),yk="0x0000000000000000000000000000000000000000",fm=new fk(["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)"]),dk=new fk(["function coins(uint256) view returns (address)"]);function wk(e){let t=xB[Number(e)];if(!t)throw new Error(`curve-router-ng: unsupported chainId ${e}`);return t}function pa(e,t){if(!wB(e))throw new Error(`${t} must be a valid EVM address`);return hk(e)}function SB(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 pk(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 bk(e,t,n){return[e,t,n,...Array(8).fill(yk)]}function xk(e,t,n,r){return[[BigInt(e),BigInt(t),1n,BigInt(n),BigInt(r)],...Array.from({length:4},()=>[0n,0n,0n,0n,0n])]}function Sk(e){return[e,...Array(4).fill(yk)]}async function kB({chainId:e,pool:t,nCoins:n,rpcCall:r,opts:o}){let i=[];for(let a=0;a<n;a++){let s=dk.encodeFunctionData("coins",[a]),c=await r(e,"eth_call",[{to:t,data:s},o.blockTag||"latest"],o),l=dk.decodeFunctionResult("coins",c);i.push(hk(l[0]))}return i}function mk(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 kk(e={}){return A(`${gk(e)}/openapi.json`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}async function hm(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 A(`${gk(t)}/getPools/${n}/${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function vk(e={}){let t=await hm({chain:"ethereum",registry:"main"},e),n=t?.data?.poolData?.length||0;return{ok:t?.success===!0&&n>0,poolSample:n}}async function gm(e={},t={}){let n=Number(e.chainId??8453),r=wk(n),o=pa(e.pool,"curve pool"),i=pa(e.tokenIn,"curve tokenIn"),a=pa(e.tokenOut,"curve tokenOut"),s=SB(e.amountIn,"curve amountIn"),c=pk(e.nCoins??2,"curve nCoins",2,8),l=pk(e.poolType,"curve poolType",1,4),u=t.rpcCall||V,d=await kB({chainId:n,pool:o,nCoins:c,rpcCall:u,opts:t}),p=mk(d,i,"tokenIn"),m=mk(d,a,"tokenOut");if(p===m)throw new Error("Curve token indexes must differ");let f=bk(i,o,a),h=xk(p,m,l,c),g=Sk(o),b=fm.encodeFunctionData("get_dy",[f,h,s,g]),S=await u(n,"eth_call",[{to:r,data:b},e.blockTag||"latest"],t),w=fm.decodeFunctionResult("get_dy",S),y=BigInt(w[0]);if(y<=0n)throw new Error("curve quote returned zero output");return pe({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(k=>k.map(v=>v.toString())),pools:g},{chainId:n,venue:r,amountOut:y.toString(),liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps})}async function Ek(e={},t={}){let n=Number(e.chainId??8453),r=wk(n),o=pa(e.sender||e.from||e.fromAddress||e.receiver,"curve sender"),i=pa(e.receiver||e.recipient||o,"curve receiver"),a=await gm({...e,sender:o},t),s=bk(a.tokenIn,a.pool,a.tokenOut),c=xk(a.i,a.j,a.poolType,a.nCoins),l=Sk(a.pool),u=fm.encodeFunctionData("exchange",[s,c,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,i]);return $({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:Pe(a.autoSlippage,{chainId:n,venue:r,data:u})}},{provider:"curve",kind:"curve-tx"})}j();_e();ne();import{Interface as EB,getAddress as AB,isAddress as IB,keccak256 as Ak,toUtf8Bytes as Ik}from"ethers";var _B="https://api.morpho.org/graphql",Vc=new EB(["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)"]),PB=(e={})=>e.baseUrl||process.env.MORPHO_API_URL||_B;async function wm(e,t,n={}){return A(PB(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var TB="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 } } } }",NB="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 ma(e,t){let n=String(e||"").trim();if(!IB(n))throw new Error(`morpho: ${t} must be an address`);return AB(n).toLowerCase()}function CB(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 ym(e){return Array.isArray(e)?`[${e.map(ym).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ym(e[t])}`).join(",")}}`:JSON.stringify(e)}async function fa(e,t,n,r,o={}){let i=Vc.encodeFunctionData(n,r),s=await(o.rpcCall||V)(Number(e),"eth_call",[{to:t,data:i},"latest"],o);return Vc.decodeFunctionResult(n,s)}function OB(e,t){let n=t.toLowerCase();return(e||[]).find(r=>String(r?.address||"").toLowerCase()===n)||null}async function _k(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return wm(TB,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function bm(e={},t={}){let n=Math.min(100,Math.max(1,Number(e.first||20))),r=(e.chainIds||[e.chainId||1]).map(Number);return wm(NB,{first:n,chainIds:r,where:{chainId_in:r}},t)}async function Pk(e={}){return{ok:(await wm("query { __typename }",{},e))?.data?.__typename==="Query"}}async function Tk(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=ma(e.vault||e.vaultAddress,"vault"),i=ma(e.owner||e.from||e.sender,"owner"),a=ma(e.receiver||i,"receiver"),s=CB(e.amount||e.assets,"amount"),c=Number(e.minTotalAssetsUsd??1e5),l=await bm({chainId:n,first:100},t),u=OB(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 fa(n,o,"asset",[],t),m=ma(p,"vault asset");if((u?.asset?.address?ma(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[S]=await fa(n,o,"maxDeposit",[i],t);if(BigInt(s)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxDeposit");let[w]=await fa(n,o,"previewDeposit",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewDeposit returned zero shares");g={minSharesOut:w.toString()},h=Vc.encodeFunctionData("deposit",[s,a])}else{let[S]=await fa(n,o,"maxWithdraw",[i],t);if(BigInt(s)>BigInt(S.toString()))throw new Error("morpho: amount exceeds maxWithdraw");let[w]=await fa(n,o,"previewWithdraw",[s],t);if(BigInt(w.toString())<=0n)throw new Error("morpho: previewWithdraw returned zero shares");g={maxSharesIn:w.toString()},h=Vc.encodeFunctionData("withdraw",[s,a,i])}let b={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:Ak(Ik(h)),issuedAtMs:Date.now(),expiresAtMs:Date.now()+2e4};return b.guardHash=Ak(Ik(ym(b))),$({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:b,requiresApproval:r==="deposit"?{token:m,spender:o,amount:s}:null,transaction:{chainId:n,from:i,to:o,data:h,value:"0x0",madVault:b}},{provider:"morpho",kind:"erc4626-vault"})}j();_e();Ye();ne();import{Interface as LB,getAddress as xm,isAddress as $B}from"ethers";var BB="https://api-v3.balancer.fi/",MB=(e={})=>e.baseUrl||process.env.BALANCER_API_URL||BB;async function Ok(e,t,n={}){return A(MB(n),{method:"POST",body:{query:e,variables:t},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??2e4})}var FB="query Pools($first: Int, $where: GqlPoolFilter) { poolGetPools(first: $first, where: $where) { id address chain type protocolVersion dynamicData { totalLiquidity volume24h fees24h } } }",Nk=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"}}),UB="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",DB="0x0000000000000000000000000000000000000000",Sm=new LB(["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 Rk(e){let t=Number(e??8453),n=Nk[t];if(!n)throw new Error(`balancer-v3: unsupported chainId ${e} (supported: ${Object.keys(Nk).join(", ")})`);return{chainId:t,...n}}function Lk(e){let t=String(e||"").toLowerCase();return!t||t==="eth"||t==="native"||t===DB||t===UB.toLowerCase()}function Wc(e,t){if(!$B(e))throw new Error(`${t} must be a valid EVM address`);return xm(e)}function Ck(e,t,n){let r=String(e||"");return Lk(r)||/^weth$/i.test(r)?xm(t.weth):/^usdc$/i.test(r)?xm(t.usdc):Wc(r,n)}function qB(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 $k(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 Bk(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 Ok(FB,{first:n,chains:r,where:{chainIn:r}},t)}async function Mk(e={}){return{ok:(await Ok("query { __typename }",{},e))?.data?.__typename==="Query"}}async function km(e={},t={}){let n=Rk(e.chainId),r=Wc(e.pool,"balancer pool"),o=e.tokenIn||"WETH",i=Ck(o,n,"balancer tokenIn"),a=Ck(e.tokenOut||"USDC",n,"balancer tokenOut"),s=qB(e.amountIn,"balancer amountIn"),c=Wc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),l=Sm.encodeFunctionData("querySwapSingleTokenExactIn",[r,i,a,s,c,$k(e.userData)]),d=await(t.rpcCall||V)(n.chainId,"eth_call",[{to:n.router,data:l},e.blockTag||"latest"],t),p=Sm.decodeFunctionResult("querySwapSingleTokenExactIn",d),m=BigInt(p[0]);if(m<=0n)throw new Error("balancer quote returned zero output");return pe({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 Fk(e={},t={}){let n=Rk(e.chainId),r=Wc(e.sender||e.from||e.fromAddress||e.recipient,"balancer sender"),o=e.tokenIn||"WETH",i=Lk(o),a=await km({...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=Sm.encodeFunctionData("swapSingleTokenExactIn",[a.pool,a.tokenIn,a.tokenOut,BigInt(a.amountIn),BigInt(a.amountOutMinimum),l,u,$k(e.userData)]);return $({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:Pe(a.autoSlippage,{chainId:n.chainId,venue:n.router,data:d})}},{provider:"balancer",kind:"balancer-tx"})}j();Ye();ne();import{getAddress as jB}from"ethers";var zB="https://api-v2.pendle.finance/core",VB=Object.freeze({42161:"0x888888888889758F76e7103c6CbF23ABbF58F946",8453:"0x888888888889758F76e7103c6CbF23ABbF58F946"}),WB="0x0000000000000000000000000000000000000000",GB="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",Uk=(e={})=>(e.baseUrl||process.env.PENDLE_API_URL||zB).replace(/\/$/,"");function Gc(e,t){try{return jB(e)}catch{throw new Error(`${t} must be a valid EVM address`)}}function ko(e,t){return Gc(e,t).toLowerCase()}function KB(e){let t=String(e||"").toLowerCase();return t==="native"||t==="eth"||t===GB||t===WB}function vm(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 YB(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires inputs[]");return e.map((t,n)=>({token:Gc(t.token,`pendle input ${n} token`),amount:vm(t.amount,`pendle input ${n} amount`)}))}function JB(e){if(!Array.isArray(e)||e.length===0)throw new Error("pendle convert requires outputs[]");return e.map((t,n)=>Gc(t,`pendle output ${n} token`))}function XB(e){let t=VB[Number(e)];if(!t)throw new Error(`Pendle prepare not enabled for chainId ${e}`);return t}function QB(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 vm(t,"pendle output amount")}function ZB(e,t){let n=(Array.isArray(e)?e:[]).filter(r=>r?.token&&r?.amount&&!KB(r.token)).map(r=>({token:ko(r.token,"pendle approval token"),spender:ko(t,"pendle approval spender"),amount:vm(r.amount,"pendle approval amount")}));return n.length?n.length===1?n[0]:n:null}async function Em(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)),A(`${Uk(t)}/v1/${n}/markets?${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}async function Dk(e={}){let t=await Em({chainId:42161,limit:1},e);return{ok:Array.isArray(t?.results),marketSample:t?.results?.length||0}}async function Am(e={},t={}){let n=Number(e.chainId??42161),r=XB(n),o=e.from||e.fromAddress||e.userAddress||e.taker||e.receiver;if(!o)throw new Error("pendlePrepare requires from/receiver");let i=Gc(e.receiver||o,"pendle receiver"),a=YB(e.inputs),s=JB(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=it({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 A(`${Uk(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(ko(p.to,"pendle tx target")!==ko(r,"pendle router"))throw new Error("Pendle convert returned unexpected router target");if(p.from&&ko(p.from,"pendle tx sender")!==ko(o,"pendle sender"))throw new Error("Pendle convert transaction sender mismatch");let m=QB(u),f=pe(u,{chainId:n,venue:p.to,amountOut:m,liquidityUsd:e.liquidityUsd,priceChange5m:e.priceChange5m,requestedCapBps:e.maxSlippageBps??e.slippageBps});return $({provider:"pendle",calldataReady:!0,requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,chainId:n,action:u.action||null,quote:f,autoSlippage:f.autoSlippage,requiresApproval:ZB(u.requiredApprovals,p.to),transaction:{chainId:n,from:p.from||o,to:p.to,data:p.data,value:p.value??"0x0",slippageGuard:Pe(f.autoSlippage,{chainId:n,venue:p.to,data:p.data})}},{provider:"pendle",kind:"pendle-swap"})}async function qk(e={},t={}){let n=await Am(e,t),{transaction:r,...o}=n;return o}j();Ye();ne();import{isAddress as tM}from"ethers";var nM="https://api.odos.xyz",Im=(e={})=>(e.baseUrl||process.env.ODOS_API_URL||nM).replace(/\/$/,"");async function _m(e={}){return A(`${Im(e)}/info/chains`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs})}function rM(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(!tM(String(e.userAddr||"")))throw new Error("odos: valid userAddr required");return t}async function Hk(e={},t={}){let n=rM(e),r=it({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 A(`${Im(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 jk(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Hk(e,t);return{...pe(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 zk(e={},t={}){let{chainId:n,quote:r,amountOut:o}=await Hk(e,t),i=await A(`${Im(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=pe(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 $({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:Pe(s.autoSlippage,{chainId:n,venue:a.to,data:a.data})}},{provider:"odos",kind:"odos-tx"})}async function Vk(e={}){let t=await _m(e);return{ok:Array.isArray(t?.chains)&&t.chains.length>0,chainCount:t?.chains?.length||0}}j();var Wk=/[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]/g,iM=/[<>&`*_~[\]()|\\]/g,aM=/[\u0000-\u001F\u007F]/g;function Pm(e,{max:t=32,fallback:n=""}={}){return e==null?n:String(e).normalize("NFKC").replace(Wk,"").replace(aM,"").replace(iM,"").replace(/\s+/g," ").trim().slice(0,t).trim()||n}function Tm(e){if(e==null)return!1;let t=String(e);return Wk.test(t)?!0:/[\u0400-\u04FF\u0370-\u03FF]/.test(t)&&/[A-Za-z]/.test(t)}var Gk=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 Kc(e,t={}){let n=Number(e),r=t.baseUrl||Gk[n];if(!r)throw new Error(`Blockscout not configured for chainId ${n}`);return r.replace(/\/$/,"")}function Kk(e){return!!Gk[Number(e)]}async function Nm(e={},t={}){return A(`${Kc(e.chainId||1,t)}/api/v2/stats`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Yk(e={},t={}){if(!e.address)throw new Error("address required");return A(`${Kc(e.chainId||1,t)}/api/v2/addresses/${encodeURIComponent(e.address)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Jk(e={},t={}){if(!e.address&&!e.tokenAddress)throw new Error("token address required");return A(`${Kc(e.chainId||1,t)}/api/v2/tokens/${encodeURIComponent(e.address||e.tokenAddress)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function Xk(e={},t={}){if(!e.address)throw new Error("address required");let n=Number(e.chainId||1),r=`${Kc(n,t)}/api/v2/addresses/${encodeURIComponent(e.address)}/token-balances`,o=await A(r,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??18e3,headers:{accept:"application/json","user-agent":"OraclePortfolio/1.0"}});return Array.isArray(o)?o:[]}function Qk(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=Pm(o.symbol||o.name,{max:32,fallback:"TOKEN"}),u=Pm(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:Tm(o.symbol)||Tm(o.name)||void 0})}return n}async function Zk(e={}){let t=await Nm({chainId:8453},e);return{ok:t?.total_blocks!=null||t?.total_transactions!=null,chainId:8453}}import{getAddress as cM}from"ethers";j();_e();mt();var lM="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",tv=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 Un(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,...e[t]||{}}}function Yc(e,...t){for(let n of t){let r=String(e?.[n]||"").trim();if(r)return r}return null}function ev(e){if(!e)return null;try{return cM(String(e).trim().toLowerCase())}catch{throw new Error("portfolio: EVM address must be a valid 20-byte address")}}function kr(e={},t=process.env){let n=e.addresses||{},r=ev(n.evm||e.evmAddress||Yc(t,"ORACLE_EVM_ADDRESS","ORACLE_DEFAULT_ADDRESS","MAD_OPERATOR_ADDRESS")),o=n.solana||e.solanaAddress||Yc(t,"ORACLE_SOLANA_ADDRESS"),i=n.bitcoin||e.bitcoinAddress||Yc(t,"ORACLE_BITCOIN_ADDRESS"),a=ev(n.hyperliquid||e.hyperliquidAddress||Yc(t,"ORACLE_HYPERLIQUID_ADDRESS")||r);return{evm:r,solana:o?ve(o,"portfolio Solana address"):null,bitcoin:i?Ct(i,"portfolio Bitcoin address"):null,hyperliquid:a}}function ha(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 vo(e){let t=Number(e);return Number.isFinite(t)?t:null}function Jc(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function Dn(e){let t=Number(e);return Number.isFinite(t)&&t!==0}function nv(e,t){let n=tv[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 uM(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:ha(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 Cm(e,t){return{family:e,status:"unsupported",reason:t}}function Om(e,t){if(!e||e.status!=="ok")return e;let n=nv(t,e.symbol),r=vo(e.amount),o=r!=null&&n.priceUsd!=null?Jc(r*n.priceUsd):null;return{...e,price:n,usdValue:o}}async function rv(e={}){let t=kr({},e.env||process.env);return{ok:!0,provider:"portfolio",readOnly:!0,configuredFamilies:Object.entries(t).filter(([,n])=>!!n).map(([n])=>n)}}async function Xc(e={},t={}){let n=new Date().toISOString(),r=kr(e,t.env||process.env),o=e.includePrices!==!1,i=e.includeTokens!==!1,a=e.includeCollectibles!==!1,s=new Map(jr.map(q=>[q.chainId,q])),c=Array.isArray(e.evmChainIds)&&e.evmChainIds.length?[...new Set(e.evmChainIds.map(Number))]:[...s.keys()],l=[...new Set(Object.values(tv))],u=o?$e(()=>Ot(l,Un(t,"prices"))):Promise.resolve({ok:!1,ms:0,error:"price lookup disabled"}),d=ot(c,e.concurrency||5,async q=>{let H=s.get(q);if(!H)return{family:"evm",chainId:q,name:null,address:r.evm,status:"unsupported",error:"chainId is not in Oracle's configured EVM registry"};if(!r.evm)return{family:"evm",chainId:q,name:H.name,address:null,status:"not-configured",error:"set ORACLE_EVM_ADDRESS or pass addresses.evm"};let te={...Un(t,"evm"),rpcUrl:e.rpcUrls?.[q]||t.evm?.rpcUrls?.[q]},we=await $e(()=>nr(q,r.evm,te));if(!we.ok)return{family:"evm",chainId:q,name:H.name,address:r.evm,status:"unavailable",latencyMs:we.ms,error:we.error};let qe=H.nativeCurrency?.decimals??18,We=H.nativeCurrency?.symbol||"NATIVE",Z=we.data.balanceWei,Ee={status:i?"unavailable":"not-requested",assets:[],reason:i?"EVM JSON-RPC cannot enumerate wallet tokens without an address indexer":"token discovery disabled"};if(i&&Kk(q)){let Pt=await $e(()=>Xk({chainId:q,address:r.evm},{...Un(t,"blockscout"),timeoutMs:t.timeoutMs??18e3}));Pt.ok?Ee={status:"ok",assets:Qk(Pt.data,{fungibleOnly:!0}).map(Xt=>{let er=ha(Xt.amountRaw,Xt.decimals);return{...Xt,amount:er,priceUsd:null,usdValue:null}}),reason:null,source:"blockscout",latencyMs:Pt.ms}:Ee={status:"unavailable",assets:[],reason:Pt.error||"blockscout token-balances failed",source:"blockscout",latencyMs:Pt.ms}}return{family:"evm",chainId:q,name:H.name,address:r.evm,status:"ok",latencyMs:we.ms,native:{status:"ok",symbol:We,amountRaw:Z,decimals:qe,amount:ha(Z,qe)},fungibleTokens:Ee,collectibles:{status:a?"unavailable":"not-requested",assets:[],reason:a?"EVM JSON-RPC cannot enumerate wallet NFTs without an address indexer":"collectible discovery disabled"},source:Ee.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 q=Un(t,"solana"),H=await $e(()=>$s({address:r.solana},q)),te=i||a?await Promise.all([$e(()=>Ti({owner:r.solana,programId:$d},q)).then(Ee=>({...Ee,program:"spl-token"})),$e(()=>Ti({owner:r.solana,programId:lM},q)).then(Ee=>({...Ee,program:"token-2022"}))]):[],we=uM(te),qe=we.filter(Ee=>Ee.classification==="collectible-candidate"),We=we.filter(Ee=>Ee.classification!=="collectible-candidate"),Z=te.filter(Ee=>!Ee.ok).map(Ee=>Ee.error);return{family:"solana",name:"Solana Mainnet",address:r.solana,status:H.ok||te.some(Ee=>Ee.ok)?"ok":"unavailable",native:H.ok?{status:"ok",symbol:"SOL",amountRaw:H.data.lamports,decimals:9,amount:ha(H.data.lamports,9),slot:H.data.slot}:{status:"unavailable",symbol:"SOL",error:H.error},fungibleTokens:{status:i?Z.length===te.length?"unavailable":Z.length?"partial":"ok":"not-requested",assets:i?We:[],errors:Z,note:"SPL accounts are unverified until a metadata/indexer source confirms symbol and spam status"},collectibles:{status:a?Z.length===te.length?"unavailable":"partial":"not-requested",assets:a?qe:[],errors:Z,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 q=Un(t,"bitcoin"),H=Un(t,"bitcoinMeta"),[te,we,qe]=await Promise.all([$e(()=>Ms({address:r.bitcoin},q)),i?$e(()=>Us({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"token discovery disabled"}),a?$e(()=>eo({address:r.bitcoin},H)):Promise.resolve({ok:!1,ms:0,error:"collectible discovery disabled"})]),We=we.ok?we.data:null,Z=qe.ok?qe.data:null;return{family:"bitcoin",name:"Bitcoin Mainnet",address:r.bitcoin,status:te.ok||We?.ok||Z?.ok?"ok":"unavailable",native:te.ok?{status:"ok",symbol:"BTC",amountRaw:te.data.balanceSats,decimals:8,amount:ha(te.data.balanceSats,8)}:{status:"unavailable",symbol:"BTC",error:te.error},fungibleTokens:{status:i?We?.ok?"ok":"unavailable":"not-requested",assets:We?.balances||[],error:We?.ok?null:We?.error||we.error,verification:"indexer-reported"},collectibles:{status:a?Z?.ok?"ok":"unavailable":"not-requested",assets:Z?.inscriptions||[],error:Z?.ok?null:Z?.error||qe.error,unknownNotEmpty:!!Z?.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 q=Un(t,"hyperliquid"),[H,te,we]=await Promise.all([$e(()=>xs(r.hyperliquid,q)),$e(()=>Wr(r.hyperliquid,q)),$e(()=>tn(q))]),qe=(H.ok&&Array.isArray(H.data?.balances)?H.data.balances:[]).filter(Z=>Dn(Z.total)||Dn(Z.hold)).map(Z=>({coin:Z.coin||null,total:String(Z.total??"0"),hold:String(Z.hold??"0"),priceUsd:null,usdValue:null})),We=(te.ok&&Array.isArray(te.data?.assetPositions)?te.data.assetPositions:[]).map(Z=>Z.position||Z).filter(Z=>Dn(Z.szi)).map(Z=>({coin:Z.coin||null,size:String(Z.szi??"0"),entryPrice:Z.entryPx??null,positionValueUsd:Z.positionValue??null,unrealizedPnlUsd:Z.unrealizedPnl??null,liquidationPrice:Z.liquidationPx??null}));return{family:"hyperliquid",name:"Hyperliquid HyperCore",address:r.hyperliquid,status:H.ok||te.ok?"ok":"unavailable",spot:{status:H.ok?"ok":"unavailable",balances:qe,error:H.ok?null:H.error},perps:{status:te.ok?"ok":"unavailable",accountValueUsd:te.data?.marginSummary?.accountValue??null,withdrawableUsd:te.data?.withdrawable??null,positions:We,error:te.ok?null:te.error},mids:we.ok?we.data:{},source:"hyperliquid-info"}})(),[h,g,b,S,w]=await Promise.all([d,p,m,f,u]),y=w.ok?w.data:null,k=Object.freeze({1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax",81457:"blast",534352:"scroll",59144:"linea",324:"era"}),v=[];for(let q of h){if(q.family!=="evm"||q.fungibleTokens?.status!=="ok")continue;let H=k[q.chainId];if(H)for(let te of q.fungibleTokens.assets||[])te.address&&v.push(`${H}:${String(te.address).toLowerCase()}`)}let x=null;if(o&&v.length){let q=[...new Set(v)],H=await $e(()=>Ot(q,Un(t,"prices")));H.ok&&(x=H.data)}let E=h.map(q=>{let H=q.native?{...q,native:Om(q.native,y)}:q;if(H.fungibleTokens?.status==="ok"&&Array.isArray(H.fungibleTokens.assets)){let te=k[H.chainId],we=H.fungibleTokens.assets.map(qe=>{let We=String(qe.symbol||"").toUpperCase(),Z=null;if(["USDC","USDT","USDT0","DAI","USDBC","USDE","USDCE"].includes(We)&&(Z=1),Z==null&&te&&qe.address&&x?.coins){let Br=`${te}:${String(qe.address).toLowerCase()}`,Xt=x.coins[Br],er=Number(Xt?.price);Number.isFinite(er)&&er>0&&(Z=er)}let Ee=vo(qe.amount),Pt=Ee!=null&&Z!=null?Jc(Ee*Z):null;return{...qe,priceUsd:Z,usdValue:Pt}});H={...H,fungibleTokens:{...H.fungibleTokens,assets:we}}}return H});g.native&&(g.native=Om(g.native,y)),b.native&&(b.native=Om(b.native,y));let _=0,P=0,N=0;for(let q of[...E,g,b]){q.native?.status==="ok"&&Dn(q.native.amount)&&(q.native.usdValue!=null?(_+=q.native.usdValue,P+=1):N+=1);for(let H of q.fungibleTokens?.assets||[])!Dn(H.amount)&&!Dn(H.amountRaw)||(H.usdValue!=null?(_+=H.usdValue,P+=1):N+=1)}let I=nv(y,"HYPE");for(let q of S.spot?.balances||[]){let H=String(q.coin||"").toUpperCase(),te=H==="USDC"||H==="USDT"||H==="USDT0"?1:H==="HYPE"?I.priceUsd||vo(S.mids?.HYPE):vo(S.mids?.[q.coin]),we=vo(q.total);q.priceUsd=te,q.usdValue=we!=null&&te!=null?Jc(we*te):null,Dn(q.total)&&(q.usdValue!=null?(_+=q.usdValue,P+=1):N+=1)}let L=vo(S.perps?.accountValueUsd);L!=null&&L!==0&&(_+=L,P+=1);let F=[...g.fungibleTokens?.assets||[],...g.collectibles?.assets||[]].filter(q=>Dn(q.amount)).length,O=(b.fungibleTokens?.assets||[]).length+(b.collectibles?.assets||[]).length;N+=F+O;let D=[...E,g,b,S],R=q=>D.filter(H=>H.status===q).length,U=[],Q=E.filter(q=>q.fungibleTokens?.status==="unavailable"),Y=E.filter(q=>q.fungibleTokens?.status==="ok");Q.length&&!Y.length?U.push("EVM token discovery is unavailable without a working address indexer; native balances are still live."):Q.length&&U.push(`EVM token discovery partial: Blockscout covered ${Y.length} chain(s); ${Q.length} chain(s) still native-only.`),(g.fungibleTokens?.assets?.length||g.collectibles?.assets?.length)&&U.push("Solana token accounts are unverified and may include spam; collectible candidates are not confirmed NFTs."),b.collectibles?.unknownNotEmpty&&U.push("Bitcoin inscription holdings are unknown, not zero, because no address indexer is configured."),w.ok||U.push(`Price provider unavailable: ${w.error}`);let Re=[Cm("cosmos","requires a chain-specific bech32 address and LCD/RPC adapter"),Cm("sui","Sui balance adapter is not installed"),Cm("aptos","Aptos balance adapter is not installed")],lt=D.some(q=>["unavailable","partial","not-configured"].includes(q.fungibleTokens?.status)||["unavailable","partial","not-configured"].includes(q.collectibles?.status));return{provider:"portfolio",operation:"balances",readOnly:!0,queriedAt:n,addresses:r,coverage:{requestedSurfaces:D.length,ok:R("ok"),unavailable:R("unavailable"),notConfigured:R("not-configured"),unsupported:R("unsupported")+Re.length,evmChainsRequested:c.length,evmChainsOk:E.filter(q=>q.status==="ok").length},valuation:{knownUsd:Jc(_),label:"known priced value, not a complete portfolio total",pricedItems:P,unpricedNonzeroItems:N,complete:N===0&&!lt&&R("unavailable")===0&&R("not-configured")===0&&Re.length===0,priceSource:o?"DefiLlama":null,priceStatus:w.ok?"ok":"unavailable",priceQueriedAt:n},chains:[...E,g,b,S],unsupportedFamilies:Re,warnings:U}}import{constants as Zc}from"node:fs";import{chmod as $M,mkdir as BM,open as MM,readFile as FM}from"node:fs/promises";import{createHash as UM,randomUUID as DM}from"node:crypto";import qM from"node:os";import Ao from"node:path";j();j();var pM=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"]),mM=new Set(["image/jpeg","image/png","image/webp"]);function fM(e){let t=String(e||"").toLowerCase();return pM.some(n=>t===n||t.endsWith(`.${n}`))}function hM(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 ov(e){let t=hM(e),n;try{n=new URL(t)}catch{return null}return n.protocol!=="https:"||n.username||n.password||!fM(n.hostname)?null:n}async function gM(e,t={}){let n=t.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("gallery fetch unavailable");let r=ov(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 $e(()=>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=ov(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(!mM.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 Rm(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function yM(e,t){return e.name||e.collection||e.tokenId||`NFT ${t+1}`}async function iv(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 w of a){if(c>=l){s.push({item:w,image:null,error:"gallery page byte cap reached"});continue}try{let y=await gM(w.imageUrl||w.originalImageUrl,{...t,maxImageBytes:Math.min(Number(e.maxImageBytes??15e5),l-c)});c+=y.bytes,s.push({item:w,image:y,error:null})}catch(y){s.push({item:w,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,b=s.map(({item:w,image:y,error:k},v)=>{let x=v%u,E=Math.floor(v/u),_=x*d,P=m+E*p,N=y?`<image x="${_+14}" y="${P+14}" width="312" height="312" preserveAspectRatio="xMidYMid slice" href="data:${y.mimeType};base64,${y.data}"/>`:`<rect x="${_+14}" y="${P+14}" width="312" height="312" rx="14" fill="#151820"/><text x="${_+170}" y="${P+165}" text-anchor="middle" fill="#76808f" font-size="16">image unavailable</text>`,I=Rm(yM(w,v).slice(0,34)),L=Rm(w.chain||"unknown chain");return`${N}<text x="${_+16}" y="${P+350}" fill="#f3f5f7" font-size="17" font-weight="600">${I}</text><text x="${_+16}" y="${P+376}" fill="#8d98a8" font-size="13">${L}${k?" \xB7 placeholder":""}</text>`}).join(""),S=`<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 ${Rm(new Date().toISOString())}</text>${b}</svg>`;return{provider:"nft-portfolio",operation:"gallery",mimeType:"image/svg+xml",dataBase64:Buffer.from(S).toString("base64"),page:o,pageSize:r,totalPages:i,totalItems:n.length,renderedItems:s.filter(w=>w.image).length,placeholders:s.filter(w=>!w.image).map(w=>({assetKey:w.item.assetKey||null,name:w.item.name||null,sourceUrl:w.item.imageUrl||null,error:w.error})),rasterOnly:!0,externalScripts:!1}}var wM=[/\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],bM=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,xM=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i;function SM(e={}){let t=[],n=String(e.name||""),r=String(e.description||""),o=`${n} ${r}`;bM.test(n)&&t.push("url-in-name");let i=wM.filter(l=>l.test(o)).length;i>0&&t.push(`lure-language:${i}`),xM.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 av(e={}){let t=SM(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}ne();var kM=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"}]),vM=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 vr(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function ga(e,t){let n=await $e(t);return n.ok?{ok:!0,data:n.data}:{ok:!1,error:`${e}: ${n.error}`.slice(0,300)}}function EM(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 AM(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 IM(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 lv(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function _M(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 PM(e,t){let n=lv(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 TM(e){let t=new Map;for(let n of e){let r=lv(n);t.has(r)||t.set(r,n)}return[...t.values()]}function NM(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 uv(){return{ok:!0,provider:"nft-portfolio",readOnly:!0,marketplaces:["opensea","magiceden-sol","satflow"],listingExecution:"prepare-only"}}async function Eo(e={},t={}){let n=new Date().toISOString(),r=kr(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(y=>String(y).toLowerCase())):null,i=kM.filter(y=>!o||o.has(y.chain)),a=[],s=[],c=vr(t,"opensea"),l=r.evm?i.filter(y=>y.family!=="solana"):[],u=await ot(l,4,async y=>({row:y,result:await ga(`opensea-${y.chain}`,()=>ci({chain:y.chain,address:r.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:y,result:k}of u)if(k.ok){let v=k.data.nfts.map(x=>({...x,family:y.family,chainId:y.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));s.push(...v),a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:k.data.complete?"ok":"partial",count:v.length,complete:k.data.complete,next:k.data.next,source:"opensea"})}else a.push({family:y.family,chain:y.chain,chainId:y.chainId,status:"unavailable",error:k.error,source:"opensea"});if(!r.evm)for(let y of i.filter(k=>k.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 ga("opensea-solana",()=>ci({chain:"solana",address:r.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(y.ok){let k=y.data.nfts.map(v=>({...v,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));s.push(...k),a.push({family:"solana",chain:"solana",status:y.data.complete?"ok":"partial",count:k.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 ga("satflow-wallet-contents",()=>qs({address:r.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},vr(t,"satflow")),t.timeoutMs??35e3);if(y.ok){let k=EM(y.data.contents).map(x=>AM(x,r.bitcoin));s.push(...k);let v=k.length<Number(e.bitcoinLimit??100);a.push({family:"bitcoin",chain:"bitcoin",status:v?"ok":"partial",count:k.length,complete:v,source:"satflow"})}else{let k=await ga("bitcoin-meta-inscriptions",()=>eo({address:r.bitcoin},vr(t,"bitcoinMeta")),t.timeoutMs??35e3),v=k.ok&&k.data?.ok&&Array.isArray(k.data.inscriptions)?k.data.inscriptions:[];s.push(...v.map(x=>IM(x,r.bitcoin))),a.push({family:"bitcoin",chain:"bitcoin",status:v.length?"partial":"unavailable",count:v.length,complete:!1,source:v.length?"bitcoin-meta":"satflow",error:v.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 k=await ga(`opensea-pnl-${y}`,()=>ls({address:y},c),t.timeoutMs??35e3);d.push(k.ok?{status:"ok",...k.data}:{status:"unavailable",address:y,source:"opensea-indexed-account-pnl",error:k.error})}let p=_M(e.costBasis),m=TM(s).map(y=>PM(y,p)).map(y=>av(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))),b=Math.round(g.reduce((y,k)=>y+Number(k.estimatedValueUsd),0)*100)/100,S=f.length-g.length,w=a.filter(y=>y.status!=="ok"||y.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:n,addresses:r,coverage:a,unsupported:vM,inventory:{count:m.length,visibleCount:f.length,flaggedCount:h.length,items:m,visibleItems:f,flaggedItems:h},valuation:{estimatedCurrentValueUsd:b,valuedItems:g.length,unvaluedItems:S,complete:S===0&&w.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:NM(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 sv(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 CM(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 dv(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 hs(e,vr(t,"opensea"));if(n==="magiceden"||n==="magiceden-sol"){let r=sv(e.expiry??e.endTime,"Solana NFT listing expiry");return Ec({...e,expiry:r},vr(t,"magiceden"))}if(n==="satflow"){let r=sv(e.expiry??e.endTime??e.expiresAt,"Bitcoin NFT listing expiry");return Hs({inscription_id:e.inscriptionId||e.tokenId,runes_output:e.runesOutput,ord_address:e.ordAddress||e.seller,receive_address:e.receiveAddress,price:CM(e.priceSats??e.price),tap_key:e.tapKey,collection_slug:e.collectionSlug||e.collection,expires_at:r},vr(t,"satflow"))}throw new Error(`unsupported NFT marketplace: ${n||"<missing>"}`)}function Lm(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 $m(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)&&t>0?t:null}function Qc(e){return String(e??"").trim().toLowerCase()}function OM(e={},t,n){let r=Array.isArray(e.traits)?e.traits:[],o=Qc(t),i=Qc(n);return!o||!i?!1:r.some(a=>Qc(a.trait_type??a.traitType??a.type)===o&&Qc(a.value??a.trait_value??a.traitValue)===i)}function RM(e={},t){if(!t)return!0;let n=String(e.contract||e.tokenContract||e.assetContract||"").toLowerCase();return!n||n===String(t).toLowerCase()}function cv(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 Bm(e){return Math.round(Number(e)*1e6)/1e6}function qn(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 pv(e={},t={}){let n=String(e.marketplace||"").trim().toLowerCase();if(n!=="opensea")return qn(e,`unsupported NFT marketplace: ${n||"<missing>"}`);let o=["traitType","traitValue","maxPriceEth","minDiscountBps","minTraitSales","minTraitVolumeEth","traitFloorEth"].filter(x=>e[x]==null||e[x]==="");if(o.length)return qn(e,`trait-risk-params-required: ${o.join(",")}`);let i=Number.isFinite(Number(e.nowMs))?Number(e.nowMs):Date.now(),a=Lm(e.maxPriceEth,"maxPriceEth"),s=Number(e.minDiscountBps),c=Number(e.minTraitSales),l=Lm(e.minTraitVolumeEth,"minTraitVolumeEth"),u=Lm(e.traitFloorEth,"traitFloorEth"),d=$m(e.collectionFloorEth),p=$m(e.maxListingAgeMs),m=$m(e.maxSaleAgeMs??e.salesWindowMs);if(!Number.isFinite(s)||s<0)return qn(e,"invalid-min-discount-bps");if(!Number.isFinite(c)||c<1)return qn(e,"invalid-min-trait-sales");if(u<=0)return qn(e,"trait-floor-unavailable");let f=x=>OM(x,e.traitType,e.traitValue)&&RM(x,e.contract),h=(Array.isArray(e.sales)?e.sales:[]).filter(f).filter(x=>{if(!m)return!0;let E=cv(x,["timestamp","soldAt","createdAt"]);return E!=null&&i-E<=m}),g=Bm(h.reduce((x,E)=>x+Number(E.priceEth??E.price??0),0)),b={count:h.length,volumeEth:g,minSales:c,minVolumeEth:l};if(h.length<c||g<l)return qn(e,"trait-liquidity-insufficient",{traitSales:b});let S=(Array.isArray(e.listings)?e.listings:[]).filter(f).filter(x=>{let E=Number(x.priceEth??x.price);if(!Number.isFinite(E)||E<=0||E>a)return!1;if(!p)return!0;let _=cv(x,["listedAt","createdAt","timestamp"]);return _!=null&&i-_<=p}).map(x=>{let E=Number(x.priceEth??x.price),_=Math.round((u-E)/u*1e4);return{...x,priceEth:E,discountBps:_}}).filter(x=>x.discountBps>=s).sort((x,E)=>x.priceEth-E.priceEth||E.discountBps-x.discountBps),w={traitSales:b,collectionFloorEth:d,traitFloorEth:u,listingDepth:{count:S.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 qn(e,"invalid-min-trait-listings",w);if(S.length<y)return qn(e,"trait-listing-depth-insufficient",w);let k=S[0],v=$({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:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Bm(k.priceEth),maxPriceEth:a,traitType:e.traitType,traitValue:e.traitValue,evidence:w,localOnly:!0,requiresLocalVault:!0},{provider:"nft-portfolio",kind:"nft-trait-buy-intent",env:t.env||process.env});return{provider:"nft-portfolio",operation:"traitSnipe",marketplace:n,collectionSlug:e.collectionSlug||e.collection||null,contract:e.contract||null,decision:"BUY",reason:"trait-mispricing-evidence-met",executionReady:!1,signingReady:!1,broadcastReady:!1,requiresLocalVault:!0,best:{tokenId:k.tokenId==null?null:String(k.tokenId),listingId:k.listingId||null,orderHash:k.orderHash||null,priceEth:Bm(k.priceEth),discountBps:k.discountBps},evidence:w,prepareIntent:v}}async function mv(e={},t={}){let n=await Eo({...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 fv(e={},t={}){let n=Array.isArray(e.items)?e.items:null,r=null;return n||(r=await Eo({...e,includePnl:!1},t),n=r.inventory.visibleItems),{...await iv({...e,items:n},vr(t,"gallery")),inventorySummary:r?{visibleCount:r.inventory.visibleCount,flaggedCount:r.inventory.flaggedCount,coverage:r.coverage}:null}}var hv=10*1024*1024,wv=1e3;function Hn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Io(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function gv(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 bv(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 HM(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function xv(e={}){return`portfolio_${UM("sha256").update(HM(e)).digest("hex").slice(0,20)}`}function Sv(e={}){if(e.historyFile)return Ao.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return Ao.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let n=String(t.HERMES_HOME||"").trim()||Ao.join(qM.homedir(),".hermes");return Ao.join(Ao.resolve(n),"state","oracle","portfolio-history.jsonl")}function jM(e){let t=Hn(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?Io(t):null}function zM(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Hn(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?Io(t):null}function VM(e){let t=[];for(let n of e?.chains||[]){if(n.family==="hyperliquid"){let o=(n.spot?.balances||[]).reduce((s,c)=>{let l=Hn(c.usdValue);return l==null?s:s+l},0),i=Hn(n.perps?.accountValueUsd),a=Io(o+(i??0));(a!==0||i!=null||(n.spot?.balances||[]).some(s=>Hn(s.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:n.name||"Hyperliquid",knownUsd:a});continue}let r=Hn(n.native?.usdValue);r!=null&&t.push({family:n.family||"evm",chainId:n.chainId??null,name:n.name||n.native?.symbol||"Unknown",knownUsd:Io(r)})}return t}function WM(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 GM(e,t){let n=Sv(t),r=`${JSON.stringify(e)}
|
|
149
149
|
`;if(Buffer.byteLength(r)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await BM(Ao.dirname(n),{recursive:!0,mode:448});let o=Zc.O_APPEND|Zc.O_CREAT|Zc.O_WRONLY|(Zc.O_NOFOLLOW||0),i=await MM(n,o,384);try{await i.writeFile(r,"utf8")}finally{await i.close()}return await $M(n,384),n}async function kv(e={},t={}){let n=e.includeNfts!==!1,r=t.portfolioBalanceImpl||Xc,o=t.nftInventoryImpl||Eo,i=r(e,t),a=n?o({...e,includePnl:!1},t).catch(k=>({status:"unavailable",error:String(k?.message||k).slice(0,300)})):Promise.resolve({status:"not-requested"}),[s,c]=await Promise.all([i,a]),l=jM(s),u=zM(c),d=[l,u].filter(k=>k!=null),p=d.length?Io(d.reduce((k,v)=>k+v,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||kr(e,t.env||process.env),b=xv(g),S=[...s?.warnings||[]];n&&c?.status==="unavailable"&&S.push(`NFT inventory unavailable: ${c.error}`),n&&c?.valuation&&c.valuation.complete!==!0&&S.push("NFT estimated value is incomplete and is not an executable bid.");let w={schemaVersion:1,id:`snapshot_${DM()}`,portfolioId:b,recordedAt:h,sourceQueriedAt:{balances:s?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(k=>[k,!!g?.[k]])),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:VM(s),nfts:{knownUsd:u,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:WM(s,c,n),warnings:[...new Set(S)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await GM(w,t),snapshot:w,balance:s,nfts:c}}async function KM(e){let t=Sv(e);try{let n=await FM(t);if(n.byteLength>hv)throw new Error(`portfolio history exceeds ${hv} bytes`);let r=[],o=0;for(let i of n.toString("utf8").split(`
|
|
150
|
-
`))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function YM(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=kr(e,t.env||process.env);return Object.values(n).some(Boolean)?xv(n):null}async function Mm(e={},t={}){let n=bv(e.limit,100,1,wv,"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=gv(e.since,"portfolio history since"),i=gv(e.until,"portfolio history until"),a=YM(e,t),s=await KM(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=>Hn(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 yv(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function el(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function JM(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 XM(e,t){let c=e.map(w=>w.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let w=Math.max(1,Math.abs(l)*.05);l-=w,u+=w}else{let w=(u-l)*.1;l=Math.max(0,l-w),u+=w}let d=w=>e.length===1?1240/2:100+1040*w/(e.length-1),p=w=>570-(w-l)/(u-l)*470,m=e.map((w,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(w.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(w,y)=>{let k=y/4,v=100+k*470,x=u-k*(u-l);return`<line x1="100" y1="${v}" x2="1140" y2="${v}" stroke="#26313c" stroke-width="1"/><text x="86" y="${v+5}" text-anchor="end" fill="#8795a5" font-size="15">${yv(x)}</text>`}).join(""),h=e.map((w,y)=>`<circle cx="${d(y)}" cy="${p(w.value)}" r="5" fill="#b8f0ff"><title>${el(w.recordedAt)}: ${yv(w.value)}</title></circle>`).join(""),g=el(e[0].recordedAt.slice(0,10)),b=el(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 ${el(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">${b}</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 vv(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=bv(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Mm({...e,order:"asc",limit:e.limit??wv},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:Hn(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=JM(o,n),a=i[0].value,s=i.at(-1).value,c=Io(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=XM(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"}}}_e();var ZM=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"}}),eF=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),tF=`0x${"0".repeat(64)}`;function nF(e){return!e||e==="0x"||e===tF}async function Er(e={},t={}){let n=t.rpcCall||V,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(ZM))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of eF)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!nF(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 Ev(e={}){let t=Date.now();try{let n=await Er({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"}}}Ye();var oF=/^0x[0-9a-fA-F]{40}$/,Av=4663;function tl(e,t){let n=String(e||"").trim();if(!oF.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Fm(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 ya(e,t){return e==null||e===""?null:Fm(e,t)}function iF({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=tl(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=Fm(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=ya(u.gasLimit??c.gasLimit,"gasLimit"),h=ya(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()),b=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),S=pu({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:b,secret:l.routeAttestationSecret}),w=Pe(S,{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:w.selectedBps,expiresAtMs:g+b},k=ya(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(y.maxPriorityFeePerGas=k),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=ya(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=ya(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:w.selectedBps,expiresAtMs:g+b,fee:{oracleFeeBps:5},autoSlippage:w,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function aF(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}pi();let n=Hr(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function sF({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==re.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!==J.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==J.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==re.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 Iv(e={},t={}){let n=Number(e.chainId??Av);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=tl(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?tl(e.tokenIn,"tokenIn"):null,i=e.recipient?tl(e.recipient,"recipient"):null,a=e.amountIn==null?null:Fm(e.amountIn,"amountIn"),s=aF(n,t.scanner),c=t.scanContractRisk||Er,[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=sF({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),b=null,S=null,w=null;if(e.prepare===!0&&g.length===0){b=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{S=iF({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:b,args:e,opts:t})}catch(y){w=String(y?.message||y).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!S,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:!!b,unsignedTx:b,localSignerEnvelope:S,localSignerBlockedReason:w,signed:S?"pending-local-signer":!1,broadcast:S?"pending-local-signer":!1}}async function _v(){pi();let e=ys();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Av,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"}}_e();_e();var lF=5,Um=[50,75,90],Pv=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Ar(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 uF(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 nl(e={},t={}){let n=t.rpcCall||V,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Pv[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Pv).join(", ")}`};let i,a,s,c;try{i=Ar(e.maxFeePerGasWei,"maxFeePerGasWei"),a=Ar(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=Ar(e.gasLimit,"gasLimit"),c=Ar(e.maxTotalGasWei,"maxTotalGasWei")}catch(x){return{status:"error",viable:!1,error:x.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${lF.toString(16)}`,"pending",Um],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(x){return{status:"unavailable",viable:!1,error:x?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Ar(u?.baseFeePerGas,"baseFeePerGas")??Ar(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(x=>{try{return Ar(x?.[o.percentile],"reward")}catch{return null}}).filter(x=>x!=null&&x>0n),f=uF(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,b=d*o.baseFeeMultiplier+g,S=[];a!=null&&g>a&&(S.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(S.push({field:"maxFeePerGas",wanted:b.toString(),capped:i.toString()}),b=i,g>b&&(g=b));let w=s!=null?s*b:null;c!=null&&w!=null&&w>c&&S.push({field:"totalGas",wanted:w.toString(),capped:c.toString()});let y=f==null||g>=f,k=c==null||w==null||w<=c,v=y&&k;return y||h.push(`tip cap ${g} is below the observed ${Um[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),k||h.push(`worst-case gas ${w} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:v,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:Um[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:w==null?null:w.toString(),clamps:S,notes:h}}_e();var pF="08c379a0",mF="4e487b71",fF=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 hF(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===pF)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===mF){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:fF[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 gF(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 yF(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 wF(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 wa(e={},t={}){let n=t.rpcCall||V,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=wF(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=gF(f);if(!yF(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=hF(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 Tv(e={}){let t=Date.now();try{let n=await wa({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 xF=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 SF(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 kF(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 Nv(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=kF(t);else if(o==="quantity")r+=SF(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function vF({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 rl(e={},t={}){let n=t.rpcCall||V,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=xF.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 Cv(e={}){let t=Date.now();try{let n=await rl({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 Dm(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 rl({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(w=>w.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(w=>w.signature)};let c=a.found.length>1&&!e.signature,l=await Er({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await wa({chainId:r,tx:{from:o,to:n,data:Nv(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 nl({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=Nv(s,{minter:o,quantity:i})}catch(w){return{status:"error",error:w.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=$u({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(w=>w.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(w=>w.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let b=null,S=null;try{b=vF({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(w){S=String(w?.message||w).slice(0,200)}return{status:"ok",execution:b?"armed-local":"prepare-only",signed:b?"pending-local-signer":!1,broadcast:b?"pending-local-signer":!1,tx:f,localSignerEnvelope:b,localSignerBlockedReason:S,mintFunction:s.signature,alternatives:a.found.map(w=>w.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}ne();import{createHash as x4}from"node:crypto";import{createHash as AF}from"node:crypto";var IF=1,_F=8,je=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},PF=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),TF=new Set(["family","id"]),NF=new Set(["id","startsAt","endsAt","eligibility"]),CF=new Set(["kind","proofFormat","proofDigest"]),OF=new Set(["amount","unit"]),RF=new Set(["value","unit"]);function _o(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new je(`${t} must be a plain object`);return e}function Po(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new je(`${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 je(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function LF(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new je(`${t} must be a positive safe integer`);return e}function qm(e,t){if(e=_o(e,t),Po(e,OF,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new je(`${t} requires amount and unit`,"ambiguous-unit");let n=It(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new je(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:It(e.unit,`${t}.unit`)}}function Hm(e,t){if(e=_o(e,t),Po(e,RF,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new je(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function $F(e,t){e=_o(e,t),Po(e,CF,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 je(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function BF(e,t){let n=`stages[${t}]`;e=_o(e,n),Po(e,NF,n);let r=Hm(e.startsAt,`${n}.startsAt`),o=Hm(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new je(`${n} must end after it starts`,"invalid-stage-range");return{id:It(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:$F(e.eligibility,`${n}.eligibility`)}}function jm(e){if(e=_o(e,"input"),Po(e,PF,"input"),e.version!==IF)throw new je("version must be 1");let t=_o(e.chain,"chain");Po(t,TF,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>_F)throw new je("stages must contain 1 through 8 entries","stage-count");let r=n.map(BF).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 je("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 je("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new je("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:LF(e.quantity,"quantity"),stages:r,mintValueCap:qm(e.mintValueCap,"mintValueCap"),networkFeeCap:qm(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:qm(e.priorityFeeCap,"priorityFeeCap"),expiry:Hm(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new je("every stage must end no later than expiry","stage-after-expiry");return i}function MF(e){return JSON.stringify(jm(e))}function Ov(e){return`sha256:${AF("sha256").update(MF(e),"utf8").digest("hex")}`}var zm=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Ir=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Vm=Object.freeze(Object.values(Ir)),Rv=new Set(Vm),Lv=Object.freeze(Vm.slice(0,4)),FF=Vm,UF=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Qe=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function ol(e,t){if(!Array.isArray(e)||e.length===0)throw new Qe(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Qe(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Qe(`${t} contains duplicates`);return[...n].sort()}function DF(e){if(!Array.isArray(e))throw new Qe("capabilities must be an array");let t=new Set(e);for(let n of t)if(!Rv.has(n))throw new Qe(`unknown capability ${n}`,"unknown-capability");return FF.every(n=>t.has(n))?zm.AUTOMINT_READY:Lv.every(n=>t.has(n))?zm.PREPARE_READY:zm.RESEARCH_ONLY}function Wm(e=[]){if(!Array.isArray(e))throw new Qe("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Qe("entry must be an object");for(let i of Object.keys(n))if(!UF.has(i))throw new Qe(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Qe("entry id must be an exact string");if(t.has(n.id))throw new Qe(`duplicate entry id ${n.id}`,"duplicate-entry");let r=ol(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(ol(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(ol(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(ol(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:DF(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=Lv){let o=t.get(n);if(!o)throw new Qe(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!Rv.has(i))throw new Qe(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Qe(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var lW=Wm([]);ne();import{getAddress as qF,Interface as Gm,keccak256 as HF}from"ethers";var jn=Object.freeze({manifold:new Gm(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Gm(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Gm(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Ym=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"})}),mW=Object.freeze(Object.fromEntries(Object.entries(Ym).map(([e,t])=>[jn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function me(e){throw new Error(`evm-mint-launchpads: ${e}`)}function gt(e,t){try{return qF(String(e||""))}catch{return me(`invalid ${t}`)}}function Ze(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&me(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return me(`${t} must be an unsigned integer`)}}function Km(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&me(`invalid ${t}`),e.map(String)}function jF(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&me("invalid chainId");let o=gt(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&>(u.contract,"reviewed contract")===o);a||me("unsupported contract or wrong chain");let s=gt(a.mintTarget||a.contract,"reviewed mint target"),c=jn[e].getFunction(Ym[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))&&me("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function zF(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);me("runtime bytecode verification required")}function VF(e,t){let n=e.stage;if(!n)return null;let r=Ze(n.startTime,"stage startTime"),o=Ze(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&me("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function WF(e,t){let n=Ym[e];String(t).slice(0,10).toLowerCase()!==jn[e].getFunction(n.signature).selector.toLowerCase()&&me("unknown selector");let r;try{r=jn[e].decodeFunctionData(n.signature,t)}catch{me("invalid calldata layout")}let o;return e==="manifold"&&(o=jn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=jn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=jn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&me("calldata must be canonical with no suffix"),r}async function $v(e,t={},n={}){jn[e]||me("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=jF(e,t,n),s=gt(t.recipient||t.minter,"recipient"),c=Ze(t.quantity,"quantity",{positive:!0}),l=Ze(t.priceWei,"priceWei"),u=Ze(t.maxValueWei,"maxValueWei"),d=Ze(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&me("transaction chain mismatch"),gt(p.to,"transaction target")!==i&&me("transaction target mismatch");let m=await zF(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||HF(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&me("runtime bytecode is not reviewed");let f=WF(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=VF(t,h),b,S,w,y=null,k=[];if(e==="manifold")gt(f[0],"calldata contract")!==o&&me("calldata contract mismatch"),(t.instanceId==null||Ze(f[1],"instanceId")!==Ze(t.instanceId,"instanceId"))&&me("instance/stage mismatch"),(t.mintIndex==null||Ze(f[2],"mintIndex")!==Ze(t.mintIndex,"mintIndex"))&&me("mint index/stage mismatch"),k=Km([...f[3]]),b=gt(f[4],"calldata recipient"),S=1n,w=l;else if(e==="zora")b=gt(f[0],"calldata recipient"),S=BigInt(f[1]),w=l,t.comment!=null&&f[2]!==String(t.comment)&&me("comment mismatch"),t.mintReferral!=null&>(f[3],"mint referral")!==gt(t.mintReferral,"expected mint referral")&&me("mint referral mismatch");else{b=gt(f[0],"calldata recipient"),S=BigInt(f[1]),w=BigInt(f[3]);let P=f[4];k=Km([...P.proof]),y=BigInt(P.quantityLimitPerWallet),y<c&&me("wallet allowance below quantity"),(BigInt(P.pricePerToken)!==l||gt(P.currency,"allowlist currency")!==gt(f[2],"currency"))&&me("allowlist terms mismatch")}b!==s&&me("recipient mismatch"),S!==c&&me("quantity mismatch"),w!==l&&me("price mismatch"),t.proof!=null&&JSON.stringify(k.map(P=>P.toLowerCase()))!==JSON.stringify(Km(t.proof).map(P=>P.toLowerCase()))&&me("proof mismatch");let v=Ze(p.value??0,"transaction value"),x=l*c;(v<x||v-x>d||v>u)&&me("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:Ze(p.gasLimit,"gasLimit"),_=p.maxFeePerGas==null?null:Ze(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>Ze(t.maxGasLimit,"maxGasLimit"))&&me("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(_==null||_>Ze(t.maxFeePerGasWei,"maxFeePerGasWei"))&&me("gas fee cap exceeded"),$({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:v.toString(),platformFeeWei:(v-x).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.toString()},proof:k,transaction:{chainId:r,to:i,data:p.data,value:v.toString(),...E==null?{}:{gasLimit:E.toString()},..._==null?{}:{maxFeePerGas:_.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var GF="RESEARCH_ONLY";var KF="canonical serialized-message decoding and program-specific instruction validation are not implemented",il=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),hW=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function YF(){throw new Error(`solana-mint: ${GF}; disabled until ${KF}`)}function Bv(){YF()}ne();import{Address as JF,CompactSize as XF,NETWORK as QF,OutScript as Gv,Script as ZF,TEST_NETWORK as Mv,Transaction as e4,utils as t4}from"@scure/btc-signer";import{createHash as ba}from"node:crypto";var Fv="universal-ordinals-mint",Uv="bitcoin-ordinals-mint-plan",n4=1800*1e3,r4=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Dv=new Set,o4=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Bt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function zn(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 Jm(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 Kv(e,t){let n=Bt(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 i4(e){return e==="bitcoin"||e==="mainnet"?QF:e==="regtest"?{...Mv,bech32:"bcrt"}:Mv}function qv(e,t){try{let n=Gv.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 a4(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function s4(e){let t=ba("sha256").update(e.unsignedTx).digest();return ba("sha256").update(t).digest().reverse().toString("hex")}function Hv(e,...t){let n=ba("sha256").update(e,"ascii").digest();return ba("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function c4(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=Hv("TapLeaf",Buffer.from([a]),Buffer.from(XF.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Hv("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=t4.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 jv(e,t){let n=Bt(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=e4.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(a4(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=qv(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)=>c4(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 qv(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:s4(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 l4(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 u4(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 d4=new Set([1,3]);function p4(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=u4(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!d4.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 m4(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=ZF.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(p4(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(ba("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||l4(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 zv(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 f4(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 Yv(e,t="parentId"){let n=Bt(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 Jv(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Bt(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=zn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function h4(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:Bt(a.role,`revealOutputs[${s}].role`),address:Bt(a.address,`revealOutputs[${s}].address`),valueSats:zn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:Kv(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:Yv(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 g4(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Bt(n?.role,`commitOutputs[${r}].role`),valueSats:zn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Kv(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 Vv(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 Wv(e,t,n){try{return Buffer.from(Gv.encode(JF(i4(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 y4(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)=>Jv({...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 w4(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");f4(e);for(let N of["content","contentBytes","body","file","path","url","contentUrl"])if(e[N]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let N of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[N]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Bt(e.network,"network").toLowerCase();if(!r4.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Bt(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=Bt(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=Yv(e.parentId??e.parentInscriptionId),a=Bt(e.recipient??e.destination,"recipient"),s=zn(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(Jv);if(new Set(c.map(N=>N.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");y4(e,c);let l=jv(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=jv(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=g4(e.commitOutputs),p=h4(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((N,I)=>N.txid!==c[I].txid||N.vout!==c[I].vout||N.valueSats!==c[I].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Vv(l.outputs,d,"commit PSBT"),Vv(u.outputs,p,"reveal PSBT");let m=Wv(a,n,"recipient");if(p.find(N=>N.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[N,I]of p.entries())if(I.scriptHex!==Wv(I.address,n,`revealOutputs[${N}].address`))throw new Error(`ordinals mint: reveal output ${N} script does not pay its bound address`);let f=d.findIndex(N=>N.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(N=>N.txid===l.txid&&N.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");m4(u,{contentHash:r,contentType:o,parentId:i});let g=Jm(e.commitFeeRateSatVb,"commitFeeRateSatVb"),b=Jm(e.revealFeeRateSatVb,"revealFeeRateSatVb"),S=Jm(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(S<=0||g>S||b>S)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let w=zn(e.commitFeeSats,"commitFeeSats"),y=zn(e.revealFeeSats,"revealFeeSats"),k=zn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(w+y>k)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==w.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(w)/l.vsizeLowerBound>g||Number(y)/u.vsizeLowerBound>b)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(N=>N.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let E=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:zn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(E.enabled){if(!Number.isSafeInteger(E.outputIndex)||E.outputIndex<0||p[E.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[E.outputIndex].valueSats!==E.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(N=>N.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let _=Number(t.nowMs??Date.now()),P=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(P)||P<=_||P-_>n4)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(zv),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(zv),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:b,maxRate:S,commitFee:w.toString(),revealFee:y.toString(),maxTotalFee:k.toString(),rbf:e.rbf,cpfp:E,expiresAt:P}}function b4(e={},t={}){let n=w4(e,t),r=n.commitInputs.find(s=>Dv.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:Fv,kind:Uv,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...o4},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=$(i,{provider:Fv,kind:Uv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Dv.add(s.outpoint);return a}var Xv=b4;var S4=Object.freeze([Ir.DISCOVERY,Ir.ELIGIBILITY,Ir.PREPARATION,Ir.SIMULATION]),Qv=[["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",il.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",il.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",il.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Zv=Object.freeze(Qv.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([Ir.DISCOVERY]):S4,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),TW=Wm(Zv.map(({family:e,tier:t,enabled:n,...r})=>r)),eE=new Map(Qv.map(e=>[e[0],e])),k4=new Set(["intent","adapterId","input"]),v4=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,al=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ke(e,t,n){throw new al(e,t,n?{cause:n}:{})}function z(e,t,n){String(e??"")!==String(t)&&ke("intent-mismatch",`${n} does not match canonical intent`)}function De(e,t,n){let r=e[t];return r.unit!==n&&ke("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function tE(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))v4.test(n)&&ke("custody-refused",`${t}.${n} is outside the prepare-only boundary`),tE(r,`${t}.${n}`)}function E4(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function A4(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ke("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ke("intent-mismatch","stageId does not match canonical intent"),z(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${x4("sha256").update(JSON.stringify(E4(n,t))).digest("hex")}`;z(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))&&ke("invalid-request","decoded input requires exact stage bounds"),z(a,o.startsAt.value,"stage start"),z(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ke("expired-intent","canonical mint stage is not active at authoritative now"),o}function I4(e,t){let n=eE.get(t);n||ke("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return z(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ke("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function _4(e,t){e.chain.family==="evm"?(z(t.chainId,e.chain.id,"network"),z(t.contract,e.collection,"collection/drop"),z(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.maxValueWei??t.maxTotalWei,De(e,"mintValueCap","wei"),"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,De(e,"networkFeeCap","wei"),"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,De(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(z(t.network,e.chain.id,"network"),z(t.collection??t.drop??t.identity,e.collection,"collection/drop"),z(t.recipientOwner??t.recipient,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.priceLamports,De(e,"mintValueCap","lamports"),"mint-value cap"),z(t.networkFeeCapLamports,De(e,"networkFeeCap","lamports"),"network-fee cap"),z(t.priorityFeeCapLamports,De(e,"priorityFeeCap","lamports"),"priority-fee cap")):(z(t.network,e.chain.id,"network"),z(t.parentId,e.collection,"collection/drop"),z(t.recipient,e.recipient,"recipient"),z(e.quantity,1,"Ordinals quantity"),z(t.postageSats,De(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,De(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,De(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function P4(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==or(e))&&ke("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ke("custody-refused","leaf artifact is not strictly prepare-only")}function T4(e,t,n){z(t.chainId,e.chain.id,"network"),z(t.contract,e.collection,"collection/drop"),z(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity");let r=De(e,"mintValueCap","wei"),o=De(e,"networkFeeCap","wei"),i=De(e,"priorityFeeCap","wei-per-gas");z(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ke("artifact-mismatch","prepared EVM transaction is missing"),z(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ke("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)&&ke("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),z(n.contract,e.collection,"artifact collection/drop"),z(n.recipient??n.buyer,e.recipient,"artifact recipient"),z(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ke("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function N4(e,t,n){z(t.network,e.chain.id,"network"),z(t.collection??t.drop??t.identity,e.collection,"collection/drop"),z(t.recipientOwner??t.recipient,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.priceLamports,De(e,"mintValueCap","lamports"),"mint-value cap");let r=De(e,"networkFeeCap","lamports"),o=De(e,"priorityFeeCap","lamports");z(t.networkFeeCapLamports,r,"network-fee cap"),z(t.priorityFeeCapLamports,o,"priority-fee cap"),z(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)&&ke("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function C4(e,t,n){return z(t.network,e.chain.id,"network"),z(t.parentId,e.collection,"collection/drop"),z(t.recipient,e.recipient,"recipient"),z(e.quantity,1,"Ordinals quantity"),z(t.postageSats,De(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,De(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,De(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),z(n.plan.network,e.chain.id,"artifact network"),z(n.plan.parentId,e.collection,"artifact collection/drop"),z(n.plan.recipient,e.recipient,"artifact recipient"),z(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),z(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),z(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 Xm(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Zv})}async function nE(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Xm()}}async function rE(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ke("invalid-request","request must be a plain object");for(let u of Object.keys(e))k4.has(u)||ke("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ke("invalid-request","explicit adapterId is required; adapter inference is refused"),eE.has(e.adapterId)||ke("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ke("invalid-request","family-specific decoded input is required"),tE(n);let r;try{r=jm(e.intent)}catch(u){ke("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ke("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ke("expired-intent","canonical mint intent has expired");let i=I4(r,e.adapterId);i[1]==="solana"&&ke("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=A4(r,n,r.chain.family,o);_4(r,n);let s;try{i[4]==="evm"?s=await $v(i[5],n,t):i[4]==="opensea"?s=await fs(n,t):i[4]==="solana"?(z(n.programId,i[5],"selected Solana adapter program"),s=await Bv(n,t)):s=await Xv(n,t)}catch(u){if(u instanceof al)throw u;ke("adapter-refused",u?.message||"adapter preparation failed",u)}P4(s);let c=i[4]==="bitcoin"?C4(r,n,s):i[4]==="solana"?N4(r,n,s):T4(r,n,s),l=Object.freeze({intentHash:Ov(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 $({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 Qm="ROUTE_ONLY",Zm=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),iE=new Set(Object.values(Zm)),R4=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),L4=new Set(["amount","currency"]),$4=new Set(["value","unit"]),B4=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),M4=new Set(["provider","operations"]),ye=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function Co(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new ye(`${t} must be a plain object`);return e}function xa(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new ye(`${n} has unknown field ${r}`,"unknown-field")}function Te(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new ye(`${t} must be an exact non-empty string`);return e}function aE(e,t,{positive:n=!1}={}){if(e=Te(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new ye(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function To(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new ye(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>Te(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new ye(`${t} contains duplicates`);return r}function sE(e,t){return e=Co(e,t),xa(e,L4,t),{amount:aE(e.amount,`${t}.amount`),currency:Te(e.currency,`${t}.currency`)}}function oE(e,t){if(!Array.isArray(e))throw new ye(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>sE(n,`${t}[${r}]`))}function F4(e){if(e=Co(e,"expiry"),xa(e,$4,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new ye("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function U4(e,t,n){Object.hasOwn(e,n)&&(t[n]=Te(e[n],n))}function cE(e){e=Co(e,"intent"),xa(e,R4,"intent");let t=Te(e.action,"action");if(!iE.has(t))throw new ye(`unsupported action ${t}`,"invalid-action");let n={action:t,family:Te(e.family,"family"),network:Te(e.network,"network"),standard:Te(e.standard,"standard"),collection:Te(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])U4(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 ye("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new ye("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new ye("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=Te(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new ye("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=Te(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=Te(e.sender,"sender"))}else n.owner=Te(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=Te(e.recipient,"recipient")),n.quantity=aE(e.quantity,"quantity",{positive:!0}),n.marketplace=Te(e.marketplace,"marketplace"),n.protocol=Te(e.protocol,"protocol"),n.artifactKind=Te(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new ye(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=sE(e.price,"price"),n.expiry=F4(e.expiry),n.fees=oE(e.fees,"fees"),n.royalties=oE(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=Te(e.listingId,"listingId")),n}function D4(e){e=Co(e,"adapter"),xa(e,B4,"adapter");let t=To(e.actions,"adapter.actions");for(let o of t)if(!iE.has(o))throw new ye(`adapter has unknown action ${o}`,"invalid-action");let n=Co(e.surface,"adapter.surface");xa(n,M4,"adapter.surface");let r=Co(n.operations,"adapter.surface.operations");for(let o of t)Te(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new ye(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:Te(e.id,"adapter.id"),family:Te(e.family,"adapter.family"),networks:Object.freeze(To(e.networks,"adapter.networks")),standards:Object.freeze(To(e.standards,"adapter.standards")),marketplaces:Object.freeze(To(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(To(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(To(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Qm,custody:"user",surface:Object.freeze({provider:Te(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function q4(e=[]){if(!Array.isArray(e))throw new ye("entries must be an array");let t=e.map(D4);if(new Set(t.map(r=>r.id)).size!==t.length)throw new ye("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:Qm,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=cE(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new ye("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new ye(`adapter lacks ${o.action}`,"unsupported-operation"):new ye("no exact adapter route","unsupported-operation")}})}var No=(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}}),ef=q4([No("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"}),No("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"}),No("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"}),No("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),No("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),No("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function lE(e,{access:t="public",feeProfile:n="default",registry:r=ef,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new ye("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new ye("nowMs must be a non-negative safe integer","invalid-expiry");let i=cE(e);if(i.expiry&&o>=i.expiry.value)throw new ye("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Qm,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:Te(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)})}ne();var cl="universal-evm-nft-transfer",uE="evm-nft-safe-transfer",j4=1800*1e3,z4=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),V4=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function dE(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(V4.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);dE(r,t)}}}function tf(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 _r(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 Sa=e=>e.toString(16).padStart(64,"0"),sl=e=>e.slice(2).padStart(64,"0");function W4(e,t,n,r,o){return e==="erc721"?`0x42842e0e${sl(t)}${sl(n)}${Sa(r)}`:`0xf242432a${sl(t)}${sl(n)}${Sa(r)}${Sa(o)}${Sa(160n)}${Sa(0n)}`}function G4(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(dE(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=_r(e.chainId,"chainId",{positive:!0,safe:!0}),o=tf(e.sender??e.from,"sender"),i=tf(e.recipient??e.to,"recipient"),a=tf(e.contract??e.contractAddress??e.tokenContract,"contract"),s=_r(e.tokenId,"tokenId"),c=_r(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(_r(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=_r(e.gasLimit,"gasLimit",{positive:!0}),u=_r(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=_r(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)>j4)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=W4(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 pE(e={},t={}){let n=G4(e,t),r={provider:cl,kind:uE,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...z4},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 $(r,{provider:cl,kind:uE,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}ne();var ll="universal-solana-nft-transfer",mE="solana-verified-nft-transfer",hE="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Pr=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),fE=new Set(Object.values(Pr)),Y4=new Set([Pr.token,Pr.token2022]),J4=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),X4=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function ce(e){throw new Error(`solana nft transfer: ${e}`)}function Mt(e,t){let n=String(e??"").trim();return n||ce(`${t} required`),n}function Gt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||ce(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&ce(`${t} must be positive`),r}function Oe(e,t,n){String(e??"")!==String(t)&&ce(`${n} mismatch; mutation refused`)}function gE(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))X4.test(r)&&o!=null&&o!==!1&&ce(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),gE(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ce(`${r} refused; adapter is prepare-only`)}}function Q4(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&ce(`${t} must be decoded`),Array.isArray(e.accounts)||ce(`${t} decoded accounts required`),e.decoded}function Z4(e,t,n){for(let r of e.accounts){let o=Mt(r.pubkey,"account pubkey");t.has(o)||ce(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&ce(`unexpected writable account ${o}`)}}function eU(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ce("request object required"),gE(e),(e.network!=="mainnet-beta"||e.genesisHash!==hE)&&ce("mainnet genesis/network mismatch"),e.reviewed!==!0&&ce("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Mt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&ce("standard must be metaplex or core");let n=Mt(e.mint??e.asset,"mint/asset"),r=Mt(e.collection,"collection");e.collectionVerified!==!0&&ce("verified collection required");let o=Mt(e.owner,"owner"),i=Mt(e.recipient,"recipient"),a=Gt(e.quantity,"quantity",{positive:!0}),s=Gt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&ce("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&ce("Core quantity must be exactly 1");let c=Mt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==Pr.core:!Y4.has(c))&&ce("reviewed transfer program mismatch");let l=t==="metaplex"?Mt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Mt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Oe(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Gt(e.decimals??0,"decimals")):null,p=Gt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Gt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Gt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&ce("priority fee exceeds reviewed cap");let g=Gt(e.networkFeeLamports,"networkFeeLamports"),b=Gt(e.networkFeeCapLamports,"networkFeeCapLamports");g>b&&ce("network fee cap exceeded");let S=e.transaction;(!S||typeof S!="object"||Array.isArray(S))&&ce("transaction object required"),S.version!==0&&S.version!=="legacy"&&ce("transaction version must be 0 or legacy");let w=Mt(S.recentBlockhash,"recentBlockhash");Oe(w,e.approvedBlockhash,"blockhash mutation after approval");let y=Gt(S.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),k=Gt(e.currentBlockHeight,"currentBlockHeight");k>y&&ce("expired blockhash"),(!Array.isArray(S.instructions)||S.instructions.length<3)&&ce("canonical instructions required");let v=new Set([o,n,l,u].filter(Boolean)),x=new Set([o,i,n,r,l,u,...fE].filter(Boolean)),E=0,_=0,P=0,N=0;for(let[I,L]of S.instructions.entries()){let F=Mt(L.programId,`instructions[${I}].programId`);fE.has(F)||ce(`unknown program ${F}`);let O=Q4(L,`instructions[${I}]`);Z4(L,x,v);let D=String(O.type??O.instruction??"").toLowerCase();F===Pr.computeBudget?D.includes("limit")?(Oe(O.units??O.computeUnitLimit,p,"compute-unit limit"),E++):D.includes("price")?(Oe(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),_++):ce("unsupported compute budget instruction"):F===Pr.associatedToken?((t!=="metaplex"||D!=="createassociatedtokenaccountidempotent")&&ce("non-canonical associated token instruction"),Oe(O.payer,o,"ATA payer"),Oe(O.owner,i,"ATA recipient"),Oe(O.mint,n,"ATA mint"),Oe(O.tokenAccount,u,"recipient ATA"),Oe(O.tokenProgramId,c,"ATA token program"),N++):t==="metaplex"&&F===c?(D!=="transferchecked"&&ce("only canonical transferChecked is allowed"),Oe(O.mint,n,"mint"),Oe(O.owner,o,"owner"),Oe(O.recipient,i,"recipient"),Oe(O.sourceTokenAccount,l,"source token account"),Oe(O.destinationTokenAccount,u,"recipient ATA"),Oe(O.amount,a,"quantity"),Oe(O.decimals,d,"decimals"),P++):t==="core"&&F===Pr.core?(D!=="transfer"&&ce("only canonical Core transfer is allowed"),Oe(O.asset,n,"mint/asset"),Oe(O.collection,r,"collection"),O.collectionVerified!==!0&&ce("verified collection required in Core instruction"),Oe(O.owner,o,"owner"),Oe(O.newOwner,i,"recipient"),Oe(O.amount??1,1,"quantity"),P++):ce(`program ${F} is not valid for ${t} transfer`)}return(E!==1||_!==1)&&ce("exactly one compute-unit limit and price instruction required"),P!==1&&ce("exactly one canonical transfer instruction required"),t==="metaplex"&&N>1&&ce("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:w,lastValidBlockHeight:y.toString(),currentBlockHeight:k.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:b.toString(),transaction:S}}function yE(e={},t={}){let n=eU(e),r=Number(t.nowMs??Date.now()),o={provider:ll,kind:mE,chain:"solana-mainnet-beta",genesisHash:hE,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...J4},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:!0,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,...n.sourceTokenAccount?{sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,decimals:n.decimals}:{}},transaction:{unsigned:!0,version:n.transaction.version,recentBlockhash:n.recentBlockhash,lastValidBlockHeight:n.lastValidBlockHeight,instructions:structuredClone(n.transaction.instructions)},caps:{currentBlockHeight:n.currentBlockHeight,computeUnitLimit:n.computeUnitLimit,computeUnitPriceMicroLamports:n.computeUnitPriceMicroLamports,priorityFeeLamports:n.priorityFeeLamports,priorityFeeCapLamports:n.priorityFeeCapLamports,networkFeeLamports:n.networkFeeLamports,networkFeeCapLamports:n.networkFeeCapLamports},reviewed:!0};return $(o,{provider:ll,kind:mE,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}ne();var ul="universal-ordinals-transfer",wE="bitcoin-ordinals-transfer-plan",bE=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),nU=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function he(e){throw new Error(`ordinals transfer: ${e}`)}function Wn(e,t){let n=String(e??"").trim();return n||he(`${t} required`),n}function Vn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||he(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&he(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&he(`${t} out of range`),o}function xE(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&he(`${t} must be positive`),n}function EE(e,t){let n=Wn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||he(`${t} must be 64 hex`),n}function AE(e,t="inscriptionId"){let n=Wn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||he(`${t} must be canonical`),n}function IE(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&&he(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),IE(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&he(`${r} bypass refused; adapter is prepare-only`)}function _E(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&he(`${t}.${n} arbitrary script refused; use a bound address`)}function SE(e,t){(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),_E(e,t);let n=EE(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&he(`${t}.vout invalid`),{txid:n,vout:r,valueSats:Vn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:Wn(e.address,`${t}.address`),sequence:Number(Vn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function kE(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),_E(e,t),{role:Wn(e.role,`${t}.role`),address:Wn(e.address,`${t}.address`),valueSats:Vn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:AE(e.inscriptionId,`${t}.inscriptionId`)}}}function vE(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&he(`${n} mismatch; mutation refused`)}function rU(e={}){(!e||typeof e!="object"||Array.isArray(e))&&he("request object required"),IE(e);let t=Wn(e.network,"network").toLowerCase(),n=EE(e.genesisHash,"genesisHash");(!bE[t]||n!==bE[t])&&he("network/genesis mismatch");let r=AE(e.inscriptionId),o=SE(e.ownerInput,"ownerInput");Wn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&he("current inscription outpoint mismatch");let i=Wn(e.destination,"destination"),a=Vn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:kE(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&he("exact change output invalid");let c=xE(e.feeRateSatVb,"feeRateSatVb"),l=xE(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&he("fee rate exceeds reviewed cap");let u=Vn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=Vn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&he("total fee exceeds reviewed cap");let p=Number(Vn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(Vn(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&he("RBF sequence refused"),o.sequence!==m&&he("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&he("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&he("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&he("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&he("exactly one PSBT input required; extra inputs refused"),vE(SE(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((w,y)=>kE(w,`psbt.outputs[${y}]`)):he("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};vE(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(w=>w.role==="inscription"&&w.inscriptionId===r).length!==1&&he("exactly one inscription-carrying output required");let S=h.reduce((w,y)=>w+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==S+u&&he("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 PE(e={},t={}){let n=rU(e);return $({provider:ul,kind:wE,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...nU},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:ul,kind:wE,env:t.env})}Qs();_e();function iU(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 TE(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(!ap(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=iU(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 NE(e={},t={}){let n=t.rpcCall||V,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"]}}Qs();var sU=1440*60*1e3;function cU(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>sU&&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 CE="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",lU=4663,uU="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",OE="a22cb465",dU="a0712d68";function nf(e){return String(e||"").trim().toLowerCase()}function Oo(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function pU(e){let t=Oo(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${OE}${t.padStart(64,"0")}${"0".repeat(64)}`}function mU(e){return Oo(e).includes(Oo(CE))}function fU(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Oo(n?.data).startsWith(OE))}function hU(e={},t){let n=Oo(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return nf(i[0])!==uU?!1:Oo(i[2])===n})}function gU(e=1){return`0x${dU}${BigInt(e).toString(16).padStart(64,"0")}`}function RE(e={},t={}){let n=nf(e.contract),r=nf(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!==lU&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),mU(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"),fU(s)&&a.push("simulation sets approval / setApprovalForAll"),hU(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:gU(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:pU(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!qw(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=cU(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:CE.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"]}}ka();import{createHash as wU}from"node:crypto";import{getAddress as DE,isAddress as cf}from"ethers";var $E="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",bU=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),xU=Object.freeze(["lifi"]),BE=/^0x[0-9a-fA-F]{64}$/,SU=/^\d+$/;function Ne(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function ME(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Ne(t,"must be a positive chainId"),n}function pl(e,t){let n=String(e??"").trim();return(!SU.test(n)||BigInt(n)<=0n)&&Ne(t,"must be a positive integer string"),n}function kU(e,t){return e==null||e===""?null:pl(e,t)}function FE(e,t){let n=String(e??"").trim();return n.toLowerCase()===$E.toLowerCase()?$E:(cf(n)||Ne(t,"must be an EVM address or native token sentinel"),DE(n))}function qE(e,t){let n=String(e??"").trim();return cf(n)||Ne(t,"must be an EVM address"),DE(n)}function vU(e,t){return e==null||e===""?null:qE(e,t)}function UE(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||Ne(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function EU(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||Ne(r,"must be a finite millisecond timestamp"),o<=t&&Ne(r,"expired"),o>t+n&&Ne(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Lo(e){if(Array.isArray(e))return e.map(Lo);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Lo(e[n]));return t}return e}function AU(e){return JSON.stringify(Lo(e))}function ml(e){return`0x${wU("sha256").update(AU(e)).digest("hex")}`}function HE(e,t){let n={...e};for(let r of t)delete n[r];return n}function IU(e){return ml(HE(e,["intentHash"]))}function _U(e){return ml(HE(e,["firmQuoteHash"]))}function lf(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&Ne("time","is invalid");let o=ME(e.fromChainId??e.fromChain,"fromChainId"),i=ME(e.toChainId??e.toChain,"toChainId"),s=o===i?bU:xU,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:FE(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:FE(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:pl(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:qE(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:EU(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:kU(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:UE(e.allowedSources,"allowedSources",s),allowedRouters:UE(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)?Lo(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&Ne("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):ml({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=IU(c),Object.freeze(c)}function PU(e){return(!e||typeof e!="object"||Array.isArray(e))&&Ne("artifact","required"),e.typedDataHash!=null&&!BE.test(String(e.typedDataHash))&&Ne("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!BE.test(String(e.calldataHash))&&Ne("artifact.calldataHash","must be bytes32"),e.to!=null&&!cf(String(e.to))&&Ne("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&Ne("artifact.data","must be hex"),Lo(e)}function jE(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&Ne("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||Ne("quote expiry","required"),o<=r&&Ne("quote","expired"),o>e.deadlineMs&&Ne("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||Ne("source","required"),e.allowedSources.includes(i)||Ne("source","not allowed by intent");let a=pl(t.amountOut??t.buyAmount,"amountOut"),s=pl(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&Ne("minBuyAmount","exceeds amountOut");let c=PU(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||Ne("quotedAtMs","must be finite");let u=vU(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)?Lo(t.metadata):{}};return d.quoteId||(d.quoteId=ml({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=_U(d),Object.freeze(d)}Oi();ka();Li();Bi();ir();function va(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function zE(e,t){return String(e?.[t]??"").trim()}function Ea(e,t){return Object.freeze({source:e,run:t})}function TU(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??Fe,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return va(e,"lifi")&&a.push(Ea("lifi",async()=>{let c=await(r.lifiQuote??On)({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 NU(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(va(e,"paraswap")&&a.push(Ea("paraswap",async()=>{let c=await(r.paraswapPrice??gn)({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}}})),va(e,"0x")&&(zE(n,"ZEROX_API_KEY")||zE(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(Ea("0x",async()=>{let c=await(r.zeroxQuote??Ln)({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}}})),va(e,"cow")&&a.push(Ea("cow",async()=>{let c=await(r.cowQuote??cn)({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}}})),va(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(Ea("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Zt)({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 NU(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function CU(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function OU(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>CU(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(jE(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 RU(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 VE(e,t={}){let n=TU(e,t),{quotes:r,failed:o}=await OU(e,n,t),i=RU(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 WE(e={},t={}){return lf(e,t)}async function GE(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:lf(e,t);return VE(n,t)}async function KE(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}j();var $U="https://app.across.to";function uf(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||$U).replace(/\/$/,"")}async function YE(e={}){try{let t=await A(`${uf(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 JE(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return A(`${uf(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function XE(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)),A(`${uf(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var MU="https://api.beefy.finance";function df(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||MU).replace(/\/$/,"")}async function QE(e={}){try{let t=await A(`${df(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 ZE(e={},t={}){let n=await A(`${df(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 eA(e={}){return A(`${df(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}j();var UU="https://public-api.birdeye.so";function tA(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||UU).replace(/\/$/,"")}async function nA(e={}){try{let t=await A(`${tA(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 rA(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 A(`${tA(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var qU="https://api.celenium.io";function pf(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||qU).replace(/\/$/,"")}async function oA(e={}){try{let t=await A(`${pf(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 iA(e={}){return A(`${pf(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function aA(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 A(`${pf(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var jU="https://api.mainnet-beta.solana.com";function zU(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||jU).replace(/\/$/,"")}async function fl(e,t,n={}){let r=zU(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 sA(e={}){try{let t=await fl("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 cA(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 fl("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function lA(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)),fl("searchAssets",o,t)}async function uA(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return fl("getAssetProof",{id:n},t)}j();var WU="https://api.l2beat.com";function mf(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||WU).replace(/\/$/,"")}async function dA(e={}){try{let t=await A(`${mf(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 pA(e={},t={}){let n=await A(`${mf(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 mA(e={},t={}){return A(`${mf(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var KU="https://api.spark.fi";function ff(e={}){return(e.baseUrl||process.env.SPARK_API_URL||KU).replace(/\/$/,"")}async function fA(e={}){try{return{ok:(await A(`${ff(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 hA(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?A(`${ff(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):A(`${ff(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var JU="https://api.symbiotic.fi";function hf(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||JU).replace(/\/$/,"")}async function gA(e={}){try{let t=await A(`${hf(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 yA(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await A(`${hf(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 wA(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return A(`${hf(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var QU="https://staking-api.polygon.technology/api/v2",ZU=18,e6=200,t6=50,n6=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function yf(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||QU).replace(/\/$/,"")}function r6(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 o6(e,t=t6){let n=Number(e??t);return Number.isFinite(n)?Math.min(e6,Math.max(1,Math.trunc(n))):t}function gf(e){let t=Number(e);return Number.isFinite(t)?t/10**ZU:null}async function wf(e,t={}){let n=await A(`${yf(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 bA(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:gf(e.totalStaked),selfStakePolApprox:gf(e.selfStake),delegatedStakePolApprox:gf(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function xA(e={},t={}){let n=await wf("/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=n6.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=o6(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(bA)}}async function SA(e={},t={}){let n=r6(e.id??e.validatorId,"id"),o=(await wf(`/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:{...bA(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 kA(e={}){try{let t=await wf("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:yf(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:yf(e),error:String(t?.message||t),exec:!1}}}j();var a6="https://api.v3.aave.com/graphql",uG=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),s6=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||a6;async function hl(e,t,n={}){let r=await A(s6(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 c6=`query Markets($request: MarketsRequest!) {
|
|
150
|
+
`))if(i.trim())try{let a=JSON.parse(i);a?.schemaVersion===1&&a?.portfolioId&&a?.recordedAt?r.push(a):o+=1}catch{o+=1}return{file:t,snapshots:r,corruptLines:o}}catch(n){if(n?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw n}}function YM(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let n=kr(e,t.env||process.env);return Object.values(n).some(Boolean)?xv(n):null}async function Mm(e={},t={}){let n=bv(e.limit,100,1,wv,"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=gv(e.since,"portfolio history since"),i=gv(e.until,"portfolio history until"),a=YM(e,t),s=await KM(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=>Hn(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 yv(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function el(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function JM(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 XM(e,t){let c=e.map(w=>w.value),l=Math.min(...c),u=Math.max(...c);if(l===u){let w=Math.max(1,Math.abs(l)*.05);l-=w,u+=w}else{let w=(u-l)*.1;l=Math.max(0,l-w),u+=w}let d=w=>e.length===1?1240/2:100+1040*w/(e.length-1),p=w=>570-(w-l)/(u-l)*470,m=e.map((w,y)=>`${y?"L":"M"}${d(y).toFixed(2)},${p(w.value).toFixed(2)}`).join(" "),f=Array.from({length:5},(w,y)=>{let k=y/4,v=100+k*470,x=u-k*(u-l);return`<line x1="100" y1="${v}" x2="1140" y2="${v}" stroke="#26313c" stroke-width="1"/><text x="86" y="${v+5}" text-anchor="end" fill="#8795a5" font-size="15">${yv(x)}</text>`}).join(""),h=e.map((w,y)=>`<circle cx="${d(y)}" cy="${p(w.value)}" r="5" fill="#b8f0ff"><title>${el(w.recordedAt)}: ${yv(w.value)}</title></circle>`).join(""),g=el(e[0].recordedAt.slice(0,10)),b=el(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 ${el(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">${b}</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 vv(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let n=bv(e.maxPoints,200,2,500,"portfolio graph maxPoints"),r=await Mm({...e,order:"asc",limit:e.limit??wv},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:Hn(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=JM(o,n),a=i[0].value,s=i.at(-1).value,c=Io(s-a),l=a===0?null:Number(((s-a)/a*100).toFixed(2)),u=XM(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"}}}_e();var ZM=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"}}),eF=Object.freeze([{label:"eip1967",slot:"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"},{label:"zeppelinos",slot:"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"},{label:"eip1822",slot:"0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"}]),tF=`0x${"0".repeat(64)}`;function nF(e){return!e||e==="0x"||e===tF}async function Er(e={},t={}){let n=t.rpcCall||V,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(ZM))c.includes(f)&&s.push({selector:`0x${f}`,...h});let l=!1,u=null,d=null;for(let{label:f,slot:h}of eF)try{let g=await n(o,"eth_getStorageAt",[r,h,"latest"],t);if(!nF(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 Ev(e={}){let t=Date.now();try{let n=await Er({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"}}}Ye();var oF=/^0x[0-9a-fA-F]{40}$/,Av=4663;function tl(e,t){let n=String(e||"").trim();if(!oF.test(n))throw new Error(`evm-token-sniper: ${t} must be a 0x EVM address`);return n}function Fm(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 ya(e,t){return e==null||e===""?null:Fm(e,t)}function iF({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=tl(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=Fm(u.value??r,"prepared native value");if(BigInt(m)!==BigInt(r))throw new Error("local-signer envelope requires native value equal amountIn");let f=ya(u.gasLimit??c.gasLimit,"gasLimit"),h=ya(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()),b=Math.min(6e4,Math.max(1e3,Number(c.ttlMs??c.expiresInMs??3e4)||3e4)),S=pu({chainId:e,venue:"uniswap-v3",quoteAmountOut:i?.amountOut,liquidityUsd:a?.liquidityUsd,requestedCapBps:c.slippageBps??50,quotedAtMs:g,ttlMs:b,secret:l.routeAttestationSecret}),w=Pe(S,{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:w.selectedBps,expiresAtMs:g+b},k=ya(u.maxPriorityFeePerGas??c.maxPriorityFeePerGas,"maxPriorityFeePerGas");return k&&(y.maxPriorityFeePerGas=k),c.nonce!==void 0&&(y.nonce=Number(c.nonce)),(c.txType!==void 0||k)&&(y.type=Number(c.txType??2)),c.l1FeeWei!==void 0&&(y.l1FeeWei=ya(c.l1FeeWei,"l1FeeWei")??"0"),c.operatorFeeWei!==void 0&&(y.operatorFeeWei=ya(c.operatorFeeWei,"operatorFeeWei")??"0"),{version:1,surface:"evm-swap",action:"swap",provider:"uniswap-v3",owner:o,destination:d,tradeId:c.tradeId||`evm-token-sniper-${e}-${t.toLowerCase()}`,slippageBps:w.selectedBps,expiresAtMs:g+b,fee:{oracleFeeBps:5},autoSlippage:w,artifact:{chainId:e,owner:o,transactions:[y]},meta:{source:"evm-token-sniper",tokenIn:n,tokenOut:t}}}function aF(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}pi();let n=Hr(e);if(!n)throw new Error(`evm-token-sniper: unsupported EVM chainId ${e}`);return n}function sF({token:e,pools:t,structuralRisk:n,scannerRisk:r,sellability:o,quote:i,args:a,scanner:s}){let c=[];return e?.evidence!==re.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!==J.PASS&&c.push(`scanner risk verdict is ${r?.verdict||"UNKNOWN"}`),s.supports?.("sellSimulation")?o?.verdict!==J.PASS&&c.push(`sellability verdict is ${o?.verdict||"UNKNOWN"}`):c.push("sell simulation is unavailable on this chain"),s.supports?.("quote")?i?.evidence!==re.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 Iv(e={},t={}){let n=Number(e.chainId??Av);if(!Number.isInteger(n)||n<=0)throw new Error("evm-token-sniper: chainId must be a positive integer");let r=tl(e.tokenAddress||e.address||e.token,"tokenAddress"),o=e.tokenIn?tl(e.tokenIn,"tokenIn"):null,i=e.recipient?tl(e.recipient,"recipient"):null,a=e.amountIn==null?null:Fm(e.amountIn,"amountIn"),s=aF(n,t.scanner),c=t.scanContractRisk||Er,[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=sF({token:l,pools:u,structuralRisk:d,scannerRisk:p,sellability:m,quote:f,args:h,scanner:s}),b=null,S=null,w=null;if(e.prepare===!0&&g.length===0){b=await s.prepareUnsignedTx({tokenIn:o,tokenOut:r,amountIn:a,recipient:i,slippageBps:e.slippageBps??50,fee:f?.fee});try{S=iF({chainId:n,tokenAddress:r,tokenIn:o,amountIn:a,recipient:i,quote:f,topPool:u?.pools?.[0]||null,unsignedTx:b,args:e,opts:t})}catch(y){w=String(y?.message||y).slice(0,200)}}return{provider:"evm-token-sniper",execution:"armed-local",armed:!!S,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:!!b,unsignedTx:b,localSignerEnvelope:S,localSignerBlockedReason:w,signed:S?"pending-local-signer":!1,broadcast:S?"pending-local-signer":!1}}async function _v(){pi();let e=ys();return{ok:e.length>0,provider:"evm-token-sniper",defaultChainId:Av,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"}}_e();_e();var lF=5,Um=[50,75,90],Pv=Object.freeze({normal:{percentile:0,baseFeeMultiplier:2n,label:"normal"},fast:{percentile:1,baseFeeMultiplier:3n,label:"fast"},war:{percentile:2,baseFeeMultiplier:4n,label:"war"}});function Ar(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 uF(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 nl(e={},t={}){let n=t.rpcCall||V,r=Number(e.chainId);if(!Number.isInteger(r))return{status:"error",error:"chainId is required",viable:!1};let o=Pv[e.urgency||"fast"];if(!o)return{status:"error",viable:!1,error:`urgency must be one of: ${Object.keys(Pv).join(", ")}`};let i,a,s,c;try{i=Ar(e.maxFeePerGasWei,"maxFeePerGasWei"),a=Ar(e.maxPriorityFeePerGasWei,"maxPriorityFeePerGasWei"),s=Ar(e.gasLimit,"gasLimit"),c=Ar(e.maxTotalGasWei,"maxTotalGasWei")}catch(x){return{status:"error",viable:!1,error:x.message}}let l,u;try{[l,u]=await Promise.all([n(r,"eth_feeHistory",[`0x${lF.toString(16)}`,"pending",Um],t),n(r,"eth_getBlockByNumber",["pending",!1],t)])}catch(x){return{status:"unavailable",viable:!1,error:x?.message||"fee history unavailable",notes:["could not read live fee data; refusing to guess a competitive bid"]}}let d=Ar(u?.baseFeePerGas,"baseFeePerGas")??Ar(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(x=>{try{return Ar(x?.[o.percentile],"reward")}catch{return null}}).filter(x=>x!=null&&x>0n),f=uF(m),h=[];f==null&&h.push("no non-zero tips observed in recent blocks; using a 1 gwei floor");let g=f??1000000000n,b=d*o.baseFeeMultiplier+g,S=[];a!=null&&g>a&&(S.push({field:"maxPriorityFeePerGas",wanted:g.toString(),capped:a.toString()}),g=a,b=d*o.baseFeeMultiplier+g),i!=null&&b>i&&(S.push({field:"maxFeePerGas",wanted:b.toString(),capped:i.toString()}),b=i,g>b&&(g=b));let w=s!=null?s*b:null;c!=null&&w!=null&&w>c&&S.push({field:"totalGas",wanted:w.toString(),capped:c.toString()});let y=f==null||g>=f,k=c==null||w==null||w<=c,v=y&&k;return y||h.push(`tip cap ${g} is below the observed ${Um[o.percentile]}th-percentile tip ${f}; this bid is unlikely to land`),k||h.push(`worst-case gas ${w} exceeds the ${c} total cap`),h.push("maxFeePerGas is a ceiling \u2014 unused headroom above basefee+tip is refunded, not spent"),{status:"ok",viable:v,chainId:r,urgency:o.label,baseFeePerGas:d.toString(),observedTip:f==null?null:f.toString(),percentile:Um[o.percentile],maxFeePerGas:b.toString(),maxPriorityFeePerGas:g.toString(),worstCaseGasWei:w==null?null:w.toString(),clamps:S,notes:h}}_e();var pF="08c379a0",mF="4e487b71",fF=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 hF(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===pF)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===mF){let r=parseInt(t.slice(8,72),16);return{kind:"panic",code:r,reason:fF[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 gF(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 yF(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 wF(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 wa(e={},t={}){let n=t.rpcCall||V,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=wF(o),a=[],s=null,c=!1,l=null;try{s=await n(r,"eth_call",[i,"pending"],t)}catch(f){let h=gF(f);if(!yF(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=hF(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 Tv(e={}){let t=Date.now();try{let n=await wa({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 xF=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 SF(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 kF(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 Nv(e,{minter:t,quantity:n}){let r=`0x${e.selector}`;for(let o of e.args)if(o==="to")r+=kF(t);else if(o==="quantity")r+=SF(n);else throw new Error(`unsupported mint argument: ${o}`);return r}function vF({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 rl(e={},t={}){let n=t.rpcCall||V,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=xF.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 Cv(e={}){let t=Date.now();try{let n=await rl({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 Dm(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 rl({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(w=>w.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(w=>w.signature)};let c=a.found.length>1&&!e.signature,l=await Er({address:n,chainId:r},t),u=null;if(e.simulate!==!1&&(u=await wa({chainId:r,tx:{from:o,to:n,data:Nv(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 nl({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=Nv(s,{minter:o,quantity:i})}catch(w){return{status:"error",error:w.message}}let f={chainId:r,from:o,to:n,data:m,value:e.valueWei==null?"0":String(e.valueWei),gasLimit:d==null?null:String(d),maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas},h={ok:!0,skipped:!0,reason:"no gasLimit or cap supplied"};if(d!=null&&(e.maxTotalGasWei!=null||e.grant!=null)&&(h=$u({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(w=>w.signature).join(", ")}); defaulted to ${s.signature} \u2014 pass signature to choose`),l.risk==="high"&&g.push(`contract risk HIGH: ${l.findings.map(w=>w.name).join(", ")}`),p.viable||g.push(p.notes[0]),h.skipped&&g.push("gas-war caps NOT enforced: supply gasLimit plus maxTotalGasWei or a grant");let b=null,S=null;try{b=vF({address:n,chainId:r,minter:o,quantity:i,tx:f,nowMs:t.nowMs,ttlMs:e.ttlMs??e.expiresInMs})}catch(w){S=String(w?.message||w).slice(0,200)}return{status:"ok",execution:b?"armed-local":"prepare-only",signed:b?"pending-local-signer":!1,broadcast:b?"pending-local-signer":!1,tx:f,localSignerEnvelope:b,localSignerBlockedReason:S,mintFunction:s.signature,alternatives:a.found.map(w=>w.signature),quantity:i,gas:p,simulation:u,contractRisk:{risk:l.risk,findings:l.findings,isProxy:l.isProxy},capCheck:h,warnings:g}}ne();import{createHash as x4}from"node:crypto";import{createHash as AF}from"node:crypto";var IF=1,_F=8,je=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal mint intent: ${t}`),this.name="UniversalMintIntentError",this.code=n}},PF=new Set(["version","chain","marketplace","mechanism","collection","recipient","quantity","stages","mintValueCap","networkFeeCap","priorityFeeCap","expiry","maxExecutions"]),TF=new Set(["family","id"]),NF=new Set(["id","startsAt","endsAt","eligibility"]),CF=new Set(["kind","proofFormat","proofDigest"]),OF=new Set(["amount","unit"]),RF=new Set(["value","unit"]);function _o(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new je(`${t} must be a plain object`);return e}function Po(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new je(`${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 je(`${t} must be a non-empty exact string without surrounding whitespace`);return e}function LF(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new je(`${t} must be a positive safe integer`);return e}function qm(e,t){if(e=_o(e,t),Po(e,OF,t),!Object.hasOwn(e,"amount")||!Object.hasOwn(e,"unit"))throw new je(`${t} requires amount and unit`,"ambiguous-unit");let n=It(e.amount,`${t}.amount`);if(!/^(0|[1-9]\d*)$/.test(n))throw new je(`${t}.amount must be a canonical non-negative integer string`);return{amount:n,unit:It(e.unit,`${t}.unit`)}}function Hm(e,t){if(e=_o(e,t),Po(e,RF,t),e.unit!=="unix-ms"||!Number.isSafeInteger(e.value)||e.value<0)throw new je(`${t} must have a non-negative safe integer value and unit unix-ms`,"ambiguous-unit");return{value:e.value,unit:"unix-ms"}}function $F(e,t){e=_o(e,t),Po(e,CF,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 je(`${t}.proofDigest must be algorithm:lowercase-hex metadata`);return{kind:n,proofFormat:r,proofDigest:o}}function BF(e,t){let n=`stages[${t}]`;e=_o(e,n),Po(e,NF,n);let r=Hm(e.startsAt,`${n}.startsAt`),o=Hm(e.endsAt,`${n}.endsAt`);if(r.value>=o.value)throw new je(`${n} must end after it starts`,"invalid-stage-range");return{id:It(e.id,`${n}.id`),startsAt:r,endsAt:o,eligibility:$F(e.eligibility,`${n}.eligibility`)}}function jm(e){if(e=_o(e,"input"),Po(e,PF,"input"),e.version!==IF)throw new je("version must be 1");let t=_o(e.chain,"chain");Po(t,TF,"chain");let n=e.stages;if(!Array.isArray(n)||n.length<1||n.length>_F)throw new je("stages must contain 1 through 8 entries","stage-count");let r=n.map(BF).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 je("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 je("stages must not overlap","overlapping-stages")}if(e.maxExecutions!==1)throw new je("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:LF(e.quantity,"quantity"),stages:r,mintValueCap:qm(e.mintValueCap,"mintValueCap"),networkFeeCap:qm(e.networkFeeCap,"networkFeeCap"),priorityFeeCap:qm(e.priorityFeeCap,"priorityFeeCap"),expiry:Hm(e.expiry,"expiry"),maxExecutions:1};if(r.some(a=>a.endsAt.value>i.expiry.value))throw new je("every stage must end no later than expiry","stage-after-expiry");return i}function MF(e){return JSON.stringify(jm(e))}function Ov(e){return`sha256:${AF("sha256").update(MF(e),"utf8").digest("hex")}`}var zm=Object.freeze({RESEARCH_ONLY:"RESEARCH_ONLY",PREPARE_READY:"PREPARE_READY",AUTOMINT_READY:"AUTOMINT_READY"}),Ir=Object.freeze({DISCOVERY:"discovery",ELIGIBILITY:"eligibility",PREPARATION:"preparation",SIMULATION:"simulation",BOUNDED_SIGNING:"boundedSigning",BROADCAST:"broadcast",RECEIPT_VERIFICATION:"receiptVerification",OWNERSHIP_VERIFICATION:"ownershipVerification"}),Vm=Object.freeze(Object.values(Ir)),Rv=new Set(Vm),Lv=Object.freeze(Vm.slice(0,4)),FF=Vm,UF=new Set(["id","chainFamilies","marketplaces","mechanisms","capabilities"]),Qe=class extends TypeError{constructor(t,n="invalid-registry-entry"){super(`universal mint registry: ${t}`),this.name="UniversalMintRegistryError",this.code=n}};function ol(e,t){if(!Array.isArray(e)||e.length===0)throw new Qe(`${t} must be a non-empty array`);let n=e.map(r=>{if(typeof r!="string"||!r||r.trim()!==r)throw new Qe(`${t} entries must be exact strings`);return r});if(new Set(n).size!==n.length)throw new Qe(`${t} contains duplicates`);return[...n].sort()}function DF(e){if(!Array.isArray(e))throw new Qe("capabilities must be an array");let t=new Set(e);for(let n of t)if(!Rv.has(n))throw new Qe(`unknown capability ${n}`,"unknown-capability");return FF.every(n=>t.has(n))?zm.AUTOMINT_READY:Lv.every(n=>t.has(n))?zm.PREPARE_READY:zm.RESEARCH_ONLY}function Wm(e=[]){if(!Array.isArray(e))throw new Qe("entries must be an array");let t=new Map;for(let n of e){if(!n||typeof n!="object"||Array.isArray(n))throw new Qe("entry must be an object");for(let i of Object.keys(n))if(!UF.has(i))throw new Qe(`entry has unknown field ${i}`,"unknown-field");if(typeof n.id!="string"||!n.id||n.id.trim()!==n.id)throw new Qe("entry id must be an exact string");if(t.has(n.id))throw new Qe(`duplicate entry id ${n.id}`,"duplicate-entry");let r=ol(n.capabilities,"capabilities"),o=Object.freeze({id:n.id,chainFamilies:Object.freeze(ol(n.chainFamilies,"chainFamilies")),marketplaces:Object.freeze(ol(n.marketplaces,"marketplaces")),mechanisms:Object.freeze(ol(n.mechanisms,"mechanisms")),capabilities:Object.freeze(r),tier:DF(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=Lv){let o=t.get(n);if(!o)throw new Qe(`missing adapter ${n}`,"missing-adapter");for(let i of r){if(!Rv.has(i))throw new Qe(`unknown capability ${i}`,"unknown-capability");if(!o.capabilities.includes(i))throw new Qe(`${n} is missing capability ${i}`,"missing-capability")}return o}})}var dW=Wm([]);ne();import{getAddress as qF,Interface as Gm,keccak256 as HF}from"ethers";var jn=Object.freeze({manifold:new Gm(["function mint(address creatorContract,uint256 instanceId,uint32 mintIndex,bytes32[] merkleProof,address mintFor) payable"]),zora:new Gm(["function mint(address mintTo,uint256 quantity,string comment,address mintReferral) payable"]),thirdweb:new Gm(["function claim(address receiver,uint256 quantity,address currency,uint256 pricePerToken,(bytes32[] proof,uint256 quantityLimitPerWallet,uint256 pricePerToken,address currency) allowlistProof,bytes data) payable"])}),Ym=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"})}),hW=Object.freeze(Object.fromEntries(Object.entries(Ym).map(([e,t])=>[jn[e].getFunction(t.signature).selector.toLowerCase(),Object.freeze({platform:e,...t})])));function me(e){throw new Error(`evm-mint-launchpads: ${e}`)}function gt(e,t){try{return qF(String(e||""))}catch{return me(`invalid ${t}`)}}function Ze(e,t,{positive:n=!1}={}){try{let r=BigInt(e);return(r<0n||n&&r===0n)&&me(`${t} must be ${n?"positive":"unsigned"}`),r}catch(r){if(/evm-mint-launchpads:/.test(String(r?.message)))throw r;return me(`${t} must be an unsigned integer`)}}function Km(e,t="proof"){return(!Array.isArray(e)||e.length>64||e.some(n=>!/^0x[0-9a-fA-F]{64}$/.test(String(n))))&&me(`invalid ${t}`),e.map(String)}function jF(e,t,n){let r=Number(t.chainId);(!Number.isSafeInteger(r)||r<=0)&&me("invalid chainId");let o=gt(t.contract,"contract"),a=(Array.isArray(n.reviewedContracts)?n.reviewedContracts:[]).find(u=>u.platform===e&&Number(u.chainId)===r&>(u.contract,"reviewed contract")===o);a||me("unsupported contract or wrong chain");let s=gt(a.mintTarget||a.contract,"reviewed mint target"),c=jn[e].getFunction(Ym[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))&&me("unverified bytecode/selector combination"),{chainId:r,contract:o,mintTarget:s,selector:c,review:a}}async function zF(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);me("runtime bytecode verification required")}function VF(e,t){let n=e.stage;if(!n)return null;let r=Ze(n.startTime,"stage startTime"),o=Ze(n.endTime,"stage endTime"),i=BigInt(Math.floor(t/1e3));return(r>i||o<=i||o<=r)&&me("mint stage is not open"),{...n,startTime:r.toString(),endTime:o.toString()}}function WF(e,t){let n=Ym[e];String(t).slice(0,10).toLowerCase()!==jn[e].getFunction(n.signature).selector.toLowerCase()&&me("unknown selector");let r;try{r=jn[e].decodeFunctionData(n.signature,t)}catch{me("invalid calldata layout")}let o;return e==="manifold"&&(o=jn.manifold.encodeFunctionData(n.signature,[r[0],r[1],r[2],[...r[3]],r[4]])),e==="zora"&&(o=jn.zora.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3]])),e==="thirdweb"&&(o=jn.thirdweb.encodeFunctionData(n.signature,[r[0],r[1],r[2],r[3],r[4],r[5]])),o.toLowerCase()!==String(t).toLowerCase()&&me("calldata must be canonical with no suffix"),r}async function $v(e,t={},n={}){jn[e]||me("unsupported platform");let{chainId:r,contract:o,mintTarget:i,review:a}=jF(e,t,n),s=gt(t.recipient||t.minter,"recipient"),c=Ze(t.quantity,"quantity",{positive:!0}),l=Ze(t.priceWei,"priceWei"),u=Ze(t.maxValueWei,"maxValueWei"),d=Ze(t.maxPlatformFeeWei??0,"maxPlatformFeeWei"),p=t.transaction||t.tx;(!p||Number(p.chainId)!==r)&&me("transaction chain mismatch"),gt(p.to,"transaction target")!==i&&me("transaction target mismatch");let m=await zF(r,i,n);(!/^0x[0-9a-fA-F]+$/.test(String(m))||m==="0x"||HF(m).toLowerCase()!==String(a.codeHash).toLowerCase())&&me("runtime bytecode is not reviewed");let f=WF(e,p.data),h=Number.isFinite(Number(n.nowMs))?Number(n.nowMs):Date.now(),g=VF(t,h),b,S,w,y=null,k=[];if(e==="manifold")gt(f[0],"calldata contract")!==o&&me("calldata contract mismatch"),(t.instanceId==null||Ze(f[1],"instanceId")!==Ze(t.instanceId,"instanceId"))&&me("instance/stage mismatch"),(t.mintIndex==null||Ze(f[2],"mintIndex")!==Ze(t.mintIndex,"mintIndex"))&&me("mint index/stage mismatch"),k=Km([...f[3]]),b=gt(f[4],"calldata recipient"),S=1n,w=l;else if(e==="zora")b=gt(f[0],"calldata recipient"),S=BigInt(f[1]),w=l,t.comment!=null&&f[2]!==String(t.comment)&&me("comment mismatch"),t.mintReferral!=null&>(f[3],"mint referral")!==gt(t.mintReferral,"expected mint referral")&&me("mint referral mismatch");else{b=gt(f[0],"calldata recipient"),S=BigInt(f[1]),w=BigInt(f[3]);let P=f[4];k=Km([...P.proof]),y=BigInt(P.quantityLimitPerWallet),y<c&&me("wallet allowance below quantity"),(BigInt(P.pricePerToken)!==l||gt(P.currency,"allowlist currency")!==gt(f[2],"currency"))&&me("allowlist terms mismatch")}b!==s&&me("recipient mismatch"),S!==c&&me("quantity mismatch"),w!==l&&me("price mismatch"),t.proof!=null&&JSON.stringify(k.map(P=>P.toLowerCase()))!==JSON.stringify(Km(t.proof).map(P=>P.toLowerCase()))&&me("proof mismatch");let v=Ze(p.value??0,"transaction value"),x=l*c;(v<x||v-x>d||v>u)&&me("transaction value or fee cap exceeded");let E=p.gasLimit==null?null:Ze(p.gasLimit,"gasLimit"),_=p.maxFeePerGas==null?null:Ze(p.maxFeePerGas,"maxFeePerGas");return t.maxGasLimit!=null&&(E==null||E>Ze(t.maxGasLimit,"maxGasLimit"))&&me("gas limit cap exceeded"),t.maxFeePerGasWei!=null&&(_==null||_>Ze(t.maxFeePerGasWei,"maxFeePerGasWei"))&&me("gas fee cap exceeded"),$({status:"ok",action:"mint",platform:e,chainId:r,contract:o,mintTarget:i,recipient:s,quantity:c.toString(),priceWei:l.toString(),valueWei:v.toString(),platformFeeWei:(v-x).toString(),maxValueWei:u.toString(),maxPlatformFeeWei:d.toString(),...g?{stage:g}:{},...y==null?{}:{walletAllowance:y.toString()},proof:k,transaction:{chainId:r,to:i,data:p.data,value:v.toString(),...E==null?{}:{gasLimit:E.toString()},..._==null?{}:{maxFeePerGas:_.toString()}},requiresWalletSignature:!0,backendSigner:!1,execution:"prepare-only",signed:!1},{provider:`${e}-mint`,kind:"evm-nft-mint"})}var GF="RESEARCH_ONLY";var KF="canonical serialized-message decoding and program-specific instruction validation are not implemented",il=Object.freeze({metaplexCore:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",candyMachine:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR",candyGuard:"Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g",magicEdenLaunchpad:"CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR"}),yW=Object.freeze({system:"11111111111111111111111111111111",computeBudget:"ComputeBudget111111111111111111111111111111",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",sysvarInstructions:"Sysvar1nstructions1111111111111111111111111"});function YF(){throw new Error(`solana-mint: ${GF}; disabled until ${KF}`)}function Bv(){YF()}ne();import{Address as JF,CompactSize as XF,NETWORK as QF,OutScript as Gv,Script as ZF,TEST_NETWORK as Mv,Transaction as e4,utils as t4}from"@scure/btc-signer";import{createHash as ba}from"node:crypto";var Fv="universal-ordinals-mint",Uv="bitcoin-ordinals-mint-plan",n4=1800*1e3,r4=new Set(["bitcoin","mainnet","testnet","signet","regtest"]),Dv=new Set,o4=Object.freeze({prepareUnsignedCommitPsbt:!0,prepareUnsignedRevealPsbt:!0,parentChildInscriptions:!0,validatePlan:!0,sign:!1,broadcast:!1,custody:!1});function Bt(e,t){let n=String(e??"").trim();if(!n)throw new Error(`ordinals mint: ${t} required`);return n}function zn(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 Jm(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 Kv(e,t){let n=Bt(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 i4(e){return e==="bitcoin"||e==="mainnet"?QF:e==="regtest"?{...Mv,bech32:"bcrt"}:Mv}function qv(e,t){try{let n=Gv.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 a4(e){return e!=null&&(typeof e.length!="number"||e.length>0)}function s4(e){let t=ba("sha256").update(e.unsignedTx).digest();return ba("sha256").update(t).digest().reverse().toString("hex")}function Hv(e,...t){let n=ba("sha256").update(e,"ascii").digest();return ba("sha256").update(n).update(n).update(Buffer.concat(t)).digest()}function c4(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=Hv("TapLeaf",Buffer.from([a]),Buffer.from(XF.encode(BigInt(i.length))),i);for(let u of e.merklePath){let d=Buffer.from(u);s=Hv("TapBranch",...Buffer.compare(s,d)<0?[s,d]:[d,s])}let[c,l]=t4.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 jv(e,t){let n=Bt(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=e4.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(a4(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=qv(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)=>c4(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 qv(l.script,`${t} output ${c} script`),{valueSats:BigInt(l.amount).toString(),scriptHex:Buffer.from(l.script).toString("hex")}});return{encoded:n,txid:s4(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 l4(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 u4(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 d4=new Set([1,3]);function p4(e,t){let n=t+3,r=new Map;for(;n<e.length&&e[n]!==0;){let i=u4(e[n++]),a=e[n++];if(i==null||!(a instanceof Uint8Array))throw new Error("ordinals mint: malformed inscription envelope fields");if(!d4.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 m4(e,{contentHash:t,contentType:n,parentId:r}){let o=[];for(let u of e.inputs[0].tapLeafScripts){let d;try{d=ZF.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(p4(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(ba("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||l4(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 zv(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 f4(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 Yv(e,t="parentId"){let n=Bt(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 Jv(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`ordinals mint: commit input ${t} must be an object`);let n=Bt(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=zn(e.valueSats??e.value,`commitInputs[${t}].valueSats`,{positive:!0}).toString();return{txid:n,vout:r,valueSats:o,outpoint:`${n}:${r}`}}function h4(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:Bt(a.role,`revealOutputs[${s}].role`),address:Bt(a.address,`revealOutputs[${s}].address`),valueSats:zn(a.valueSats??a.value,`revealOutputs[${s}].valueSats`).toString(),scriptHex:Kv(a.scriptHex,`revealOutputs[${s}].scriptHex`),...a.parentId==null?{}:{parentId:Yv(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 g4(e){if(!Array.isArray(e)||e.length===0)throw new Error("ordinals mint: exact commitOutputs required");let t=e.map((n,r)=>({role:Bt(n?.role,`commitOutputs[${r}].role`),valueSats:zn(n?.valueSats??n?.value,`commitOutputs[${r}].valueSats`,{positive:!0}).toString(),scriptHex:Kv(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 Vv(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 Wv(e,t,n){try{return Buffer.from(Gv.encode(JF(i4(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 y4(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)=>Jv({...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 w4(e={},t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("ordinals mint: request object required");f4(e);for(let N of["content","contentBytes","body","file","path","url","contentUrl"])if(e[N]!=null)throw new Error("ordinals mint: mutable content refused; provide immutable contentHash and contentType only");for(let N of["inscriptionNumber","stableInscriptionNumber","expectedInscriptionNumber","number"])if(e[N]!=null)throw new Error("ordinals mint: stable inscription number claims are not valid before confirmation");let n=Bt(e.network,"network").toLowerCase();if(!r4.has(n))throw new Error("ordinals mint: unsupported Bitcoin network");let r=Bt(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=Bt(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=Yv(e.parentId??e.parentInscriptionId),a=Bt(e.recipient??e.destination,"recipient"),s=zn(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(Jv);if(new Set(c.map(N=>N.outpoint)).size!==c.length)throw new Error("ordinals mint: duplicate commit input/reuse refused");y4(e,c);let l=jv(e.commitPsbt??e.unsignedCommitPsbt,"unsigned commit PSBT"),u=jv(e.revealPsbt??e.unsignedRevealPsbt,"unsigned reveal PSBT"),d=g4(e.commitOutputs),p=h4(e.revealOutputs,{recipient:a,parentId:i,postageSats:s});if(l.inputs.length!==c.length||l.inputs.some((N,I)=>N.txid!==c[I].txid||N.vout!==c[I].vout||N.valueSats!==c[I].valueSats))throw new Error("ordinals mint: actual commit PSBT inputs must exactly match commitInputs");Vv(l.outputs,d,"commit PSBT"),Vv(u.outputs,p,"reveal PSBT");let m=Wv(a,n,"recipient");if(p.find(N=>N.role==="inscription").scriptHex!==m)throw new Error("ordinals mint: reveal inscription script does not pay the bound recipient address");for(let[N,I]of p.entries())if(I.scriptHex!==Wv(I.address,n,`revealOutputs[${N}].address`))throw new Error(`ordinals mint: reveal output ${N} script does not pay its bound address`);let f=d.findIndex(N=>N.role==="reveal");if(u.inputs.length!==1)throw new Error("ordinals mint: reveal PSBT must have exactly one reveal input");let h=u.inputs.filter(N=>N.txid===l.txid&&N.vout===f);if(h.length!==1||h[0].valueSats!==d[f].valueSats||h[0].scriptHex!==d[f].scriptHex)throw new Error("ordinals mint: reveal PSBT is not exactly linked to the reviewed commit reveal output");m4(u,{contentHash:r,contentType:o,parentId:i});let g=Jm(e.commitFeeRateSatVb,"commitFeeRateSatVb"),b=Jm(e.revealFeeRateSatVb,"revealFeeRateSatVb"),S=Jm(e.maxFeeRateSatVb,"maxFeeRateSatVb");if(S<=0||g>S||b>S)throw new Error("ordinals mint: fee rate exceeds bound fee-rate cap");let w=zn(e.commitFeeSats,"commitFeeSats"),y=zn(e.revealFeeSats,"revealFeeSats"),k=zn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});if(w+y>k)throw new Error("ordinals mint: total fee exceeds maxTotalFeeSats cap");if(l.feeSats!==w.toString()||u.feeSats!==y.toString())throw new Error("ordinals mint: decoded PSBT fee does not match reviewed fee");if(Number(w)/l.vsizeLowerBound>g||Number(y)/u.vsizeLowerBound>b)throw new Error("ordinals mint: decoded PSBT fee rate exceeds reviewed rate");if(typeof e.rbf!="boolean")throw new Error("ordinals mint: explicit rbf policy required");if(l.inputs.some(N=>N.sequence<4294967294)!==e.rbf)throw new Error("ordinals mint: actual commit PSBT sequence does not match the reviewed RBF policy");if(u.inputs[0].sequence<4294967294!==e.rbf)throw new Error("ordinals mint: actual reveal PSBT sequence does not match the reviewed RBF policy");if(!e.cpfp||typeof e.cpfp!="object"||typeof e.cpfp.enabled!="boolean")throw new Error("ordinals mint: explicit cpfp policy required");let E=e.cpfp.enabled?{enabled:!0,outputIndex:Number(e.cpfp.outputIndex),valueSats:zn(e.cpfp.valueSats,"cpfp.valueSats",{positive:!0}).toString()}:{enabled:!1};if(E.enabled){if(!Number.isSafeInteger(E.outputIndex)||E.outputIndex<0||p[E.outputIndex]?.role!=="cpfp")throw new Error("ordinals mint: CPFP outputIndex must identify a reveal cpfp output");if(p[E.outputIndex].valueSats!==E.valueSats)throw new Error("ordinals mint: CPFP value does not match reveal output")}else if(p.some(N=>N.role==="cpfp"))throw new Error("ordinals mint: reveal cpfp output conflicts with disabled CPFP policy");let _=Number(t.nowMs??Date.now()),P=Number(e.expiresAt??e.expiresAtMs);if(!Number.isFinite(P)||P<=_||P-_>n4)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(zv),commitPsbt:l.encoded,commitOutputs:d,revealInputs:u.inputs.map(zv),revealPsbt:u.encoded,revealOutputs:p,commitRate:g,revealRate:b,maxRate:S,commitFee:w.toString(),revealFee:y.toString(),maxTotalFee:k.toString(),rbf:e.rbf,cpfp:E,expiresAt:P}}function b4(e={},t={}){let n=w4(e,t),r=n.commitInputs.find(s=>Dv.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:Fv,kind:Uv,execution:"prepare-only",signed:!1,maxExecutions:1,capabilities:{...o4},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=$(i,{provider:Fv,kind:Uv,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt});for(let s of n.commitInputs)Dv.add(s.outpoint);return a}var Xv=b4;var S4=Object.freeze([Ir.DISCOVERY,Ir.ELIGIBILITY,Ir.PREPARATION,Ir.SIMULATION]),Qv=[["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",il.metaplexCore],["solana.candy-machine","solana",["metaplex"],["mint","candy-machine"],"solana",il.candyMachine],["solana.magic-eden-launchpad","solana",["magic-eden"],["mint","launchpad"],"solana",il.magicEdenLaunchpad],["bitcoin.ordinals","bitcoin",["ordinals"],["mint","inscription"],"bitcoin",null]],Zv=Object.freeze(Qv.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([Ir.DISCOVERY]):S4,tier:t==="solana"?"RESEARCH_ONLY":"PREPARE_READY"}))),CW=Wm(Zv.map(({family:e,tier:t,enabled:n,...r})=>r)),eE=new Map(Qv.map(e=>[e[0],e])),k4=new Set(["intent","adapterId","input"]),v4=/^(?:sign|execute|broadcast|submit|wif|privateKey|secretKey|seed|mnemonic|vault|signature|signatures|signed.*|rawTransaction)$/i,al=class extends Error{constructor(t,n,r={}){super(`universal mint router: ${n}`,r),this.name="UniversalMintRouterError",this.code=t}};function ke(e,t,n){throw new al(e,t,n?{cause:n}:{})}function z(e,t,n){String(e??"")!==String(t)&&ke("intent-mismatch",`${n} does not match canonical intent`)}function De(e,t,n){let r=e[t];return r.unit!==n&&ke("unsupported-unit",`${t}.unit must be ${n}`),BigInt(r.amount)}function tE(e,t="input"){if(!(!e||typeof e!="object"))for(let[n,r]of Object.entries(e))v4.test(n)&&ke("custody-refused",`${t}.${n} is outside the prepare-only boundary`),tE(r,`${t}.${n}`)}function E4(e,t){return e==="solana"?t.eligibilityProofAccounts??[]:e==="bitcoin"?t.eligibilityProof??[t.contentHash,t.parentId]:t.proof??[]}function A4(e,t,n,r){(typeof t.stageId!="string"||typeof t.proofDigest!="string")&&ke("invalid-request","decoded input requires exact stageId and proofDigest");let o=e.stages.find(c=>c.id===t.stageId);o||ke("intent-mismatch","stageId does not match canonical intent"),z(t.proofDigest,o.eligibility.proofDigest,"proof digest");let i=`sha256:${x4("sha256").update(JSON.stringify(E4(n,t))).digest("hex")}`;z(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))&&ke("invalid-request","decoded input requires exact stage bounds"),z(a,o.startsAt.value,"stage start"),z(s,o.endsAt.value,"stage end"),(r<a||r>=s)&&ke("expired-intent","canonical mint stage is not active at authoritative now"),o}function I4(e,t){let n=eE.get(t);n||ke("unsupported-adapter",`unsupported explicit adapter ${String(t)}`);let[,r,o,i]=n;return z(r,e.chain.family,"chain family"),(!o.includes(e.marketplace)||!i.includes(e.mechanism))&&ke("unsupported-request",`${t} does not support the exact marketplace/mechanism`),n}function _4(e,t){e.chain.family==="evm"?(z(t.chainId,e.chain.id,"network"),z(t.contract,e.collection,"collection/drop"),z(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.maxValueWei??t.maxTotalWei,De(e,"mintValueCap","wei"),"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,De(e,"networkFeeCap","wei"),"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,De(e,"priorityFeeCap","wei-per-gas"),"priority-fee cap")):e.chain.family==="solana"?(z(t.network,e.chain.id,"network"),z(t.collection??t.drop??t.identity,e.collection,"collection/drop"),z(t.recipientOwner??t.recipient,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.priceLamports,De(e,"mintValueCap","lamports"),"mint-value cap"),z(t.networkFeeCapLamports,De(e,"networkFeeCap","lamports"),"network-fee cap"),z(t.priorityFeeCapLamports,De(e,"priorityFeeCap","lamports"),"priority-fee cap")):(z(t.network,e.chain.id,"network"),z(t.parentId,e.collection,"collection/drop"),z(t.recipient,e.recipient,"recipient"),z(e.quantity,1,"Ordinals quantity"),z(t.postageSats,De(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,De(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,De(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"))}function P4(e){(!e||e.oraclePrepared!==!0||e.prepareHash!==or(e))&&ke("artifact-mismatch","leaf returned an invalid or mutated preparation stamp"),(e.signingReady!==!1||e.broadcastReady!==!1||e.executionReady!==!1||e.signed===!0)&&ke("custody-refused","leaf artifact is not strictly prepare-only")}function T4(e,t,n){z(t.chainId,e.chain.id,"network"),z(t.contract,e.collection,"collection/drop"),z(t.recipient??t.buyer??t.minter,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity");let r=De(e,"mintValueCap","wei"),o=De(e,"networkFeeCap","wei"),i=De(e,"priorityFeeCap","wei-per-gas");z(t.maxValueWei??t.maxTotalWei,r,"mint-value cap"),z(t.maxTotalGasWei??t.maxGasWei??t.gasPolicy?.maxTotalGasWei,o,"network-fee cap"),z(t.maxPriorityFeePerGasWei??t.gasPolicy?.maxPriorityFeePerGasWei,i,"priority-fee cap");let a=n.transaction??n.transactions?.[0];a||ke("artifact-mismatch","prepared EVM transaction is missing"),z(a.chainId,e.chain.id,"artifact network");let s=BigInt(a.gasLimit??0),c=BigInt(a.maxFeePerGas??0);(!s||!c||s*c>o)&&ke("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)&&ke("artifact-mismatch","artifact priority fee exceeds or omits canonical cap evidence"),z(n.contract,e.collection,"artifact collection/drop"),z(n.recipient??n.buyer,e.recipient,"artifact recipient"),z(n.quantity,e.quantity,"artifact quantity"),BigInt(n.valueWei??n.totalWei)>r&&ke("artifact-mismatch","artifact mint value exceeds canonical cap"),{networkFee:(s*c).toString(),priorityFee:l.toString()}}function N4(e,t,n){z(t.network,e.chain.id,"network"),z(t.collection??t.drop??t.identity,e.collection,"collection/drop"),z(t.recipientOwner??t.recipient,e.recipient,"recipient"),z(t.quantity,e.quantity,"quantity"),z(t.priceLamports,De(e,"mintValueCap","lamports"),"mint-value cap");let r=De(e,"networkFeeCap","lamports"),o=De(e,"priorityFeeCap","lamports");z(t.networkFeeCapLamports,r,"network-fee cap"),z(t.priorityFeeCapLamports,o,"priority-fee cap"),z(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)&&ke("artifact-mismatch","artifact Solana fee exceeds canonical caps"),{networkFee:i.toString(),priorityFee:i.toString()}}function C4(e,t,n){return z(t.network,e.chain.id,"network"),z(t.parentId,e.collection,"collection/drop"),z(t.recipient,e.recipient,"recipient"),z(e.quantity,1,"Ordinals quantity"),z(t.postageSats,De(e,"mintValueCap","sats"),"mint-value cap"),z(t.maxTotalFeeSats,De(e,"networkFeeCap","sats"),"network-fee cap"),z(t.maxFeeRateSatVb,De(e,"priorityFeeCap","sat/vbyte"),"priority-fee cap"),z(n.plan.network,e.chain.id,"artifact network"),z(n.plan.parentId,e.collection,"artifact collection/drop"),z(n.plan.recipient,e.recipient,"artifact recipient"),z(n.plan.postageSats,e.mintValueCap.amount,"artifact mint-value cap"),z(n.plan.caps.maxTotalFeeSats,e.networkFeeCap.amount,"artifact network-fee cap"),z(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 Xm(){return Object.freeze({prepareOnly:!0,signing:!1,broadcast:!1,adapters:Zv})}async function nE(){return{provider:"universal-mint-router",status:"ok",prepareOnly:!0,capabilities:Xm()}}async function rE(e={},t={}){(!e||typeof e!="object"||Array.isArray(e))&&ke("invalid-request","request must be a plain object");for(let u of Object.keys(e))k4.has(u)||ke("invalid-request",`unknown request field ${u}`);(typeof e.adapterId!="string"||!e.adapterId)&&ke("invalid-request","explicit adapterId is required; adapter inference is refused"),eE.has(e.adapterId)||ke("unsupported-adapter",`unsupported explicit adapter ${e.adapterId}`);let n=e.input;(!n||typeof n!="object"||Array.isArray(n))&&ke("invalid-request","family-specific decoded input is required"),tE(n);let r;try{r=jm(e.intent)}catch(u){ke("invalid-intent",u.message,u)}let o=Number(t.nowMs??Date.now());Number.isSafeInteger(o)||ke("invalid-request","authoritative nowMs must be a safe integer"),o>=r.expiry.value&&ke("expired-intent","canonical mint intent has expired");let i=I4(r,e.adapterId);i[1]==="solana"&&ke("adapter-refused","universal Solana mint preparation is disabled until canonical serialized-message instructions are independently decoded and bound");let a=A4(r,n,r.chain.family,o);_4(r,n);let s;try{i[4]==="evm"?s=await $v(i[5],n,t):i[4]==="opensea"?s=await fs(n,t):i[4]==="solana"?(z(n.programId,i[5],"selected Solana adapter program"),s=await Bv(n,t)):s=await Xv(n,t)}catch(u){if(u instanceof al)throw u;ke("adapter-refused",u?.message||"adapter preparation failed",u)}P4(s);let c=i[4]==="bitcoin"?C4(r,n,s):i[4]==="solana"?N4(r,n,s):T4(r,n,s),l=Object.freeze({intentHash:Ov(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 $({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 Qm="ROUTE_ONLY",Zm=Object.freeze({MINT:"mint",BUY:"buy",LIST:"list",CANCEL_LISTING:"cancel_listing",SEND:"send"}),iE=new Set(Object.values(Zm)),R4=new Set(["action","family","network","standard","collection","tokenId","mint","inscription","outpoint","owner","seller","sender","recipient","quantity","marketplace","protocol","price","expiry","fees","royalties","listingId","artifactKind"]),L4=new Set(["amount","currency"]),$4=new Set(["value","unit"]),B4=new Set(["id","family","networks","standards","marketplaces","protocols","artifactKinds","actions","surface"]),M4=new Set(["provider","operations"]),ye=class extends TypeError{constructor(t,n="invalid-intent"){super(`universal NFT lifecycle: ${t}`),this.name="UniversalNftLifecycleError",this.code=n}};function Co(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new ye(`${t} must be a plain object`);return e}function xa(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new ye(`${n} has unknown field ${r}`,"unknown-field")}function Te(e,t){if(typeof e!="string"||e.length===0||e.trim()!==e||/[\u0000-\u001f\u007f]/.test(e))throw new ye(`${t} must be an exact non-empty string`);return e}function aE(e,t,{positive:n=!1}={}){if(e=Te(e,t),!/^(0|[1-9]\d*)$/.test(e)||n&&e==="0")throw new ye(`${t} must be a canonical ${n?"positive":"non-negative"} integer string`);return e}function To(e,t,{allowEmpty:n=!1}={}){if(!Array.isArray(e)||!n&&e.length===0)throw new ye(`${t} must be ${n?"an":"a non-empty"} array`);let r=e.map((o,i)=>Te(o,`${t}[${i}]`));if(new Set(r).size!==r.length)throw new ye(`${t} contains duplicates`);return r}function sE(e,t){return e=Co(e,t),xa(e,L4,t),{amount:aE(e.amount,`${t}.amount`),currency:Te(e.currency,`${t}.currency`)}}function oE(e,t){if(!Array.isArray(e))throw new ye(`${t} must be an array`,"missing-bounds");return e.map((n,r)=>sE(n,`${t}[${r}]`))}function F4(e){if(e=Co(e,"expiry"),xa(e,$4,"expiry"),!Number.isSafeInteger(e.value)||e.value<0||e.unit!=="unix-ms")throw new ye("expiry must be a non-negative safe unix-ms value","invalid-expiry");return{value:e.value,unit:"unix-ms"}}function U4(e,t,n){Object.hasOwn(e,n)&&(t[n]=Te(e[n],n))}function cE(e){e=Co(e,"intent"),xa(e,R4,"intent");let t=Te(e.action,"action");if(!iE.has(t))throw new ye(`unsupported action ${t}`,"invalid-action");let n={action:t,family:Te(e.family,"family"),network:Te(e.network,"network"),standard:Te(e.standard,"standard"),collection:Te(e.collection,"collection")};for(let o of["tokenId","mint","inscription","outpoint"])U4(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 ye("mint routes bind the collection/drop and must not invent a post-mint asset identity","invalid-identity")}else{if(r.length!==1)throw new ye("exactly one tokenId, mint, or inscription identity is required","invalid-identity");if(n.family==="bitcoin"&&!n.outpoint)throw new ye("Bitcoin identity requires outpoint","invalid-identity")}if(t==="list"||t==="cancel_listing")n.seller=Te(e.seller,"seller");else if(t==="send"){if(!Object.hasOwn(e,"owner")&&!Object.hasOwn(e,"sender"))throw new ye("send requires owner or sender","missing-actor");Object.hasOwn(e,"owner")&&(n.owner=Te(e.owner,"owner")),Object.hasOwn(e,"sender")&&(n.sender=Te(e.sender,"sender"))}else n.owner=Te(e.owner,"owner");if((t==="send"||t==="buy"||t==="mint")&&(n.recipient=Te(e.recipient,"recipient")),n.quantity=aE(e.quantity,"quantity",{positive:!0}),n.marketplace=Te(e.marketplace,"marketplace"),n.protocol=Te(e.protocol,"protocol"),n.artifactKind=Te(e.artifactKind,"artifactKind"),["mint","buy","list"].includes(t)){if(!["price","expiry","fees","royalties"].every(o=>Object.hasOwn(e,o)))throw new ye(`${t} requires price, expiry, fees, and royalties`,"missing-bounds");n.price=sE(e.price,"price"),n.expiry=F4(e.expiry),n.fees=oE(e.fees,"fees"),n.royalties=oE(e.royalties,"royalties")}return t==="cancel_listing"&&(n.listingId=Te(e.listingId,"listingId")),n}function D4(e){e=Co(e,"adapter"),xa(e,B4,"adapter");let t=To(e.actions,"adapter.actions");for(let o of t)if(!iE.has(o))throw new ye(`adapter has unknown action ${o}`,"invalid-action");let n=Co(e.surface,"adapter.surface");xa(n,M4,"adapter.surface");let r=Co(n.operations,"adapter.surface.operations");for(let o of t)Te(r[o],`adapter.surface.operations.${o}`);for(let o of Object.keys(r))if(!t.includes(o))throw new ye(`operation ${o} is not declared`,"unknown-field");return Object.freeze({id:Te(e.id,"adapter.id"),family:Te(e.family,"adapter.family"),networks:Object.freeze(To(e.networks,"adapter.networks")),standards:Object.freeze(To(e.standards,"adapter.standards")),marketplaces:Object.freeze(To(e.marketplaces,"adapter.marketplaces")),protocols:Object.freeze(To(e.protocols,"adapter.protocols")),artifactKinds:Object.freeze(To(e.artifactKinds,"adapter.artifactKinds")),actions:Object.freeze(t),tier:Qm,custody:"user",surface:Object.freeze({provider:Te(n.provider,"adapter.surface.provider"),operations:Object.freeze({...r})})})}function q4(e=[]){if(!Array.isArray(e))throw new ye("entries must be an array");let t=e.map(D4);if(new Set(t.map(r=>r.id)).size!==t.length)throw new ye("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:Qm,custody:"user",adapters:Object.freeze(t),get(r){return t.find(o=>o.id===r)||null},route(r){let o=cE(r),i=n(o,!0);if(i.length===1)return i[0];throw i.length>1?new ye("ambiguous adapter route","ambiguous-route"):n(o,!1).length?new ye(`adapter lacks ${o.action}`,"unsupported-operation"):new ye("no exact adapter route","unsupported-operation")}})}var No=(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}}),ef=q4([No("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"}),No("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"}),No("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"}),No("solana-nft-transfer","solana",["solana:mainnet"],["metaplex-nft","metaplex-core"],["none"],["spl-token"],["solana-transaction"],["send"],"universal-solana-nft-transfer",{send:"prepare"}),No("satflow-ordinals-market","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["satflow"],["ordinals"],["bitcoin-psbt"],["buy","list"],"satflow",{buy:"preparePurchase",list:"prepareList"}),No("bitcoin-ordinal-transfer","bitcoin",["bitcoin:mainnet","bitcoin:testnet","bitcoin:signet"],["ordinals"],["none"],["ordinals"],["bitcoin-psbt"],["send"],"universal-ordinals-transfer",{send:"prepare"})]);function lE(e,{access:t="public",feeProfile:n="default",registry:r=ef,nowMs:o=Date.now()}={}){if(!new Set(["public","admin"]).has(t))throw new ye("access must be public or admin","invalid-access");if(!Number.isSafeInteger(o)||o<0)throw new ye("nowMs must be a non-negative safe integer","invalid-expiry");let i=cE(e);if(i.expiry&&o>=i.expiry.value)throw new ye("lifecycle intent has expired","expired-intent");let a=r.route(i);return Object.freeze({tier:Qm,custody:"user",prepareOnly:!1,routeOnly:!0,access:t,feeProfile:Te(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)})}ne();var cl="universal-evm-nft-transfer",uE="evm-nft-safe-transfer",j4=1800*1e3,z4=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),V4=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function dE(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[n,r]of Object.entries(e)){if(V4.test(n))throw new Error(`evm nft transfer: ${n} refused; secret/signed material is outside this prepare-only adapter`);dE(r,t)}}}function tf(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 _r(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 Sa=e=>e.toString(16).padStart(64,"0"),sl=e=>e.slice(2).padStart(64,"0");function W4(e,t,n,r,o){return e==="erc721"?`0x42842e0e${sl(t)}${sl(n)}${Sa(r)}`:`0xf242432a${sl(t)}${sl(n)}${Sa(r)}${Sa(o)}${Sa(160n)}${Sa(0n)}`}function G4(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(dE(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=_r(e.chainId,"chainId",{positive:!0,safe:!0}),o=tf(e.sender??e.from,"sender"),i=tf(e.recipient??e.to,"recipient"),a=tf(e.contract??e.contractAddress??e.tokenContract,"contract"),s=_r(e.tokenId,"tokenId"),c=_r(e.quantity,"quantity",{positive:!0});if(n==="erc721"&&c!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(_r(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let l=_r(e.gasLimit,"gasLimit",{positive:!0}),u=_r(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),d=_r(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)>j4)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let m=W4(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 pE(e={},t={}){let n=G4(e,t),r={provider:cl,kind:uE,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...z4},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 $(r,{provider:cl,kind:uE,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:n.expiresAt})}ne();var ll="universal-solana-nft-transfer",mE="solana-verified-nft-transfer",hE="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Pr=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),fE=new Set(Object.values(Pr)),Y4=new Set([Pr.token,Pr.token2022]),J4=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),X4=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function ce(e){throw new Error(`solana nft transfer: ${e}`)}function Mt(e,t){let n=String(e??"").trim();return n||ce(`${t} required`),n}function Gt(e,t,{positive:n=!1}={}){/^\d+$/.test(String(e??""))||ce(`${t} must be an unsigned integer`);let r=BigInt(e);return n&&r===0n&&ce(`${t} must be positive`),r}function Oe(e,t,n){String(e??"")!==String(t)&&ce(`${n} mismatch; mutation refused`)}function gE(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))X4.test(r)&&o!=null&&o!==!1&&ce(`${t}.${r} refused; signed or private material is outside this prepare-only adapter`),gE(o,`${t}.${r}`,n);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&ce(`${r} refused; adapter is prepare-only`)}}function Q4(e,t){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&ce(`${t} must be decoded`),Array.isArray(e.accounts)||ce(`${t} decoded accounts required`),e.decoded}function Z4(e,t,n){for(let r of e.accounts){let o=Mt(r.pubkey,"account pubkey");t.has(o)||ce(`unexpected account ${o}`),r.isWritable===!0&&!n.has(o)&&ce(`unexpected writable account ${o}`)}}function eU(e={}){(!e||typeof e!="object"||Array.isArray(e))&&ce("request object required"),gE(e),(e.network!=="mainnet-beta"||e.genesisHash!==hE)&&ce("mainnet genesis/network mismatch"),e.reviewed!==!0&&ce("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let t=Mt(e.standard,"standard").toLowerCase();t!=="metaplex"&&t!=="core"&&ce("standard must be metaplex or core");let n=Mt(e.mint??e.asset,"mint/asset"),r=Mt(e.collection,"collection");e.collectionVerified!==!0&&ce("verified collection required");let o=Mt(e.owner,"owner"),i=Mt(e.recipient,"recipient"),a=Gt(e.quantity,"quantity",{positive:!0}),s=Gt(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});a>s&&ce("quantity exceeds reviewed edition bound"),t==="core"&&a!==1n&&ce("Core quantity must be exactly 1");let c=Mt(e.tokenProgramId,"tokenProgramId");(t==="core"?c!==Pr.core:!Y4.has(c))&&ce("reviewed transfer program mismatch");let l=t==="metaplex"?Mt(e.sourceTokenAccount,"sourceTokenAccount"):null,u=t==="metaplex"?Mt(e.recipientTokenAccount,"recipientTokenAccount"):null;t==="metaplex"&&Oe(e.derivedRecipientAta,u,"derived recipient ATA");let d=t==="metaplex"?Number(Gt(e.decimals??0,"decimals")):null,p=Gt(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),m=Gt(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),f=Gt(e.priorityFeeCapLamports,"priorityFeeCapLamports"),h=(p*m+999999n)/1000000n;h>f&&ce("priority fee exceeds reviewed cap");let g=Gt(e.networkFeeLamports,"networkFeeLamports"),b=Gt(e.networkFeeCapLamports,"networkFeeCapLamports");g>b&&ce("network fee cap exceeded");let S=e.transaction;(!S||typeof S!="object"||Array.isArray(S))&&ce("transaction object required"),S.version!==0&&S.version!=="legacy"&&ce("transaction version must be 0 or legacy");let w=Mt(S.recentBlockhash,"recentBlockhash");Oe(w,e.approvedBlockhash,"blockhash mutation after approval");let y=Gt(S.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),k=Gt(e.currentBlockHeight,"currentBlockHeight");k>y&&ce("expired blockhash"),(!Array.isArray(S.instructions)||S.instructions.length<3)&&ce("canonical instructions required");let v=new Set([o,n,l,u].filter(Boolean)),x=new Set([o,i,n,r,l,u,...fE].filter(Boolean)),E=0,_=0,P=0,N=0;for(let[I,L]of S.instructions.entries()){let F=Mt(L.programId,`instructions[${I}].programId`);fE.has(F)||ce(`unknown program ${F}`);let O=Q4(L,`instructions[${I}]`);Z4(L,x,v);let D=String(O.type??O.instruction??"").toLowerCase();F===Pr.computeBudget?D.includes("limit")?(Oe(O.units??O.computeUnitLimit,p,"compute-unit limit"),E++):D.includes("price")?(Oe(O.microLamports??O.computeUnitPriceMicroLamports,m,"compute-unit price"),_++):ce("unsupported compute budget instruction"):F===Pr.associatedToken?((t!=="metaplex"||D!=="createassociatedtokenaccountidempotent")&&ce("non-canonical associated token instruction"),Oe(O.payer,o,"ATA payer"),Oe(O.owner,i,"ATA recipient"),Oe(O.mint,n,"ATA mint"),Oe(O.tokenAccount,u,"recipient ATA"),Oe(O.tokenProgramId,c,"ATA token program"),N++):t==="metaplex"&&F===c?(D!=="transferchecked"&&ce("only canonical transferChecked is allowed"),Oe(O.mint,n,"mint"),Oe(O.owner,o,"owner"),Oe(O.recipient,i,"recipient"),Oe(O.sourceTokenAccount,l,"source token account"),Oe(O.destinationTokenAccount,u,"recipient ATA"),Oe(O.amount,a,"quantity"),Oe(O.decimals,d,"decimals"),P++):t==="core"&&F===Pr.core?(D!=="transfer"&&ce("only canonical Core transfer is allowed"),Oe(O.asset,n,"mint/asset"),Oe(O.collection,r,"collection"),O.collectionVerified!==!0&&ce("verified collection required in Core instruction"),Oe(O.owner,o,"owner"),Oe(O.newOwner,i,"recipient"),Oe(O.amount??1,1,"quantity"),P++):ce(`program ${F} is not valid for ${t} transfer`)}return(E!==1||_!==1)&&ce("exactly one compute-unit limit and price instruction required"),P!==1&&ce("exactly one canonical transfer instruction required"),t==="metaplex"&&N>1&&ce("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:w,lastValidBlockHeight:y.toString(),currentBlockHeight:k.toString(),computeUnitLimit:p.toString(),computeUnitPriceMicroLamports:m.toString(),priorityFeeLamports:h.toString(),priorityFeeCapLamports:f.toString(),networkFeeLamports:g.toString(),networkFeeCapLamports:b.toString(),transaction:S}}function yE(e={},t={}){let n=eU(e),r=Number(t.nowMs??Date.now()),o={provider:ll,kind:mE,chain:"solana-mainnet-beta",genesisHash:hE,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...J4},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:n.standard,mint:n.mint,collection:n.collection,collectionVerified:!0,owner:n.owner,recipient:n.recipient,quantity:n.quantity,maxEditionQuantity:n.maxEditionQuantity,tokenProgramId:n.tokenProgramId,...n.sourceTokenAccount?{sourceTokenAccount:n.sourceTokenAccount,recipientTokenAccount:n.recipientTokenAccount,decimals:n.decimals}:{}},transaction:{unsigned:!0,version:n.transaction.version,recentBlockhash:n.recentBlockhash,lastValidBlockHeight:n.lastValidBlockHeight,instructions:structuredClone(n.transaction.instructions)},caps:{currentBlockHeight:n.currentBlockHeight,computeUnitLimit:n.computeUnitLimit,computeUnitPriceMicroLamports:n.computeUnitPriceMicroLamports,priorityFeeLamports:n.priorityFeeLamports,priorityFeeCapLamports:n.priorityFeeCapLamports,networkFeeLamports:n.networkFeeLamports,networkFeeCapLamports:n.networkFeeCapLamports},reviewed:!0};return $(o,{provider:ll,kind:mE,env:t.env,nowMs:r,expiresAtMs:r+300*1e3})}ne();var ul="universal-ordinals-transfer",wE="bitcoin-ordinals-transfer-plan",bE=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),nU=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function he(e){throw new Error(`ordinals transfer: ${e}`)}function Wn(e,t){let n=String(e??"").trim();return n||he(`${t} required`),n}function Vn(e,t,{positive:n=!1,max:r=null}={}){/^\d+$/.test(String(e??""))||he(`${t} must be an integer`);let o=BigInt(e);return(n&&o<=0n||!n&&o<0n)&&he(`${t} must be ${n?"positive":"non-negative"}`),r!=null&&o>BigInt(r)&&he(`${t} out of range`),o}function xE(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&he(`${t} must be positive`),n}function EE(e,t){let n=Wn(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(n)||he(`${t} must be 64 hex`),n}function AE(e,t="inscriptionId"){let n=Wn(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(n)||he(`${t} must be canonical`),n}function IE(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&&he(`${t}.${r} refused; private, signed or finalized material is outside this prepare-only adapter`),IE(o,`${t}.${r}`);for(let r of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[r]===!0&&he(`${r} bypass refused; adapter is prepare-only`)}function _E(e,t){for(let n of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[n]!=null&&he(`${t}.${n} arbitrary script refused; use a bound address`)}function SE(e,t){(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),_E(e,t);let n=EE(e.txid,`${t}.txid`),r=Number(e.vout);return(!Number.isSafeInteger(r)||r<0||r>4294967295)&&he(`${t}.vout invalid`),{txid:n,vout:r,valueSats:Vn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:Wn(e.address,`${t}.address`),sequence:Number(Vn(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${n}:${r}`}}function kE(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&he(`${t} must be an object`),_E(e,t),{role:Wn(e.role,`${t}.role`),address:Wn(e.address,`${t}.address`),valueSats:Vn(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:AE(e.inscriptionId,`${t}.inscriptionId`)}}}function vE(e,t,n){JSON.stringify(e)!==JSON.stringify(t)&&he(`${n} mismatch; mutation refused`)}function rU(e={}){(!e||typeof e!="object"||Array.isArray(e))&&he("request object required"),IE(e);let t=Wn(e.network,"network").toLowerCase(),n=EE(e.genesisHash,"genesisHash");(!bE[t]||n!==bE[t])&&he("network/genesis mismatch");let r=AE(e.inscriptionId),o=SE(e.ownerInput,"ownerInput");Wn(e.currentOutpoint,"currentOutpoint").toLowerCase()!==o.outpoint&&he("current inscription outpoint mismatch");let i=Wn(e.destination,"destination"),a=Vn(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),s=e.changeOutput==null?null:kE(e.changeOutput,"changeOutput");(s?.role!=="change"||s?.inscriptionId!=null)&&he("exact change output invalid");let c=xE(e.feeRateSatVb,"feeRateSatVb"),l=xE(e.maxFeeRateSatVb,"maxFeeRateSatVb");c>l&&he("fee rate exceeds reviewed cap");let u=Vn(e.totalFeeSats??e.feeSats,"totalFeeSats"),d=Vn(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});u>d&&he("total fee exceeds reviewed cap");let p=Number(Vn(e.locktime,"locktime",{max:0xffffffffn})),m=Number(Vn(e.sequence,"sequence",{max:0xffffffffn}));m<4294967294&&he("RBF sequence refused"),o.sequence!==m&&he("owner input sequence mismatch");let f=e.psbt;(!f||typeof f!="object"||Array.isArray(f))&&he("decoded PSBT plan required"),(f.version!==0||f.unsigned!==!0)&&he("PSBT v0 must be explicitly unsigned"),Number(f.locktime)!==p&&he("PSBT locktime mismatch"),(!Array.isArray(f.inputs)||f.inputs.length!==1)&&he("exactly one PSBT input required; extra inputs refused"),vE(SE(f.inputs[0],"psbt.inputs[0]"),o,"exact owner input");let h=Array.isArray(f.outputs)?f.outputs.map((w,y)=>kE(w,`psbt.outputs[${y}]`)):he("PSBT outputs required"),g={role:"inscription",address:i,valueSats:a,inscriptionId:r};vE(h,s?[g,s]:[g],"exact PSBT outputs"),h.filter(w=>w.role==="inscription"&&w.inscriptionId===r).length!==1&&he("exactly one inscription-carrying output required");let S=h.reduce((w,y)=>w+BigInt(y.valueSats),0n);return BigInt(o.valueSats)!==S+u&&he("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 PE(e={},t={}){let n=rU(e);return $({provider:ul,kind:wE,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...nU},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...n}},{provider:ul,kind:wE,env:t.env})}Qs();_e();function iU(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 TE(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(!ap(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=iU(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 NE(e={},t={}){let n=t.rpcCall||V,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"]}}Qs();var sU=1440*60*1e3;function cU(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>sU&&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 CE="0x797a2e030B7e49107C8F07bF0300Ea9caE88cA57",lU=4663,uU="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",OE="a22cb465",dU="a0712d68";function nf(e){return String(e||"").trim().toLowerCase()}function Oo(e){return String(e||"").toLowerCase().replace(/^0x/,"")}function pU(e){let t=Oo(e);if(!/^[a-f0-9]{40}$/.test(t))throw new Error("revoke operator must be an address");return`0x${OE}${t.padStart(64,"0")}${"0".repeat(64)}`}function mU(e){return Oo(e).includes(Oo(CE))}function fU(e={}){return(Array.isArray(e.calls)?e.calls:[]).some(n=>Oo(n?.data).startsWith(OE))}function hU(e={},t){let n=Oo(t).padStart(64,"0");return(Array.isArray(e.logs)?e.logs:[]).some(o=>{let i=o?.topics||[];return nf(i[0])!==uU?!1:Oo(i[2])===n})}function gU(e=1){return`0x${dU}${BigInt(e).toString(16).padStart(64,"0")}`}function RE(e={},t={}){let n=nf(e.contract),r=nf(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!==lU&&a.push("only Robinhood chain 4663"),i!=="0"&&a.push("value must be 0 \u2014 paid mints are skipped"),mU(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"),fU(s)&&a.push("simulation sets approval / setApprovalForAll"),hU(s,r)||a.push("simulation has no ERC721 Transfer to minter");let c=a.length===0,l={chainId:o,from:r,to:n,data:gU(e.quantity??1),value:"0"},u={chainId:o,from:r,to:n,data:pU(n),value:"0"},d=!1;if(c&&e.actionMode==="execute")if(!qw(t.env||process.env))a.push("DOWNGRADED: ORACLE_AUTONOMOUS_MINT=1 required to fire");else{let p=cU(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:CE.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"]}}ka();import{createHash as wU}from"node:crypto";import{getAddress as DE,isAddress as cf}from"ethers";var $E="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",bU=Object.freeze(["lifi","paraswap","0x","cow","uniswap-v3"]),xU=Object.freeze(["lifi"]),BE=/^0x[0-9a-fA-F]{64}$/,SU=/^\d+$/;function Ne(e,t="invalid"){throw new Error(`rfq: ${e} ${t}`)}function ME(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&Ne(t,"must be a positive chainId"),n}function pl(e,t){let n=String(e??"").trim();return(!SU.test(n)||BigInt(n)<=0n)&&Ne(t,"must be a positive integer string"),n}function kU(e,t){return e==null||e===""?null:pl(e,t)}function FE(e,t){let n=String(e??"").trim();return n.toLowerCase()===$E.toLowerCase()?$E:(cf(n)||Ne(t,"must be an EVM address or native token sentinel"),DE(n))}function qE(e,t){let n=String(e??"").trim();return cf(n)||Ne(t,"must be an EVM address"),DE(n)}function vU(e,t){return e==null||e===""?null:qE(e,t)}function UE(e,t,n){return e===void 0?[...n]:(Array.isArray(e)||Ne(t,"must be an array"),e.map(r=>String(r).trim()).filter(Boolean))}function EU(e,{nowMs:t,maxDeadlineMs:n},r){let o=Number(e);return Number.isFinite(o)||Ne(r,"must be a finite millisecond timestamp"),o<=t&&Ne(r,"expired"),o>t+n&&Ne(r,"exceeds maxDeadlineMs"),Math.floor(o)}function Lo(e){if(Array.isArray(e))return e.map(Lo);if(e&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=Lo(e[n]));return t}return e}function AU(e){return JSON.stringify(Lo(e))}function ml(e){return`0x${wU("sha256").update(AU(e)).digest("hex")}`}function HE(e,t){let n={...e};for(let r of t)delete n[r];return n}function IU(e){return ml(HE(e,["intentHash"]))}function _U(e){return ml(HE(e,["firmQuoteHash"]))}function lf(e={},t={}){let n=Number(t.nowMs??Date.now()),r=Number(t.maxDeadlineMs??1800*1e3);(!Number.isFinite(n)||!Number.isFinite(r)||r<=0)&&Ne("time","is invalid");let o=ME(e.fromChainId??e.fromChain,"fromChainId"),i=ME(e.toChainId??e.toChain,"toChainId"),s=o===i?bU:xU,c={kind:"rfq-intent",version:1,fromChainId:o,toChainId:i,sellToken:FE(e.sellToken??e.tokenIn??e.fromToken,"sellToken"),buyToken:FE(e.buyToken??e.tokenOut??e.toToken,"buyToken"),sellAmount:pl(e.sellAmount??e.amountIn??e.fromAmount,"sellAmount"),receiver:qE(e.receiver??e.recipient??e.to,"receiver"),deadlineMs:EU(e.deadlineMs??e.deadline??e.expiresAtMs,{nowMs:n,maxDeadlineMs:r},"deadline"),minBuyAmount:kU(e.minBuyAmount??e.minOut??e.amountOutMin,"minBuyAmount"),allowedSources:UE(e.allowedSources,"allowedSources",s),allowedRouters:UE(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)?Lo(e.metadata):{}};return c.slippageBps!=null&&(!Number.isInteger(c.slippageBps)||c.slippageBps<0||c.slippageBps>1e4)&&Ne("slippageBps","must be 0 to 10000"),c.intentId=e.intentId?String(e.intentId):ml({seed:"rfq-intent",intent:c}).slice(0,34),c.intentHash=IU(c),Object.freeze(c)}function PU(e){return(!e||typeof e!="object"||Array.isArray(e))&&Ne("artifact","required"),e.typedDataHash!=null&&!BE.test(String(e.typedDataHash))&&Ne("artifact.typedDataHash","must be bytes32"),e.calldataHash!=null&&!BE.test(String(e.calldataHash))&&Ne("artifact.calldataHash","must be bytes32"),e.to!=null&&!cf(String(e.to))&&Ne("artifact.to","must be an address"),e.data!=null&&!/^0x(?:[0-9a-fA-F]{2})*$/.test(String(e.data))&&Ne("artifact.data","must be hex"),Lo(e)}function jE(e,t={},n={}){(!e||e.kind!=="rfq-intent")&&Ne("intent","required");let r=Number(n.nowMs??Date.now()),o=Number(t.expiryMs??t.expiresAtMs??t.validUntilMs);Number.isFinite(o)||Ne("quote expiry","required"),o<=r&&Ne("quote","expired"),o>e.deadlineMs&&Ne("quote expiry","exceeds intent deadline");let i=String(t.source??t.provider??"").trim();i||Ne("source","required"),e.allowedSources.includes(i)||Ne("source","not allowed by intent");let a=pl(t.amountOut??t.buyAmount,"amountOut"),s=pl(t.minBuyAmount??t.minOut??a,"minBuyAmount");BigInt(s)>BigInt(a)&&Ne("minBuyAmount","exceeds amountOut");let c=PU(t.artifact??t.executableArtifact??t.transaction??t.typedData),l=Number(t.quotedAtMs??t.timestampMs??n.nowMs??Date.now());Number.isFinite(l)||Ne("quotedAtMs","must be finite");let u=vU(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)?Lo(t.metadata):{}};return d.quoteId||(d.quoteId=ml({seed:"rfq-quote",out:d}).slice(0,34)),d.firmQuoteHash=_U(d),Object.freeze(d)}Oi();ka();Li();Bi();ir();function va(e,t){return Array.isArray(e?.allowedSources)&&e.allowedSources.includes(t)}function zE(e,t){return String(e?.[t]??"").trim()}function Ea(e,t){return Object.freeze({source:e,run:t})}function TU(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??Fe,i=Number(e.fromChainId)===Number(e.toChainId),a=[];return va(e,"lifi")&&a.push(Ea("lifi",async()=>{let c=await(r.lifiQuote??On)({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 NU(t,c.transactionRequest.data):void 0,route:c},metadata:{tool:c?.tool??c?.toolDetails?.name??null}}})),i&&(va(e,"paraswap")&&a.push(Ea("paraswap",async()=>{let c=await(r.paraswapPrice??gn)({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}}})),va(e,"0x")&&(zE(n,"ZEROX_API_KEY")||zE(n,"0X_API_KEY")||r.zeroxQuote)&&a.push(Ea("0x",async()=>{let c=await(r.zeroxQuote??Ln)({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}}})),va(e,"cow")&&a.push(Ea("cow",async()=>{let c=await(r.cowQuote??cn)({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}}})),va(e,"uniswap-v3")&&o[Number(e.fromChainId)]&&a.push(Ea("uniswap-v3",async()=>{let c=await(r.uniV3QuoteExactIn??Zt)({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 NU(e,t){return`0x${(await import("node:crypto")).createHash("sha256").update(String(t)).digest("hex")}`}async function CU(e,t){return Promise.race([Promise.resolve().then(e.run),new Promise((n,r)=>setTimeout(()=>r(new Error(`${e.source}: timeout`)),t))])}async function OU(e,t,n={}){let r=Number(n.timeoutMs??12e3),o=await Promise.allSettled(t.map(s=>CU(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(jE(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 RU(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 VE(e,t={}){let n=TU(e,t),{quotes:r,failed:o}=await OU(e,n,t),i=RU(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 WE(e={},t={}){return lf(e,t)}async function GE(e={},t={}){let n=e.intent?.kind==="rfq-intent"?e.intent:lf(e,t);return VE(n,t)}async function KE(){return{ok:!0,provider:"rfq",mode:"intent-rfq",execution:"prepare"}}j();var $U="https://app.across.to";function uf(e={}){return(e.baseUrl||process.env.ACROSS_API_URL||$U).replace(/\/$/,"")}async function YE(e={}){try{let t=await A(`${uf(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 JE(e={},t={}){let n=String(e.l1Token||"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");return A(`${uf(t)}/api/pools?token=${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function XE(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)),A(`${uf(t)}/api/suggested-fees?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var MU="https://api.beefy.finance";function df(e={}){return(e.baseUrl||process.env.BEEFY_API_URL||MU).replace(/\/$/,"")}async function QE(e={}){try{let t=await A(`${df(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 ZE(e={},t={}){let n=await A(`${df(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 eA(e={}){return A(`${df(e)}/apy/breakdown`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??25e3})}j();var UU="https://public-api.birdeye.so";function tA(e={}){return(e.baseUrl||process.env.BIRDEYE_API_URL||UU).replace(/\/$/,"")}async function nA(e={}){try{let t=await A(`${tA(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 rA(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 A(`${tA(t)}/public/tokenlist?sort_by=${encodeURIComponent(n)}&sort_type=${encodeURIComponent(r)}&offset=${o}&limit=${i}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var qU="https://api.celenium.io";function pf(e={}){return(e.baseUrl||process.env.CELENIUM_API_URL||qU).replace(/\/$/,"")}async function oA(e={}){try{let t=await A(`${pf(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 iA(e={}){return A(`${pf(e)}/v1/stats`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3})}async function aA(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 A(`${pf(t)}${r}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var jU="https://api.mainnet-beta.solana.com";function zU(e={}){return(e.rpcUrl||process.env.SOLANA_RPC_URL||jU).replace(/\/$/,"")}async function fl(e,t,n={}){let r=zU(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 sA(e={}){try{let t=await fl("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 cA(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 fl("getAssetsByOwner",{ownerAddress:n,page:r,limit:o,...e.sortBy?{sortBy:{sortBy:e.sortBy,sortDirection:e.sortDirection||"asc"}}:{}},t)}async function lA(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)),fl("searchAssets",o,t)}async function uA(e={},t={}){let n=String(e.assetId||"").trim();if(!n)throw new Error("das-assets: assetId is required");return fl("getAssetProof",{id:n},t)}j();var WU="https://api.l2beat.com";function mf(e={}){return(e.baseUrl||process.env.L2BEAT_API_URL||WU).replace(/\/$/,"")}async function dA(e={}){try{let t=await A(`${mf(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 pA(e={},t={}){let n=await A(`${mf(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 mA(e={},t={}){return A(`${mf(t)}/api/scaling/activity`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var KU="https://api.spark.fi";function ff(e={}){return(e.baseUrl||process.env.SPARK_API_URL||KU).replace(/\/$/,"")}async function fA(e={}){try{return{ok:(await A(`${ff(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 hA(e={},t={}){let n=String(e.protocol||"spark"),r=String(e.chain||"mainnet"),o=e.token?String(e.token).toLowerCase():null;return o?A(`${ff(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}/${encodeURIComponent(o)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}):A(`${ff(t)}/v1/savings/${encodeURIComponent(n)}/${encodeURIComponent(r)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}j();var JU="https://api.symbiotic.fi";function hf(e={}){return(e.baseUrl||process.env.SYMBIOTIC_API_URL||JU).replace(/\/$/,"")}async function gA(e={}){try{let t=await A(`${hf(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 yA(e={},t={}){let n=Math.min(200,Math.max(1,Number(e.limit||50))),r=await A(`${hf(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 wA(e={},t={}){let n=String(e.address||"").trim();if(!n)throw new Error("symbiotic-restaking: address is required");return A(`${hf(t)}/v1/vaults/${encodeURIComponent(n)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}j();var QU="https://staking-api.polygon.technology/api/v2",ZU=18,e6=200,t6=50,n6=new Set(["id","totalStaked","selfStake","delegatedStake","commissionPercent","uptimePercent","performanceIndex"]);function yf(e={}){return String(e.baseUrl||process.env.POLYGON_STAKING_API_URL||QU).replace(/\/$/,"")}function r6(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 o6(e,t=t6){let n=Number(e??t);return Number.isFinite(n)?Math.min(e6,Math.max(1,Math.trunc(n))):t}function gf(e){let t=Number(e);return Number.isFinite(t)?t/10**ZU:null}async function wf(e,t={}){let n=await A(`${yf(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 bA(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:gf(e.totalStaked),selfStakePolApprox:gf(e.selfStake),delegatedStakePolApprox:gf(e.delegatedStake),stakePrecision:"approximate \u2014 upstream serves wei-scale as float64"}}async function xA(e={},t={}){let n=await wf("/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=n6.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=o6(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(bA)}}async function SA(e={},t={}){let n=r6(e.id??e.validatorId,"id"),o=(await wf(`/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:{...bA(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 kA(e={}){try{let t=await wf("/validators",{...e,timeoutMs:e.timeoutMs??1e4}),n=Array.isArray(t?.result)?t.result:[];return{ok:n.length>0,provider:"polygon-staking",chainId:137,baseUrl:yf(e),validatorTotal:t?.summary?.total??n.length,exec:!1}}catch(t){return{ok:!1,provider:"polygon-staking",chainId:137,baseUrl:yf(e),error:String(t?.message||t),exec:!1}}}j();var a6="https://api.v3.aave.com/graphql",pG=Object.freeze([1,10,56,100,137,146,232,324,1088,1868,5e3,42161,42220,43114,57073,59144,534352]),s6=(e={})=>e.baseUrl||process.env.AAVE_V3_API_URL||a6;async function hl(e,t,n={}){let r=await A(s6(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 c6=`query Markets($request: MarketsRequest!) {
|
|
151
151
|
markets(request: $request) {
|
|
152
152
|
name
|
|
153
153
|
address
|
|
@@ -190,5 +190,5 @@ anchor-lang = "0.31.1"
|
|
|
190
190
|
}
|
|
191
191
|
}`,u6=`query Chains($filter: ChainsFilter!) {
|
|
192
192
|
chains(filter: $filter) { chainId name isTestnet explorerUrl }
|
|
193
|
-
}`;function d6(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 vA(e={},t={}){let n={chainIds:d6(e)};return e.user&&(n.user=String(e.user)),{markets:(await hl(c6,{request:n},t))?.data?.markets??[]}}async function EA(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 hl(l6,{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 AA(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 hl(u6,{filter:r},t))?.data?.chains??[]}}async function IA(e={}){return{ok:(await hl("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}j();var m6="https://staking-api.babylonlabs.io";function bf(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||m6).replace(/\/$/,"")}function gl(e,t={}){return A(`${bf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function _A(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 PA(e={}){try{let n=(await gl("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:bf(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:bf(e),error:String(t?.message||t),exec:!1}}}async function TA(e={},t={}){let r=(await gl("/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 NA(e={},t={}){let n=await gl("/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=_A(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 CA(e={},t={}){let n=_A(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 gl(`/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}}j();var h6="https://markets.bisq.network";function xf(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||h6).replace(/\/$/,"")}function OA(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 yl(e,t={}){return A(`${xf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function RA(e={}){try{let t=await yl("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:xf(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:xf(e),error:String(t?.message||t),exec:!1}}}async function LA(e={},t={}){let n=await yl("/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 $A(e={},t={}){let n=OA(e.market||e.pair||"btc_usd","market"),r=await yl(`/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 BA(e={},t={}){let n=OA(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 yl(`/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}))}}j();var yn=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"}}),y6=new Map([["bob",60808],["rootstock",30],["rsk",30]]),w6=60808;function Aa(e){if(e==null||e==="")return w6;let t=y6.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!yn[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(yn).join(", ")} / bob, rootstock)`);return n}function Sf(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Aa(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||yn[n].url).replace(/\/$/,"")}function MA(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 wl(e,t,n={}){return A(`${Sf(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function FA(e={},t={}){let n;try{n=Aa(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=yn[n];try{let o=await wl(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Sf(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:Sf(n,e),error:String(o?.message||o),exec:!1}}}async function kf(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(yn).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await kf({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:yn[c].name,error:String(l?.message||l)}}}))}}let r=Aa(n),o=yn[r],i=await wl(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 UA(e={},t={}){let n=Aa(e.chainId??e.chain),r=MA(e.address||e.addr,"address"),o=yn[n],i=await wl(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 DA(e={},t={}){let n=Aa(e.chainId??e.chain),r=MA(e.address||e.addr,"address"),o=await wl(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:yn[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}))}}j();var x6="https://insights.braiins.com/api/v1.0";function vf(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||x6).replace(/\/$/,"")}function Ef(e,t={}){return A(`${vf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function qA(e={}){try{let t=await Ef("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:vf(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:vf(e),error:String(t?.message||t),exec:!1}}}async function HA(e={},t={}){let n=await Ef("/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 jA(e={},t={}){let n=await Ef("/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)}}j();var k6="https://api.cow.fi",zA=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function VA(e={}){return(e.baseUrl||process.env.COW_API_URL||k6).replace(/\/$/,"")}function v6(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=zA[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(zA).join(", ")})`);return n}function Af(e,t,n){return`${VA(n)}/${v6(e)}/api/v1${t}`}function WA(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 GA(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function KA(e={},t={}){return A(Af(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function YA(e={},t={}){let n=WA(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(GA(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await A(`${Af(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 JA(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",WA(e.owner||e.address||e.user,"owner"));let r=await A(`${Af(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,GA(e))}}async function XA(e={}){let t=await A(`${VA(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}}j();var A6="https://api.hiro.so",I6=20;function If(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||A6).replace(/\/$/,"")}function _6(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Ia(e,t={}){return A(`${If(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:_6(t)})}async function QA(e={}){try{let t=await Ia("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:If(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:I6,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:If(e),error:String(t?.message||t),exec:!1}}}async function ZA(e={},t={}){let n=await Ia("/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 eI(e={},t={}){let n=await Ia("/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 tI(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Ia(`/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 nI(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Ia(`/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}))}}j();var T6="https://bundles.jito.wtf",oI=1e9;function _f(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||T6).replace(/\/$/,"")}function N6(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function rI(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*oI):null}function C6(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/oI:null,raw:e}}async function iI(e={}){try{let t=await A(`${_f(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 aI(e={},t={}){let n=N6(e.limit,5,100),r=new URL(`${_f(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 A(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(C6),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 sI(e={}){let t=await A(`${_f(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,rI(i)])),suggestedTipLamports:rI(r.p75||r.p50),raw:n}}j();var R6="https://api.kamino.finance";function L6(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||R6).replace(/\/$/,"")}function yt(e){let t=Number(e);return Number.isFinite(t)?t:null}function cI(e={}){let t=yt(e.totalValueLocked)??0,n=yt(e.apy?.totalApy)??0,r=yt(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:yt(e.sharePrice),sharesIssued:yt(e.sharesIssued),profitAndLoss:yt(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:yt(e.apy?.vault?.totalApr),apy24h:yt(e.kaminoApy?.vault?.apy24h),apy7d:yt(e.kaminoApy?.vault?.apy7d),apy30d:yt(e.kaminoApy?.vault?.apy30d),poolPrice:yt(e.apy?.vault?.poolPrice),priceLower:yt(e.apy?.vault?.priceLower),priceUpper:yt(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Pf(e={},t={}){let n=new URL(`${L6(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function lI(e={}){try{let t=await Pf({},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 uI(e={},t={}){let r=(await Pf(e,t)).map(cI),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 dI(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Pf({...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",...cI(o),raw:o}}j();var B6="https://blockstream.info/liquid/api",pI="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function bl(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||B6).replace(/\/$/,"")}function M6(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 F6(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 mI(e,t={}){let n=`${bl(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 fI(e,t={}){return A(`${bl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hI(e={}){try{let t=await mI("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:bl(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:bl(e),error:String(t?.message||t),exec:!1}}}async function gI(e={},t={}){let n=await mI("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function yI(e={},t={}){let n=M6(e.address||e.addr,"address"),r=await fI(`/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 wI(e={},t={}){let n=F6(e.assetId||e.asset||pI,"assetId"),r=await fI(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===pI,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}}j();var D6="https://api-mainnet.magiceden.dev/v2/ord/btc",q6=600;function Tf(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||D6).replace(/\/$/,"")}function H6(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function bI(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 xI(e,t={}){return A(`${Tf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:H6(t),retries:t.retries??1})}async function SI(e={}){let t=bI(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await xI(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Tf(e),probeCollection:t,rateLimitRpm:q6,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Tf(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 kI(e={},t={}){let n=bI(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await xI(`/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."}}}j();var z6="https://mempool.space/api",V6=7;function Nf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||z6).replace(/\/$/,"")}function xl(e,t={}){return A(`${Nf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function vI(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>V6}}async function EI(e={}){try{let n=(await xl("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=vI(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Nf(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:Nf(e),error:String(t?.message||t),exec:!1}}}async function AI(e={},t={}){let r=(await xl("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=vI(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 II(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 xl(`/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 _I(e={},t={}){let n=await xl("/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)}))}}j();var G6="https://mempool.space/api",PI=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Cf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||G6).replace(/\/$/,"")}function TI(e,t){let n=String(e||t).trim().toLowerCase();if(!PI.has(n))throw new Error(`mempool-mining: window must be one of ${[...PI].join(", ")}`);return n}function _a(e,t={}){return A(`${Cf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function NI(e={}){try{let t=await _a("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Cf(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Cf(e),error:String(t?.message||t),exec:!1}}}async function CI(e={},t={}){let n=await _a("/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 OI(e={},t={}){let n=TI(e.window||e.timeframe,"1w"),r=await _a(`/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 RI(e={},t={}){let n=TI(e.window||e.timeframe,"3d"),r=await _a(`/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 LI(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await _a(`/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}}j();var Y6="https://amm-v2.meteora.ag",$I=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),BI=new Set(["dynamic","multitoken","lst","farms"]),J6=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function X6(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||Y6).replace(/\/$/,"")}function et(e){let t=Number(e);return Number.isFinite(t)?t:null}function Q6(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:et(e.pool_lp_price_in_usd),tvlUsd:et(e.pool_tvl),farmTvlUsd:et(e.farm_tvl),volume24hUsd:et(e.trading_volume),volume7dUsd:et(e.weekly_trading_volume),fee24hUsd:et(e.fee_volume),fee7dUsd:et(e.weekly_fee_volume),tradeApyPct:et(e.trade_apy),weeklyTradeApyPct:et(e.weekly_trade_apy),baseApyPct:et(e.daily_base_apy),farmingApyPct:et(e.farming_apy),totalApyPct:(et(e.trade_apy)??0)+(et(e.farming_apy)??0),aprPct:et(e.apr),feePct:et(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 Z6(e={},t={}){let n=new URL(`${X6(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(!$I.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...$I].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(!BI.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...BI].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(!J6.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 Of(e={},t={}){let{url:n,page:r,size:o}=Z6(e,t),i=await A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(Q6),totalCount:i?.total_count??null,page:r,size:o}}async function MI(e={}){try{let{pools:t,totalCount:n}=await Of({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 FI(e={},t={}){let n=await Of({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 UI(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 Of({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}}j();var tD="https://ordinals.com";function Sl(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||tD).replace(/\/$/,"")}function nD(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 DI(e,t={}){let n=`${Sl(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Rf(e,t={}){return A(`${Sl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function qI(e={}){try{let t=await DI("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Sl(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Sl(e),error:String(t?.message||t),exec:!1}}}async function HI(e={},t={}){let n=await DI("/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 jI(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Rf(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function zI(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,a=await Rf(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function VI(e={},t={}){let n=nD(e.name||e.rune||e.runeName,"name"),r=await Rf(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}j();var oD="https://hermes.pyth.network",$f={"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"},iD=/^[0-9a-fA-F]{64}$/;function WI(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||oD).replace(/\/$/,"")}function GI(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=$f[n.toUpperCase()]||$f[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!iD.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 Lf(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Bf(e={}){let t=Lf({price:Number(e.price?.conf),expo:e.price?.expo}),n=Lf(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Lf(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 Mf(e,t={}){let n=new URL(`${WI(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"),A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function KI(e={}){try{let t=await Mf([$f["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Bf):[])[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 YI(e={},t={}){let n=GI(e.feedId||e.id||e.symbol,"feedId"),r=await Mf([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Bf):[],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 JI(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>GI(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 Mf(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Bf):[]),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 XI(e={},t={}){let n=new URL(`${WI(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 A(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}))}}j();var sD="https://relayscan.io",QI=new Set(["1h","12h","24h","7d"]);function Ff(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||sD).replace(/\/$/,"")}function ZI(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!QI.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...QI].join(", ")}`);return t}function cD(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 Uf(e={},t={}){return A(`${Ff(t)}/overview/json?t=${ZI(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function e1(e={},t={}){return A(`${Ff(t)}/builder-profit/json?t=${ZI(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function t1(e={},t={}){let n=cD(e);return A(`${Ff(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function n1(e={}){let t=await Uf({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}}j();var uD="https://extra-api.sanctum.so",dD=30,pD=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Df(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||uD).replace(/\/$/,"")}function r1(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 mD(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Tr(e,t,n={}){let r={},o={};for(let i of mD(t,dD)){let a=new URL(`${Df(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await A(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 o1(e={}){try{let[t,n]=await Promise.all([A(`${Df(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Tr("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 qf(e={},t={}){let n=await A(`${Df(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 i1(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await qf({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=pD);let r=[...new Set(n.map(s=>r1(s,"lsts[]")))],[o,i]=await Promise.all([Tr("apy/latest",r,t),Tr("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 a1(e={},t={}){let n=r1(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Tr("apy/latest",[n],t),Tr("apy/inception",[n],t),Tr("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Tr("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}}j();var hD="https://api.save.finance",gD="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",s1="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",yD=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Hf(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||hD).replace(/\/$/,"")}function c1(e,t="address"){let n=String(e??"").trim();if(!yD.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function l1(e){let t=Number(e);return Number.isFinite(t)?t:null}function wD(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 bD(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:l1(e.rates?.supplyInterest),borrowApyPct:l1(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 u1(e={}){try{let t=await A(`${Hf(e)}/v1/reserves?ids=${s1}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:s1,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function jf(e={},t={}){let n=new URL(`${Hf(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 A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(wD);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 d1(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=>c1(String(s).trim(),"reserve"));else{let a=c1(e.market||e.marketAddress||gD,"market"),c=(await jf({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 A(`${Hf(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...bD(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 zf(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 Nr(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 Pa(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:zf(e.amount,"amount")}}function Vf(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 Ta(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 Wf(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 SD(e={},t={}){let n=Pa(e),r=Nr(e.slices??10,"slices",2,100),o=Nr(e.durationSec??3600,"durationSec",r,604800),i=Vf(n.total,Array(r).fill(1));return Ta(n,"TWAP",Wf(i,o,t.nowMs),{durationSec:o})}function kD(e={},t={}){let n=Pa(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=Nr(e.durationSec??3600,"durationSec",r.length,604800),i=Vf(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Wf(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return Ta(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function vD(e={}){let t=Pa(e),n=Nr(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=zf(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 Ta(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function ED(e={}){let t=Pa(e),n=zf(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 Ta(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function AD(e={},t={}){let n=Pa(e),r=Nr(e.slices??10,"slices",2,100),o=Nr(e.durationSec??3600,"durationSec",r,604800),i=Nr(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=Vf(n.total,a);return Ta(n,"IS",Wf(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function p1(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return SD(e,t);if(n==="VWAP")return kD(e,t);if(n==="POV")return vD(e,t);if(n==="ICEBERG")return ED(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return AD(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function m1(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}ne();import{TypedDataEncoder as _D,getAddress as PD,isAddress as TD}from"ethers";var f1=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Gf=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"}]}),h1=/^(?:0|[1-9][0-9]*)$/;function kl(e,t){let n=String(e||"").trim();if(!TD(n))throw new Error(`limit-order: ${t} must be an address`);return PD(n)}function Kf(e,t){let n=String(e??"").trim();if(!h1.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 g1(){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 ND(e){let t=Number(e),n=f1[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function CD(e){let t=Number(e);if(!f1[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function OD(e={}){let t=kl(e.maker,"maker"),n=e.receiver?kl(e.receiver,"receiver"):t,r=kl(e.makerAsset,"makerAsset"),o=kl(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=Kf(e.makingAmount,"makingAmount"),a=Kf(e.takingAmount,"takingAmount"),s=Kf(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!h1.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 y1(e={},t={}){let n=Number(e.chainId),r=ND(n),o=OD(e),i={types:Gf,domain:r,primaryType:"Order",message:o},a=_D.hash(r,Gf,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:CD(n),domain:r,types:Gf,message:o,typedData:i,digest:a})})}function w1(e={},t={}){let n=y1(e,t);return $({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 b1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=y1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}ne();var LD=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,$D=/^(?:0|[1-9][0-9]*)$/;function Yf(e,t){let n=String(e||"").trim();if(!LD.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function BD(e,t){let n=String(e??"").trim();if(!$D.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function x1(){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 S1(e={}){let t=Yf(e.owner,"owner"),n=Yf(e.inputMint,"inputMint"),r=Yf(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=BD(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 k1(e={},t={}){let n=S1(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=Ci({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 Wd({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 v1(e={},t={}){let n=S1(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=k1(e,t)),$({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 E1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=k1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}j();var FD="protective-monitors",UD="read-only",DD=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),qD="https://hermes.pyth.network",HD="https://coins.llama.fi",jD="https://api.llama.fi/hacks",zD="https://api.gopluslabs.io/api/v1/token_security",VD="https://api.v3.aave.com/user",WD=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),GD=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),KD=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),A1=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),YD=/^0x[0-9a-fA-F]{40}$/,JD=/^[0-9a-fA-F]{64}$/;function $o(e,t={}){return{ok:!0,provider:FD,op:e,alertOnly:!0,execution:UD,exec:!1,...t}}function tt(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function Na(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):A(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function vl(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function XD(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return JD.test(r)||tt("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=vl(e.symbol),n=WD[t];return n||tt("unknown symbol",t),n}function QD(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=vl(e.symbol);return GD[t]||`coingecko:${t.toLowerCase()}`}function I1(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&tt("thresholdBps must be a non-negative number"),n}function ZD(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))&&tt("no pyth price returned"),r<0?n/10**-r:n*10**r}function e5(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function t5(e,t={}){let n=String(t.pythBaseUrl||qD).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function n5(e,t={}){return`${String(t.llamaCoinsBaseUrl||HD).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function _1(e,t){let n=XD(e),r=await Na(t5(n,t),t),o=ZD(r);return o>0||tt("pyth price must be positive"),{id:n,price:o}}async function P1(e,t){let n=QD(e),r=await Na(n5(n,t),t);return{coin:n,price:e5(r,n)}}function T1(){return $o("health",{ok:!0,ops:[...DD],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function Jf(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&tt("peg must be a positive number");let r=I1(e,50),o=await _1(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await P1(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return $o("depeg",{symbol:vl(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function Xf(e={},t={}){let n=I1(e,100),r=await _1(e,t),o=await P1(e,t);o.price>0||tt("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return $o("oracleDeviation",{symbol:vl(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function r5(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function o5(e,t){return{id:r5(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 i5(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 N1(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return i5(t);try{return N1(JSON.parse(t))}catch{tt("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 a5(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 Qf(e={},t={}){let n=String(e.url||t.hacksUrl||jD),r=e.payload??await Na(n,t),o=a5(N1(r).map(o5));return $o("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function s5(e){return e===!0||e===1||e==="1"}function c5(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 Zf(e={},t={}){e.asSoleGate===!0&&tt("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();YD.test(n)||tt("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&tt("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||zD).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await Na(i,t),s=c5(a,n);s||tt("goplus returned no result for",n);let c=KD.filter(l=>s5(s.token[l]));return $o("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 l5(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&tt("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function u5(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||tt("position healthFactor required");let r=l5(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 eh(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||tt("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${VD}/${a}`);n=await Na(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(u5),i=o.reduce((a,s)=>a?A1[s.rung]<A1[a]?s.rung:a:s.rung,null);return $o("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 LG=Object.freeze({depeg:Jf,oracleDeviation:Xf,exploitFeed:Qf,goplus:Zf,liquidationLadder:eh});import{existsSync as p5,readFileSync as m5}from"node:fs";import{dirname as f5,join as C1}from"node:path";import{fileURLToPath as h5}from"node:url";var El=Object.freeze({OK:"OK",FAILED:"FAILED"}),g5=Object.freeze({hl:9,dydx:10,binance:8}),O1=Object.freeze(["hl","dydx","binance"]),y5=C1(f5(h5(import.meta.url)),"../../../fixtures/funding-scanner");function R1(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...O1],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 w5(e){let t=Ft(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function b5(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=Ft(t[e]);if(n!=null&&n>=0)return n}return Ft(g5[e])}function nh(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 x5({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=w5(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:El.OK})}function th(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:Ft(n),netAnnualizedPct:null,quality:El.FAILED,error:String(t||"missing venue")})}function S5(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=nh(t[o]?.name),a=Ft(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function k5(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=nh(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 v5(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 E5(e){let{intervalHours:t,entries:n}=v5(e),r=[];for(let o of n){let i=nh(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 A5=Object.freeze({hl:S5,dydx:k5,binance:E5});function I5(e,t){let n=C1(e,`${t}.json`);if(!p5(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(m5(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function _5(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 I5(n,e)}function P5(e,t){let n=A5[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 T5(e,t){let n=e.quality===El.FAILED||e.netAnnualizedPct==null,r=t.quality===El.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 L1(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:O1).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||y5,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=b5(s,i),l=_5(s,r,o);if(l.missing){a.push(th(s,l.error,c));continue}let u=P5(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(th(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(x5({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(th(s,p.message,c))}}return a.sort(T5),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 C5=Math.sqrt(2*Math.PI);function Al(e){return Math.exp(-.5*e*e)/C5}function O5(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 Gn(e){return .5*(1+O5(e/Math.SQRT2))}function $1({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*Gn(p)-s*f*Gn(m),g=s*f*Gn(-m)-a*Gn(-p),b=i==="put"?g:h,S=i==="put"?Gn(p)-1:Gn(p),w=Al(p)/(a*l*d),y=a*Al(p)*d/100,k=i==="put"?(-(a*Al(p)*l)/(2*d)+c*s*f*Gn(-m))/365:(-(a*Al(p)*l)/(2*d)-c*s*f*Gn(m))/365;return Object.freeze({kind:i,price:b,delta:S,gamma:w,vega:y,theta:k,d1:p,d2:m})}var DG=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function Il(){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 _l(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=$1({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 B1(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function Ca(e){return String(e||"").trim().toLowerCase()}function L5(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function M1({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=Ca(d.from),m=Ca(d.to),f=Number(d.amount);!(f>0)||!p||!m||(r.set(p,(r.get(p)||0)-f),r.set(m,(r.get(m)||0)+f))}let o=[...r.entries()].filter(([,d])=>d>0).sort((d,p)=>p[1]-d[1]),i=Number(n)>0?Number(n):o.reduce((d,[,p])=>d+p,0),a=i>0?o.map(([,d])=>d/i):[],s=L5(a),c=new Map;for(let d of t){let p=Ca(d.funder),m=Ca(d.wallet);!p||!m||(c.has(p)||c.set(p,new Set),c.get(p).add(m))}let l=[...c.entries()].map(([d,p])=>({funder:d,size:p.size,wallets:[...p].sort()})).filter(d=>d.size>=2).sort((d,p)=>p.size-d.size),u=t[0]?Ca(t[0].funder):null;return Object.freeze({ok:!0,execution:"read-only",exec:!1,holderCount:o.length,topShare:a[0]??0,hhi:s,concentrated:s>=.15,clusterCount:l.length,largestCluster:l[0]?.size??0,firstFunder:u,clusters:Object.freeze(l.slice(0,20))})}function F1(){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 U1(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 D1(){return{...Il(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function q1(e,t){return _l(e,t)}function H1(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function j1(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 U5=Object.freeze([]);function z1(){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 V1(e={}){let t=String(e.address||"").toLowerCase(),n=U5.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 W1(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 G1(){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 K1(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 q5(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function Y1(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:q5(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var H5=/^0x[0-9a-fA-F]{8}$/,J1=/^0x[0-9a-fA-F]{40}$/;function X1(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!J1.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(!J1.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!H5.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 rh=/^0x[0-9a-fA-F]{40}$/;function Q1(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(!rh.test(n)||!rh.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||!rh.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 o_=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 n_(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Zm,adapters:Object.freeze(ef.adapters.map(e=>{let t=o_[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function oq(e,t={}){let n=lE(e,t),r=o_[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new ye(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var oh=new Map;function Tl(e={}){let t=e.filePath||void 0,n=t||"__default__";return oh.has(n)||oh.set(n,Nb(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),oh.get(n)}var ih=new Map;function ah(e={}){let t=e.filePath||void 0,n=t||"__default__";return ih.has(n)||ih.set(n,$b(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),ih.get(n)}var sh=new Map;function Oa(e={}){let t=e.filePath||void 0,n=t||"__default__";return sh.has(n)||sh.set(n,Ib(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),sh.get(n)}var iq={"hl-info":{health:e=>Cg(e),allMids:e=>tn(e),l2Book:(e,t={})=>zr(t.coin,e),outcomeMeta:e=>hi(e),clearinghouse:(e,t={})=>xs(t.user,e),userFills:(e,t={})=>Og(t.user,e),meta:e=>Ss(e),metaAndAssetCtxs:e=>bt(e),candleSnapshot:(e,t={})=>Vr(t,e),openOrders:(e,t={})=>Rg(t.user,e),frontendOpenOrders:(e,t={})=>Lg(t.user,e),userState:(e,t={})=>Wr(t.user,e),spotMeta:e=>vs(e)},"hl-vaults":{health:e=>Mg(e),summaries:(e,t={})=>Ju(t,e),details:(e,t={})=>Es(t,e),userEquities:(e,t={})=>Xu(t,e),tracker:(e,t={})=>Qu(t,e)},"hl-precompiles":{health:e=>Ug(e),read:(e,t={})=>Fg(t,e),l1BlockNumber:e=>As(e),markPx:(e,t={})=>td(t,e),oraclePx:(e,t={})=>nd(t,e),spotPx:(e,t={})=>rd(t,e),position:(e,t={})=>od(t,e),spotBalance:(e,t={})=>id(t,e),vaultEquity:(e,t={})=>ad(t,e),withdrawable:(e,t={})=>sd(t,e)},"hl-delta-neutral":{health:()=>cy(),scan:(e,t={})=>_d(t,e),quote:(e,t={})=>Pd(t,e),prepare:(e,t={})=>Td(t,e),loop:(e,t={})=>hy(t,e)},"lighter-delta-neutral":{health:()=>ky(),scan:(e,t={})=>Cd(t,e),quote:(e,t={})=>Od(t,e),prepare:(e,t={})=>Rd(t,e),loop:(e,t={})=>Ny(t,e)},"poly-public":{health:e=>Oy(e),time:e=>Ld(e),markets:(e,t={})=>Ry(t,e),book:(e,t={})=>Ly(t.tokenId,e),midpoint:(e,t={})=>$y(t.tokenId,e),spread:(e,t={})=>By(t.tokenId,e),price:(e,t={})=>My(t.tokenId,{side:t.side},e),events:(e,t={})=>Fy(t,e)},"evm-rpc":{health:(e,t={})=>Mr(t.chainId??1,e),healthAll:(e,t={})=>su({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Yo(t.chainId??1,e),chainId:(e,t={})=>ou(t.chainId??1,e),getBalance:(e,t={})=>nr(t.chainId??1,t.address,e),call:(e,t={})=>V(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>au(t,e),erc20Balance:(e,t={})=>Jo(t,e),transactionReceipt:(e,t={})=>Xo(t,e)},portfolio:{health:e=>rv(e),balances:(e,t={})=>Xc(t,e),snapshot:(e,t={})=>kv(t,e),history:(e,t={})=>Mm(t,e),valueGraph:(e,t={})=>vv(t,e)},"nft-portfolio":{health:e=>uv(e),inventory:(e,t={})=>Eo(t,e),gallery:(e,t={})=>fv(t,e),pnl:(e,t={})=>mv(t,e),prepareList:(e,t={})=>dv(t,e),traitSnipe:(e,t={})=>pv(t,e)},"contract-risk":{health:e=>Ev(e),scan:(e,t={})=>Er(t,e)},"evm-token-sniper":{health:e=>_v(e),scan:(e,t={})=>Iv(t,e)},"evm-simulate":{health:e=>Tv(e),simulate:(e,t={})=>wa(t,e)},"nft-mint":{health:e=>Cv(e),discover:(e,t={})=>rl(t,e),prepare:(e,t={})=>Dm(t,e),priceGas:(e,t={})=>nl(t,e),createTrigger:(e,t={})=>TE(t,e),checkOpen:(e,t={})=>NE(t,e),evaluateMancerOs:(e,t={})=>RE(t,e)},"universal-mint-router":{health:()=>nE(),capabilities:()=>Xm(),prepare:(e,t={})=>rE(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:n_()}),capabilities:()=>n_(),route:(e,t={})=>oq(t,e)},"erc8004-identity":{health:()=>Ex(),prepareIdentityRegistration:(e,t={})=>_x(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Px(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Nx(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:cl,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>pE(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:ll,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>yE(t,e)},"universal-ordinals-transfer":{health:()=>({provider:ul,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>PE(t,e)},"solana-rpc":{health:e=>Dy(e),latestBlockhash:(e,t={})=>Bd(t,e),getBalance:(e,t={})=>$s(t,e),tokenAccounts:(e,t={})=>Ti(t,e),simulate:(e,t={})=>qy(t,e)},"bitcoin-esplora":{health:e=>Hy(e),tipHeight:e=>jy(e),fees:e=>zy(e),address:(e,t={})=>Ms(t,e),utxos:(e,t={})=>Vy(t,e),tx:(e,t={})=>Wy(t,e),decode:(e,t={})=>Gy(t,e)},"bitcoin-meta":{health:e=>Yy(e),runeBalances:(e,t={})=>Us(t,e),inscriptions:(e,t={})=>eo(t,e),inscriptionInfo:(e,t={})=>Jy(t,e),inscriptionChildren:(e,t={})=>Xy(t,e),ordBlockInfo:(e,t={})=>Qy(t,e)},satflow:{health:e=>ew(e),collectionFloors:(e,t={})=>tw(t,e),collectionStats:(e,t={})=>nw(t,e),item:(e,t={})=>rw(t,e),walletContents:(e,t={})=>qs(t,e),floorListings:(e,t={})=>ow(t,e),preparePurchase:(e,t={})=>aw(t,e),prepareList:(e,t={})=>Hs(t,e)},jupiter:{health:e=>fw(e),venues:(e,t={})=>mw(t,e),quote:(e,t={})=>Vs(t,e),prepare:(e,t={})=>hw(t,e)},defillama:{health:e=>yw(e),prices:(e,t={})=>Ot(t.coins||[],e),pricesBySymbol:(e,t={})=>xw(t.symbols,e),protocols:e=>Gd(e),yields:(e,t={})=>ww(t,e),stablecoins:(e,t={})=>Ws(t,e),dexVolumes:(e,t={})=>bw(t,e)},lifi:{health:e=>Xd(e),quote:(e,t={})=>On(t,e),prepare:(e,t={})=>Qd(t,e),chains:e=>Zd(e)},dexscreener:{health:e=>_0(e),token:(e,t={})=>rr(t.address||t.tokenAddress,e),search:(e,t={})=>Qo(t.q||t.query,e),pair:(e,t={})=>P0(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>bu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Zt(t,e),prepare:(e,t={})=>wu(t,e),quotePath:(e,t={})=>yu(t,e),ethUsdc:(e,t={})=>rs(t,e),chains:()=>xu()},"uniswap-v4":{health:(e,t={})=>Ou({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Sn(t,e),inspectHook:(e,t={})=>Pu(t,e),prepare:(e,t={})=>Nu(t,e),chains:()=>Cu()},x402:{health:()=>sb(),inspect:(e,t={})=>ib(t),prepare:(e,t={})=>ab(t,e)},bankr:{health:e=>mb(e),wallet:e=>xp(e),portfolio:e=>db(e),swapQuote:(e,t={})=>pb(t,e)},aerodrome:{health:(e,t={})=>Nw({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ks(t,e),prepare:(e,t={})=>Tw(t,e),chains:()=>Cw()},zerox:{health:e=>tp(e),price:(e,t={})=>Js(t,e),quote:(e,t={})=>Ln(t,e),prepare:(e,t={})=>np(t,e)},across:{health:e=>Bw(e),suggestedFees:(e,t={})=>op(t,e)},hop:{health:e=>Mw(e),quote:(e,t={})=>ip(t,e)},relay:{health:e=>Fw(e),quote:(e,t={})=>Xs(t,e),prepare:(e,t={})=>Uw(t,e)},cowswap:{health:e=>up(e),quote:(e,t={})=>cn(t,e),prepareOrder:(e,t={})=>dp(t,e),order:(e,t={})=>sc(t,e),status:(e,t={})=>ac(t,e),chains:()=>mp()},oneinch:{health:e=>Zw(e),quote:(e,t={})=>Fi(t,e),prepare:(e,t={})=>eb(t,e),approveSpender:(e,t={})=>yp(t,e)},"hl-ws":{health:e=>fb(e),allMids:e=>hb(e),l2Book:(e,t={})=>gb(t.coin,e),snapshot:(e,t={})=>Di(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>yb({...e,assetId:t.assetId}),book:(e,t={})=>wb(t.assetId||t.tokenId,e),snapshot:(e,t={})=>cc(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>ag(e),collection:(e,t={})=>si(t.slug,e),floor:(e,t={})=>sg(t.slug,e),bestListings:(e,t={})=>Fu(t,e),bestListing:(e,t={})=>ds(t,e),bestOffer:(e,t={})=>ps(t,e),accountNfts:(e,t={})=>ci(t,e),accountPnl:(e,t={})=>ls(t,e),prepareBuy:(e,t={})=>bg(t,e),prepareSweep:(e,t={})=>xg(t,e),prepareMint:(e,t={})=>fs(t,e),prepareList:(e,t={})=>hs(t,e),prepareCancel:(e,t={})=>Sg(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={})=>Oa(e).createListing(t),listListings:(e,t={})=>Oa(e).listListings(t),cancelListing:(e,t={})=>Oa(e).cancelListing(t),createOffer:(e,t={})=>Oa(e).createOffer(t),armFill:(e,t={})=>Oa(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={})=>Tl(e).createIntent(t),listIntents:(e,t={})=>Tl(e).listIntents(t),cancelIntent:(e,t={})=>Tl(e).cancelIntent(t),armPayment:(e,t={})=>Tl(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={})=>ah(e).registerPack(t),listPacks:(e,t={})=>ah(e).listPacks(t),revokePack:(e,t={})=>ah(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>bx(t,e),markets:(e,t={})=>so(t,e),quoteSpecificBuy:(e,t={})=>Ki(t,e),quoteSell:(e,t={})=>wc(t,e),scanCollection:(e,t={})=>bc(t,e),scanAllMarkets:(e,t={})=>dx(t,e),scanCrossVenueArb:(e,t={})=>Dp(t,e),scanAllMarketsArb:(e,t={})=>px(t,e),prepareSpecificBuy:(e,t={})=>ox(t,e),prepareSell:(e,t={})=>ix(t,e)},stonkbrokers:{health:(e,t={})=>xx(t,e),quoteBrokerBuy:(e,t={})=>xc(t,e),scanBrokerLoot:(e,t={})=>hx(t,e),prepareBrokerBuy:(e,t={})=>gx(t,e),brokerDesk:(e,t={})=>wx(t,e),clockInStatus:(e,t={})=>Yi(t,e),prepareClockIn:(e,t={})=>yx(t,e)},"hl-outcome":{list:e=>kS(e),prepareOrder:(e,t={})=>vS(t,e),prepareCancel:(e,t={})=>ES(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Dc().map(e=>e.id),nativeTemplates:ua().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Dc(),listNative:()=>ua(),gate:(e,t={})=>ca(t.templateId||t.id,e),prepareDeploy:(e,t={})=>ZS(t,e),buildNative:(e,t={})=>da(t),eval:async()=>(await Promise.resolve().then(()=>(t_(),e_))).runContractsEval()},"poly-clob":{health:()=>FS(),prepareOrder:(e,t={})=>US(t||{},e)},"hl-perps":{health:e=>tm(e),assetInfo:(e,t={})=>Pn(t,e),prepareOrder:(e,t={})=>Jr(t,e),prepareCancel:(e,t={})=>Ai(t,e),prepareLeverage:(e,t={})=>vd(t,e),prepareIsolatedMargin:(e,t={})=>Ed(t,e),prepareBracket:(e,t={})=>Ad(t,e),prepareBuilderApproval:(e,t={})=>kd(t,e)},"hl-markets":{health:e=>tm(e),markets:(e,t={})=>Ic(t,e),leaderboards:(e,t={})=>Jx(t,e),coin:(e,t={})=>Xx(t,e),spot:(e,t={})=>Qx(t,e)},"hl-entry-state":{health:e=>wS(e),see:(e,t={})=>ra(t,e),qualify:(e,t={})=>bS(t,e),lock:(e,t={})=>xS(t,e),list:e=>om(e),watch:(e,t={})=>SS(t,e)},"magiceden-sol":{health:e=>Bx(e),stats:(e,t={})=>Gp(t,e),listings:(e,t={})=>Fx(t,e),tokenListings:(e,t={})=>Ux(t,e),prepareBuy:(e,t={})=>Dx(t,e),prepareList:(e,t={})=>Ec(t,e),prepareMint:(e,t={})=>qx(t,e)},"hl-staking":{health:e=>jx(e),validators:e=>Jp(e),delegatorSummary:(e,t={})=>Xp(t,e),delegations:(e,t={})=>Qp(t,e),rewards:(e,t={})=>zx(t,e),history:(e,t={})=>Vx(t,e),preflight:(e,t={})=>Yx(t,e),prepareStakeDeposit:(e,t={})=>Wx(t,e),prepareStakeWithdraw:(e,t={})=>Gx(t,e),prepareDelegate:(e,t={})=>Kx(t,e)},"hyperevm-dex":{health:e=>Ox(e),search:(e,t={})=>Rx(t.q||t.query||"HYPE",e),token:(e,t={})=>Lx(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>uk(e),networks:(e,t={})=>mm(t,e),pool:(e,t={})=>sk(t,e),token:(e,t={})=>ck(t,e),ohlcv:(e,t={})=>lk(t,e)},curve:{health:e=>vk(e),openapi:e=>kk(e),pools:(e,t={})=>hm(t,e),quote:(e,t={})=>gm(t,e),prepare:(e,t={})=>Ek(t,e)},gmx:{health:e=>lS(e),tickers:(e,t={})=>wo(t,e),markets:(e,t={})=>sS(t,e),marketsInfo:(e,t={})=>rm(t,e),tokens:(e,t={})=>cS(t,e),prepareOrder:(e,t={})=>mS(t,e),positions:(e,t={})=>uS(t,e),orderStatus:(e,t={})=>dS(t,e),verifyOrder:(e,t={})=>pS(t,e)},morpho:{health:e=>Pk(e),markets:(e,t={})=>_k(t,e),vaults:(e,t={})=>bm(t,e),prepareVault:(e,t={})=>Tk(t,e)},balancer:{health:e=>Mk(e),pools:(e,t={})=>Bk(t,e),quote:(e,t={})=>km(t,e),prepare:(e,t={})=>Fk(t,e)},pendle:{health:e=>Dk(e),markets:(e,t={})=>Em(t,e),quote:(e,t={})=>qk(t,e),prepare:(e,t={})=>Am(t,e)},odos:{health:e=>Vk(e),chains:e=>_m(e),quote:(e,t={})=>jk(t,e),prepare:(e,t={})=>zk(t,e)},blockscout:{health:e=>Zk(e),stats:(e,t={})=>Nm(t,e),address:(e,t={})=>Yk(t,e),token:(e,t={})=>Jk(t,e)},paraswap:{health:e=>af(e),tokens:(e,t={})=>dl(t,e),price:(e,t={})=>gn(t,e),quote:(e,t={})=>gn(t,e),prepare:(e,t={})=>of(t,e)},rfq:{health:e=>KE(e),intent:(e,t={})=>WE(t,e),quote:(e,t={})=>GE(t,e)},"polygon-staking":{health:e=>kA(e),validators:(e,t={})=>xA(t,e),validatorDetail:(e,t={})=>SA(t,e)},"aave-v3":{health:e=>IA(e),markets:(e,t={})=>vA(t,e),marketReserves:(e,t={})=>EA(t,e),chains:e=>AA(e)},"babylon-staking":{health:e=>PA(e),stats:e=>TA(e),finalityProviders:e=>NA(e),delegations:(e,t={})=>CA(t,e)},"bisq-markets":{health:e=>RA(e),markets:e=>LA(e),ticker:(e,t={})=>$A(t,e),trades:(e,t={})=>BA(t,e)},"bob-rootstock":{health:(e,t={})=>FA(t.chainId,e),stats:(e,t={})=>kf(t,e),addressInfo:(e,t={})=>UA(t,e),tokenBalances:(e,t={})=>DA(t,e)},"braiins-insights":{health:e=>qA(e),priceStats:e=>HA(e),poolStats:e=>jA(e)},"cow-protocol":{health:e=>XA(e),auction:e=>KA(e),openOrders:(e,t={})=>YA(t,e),recentTrades:(e,t={})=>JA(t,e)},"hiro-stacks":{health:e=>QA(e),networkInfo:e=>ZA(e),stackingInfo:e=>eI(e),poxCycles:e=>tI(e),blocks:(e,t={})=>nI(t,e)},"jito-mev":{health:e=>iI(e),recentBundles:(e,t={})=>aI(t,e),tipFloor:e=>sI(e)},"kamino-strategies":{health:e=>lI(e),strategies:(e,t={})=>uI(t,e),strategyMetrics:(e,t={})=>dI(t,e)},"liquid-esplora":{health:e=>hI(e),tipHeight:e=>gI(e),addressInfo:(e,t={})=>yI(t,e),assetInfo:(e,t={})=>wI(t,e)},"magiceden-ordinals":{health:e=>SI(e),collectionStat:(e,t={})=>kI(t,e)},"mempool-lightning":{health:e=>EI(e),statistics:e=>AI(e),nodeRankings:(e,t={})=>II(t,e),nodeCountries:e=>_I(e)},"mempool-mining":{health:e=>NI(e),difficulty:e=>CI(e),poolShare:(e,t={})=>OI(t,e),hashrate:(e,t={})=>RI(t,e),rewardStats:(e,t={})=>LI(t,e)},"meteora-dlmm":{health:e=>MI(e),pools:(e,t={})=>FI(t,e),poolSearch:(e,t={})=>UI(t,e)},"ordinals-runes":{health:e=>qI(e),blockHeight:e=>HI(e),blockInfo:(e,t={})=>jI(t,e),satInfo:(e,t={})=>zI(t,e),runeInfo:(e,t={})=>VI(t,e)},"pyth-price-feeds":{health:e=>KI(e),latestPrice:(e,t={})=>YI(t,e),latestPrices:(e,t={})=>JI(t,e),feedDirectory:e=>XI(e)},"relayscan-mev":{health:e=>n1(e),overview:(e,t={})=>Uf(t,e),builderProfit:(e,t={})=>e1(t,e),dailyStats:(e,t={})=>t1(t,e)},"sanctum-lst":{health:e=>o1(e),lstList:e=>qf(e),apyAll:e=>i1(e),apyIndividual:(e,t={})=>a1(t,e)},"solend-lending":{health:e=>u1(e),markets:e=>jf(e),reserves:(e,t={})=>d1(t,e)},"execution-strategies":{health:()=>m1(),plan:(e,t={})=>p1(t)},"across-bridge":{health:e=>YE(e),pools:(e,t={})=>JE(t,e),suggestedFees:(e,t={})=>XE(t,e)},"beefy-yields":{health:e=>QE(e),apy:(e,t={})=>ZE(t,e),apyBreakdown:e=>eA(e)},"birdeye-tokens":{health:e=>nA(e),tokenList:(e,t={})=>rA(t,e)},"celestia-da":{health:e=>oA(e),stats:e=>iA(e),blockStats:(e,t={})=>aA(t,e)},"das-assets":{health:e=>sA(e),assetsByOwner:(e,t={})=>cA(t,e),searchAssets:(e,t={})=>lA(t,e),assetProof:(e,t={})=>uA(t,e)},"l2beat-tvl":{health:e=>dA(e),tvl:(e,t={})=>pA(t,e),activity:(e,t={})=>mA(t,e)},"spark-lend":{health:e=>fA(e),markets:(e,t={})=>hA(t,e)},"symbiotic-restaking":{health:e=>gA(e),vaults:(e,t={})=>yA(t,e),vaultDetail:(e,t={})=>wA(t,e)},"limit-order":{health:()=>g1(),prepare:(e,t={})=>w1(t,e),arm:(e,t={})=>b1(t,e)},"jupiter-dca":{health:()=>x1(),prepare:(e,t={})=>v1(t,e),arm:(e,t={})=>E1(t,e)},"protective-monitors":{health:()=>T1(),depeg:(e,t={})=>Jf(t,e),oracleDeviation:(e,t={})=>Xf(t,e),exploitFeed:(e,t={})=>Qf(t,e),goplus:(e,t={})=>Zf(t,e),liquidationLadder:(e,t={})=>eh(t,e)},"funding-scanner":{health:()=>R1(),scan:(e,t={})=>L1(t,e)},"onchain-options":{health:()=>Il(),rank:(e,t={})=>_l(t.listings||t,t)},"holder-clusters":{health:()=>B1(),score:(e,t={})=>M1(t)},kalshi:{health:()=>F1(),markets:(e,t={})=>U1(t)},"derive-options":{health:()=>D1(),rank:(e,t={})=>q1(t.listings||t,t)},limitless:{health:()=>H1(),markets:(e,t={})=>j1(t)},"dov-vaults":{health:()=>z1(),read:(e,t={})=>V1(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>W1(t.left||{},t.right||{})},"tee-attestation":{health:()=>G1(),verify:(e,t={})=>K1(t)},"keeper-mirror":{health:e=>Y1(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>X1(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>Q1(t)}},r_=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),i_=new Set(["hl-exec"]);function ch(e){return i_.has(String(e||""))}function aq(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(i_.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=bs().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!r_.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(r_.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 T(e,t,n={},r={}){if(ch(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.`);aq(e,t,n);let o=fi(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=iq[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function lh({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||bs().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)=>T(d,"health",p,m),u={};return await ot(s,i??8,async d=>{if(!fi(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await $e(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function a_(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function sq(e){return e.execution==="prepare"&&a_(e).length?"armed-local":e.execution||"read-only"}function Nl(){return bs().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:sq(e),localSignerSurfaces:a_(e),description:e.description}))}var s_={catalog:Nl,health:lh,call:T,hl:{health:e=>T("hl-info","health",{},e),allMids:e=>T("hl-info","allMids",{},e),l2Book:(e,t)=>T("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>T("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>T("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>T("hl-info","userFills",{user:e},t),meta:e=>T("hl-info","meta",{},e),metaAndAssetCtxs:e=>T("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>T("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>T("hl-info","openOrders",{user:e},t),userState:(e,t)=>T("hl-info","userState",{user:e},t),spotMeta:e=>T("hl-info","spotMeta",{},e),vaults:{health:e=>T("hl-vaults","health",{},e),summaries:(e,t)=>T("hl-vaults","summaries",e||{},t),details:(e,t)=>T("hl-vaults","details",e||{},t),mine:(e,t)=>T("hl-vaults","userEquities",{user:e},t),track:(e,t)=>T("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>T("hl-entry-state","see",e||{},t),qualify:(e,t)=>T("hl-entry-state","qualify",e||{},t),lock:(e,t)=>T("hl-entry-state","lock",e||{},t),list:e=>T("hl-entry-state","list",{},e),watch:(e,t)=>T("hl-entry-state","watch",e||{},t)},staking:{health:e=>T("hl-staking","health",{},e),validators:e=>T("hl-staking","validators",{},e),summary:(e,t)=>T("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>T("hl-staking","delegations",{user:e},t),rewards:(e,t)=>T("hl-staking","rewards",{user:e},t),history:(e,t)=>T("hl-staking","history",{user:e},t),preflight:(e,t)=>T("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>T("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>T("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>T("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>T("poly-public","health",{},e),time:e=>T("poly-public","time",{},e),markets:(e,t)=>T("poly-public","markets",e||{},t),book:(e,t)=>T("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>T("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>T("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>T("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>T("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>T("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>T("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>T("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>T("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>T("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>T("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>T("evm-token-sniper","health",{},e),scan:(e,t)=>T("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>T("portfolio","balances",e||{},t),snapshot:(e,t)=>T("portfolio","snapshot",e||{},t),history:(e,t)=>T("portfolio","history",e||{},t),valueGraph:(e,t)=>T("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>T("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>T("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>T("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>T("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>T("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>T("opensea-nft","floor",{slug:e},t),collection:(e,t)=>T("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>T("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>T("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>T("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>T("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>T("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>T("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>T("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>T("universal-mint-router","health",{},e),capabilities:e=>T("universal-mint-router","capabilities",{},e),prepare:(e,t)=>T("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>T("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>T("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>T("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>T("solana-rpc","health",{},e),latestBlockhash:(e,t)=>T("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>T("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>T("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>T("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>T("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>T("jupiter","prepare",e||{},t),nftStats:(e,t)=>T("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>T("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>T("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>T("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>T("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>T("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>T("bitcoin-esplora","health",{},e),tipHeight:e=>T("bitcoin-esplora","tipHeight",{},e),fees:e=>T("bitcoin-esplora","fees",{},e),address:(e,t)=>T("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>T("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>T("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>T("bitcoin-esplora","decode",e||{},t),metaHealth:e=>T("bitcoin-meta","health",{},e),runeBalances:(e,t)=>T("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>T("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>T("satflow","health",{},e),satflowFloors:(e,t)=>T("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>T("satflow","walletContents",{address:e},t)},prices:{health:e=>T("defillama","health",{},e),current:(e,t)=>T("defillama","prices",{coins:e},t),bySymbol:(e,t)=>T("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>T("defillama","protocols",{},e)},lifi:{health:e=>T("lifi","health",{},e),quote:(e,t)=>T("lifi","quote",e||{},t),chains:e=>T("lifi","chains",{},e)},dex:{health:e=>T("dexscreener","health",{},e),token:(e,t)=>T("dexscreener","token",{address:e},t),search:(e,t)=>T("dexscreener","search",{q:e},t),pair:(e,t,n)=>T("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>T("uniswap-v3","health",e||{},t),quote:(e,t)=>T("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>T("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>T("uniswap-v3","ethUsdc",e||{},t),chains:e=>T("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>T("uniswap-v4","health",e||{},t),quote:(e,t)=>T("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>T("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>T("uniswap-v4","prepare",e||{},t),chains:e=>T("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>T("x402","inspect",e||{},t),prepare:(e,t)=>T("x402","prepare",e||{},t)},bankr:{wallet:e=>T("bankr","wallet",{},e),portfolio:e=>T("bankr","portfolio",{},e),swapQuote:(e,t)=>T("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>T("across","suggestedFees",e||{},t),hop:(e,t)=>T("hop","quote",e||{},t),relay:(e,t)=>T("relay","quote",e||{},t)},cow:{quote:(e,t)=>T("cowswap","quote",e||{},t)},hlWs:{allMids:e=>T("hl-ws","allMids",{},e),l2Book:(e,t)=>T("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>T("poly-ws","book",{assetId:e},t)}};import{homedir as uh}from"node:os";import{join as dh}from"node:path";var c_=process.env.ORACLE_PUBLIC_DESKTOP==="1",cq=c_?process.env.ORACLE_CONFIG_DIR||dh(uh(),".config","oracle"):dh(uh(),".config","oracle"),yK=c_?cq:dh(uh(),".config","mad-desk");function Ra(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}function ph(e,t,n=!1){return String(Ra(e,t,n?"1":"")).trim()==="1"}function mh(e,t){return String(Ra(e,t,""))}$c();var wn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),u_={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},La=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function l_(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:a=0,estimatedGas:s=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:wn.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=La(n);if(p==null||p<=0n)return{source:t,quality:wn.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?wn.NO_GAS:wn.FULL,amountOut:p.toString(),minOut:La(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:s==null?null:String(s),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function d_(e,t,{divisor:n=1000n}={}){let r=La(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,a;try{[i,a]=await Promise.all([e(o),e(r)])}catch{return null}let s=La(i),c=La(a);if(s==null||c==null||s<=0n)return null;let l=Number(s)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:s.toString(),fullAmountOut:c.toString()}}function p_(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(s=>{let c=t?.[s.source];return c?c.impactPct>n?(r.push({source:s.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(s.source),!0)}),a=[...e.warnings??[]];return r.length&&a.push(`dropped ${r.length} route(s) on price impact: `+r.map(s=>`${s.source} (${s.impactPct}%)`).join(", ")),o.length&&a.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:a}}function m_(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:a=null}={}){let s=e.filter(E=>E.quality!==wn.FAILED),c=e.filter(E=>E.quality===wn.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(a),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=s.map(E=>{let _=BigInt(E.amountOut),P=0n,N=!1,I=!1,L=BigInt(E.oracleFeeBps??0),F=L>0n?_*L/10000n:0n;if(l){let R=E.gasUsd,U=Number(E.meta?.gasUnits??E.estimatedGas);if(R==null&&p&&Number.isFinite(U)&&U>0){let Y=U*u/1e18*d;Number.isFinite(Y)&&Y>=0&&(R=Y,I=!0)}let Q=(R??0)+(E.feeUsd??0);if(Q>0){let Y=Q/t*10**n;Number.isFinite(Y)&&Y>=0&&(P=BigInt(Math.floor(Y)),N=!0)}else R===0&&(N=!0)}let O=P+F,D=_>O?_-O:0n;return{...E,grossOut:_.toString(),netOut:D.toString(),costInDest:P.toString(),oracleFeeInDest:F.toString(),costAccounted:N,gasEstimated:I}}),f=Number(o)>0?Number(o):0,h=m.reduce((E,_)=>BigInt(_.netOut)>E?BigInt(_.netOut):E,0n),g=E=>h>0n?Number((h-BigInt(E))*10000n/h):0,b=[],S=m.slice().sort((E,_)=>BigInt(_.netOut)>BigInt(E.netOut)?1:-1)[0]??null;m.sort((E,_)=>{let P=g(E.netOut)<=f?0:1,N=g(_.netOut)<=f?0:1;if(r&&f>0&&P!==N)return P-N;if(r&&f>0){let I=E.liquidityUsd??-1,L=_.liquidityUsd??-1;if(I!==L)return L-I}return BigInt(_.netOut)>BigInt(E.netOut)?1:-1}),r&&f>0&&S&&m[0]&&m[0].source!==S.source&&b.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${f} bps`);let w=m.filter(E=>!E.costAccounted).map(E=>E.source);l?w.length&&b.push(`gas not reported by: ${w.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):b.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let y=m[0];if(l&&y&&y.costAccounted===!1){let E=m.find(_=>_.costAccounted&&g(_.netOut)<=f);E&&b.push(`winner ${y.source} has UNMEASURED gas; gas-measured ${E.source} is within ${f} bps and may net more once ${y.source}'s real gas is paid \u2014 prefer it if unsure.`)}let k=m.filter(E=>E.gasEstimated).map(E=>E.source);k.length&&b.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${k.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,x=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let E=BigInt(m[0].netOut),_=BigInt(m[1].netOut);_>0n&&(v=Number((E-_)*10000n/_),x=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:v,spreadBasis:x,rankedOn:l?"net-of-cost":"gross",warnings:b}}async function fh(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((a,s)=>setTimeout(()=>s(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let a=e[i].source;return o.status==="rejected"?l_({source:a,error:String(o.reason?.message||o.reason)}):l_({source:a,...o.value})})}Oi();ka();Li();Bi();ir();Dr();var hh=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function f_(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=hh(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function h_(e,t={}){let n=u_[Number(e)];if(!n)return null;try{let r=await Ot([n],t);return hh(r?.coins?.[n]?.price)}catch{return null}}var CK=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});function gh({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:a,decimalsOut:s,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await On({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:f_(m?.gasCosts),feeUsd:f_(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),a!=null&&d.push({source:"paraswap",run:async()=>{let p=s??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await gn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:hh(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await Ln({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Fi({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await cn({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),Fe[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await Zt({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),ut[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await Sn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}Si();_e();var lq={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function uq(e,t,n){let r=lq[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await Ot([o],n))?.coins?.[o],s=Number(a?.price),c=Number(a?.decimals);return{priceUsd:Number.isFinite(s)?s:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function y_(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let a=h_(n,t),s=uq(n,o,t),c=iu(n,t).catch(()=>null),l=gh({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([fh(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=m_(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:m}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&f.best){let g=f.best.source,S=await d_(async w=>{let y=gh({...e,amountIn:w.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(v=>v.source===g);return y.length?(await fh(y,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(S){let w=p_(f,{[g]:S},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...w,sourcesTried:l.length,sourcesAnswered:u.filter(y=>y.quality!==wn.FAILED).length,note:g_(w,l.length),priceImpact:{[g]:Number(S.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...f,sourcesTried:l.length,sourcesAnswered:u.filter(g=>g.quality!==wn.FAILED).length,note:g_(f,l.length)}}function dq(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Zg(t)}`:""}function g_(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=dq(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let a=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${a} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}ne();var Yn=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),pq=100,yh={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:a}=await Promise.resolve().then(()=>(ir(),Su)),s=await a({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.amountOut??null,minOut:s.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Dr(),Ru)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u);return{artifactKind:Yn.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:a}=await Promise.resolve().then(()=>(Oi(),ep)),s=await a({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.estimate?.toAmount??null,minOut:s.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:a},s)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(ka(),sf)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:a,userAddress:o,side:"SELL"},s);return{artifactKind:Yn.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval??null,amountOut:l.quote?.priceRoute?.destAmount??null,minOut:l.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:a}=await Promise.resolve().then(()=>(Li(),rp)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.buyAmount??null,minOut:s.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:a}=await Promise.resolve().then(()=>(Bi(),fp)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Yn.TYPED_DATA_ORDER,typedData:s.typedData,requiresApproval:{token:t,spender:s.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:s.settlement,amountOut:s.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};var mq=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fq=/^0x[0-9a-fA-F]{40}$/,hq=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);async function w_(e,t={}){if(hq.some(g=>Object.hasOwn(e,g)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!fq.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(mq.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await y_(e,t);if(!r.best){let g=r.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let a=yh[o];if(!a){let g=r.routes.find(b=>yh[b.source]&&b.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let s;try{s=await a(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),w=/allowance/i.test(S),y=!w&&/not enough|insufficient|balance/i.test(S),k,v;w?(v="approval-required-first",k=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${S}`):y?(v="taker-not-funded",k=`${o} refused to build the transaction: ${S}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(v="provider-error",k=`${o} prepare failed: ${S}`);let x=r.routes.find(E=>yh[E.source]&&E.source!==o);return{ok:!1,reason:k,failureKind:v,...x?{alternative:x.source}:{},comparison:r}}let c=e.driftToleranceBps??pq,l=null,u=null;if(s.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),b=BigInt(s.amountOut);g>0n&&(l=Number((b-g)*10000n/g),l<-c&&(u=`route moved ${(l/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),m=r.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,b)=>Math.max(g,b.liquidityUsd??0),0)||null,f=i.liquidityUsd??null,h=f!=null&&m>0?Math.round(f/m*100):null;return $({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:f,maxUsd:m,sharePct:h},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...s,unsigned:!0,signedBy:"user-wallet",destination:s.artifactKind===Yn.TRANSACTION?s.transaction?.to??null:s.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...s.artifactKind===Yn.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}ir();var wh=/^0x[0-9a-fA-F]{40}$/,gq=24,b_=!1;function k_(){b_||(pi(),b_=!0)}var ze=class extends Error{constructor(t,n){super(n),this.status=t}};function yq(e){if(k_(),e==null||e==="")throw new ze(400,"chainId is required");let t=Number(e);if(Number.isFinite(t)&&Hr(t))return t;let n=ys().find(r=>r.key===String(e).toLowerCase());if(n)return n.chainId;throw new ze(400,`unknown chain "${e}"`)}function x_(e,t){if(typeof e!="string")throw new ze(400,`${t} is required`);let n=e.trim();if(n===""||n.length>gq)throw new ze(400,`${t} is invalid`);if(!/^[A-Za-z0-9._-]+$/.test(n)&&!wh.test(n))throw new ze(400,`${t} is invalid`);return n}function wq(e,t){let n=String(e).trim();if(!/^\d+(\.\d+)?$/.test(n))throw new ze(400,"sellAmount must be a positive decimal number");if(Number(n)<=0)throw new ze(400,"sellAmount must be greater than zero");let r=Number.isFinite(Number(t))?Number(t):18,[o,i=""]=n.split(".");if(i.length>r)throw new ze(400,`sellAmount has more precision than the token's ${r} decimals`);let a=i.padEnd(r,"0"),s=(BigInt(o)*10n**BigInt(r)+BigInt(a||"0")).toString();if(s==="0")throw new ze(400,"sellAmount rounds to zero at this token's precision");return s}async function S_(e,t){if(k_(),wh.test(t)){let l=await Hr(e).resolveToken(t).catch(()=>null),u=Number(l?.decimals);return{address:t,decimals:Number.isFinite(u)?u:null}}let n=Fe[e];if(!n)return null;let r=t.toLowerCase(),o=r==="usdc"?n.usdc:r==="weth"||r==="eth"?n.weth:null;if(!o)return null;let a=await Hr(e).resolveToken(o).catch(()=>null),s=Number(a?.decimals);return{address:o,decimals:Number.isFinite(s)?s:null}}async function v_(e={},t={}){let n=yq(e.chainId??e.chain),r=x_(e.sellSymbol??e.sellToken,"sellSymbol"),o=x_(e.buySymbol??e.buyToken,"buySymbol");if(r.toLowerCase()===o.toLowerCase())throw new ze(400,"sell and buy assets must differ");let i=typeof e.taker=="string"?e.taker.trim():"";if(!wh.test(i))throw new ze(400,"taker must be the wallet address that will sign");let[a,s]=await Promise.all([S_(n,r),S_(n,o)]);if(!a)throw new ze(400,`could not resolve sell asset "${r}" on chain ${n}`);if(!s)throw new ze(400,`could not resolve buy asset "${o}" on chain ${n}`);let c=wq(e.sellAmount,a.decimals),l=await w_({chainId:n,tokenIn:a.address||r,tokenOut:s.address||o,amountIn:c,taker:i,decimalsIn:a.decimals??null,decimalsOut:s.decimals??null,source:typeof e.source=="string"&&e.source.trim()!==""?e.source.trim():void 0},t);if(!l.ok)return{ok:!1,reason:l.reason,priceImpactBlocked:!!l.priceImpactBlocked,requiresWalletSignature:!0,backendSigner:!1};let u=s.decimals??18,d=l.minOut??l.chosen?.netOut??l.chosen?.grossOut??null;return{ok:!0,requiresWalletSignature:!0,backendSigner:!1,quote:{sellSymbol:r,buySymbol:o,sellAmount:String(e.sellAmount),buyAmount:d==null?null:String(d),buyAmountFormatted:d==null?null:(Number(d)/10**u).toString(),routeLabel:l.chosen?.source??null,priceImpactPct:Number.isFinite(Number(l.chosen?.priceImpactPct))?Number(l.chosen.priceImpactPct):null,slippageBps:Number.isFinite(Number(l.slippageBps))?Number(l.slippageBps):null,intentHash:l.intentHash??null,minOut:l.minOut??null,requiresApproval:l.requiresApproval??null,warnings:Array.isArray(l.warnings)?l.warnings:[]},transaction:l.transaction??null}}import{createHash as xq,randomBytes as A_}from"node:crypto";import{readFileSync as Sq,writeFileSync as kq,mkdirSync as vq,existsSync as Eq}from"node:fs";import{dirname as __,join as I_}from"node:path";import{fileURLToPath as Aq}from"node:url";var bq=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),$a="agent:execute";var Bo=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function E_(e){let t=Array.isArray(e)&&e.length?e:Bo,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!bq.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}function P_(e){return xq("sha256").update(String(e),"utf8").digest("hex")}function bh(){return{version:1,keys:[]}}function Ma(){if(process.env.ORACLE_AGENT_KEYS_PATH)return process.env.ORACLE_AGENT_KEYS_PATH;if(process.env.MAD_AGENT_KEYS_PATH)return process.env.MAD_AGENT_KEYS_PATH;let e=I_(__(Aq(import.meta.url)),"..","..");return I_(e,"data","agent-keys.json")}function Cl(e){if(!Eq(e))return bh();try{let t=JSON.parse(Sq(e,"utf8"));return!t||!Array.isArray(t.keys)?bh():t}catch{return bh()}}function xh(e,t){vq(__(e),{recursive:!0}),kq(e,JSON.stringify(t,null,2),{mode:384})}function Ba(e){return{id:e.id,owner:e.owner,name:e.name,scopes:e.scopes,tier:e.tier||null,createdAt:e.createdAt,revokedAt:e.revokedAt||null,lastUsedAt:e.lastUsedAt||null}}function Sh({owner:e,name:t="Agent key",scopes:n,tier:r=null,controllerAllowlist:o=[],storePath:i=Ma()}={}){let a=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(a))throw new Error("owner must be a 0x-prefixed 20-byte address");let s=E_(n);if(s.includes($a)){let d=o.length?o:String(process.env.MAD_EXECUTOR_CONTROLLERS||"").split(",").map(m=>m.trim()).filter(Boolean);if(!new Set(d.map(m=>String(m).toLowerCase())).has(a))throw new Error("Wallet is not an executor controller")}let c=`mad_${A_(24).toString("base64url")}`,l={id:A_(8).toString("hex"),owner:a,name:String(t).slice(0,80),scopes:s,tier:r,keyHash:P_(c),createdAt:new Date().toISOString(),revokedAt:null,lastUsedAt:null},u=Cl(i);return u.keys.push(l),xh(i,u),{key:c,record:Ba(l)}}function kh(e,{storePath:t=Ma(),includeRevoked:n=!1}={}){let r=String(e||"").toLowerCase();return Cl(t).keys.filter(i=>i.owner===r).filter(i=>n||!i.revokedAt).map(Ba)}function vh({owner:e,id:t,storePath:n=Ma()}={}){let r=String(e||"").toLowerCase(),o=Cl(n),i=o.keys.find(a=>a.owner===r&&a.id===t);if(!i)throw new Error("key not found");return i.revokedAt||(i.revokedAt=new Date().toISOString(),xh(n,o)),Ba(i)}function Eh(e,{storePath:t=Ma()}={}){if(!e)throw new Error("key required");let n=P_(e),r=Cl(t),o=r.keys.find(i=>i.keyHash===n&&!i.revokedAt);if(!o)throw new Error("invalid or revoked key");return o.lastUsedAt=new Date().toISOString(),xh(t,r),{...Ba(o),identity:{type:"scoped-key",owner:o.owner,scopes:o.scopes}}}var Ah={observer:{id:"observer",label:"Observer",description:"Read markets, NFTs, positions. No prepare/execute.",scopes:["read:markets","read:nfts","read:positions"],custody:"none",canExecute:!1},preparer:{id:"preparer",label:"Preparer",description:"Prepare trades/mints; user or operator co-signs. No live execute scope.",scopes:[...Bo].filter(e=>e!=="agent:shadow"),custody:"none",canExecute:!1},shadow:{id:"shadow",label:"Shadow agent",description:"Full prepare + agent:shadow paper loops. Still no live execute.",scopes:[...Bo],custody:"none",canExecute:!1},executor:{id:"executor",label:"Executor (controller)",description:"Live agent:execute on the owner's own wallet only. Owner must be an executor controller. Key is NOT a wallet key.",scopes:[...Bo,$a],custody:"none \u2014 scoped API key only; user wallet key never stored",canExecute:!0},local_signer:{id:"local_signer",label:"Local signer",description:"User keeps keys on their device. Desk issues prepare-only key; signing happens off our infra.",scopes:["read:markets","read:positions","prepare:trade","prepare:mint"],custody:"none \u2014 signing off-box",canExecute:!1,mintKey:!0}};function Ol(){return Object.values(Ah).map(e=>({id:e.id,label:e.label,description:e.description,scopes:e.scopes,custody:e.custody,canExecute:e.canExecute}))}function T_(e){let t=Ah[e];if(!t)throw new Error(`Unknown tier: ${e}`);return t}function Ih({owner:e,tier:t="observer",name:n,controllerAllowlist:r=[],storePath:o,scopes:i}={}){if(e&&typeof e=="object"&&e.privateKey)throw new Error("Refusing privateKey \u2014 non-custodial onboarding accepts owner address only");let a=T_(t),s=i||a.scopes,c=Sh({owner:e,name:n||`${a.label} key`,scopes:s,tier:a.id,controllerAllowlist:r,storePath:o});return{tier:a.id,custody:a.custody,canExecute:a.canExecute&&s.includes($a),key:c.key,record:c.record,nextSteps:a.id==="local_signer"?["Store the API key for prepare/read calls only","Keep your wallet key on your device / hardware signer","Submit prepared payloads to your local signer \u2014 never upload the key here"]:a.canExecute?["Store the API key securely","Live execute stays disabled until the separately installed operator enables it","This key can only act on YOUR owner wallet (custody firewall)"]:["Store the API key securely","Use with getSigner({ identity: auth.identity, venue }) after authenticateAgentKey"]}}function _h(e,t){return Eh(e,t)}function Ph(e,t){return kh(e,t)}function Th(e){return vh(e)}var Hl=Ra("ORACLE_DATA_HOST","MAD_DESK_HOST","127.0.0.1"),l0=Number(Ra("ORACLE_DATA_PORT","MAD_DESK_PORT",8787)),OP=ph("ORACLE_ONBOARD_HTTP","MAD_ONBOARD_HTTP",!1),RP=ph("ORACLE_PUBLIC_API_MODE","MAD_PUBLIC_API_MODE",!1),S8=zS(import.meta.url),k8=new Set(["127.0.0.1","localhost","::1","[::1]"]),ql=64*1024,v8=new Set(["bankr.swapQuote"]),E8=new Set(["local-marketplace","local-x402","local-pack-registry"]),A8=300,I8=1e4,Ga=new Map,_8=new Map([["/strategy/draft","draft"],["/strategy/validate","validate"],["/strategy/backtest","backtest"],["/strategy/optimize","optimize"],["/strategy/evidence","evidence"],["/strategy/shadow","shadow"],["/strategy/prepare-live","prepare"]]);if(!k8.has(String(Hl).toLowerCase()))throw new Error("oracle data server only binds loopback; use 127.0.0.1 and do not expose it through a reverse proxy");function P8(e){return new Set(String(e||"").split(",").map(t=>t.trim()).filter(Boolean))}function LP(e){return P8(mh("ORACLE_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS","MAD_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS")).has(e)}function $P(e){return e&&e.auth&&e.auth!=="none"}function T8(){return Nl().filter(e=>!$P(e)||LP(e.id)).map(e=>e.id)}var fe=class extends Error{constructor(t,n,r){super(r||n),this.status=t,this.code=n}};function u0(e){let t=String(e||"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new fe(400,"invalid-owner","owner must be a 0x-prefixed address");return t}function N8(e){let t={},n=String(e||"").split(/\r?\n/).map(r=>r.trim()).filter(Boolean);if(n[0]!=="Oracle onboarding")throw new fe(401,"invalid-proof","wallet proof must be an Oracle onboarding challenge");for(let r of n.slice(1)){let o=r.indexOf(":");o<=0||(t[r.slice(0,o).trim()]=r.slice(o+1).trim())}return t}function C8(e=Math.floor(Date.now()/1e3)){for(let[t,n]of Ga)n.expiresAt<=e&&Ga.delete(t)}function O8({owner:e,action:t,tier:n,id:r}={}){let o=u0(e),i=String(t||"");if(!new Set(["onboard","list","revoke"]).has(i))throw new fe(400,"invalid-action","action must be onboard, list, or revoke");let a=n==null?null:String(n);if(i==="onboard"&&!a)throw new fe(400,"tier-required","onboard challenge requires tier");let s=r==null?null:String(r).trim();if(i==="revoke"&&!s)throw new fe(400,"id-required","revoke challenge requires key id");if(s&&s.length>256)throw new fe(400,"invalid-id","key id is too long");let c=Math.floor(Date.now()/1e3);if(C8(c),Ga.size>=I8)throw new fe(429,"challenge-capacity","too many pending wallet challenges");let l=c+A8,u=b8(32).toString("hex"),d=["Oracle onboarding",`owner: ${o}`,`action: ${i}`];a!=null&&d.push(`tier: ${a}`),s!=null&&d.push(`id: ${s}`),d.push(`nonce: ${u}`,`issuedAt: ${c}`,`expiresAt: ${l}`);let p=d.join(`
|
|
194
|
-
`);return Ga.set(u,{owner:o,action:i,tier:a,id:s,issuedAt:c,expiresAt:l,message:p,used:!1}),{message:p,issuedAt:c,expiresAt:l}}function c0(e={},{owner:t,action:n,tier:r,id:o}={}){let i=u0(t),a=e.proof||e.walletProof||{},s=a.message||e.message,c=a.signature||e.signature;if(!s||!c)throw new fe(401,"wallet-proof-required","wallet signature proof required");let l;try{l=
|
|
193
|
+
}`;function d6(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 vA(e={},t={}){let n={chainIds:d6(e)};return e.user&&(n.user=String(e.user)),{markets:(await hl(c6,{request:n},t))?.data?.markets??[]}}async function EA(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 hl(l6,{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 AA(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 hl(u6,{filter:r},t))?.data?.chains??[]}}async function IA(e={}){return{ok:(await hl("query { health }",{},e))?.data?.health===!0,provider:"aave-v3"}}j();var m6="https://staking-api.babylonlabs.io";function bf(e={}){return String(e.baseUrl||process.env.BABYLON_STAKING_API_URL||m6).replace(/\/$/,"")}function gl(e,t={}){return A(`${bf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}function _A(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 PA(e={}){try{let n=(await gl("/v2/stats",e))?.data||{},r=Number(n.active_tvl??0);return{ok:Number.isFinite(r)&&r>0,provider:"babylon-staking",baseUrl:bf(e),activeTvlSats:String(n.active_tvl??""),activeFinalityProviders:n.active_finality_providers??null,exec:!1}}catch(t){return{ok:!1,provider:"babylon-staking",baseUrl:bf(e),error:String(t?.message||t),exec:!1}}}async function TA(e={},t={}){let r=(await gl("/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 NA(e={},t={}){let n=await gl("/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=_A(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 CA(e={},t={}){let n=_A(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 gl(`/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}}j();var h6="https://markets.bisq.network";function xf(e={}){return String(e.baseUrl||process.env.BISQ_MARKETS_URL||h6).replace(/\/$/,"")}function OA(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 yl(e,t={}){return A(`${xf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function RA(e={}){try{let t=await yl("/api/markets",e),n=t&&typeof t=="object"?Object.keys(t).length:0;return{ok:n>0,provider:"bisq-markets",baseUrl:xf(e),marketCount:n,exec:!1}}catch(t){return{ok:!1,provider:"bisq-markets",baseUrl:xf(e),error:String(t?.message||t),exec:!1}}}async function LA(e={},t={}){let n=await yl("/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 $A(e={},t={}){let n=OA(e.market||e.pair||"btc_usd","market"),r=await yl(`/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 BA(e={},t={}){let n=OA(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 yl(`/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}))}}j();var yn=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"}}),y6=new Map([["bob",60808],["rootstock",30],["rsk",30]]),w6=60808;function Aa(e){if(e==null||e==="")return w6;let t=y6.get(String(e).trim().toLowerCase());if(t)return t;let n=Number(e);if(!yn[n])throw new Error(`bob-rootstock: unsupported chain ${e} (supported: ${Object.keys(yn).join(", ")} / bob, rootstock)`);return n}function Sf(e,t={}){if(t.baseUrl)return String(t.baseUrl).replace(/\/$/,"");let n=Aa(e),r=n===30?process.env.ROOTSTOCK_EXPLORER_URL:process.env.BOB_EXPLORER_URL;return String(r||yn[n].url).replace(/\/$/,"")}function MA(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 wl(e,t,n={}){return A(`${Sf(e,n)}${t.startsWith("/")?t:`/${t}`}`,{fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??15e3})}async function FA(e={},t={}){let n;try{n=Aa(t.chainId??t.chain??e.chainId)}catch(o){return{ok:!1,provider:"bob-rootstock",error:String(o?.message||o),exec:!1}}let r=yn[n];try{let o=await wl(n,"/api/v2/stats",e);return{ok:o?.total_blocks!=null||o?.total_transactions!=null,provider:"bob-rootstock",chainId:n,chain:r.name,baseUrl:Sf(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:Sf(n,e),error:String(o?.message||o),exec:!1}}}async function kf(e={},t={}){let n=e.chainId??e.chain;if(String(n).trim().toLowerCase()==="all"){let a=Object.keys(yn).map(Number);return{provider:"bob-rootstock",chains:await Promise.all(a.map(async c=>{try{return await kf({chainId:c},t)}catch(l){return{provider:"bob-rootstock",chainId:c,chain:yn[c].name,error:String(l?.message||l)}}}))}}let r=Aa(n),o=yn[r],i=await wl(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 UA(e={},t={}){let n=Aa(e.chainId??e.chain),r=MA(e.address||e.addr,"address"),o=yn[n],i=await wl(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 DA(e={},t={}){let n=Aa(e.chainId??e.chain),r=MA(e.address||e.addr,"address"),o=await wl(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:yn[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}))}}j();var x6="https://insights.braiins.com/api/v1.0";function vf(e={}){return String(e.baseUrl||process.env.BRAIINS_INSIGHTS_URL||x6).replace(/\/$/,"")}function Ef(e,t={}){return A(`${vf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function qA(e={}){try{let t=await Ef("/price-stats",e),n=Number(t?.price??0);return{ok:Number.isFinite(n)&&n>0,provider:"braiins-insights",baseUrl:vf(e),btcUsd:Number.isFinite(n)?n:null,timestamp:t?.timestamp??null,exec:!1}}catch(t){return{ok:!1,provider:"braiins-insights",baseUrl:vf(e),error:String(t?.message||t),exec:!1}}}async function HA(e={},t={}){let n=await Ef("/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 jA(e={},t={}){let n=await Ef("/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)}}j();var k6="https://api.cow.fi",zA=Object.freeze({1:"mainnet",100:"xdai",42161:"arbitrum_one",8453:"base",11155111:"sepolia"});function VA(e={}){return(e.baseUrl||process.env.COW_API_URL||k6).replace(/\/$/,"")}function v6(e={}){if(e.network)return String(e.network);let t=Number(e.chainId??1),n=zA[t];if(!n)throw new Error(`cow-protocol: unsupported chainId ${t} (have: ${Object.keys(zA).join(", ")})`);return n}function Af(e,t,n){return`${VA(n)}/${v6(e)}/api/v1${t}`}function WA(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 GA(e,t=10){return Math.min(1e3,Math.max(1,Number(e.limit??t)))}async function KA(e={},t={}){return A(Af(e,"/auction",t),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function YA(e={},t={}){let n=WA(e.owner||e.address||e.user,"owner"),r=new URLSearchParams({limit:String(GA(e))});e.offset!=null&&r.set("offset",String(Math.max(0,Number(e.offset))));let o=await A(`${Af(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 JA(e={},t={}){let n=new URLSearchParams;e.orderUid?n.set("orderUid",String(e.orderUid)):n.set("owner",WA(e.owner||e.address||e.user,"owner"));let r=await A(`${Af(e,"/trades",t)}?${n}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4}),o=Array.isArray(r)?r:[];return{count:o.length,trades:o.slice(0,GA(e))}}async function XA(e={}){let t=await A(`${VA(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}}j();var A6="https://api.hiro.so",I6=20;function If(e={}){return String(e.baseUrl||process.env.HIRO_API_URL||A6).replace(/\/$/,"")}function _6(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.HIRO_API_KEY;return n&&(t["x-api-key"]=String(n)),t}function Ia(e,t={}){return A(`${If(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:_6(t)})}async function QA(e={}){try{let t=await Ia("/v2/info",e),n=Number(t?.burn_block_height??0);return{ok:Number.isFinite(n)&&n>0,provider:"hiro-stacks",baseUrl:If(e),burnBlockHeight:t?.burn_block_height??null,stacksTipHeight:t?.stacks_tip_height??null,serverVersion:t?.server_version??null,rateLimitRps:I6,keyed:!!(e.apiKey||process.env.HIRO_API_KEY),exec:!1}}catch(t){return{ok:!1,provider:"hiro-stacks",baseUrl:If(e),error:String(t?.message||t),exec:!1}}}async function ZA(e={},t={}){let n=await Ia("/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 eI(e={},t={}){let n=await Ia("/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 tI(e={},t={}){let n=Math.min(60,Math.max(1,Number(e.limit||20))),r=Math.max(0,Number(e.offset||0)),o=await Ia(`/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 nI(e={},t={}){let n=Math.min(30,Math.max(1,Number(e.limit||1))),r=await Ia(`/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}))}}j();var T6="https://bundles.jito.wtf",oI=1e9;function _f(e={}){return String(e.baseUrl||process.env.JITO_BUNDLES_URL||T6).replace(/\/$/,"")}function N6(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(Math.floor(r),n)):t}function rI(e){let t=Number(e);return Number.isFinite(t)?Math.round(t*oI):null}function C6(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/oI:null,raw:e}}async function iI(e={}){try{let t=await A(`${_f(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 aI(e={},t={}){let n=N6(e.limit,5,100),r=new URL(`${_f(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 A(r.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3}),a=(Array.isArray(o)?o:Array.isArray(o?.bundles)?o.bundles:[]).map(C6),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 sI(e={}){let t=await A(`${_f(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,rI(i)])),suggestedTipLamports:rI(r.p75||r.p50),raw:n}}j();var R6="https://api.kamino.finance";function L6(e={}){return String(e.baseUrl||process.env.KAMINO_API_URL||R6).replace(/\/$/,"")}function yt(e){let t=Number(e);return Number.isFinite(t)?t:null}function cI(e={}){let t=yt(e.totalValueLocked)??0,n=yt(e.apy?.totalApy)??0,r=yt(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:yt(e.sharePrice),sharesIssued:yt(e.sharesIssued),profitAndLoss:yt(e.profitAndLoss),feeApy:n,feeApyPct:n*100,rewardApy:r,rewardApyPct:r*100,totalApy:n+r,totalApyPct:(n+r)*100,apr24h:yt(e.apy?.vault?.totalApr),apy24h:yt(e.kaminoApy?.vault?.apy24h),apy7d:yt(e.kaminoApy?.vault?.apy7d),apy30d:yt(e.kaminoApy?.vault?.apy30d),poolPrice:yt(e.apy?.vault?.poolPrice),priceLower:yt(e.apy?.vault?.priceLower),priceUpper:yt(e.apy?.vault?.priceUpper),outOfRange:!!e.apy?.vault?.strategyOutOfRange,rewardMints:e.rewardMints||[],balances:e.vaultBalances||null,lastCalculated:e.kaminoApy?.vault?.lastCalculated||null}}async function Pf(e={},t={}){let n=new URL(`${L6(t)}/strategies/metrics`);n.searchParams.set("env",String(e.env||"mainnet-beta")),n.searchParams.set("status",String(e.status||"LIVE"));let r=await A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??45e3});return Array.isArray(r)?r:[]}async function lI(e={}){try{let t=await Pf({},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 uI(e={},t={}){let r=(await Pf(e,t)).map(cI),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 dI(e={},t={}){let n=String(e.strategy||e.address||"").trim();if(!n)throw new Error("kamino-strategies: strategy address required");let o=(await Pf({...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",...cI(o),raw:o}}j();var B6="https://blockstream.info/liquid/api",pI="6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d";function bl(e={}){return String(e.baseUrl||process.env.LIQUID_ESPLORA_URL||B6).replace(/\/$/,"")}function M6(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 F6(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 mI(e,t={}){let n=`${bl(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 fI(e,t={}){return A(`${bl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function hI(e={}){try{let t=await mI("/blocks/tip/height",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"liquid-esplora",baseUrl:bl(e),tipHeight:n,exec:!1,signing:"user-wallet"}}catch(t){return{ok:!1,provider:"liquid-esplora",baseUrl:bl(e),error:String(t?.message||t),exec:!1}}}async function gI(e={},t={}){let n=await mI("/blocks/tip/height",t);return{provider:"liquid-esplora",tipHeight:Number(n)}}async function yI(e={},t={}){let n=M6(e.address||e.addr,"address"),r=await fI(`/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 wI(e={},t={}){let n=F6(e.assetId||e.asset||pI,"assetId"),r=await fI(`/asset/${n}`,t),o=r.chain_stats||{};return{provider:"liquid-esplora",assetId:n,isPolicyAsset:n===pI,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}}j();var D6="https://api-mainnet.magiceden.dev/v2/ord/btc",q6=600;function Tf(e={}){return String(e.baseUrl||process.env.MAGICEDEN_ORD_API_URL||D6).replace(/\/$/,"")}function H6(e={}){let t={Accept:"application/json"},n=e.apiKey||process.env.MAGICEDEN_API_KEY;return n&&(t.Authorization=`Bearer ${n}`),t}function bI(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 xI(e,t={}){return A(`${Tf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:H6(t),retries:t.retries??1})}async function SI(e={}){let t=bI(e.probeCollection||process.env.MAGICEDEN_PROBE_COLLECTION||"nodemonkes");try{let n=await xI(`/stat?collectionSymbol=${encodeURIComponent(t)}`,e);return{ok:n!=null&&typeof n=="object",provider:"magiceden-ordinals",baseUrl:Tf(e),probeCollection:t,rateLimitRpm:q6,exec:!1}}catch(n){let r=n?.status??null;return{ok:!1,provider:"magiceden-ordinals",baseUrl:Tf(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 kI(e={},t={}){let n=bI(e.collectionSymbol||e.symbol||e.collection,"collectionSymbol");try{let r=await xI(`/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."}}}j();var z6="https://mempool.space/api",V6=7;function Nf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||z6).replace(/\/$/,"")}function xl(e,t={}){return A(`${Nf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}function vI(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>V6}}async function EI(e={}){try{let n=(await xl("/v1/lightning/statistics/latest",e))?.latest||{},{ageDays:r,stale:o}=vI(n.added);return{ok:Number(n.node_count||0)>0,provider:"mempool-lightning",baseUrl:Nf(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:Nf(e),error:String(t?.message||t),exec:!1}}}async function AI(e={},t={}){let r=(await xl("/v1/lightning/statistics/latest",t))?.latest||{},{ageDays:o,stale:i}=vI(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 II(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 xl(`/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 _I(e={},t={}){let n=await xl("/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)}))}}j();var G6="https://mempool.space/api",PI=new Set(["24h","3d","1w","1m","3m","6m","1y","2y","3y","all"]);function Cf(e={}){return String(e.baseUrl||process.env.MEMPOOL_API_URL||G6).replace(/\/$/,"")}function TI(e,t){let n=String(e||t).trim().toLowerCase();if(!PI.has(n))throw new Error(`mempool-mining: window must be one of ${[...PI].join(", ")}`);return n}function _a(e,t={}){return A(`${Cf(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3})}async function NI(e={}){try{let t=await _a("/v1/difficulty-adjustment",e);return{ok:Number.isFinite(Number(t?.nextRetargetHeight))&&Number(t.nextRetargetHeight)>0,provider:"mempool-mining",baseUrl:Cf(e),nextRetargetHeight:t?.nextRetargetHeight??null,exec:!1}}catch(t){return{ok:!1,provider:"mempool-mining",baseUrl:Cf(e),error:String(t?.message||t),exec:!1}}}async function CI(e={},t={}){let n=await _a("/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 OI(e={},t={}){let n=TI(e.window||e.timeframe,"1w"),r=await _a(`/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 RI(e={},t={}){let n=TI(e.window||e.timeframe,"3d"),r=await _a(`/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 LI(e={},t={}){let n=Math.min(1e4,Math.max(1,Number(e.blockCount||e.blocks||144))),r=await _a(`/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}}j();var Y6="https://amm-v2.meteora.ag",$I=new Set(["tvl","volume","fee_tvl_ratio","l_m"]),BI=new Set(["dynamic","multitoken","lst","farms"]),J6=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function X6(e={}){return String(e.baseUrl||process.env.METEORA_API_URL||Y6).replace(/\/$/,"")}function et(e){let t=Number(e);return Number.isFinite(t)?t:null}function Q6(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:et(e.pool_lp_price_in_usd),tvlUsd:et(e.pool_tvl),farmTvlUsd:et(e.farm_tvl),volume24hUsd:et(e.trading_volume),volume7dUsd:et(e.weekly_trading_volume),fee24hUsd:et(e.fee_volume),fee7dUsd:et(e.weekly_fee_volume),tradeApyPct:et(e.trade_apy),weeklyTradeApyPct:et(e.weekly_trade_apy),baseApyPct:et(e.daily_base_apy),farmingApyPct:et(e.farming_apy),totalApyPct:(et(e.trade_apy)??0)+(et(e.farming_apy)??0),aprPct:et(e.apr),feePct:et(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 Z6(e={},t={}){let n=new URL(`${X6(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(!$I.has(s))throw new Error(`meteora-dlmm: sortKey must be one of ${[...$I].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(!BI.has(s))throw new Error(`meteora-dlmm: poolType must be one of ${[...BI].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(!J6.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 Of(e={},t={}){let{url:n,page:r,size:o}=Z6(e,t),i=await A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{pools:(Array.isArray(i?.data)?i.data:[]).map(Q6),totalCount:i?.total_count??null,page:r,size:o}}async function MI(e={}){try{let{pools:t,totalCount:n}=await Of({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 FI(e={},t={}){let n=await Of({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 UI(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 Of({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}}j();var tD="https://ordinals.com";function Sl(e={}){return String(e.baseUrl||e.ordinalsBase||process.env.ORDINALS_BASE_URL||tD).replace(/\/$/,"")}function nD(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 DI(e,t={}){let n=`${Sl(t)}${e.startsWith("/")?e:`/${e}`}`,o=await(t.fetchImpl||fetch)(n,{method:"GET",headers:{accept:"application/json,text/plain;q=0.9,*/*;q=0.8"},signal:AbortSignal.timeout(t.timeoutMs??12e3)}),i=await o.text();if(!o.ok)throw new Error(`ordinals-runes GET ${e}: HTTP ${o.status} ${i.slice(0,160)}`);return i.trim()}function Rf(e,t={}){return A(`${Sl(t)}${e.startsWith("/")?e:`/${e}`}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??15e3,headers:{Accept:"application/json"}})}async function qI(e={}){try{let t=await DI("/r/blockheight",e),n=Number(t);return{ok:Number.isFinite(n)&&n>0,provider:"ordinals-runes",baseUrl:Sl(e),blockHeight:n,exec:!1}}catch(t){return{ok:!1,provider:"ordinals-runes",baseUrl:Sl(e),error:String(t?.message||t),exec:!1}}}async function HI(e={},t={}){let n=await DI("/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 jI(e={},t={}){let n=e.height??e.block??e.hash;if(n==null||n==="")throw new Error("ordinals-runes: blockInfo requires height or hash");let r;if(/^[0-9a-f]{64}$/i.test(String(n)))r=String(n).toLowerCase();else{let i=Number(n);if(!Number.isInteger(i)||i<0)throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");r=String(i)}let o=await Rf(`/r/blockinfo/${r}`,t);return{provider:"ordinals-runes",height:o.height??null,hash:o.hash??null,timestamp:o.timestamp??null,difficulty:o.difficulty??null,transactionCount:o.transaction_count??null,averageFee:o.average_fee??null,averageFeeRate:o.average_fee_rate??null,feerangeSats:o.feerange??null,totalFee:o.total_fee??null,totalSize:o.total_size??null,confirmations:o.confirmations??null,raw:o}}async function zI(e={},t={}){let n=e.sat??e.ordinal,r=Number(n);if(!Number.isInteger(r)||r<0||r>209999999769e4)throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");let o=Math.max(0,Number(e.page||0)),i=o>0?`/r/sat/${r}/${o}`:`/r/sat/${r}`,a=await Rf(i,t),s=Array.isArray(a?.ids)?a.ids:[];return{provider:"ordinals-runes",sat:r,page:o,inscriptionCount:s.length,inscriptionIds:s,more:!!a?.more,raw:a}}async function VI(e={},t={}){let n=nD(e.name||e.rune||e.runeName,"name"),r=await Rf(`/rune/${n}`,t),o=r?.entry||{},i=o.terms||{},a=i.cap==null?null:Number(i.cap),s=o.mints==null?null:Number(o.mints);return{provider:"ordinals-runes",name:n,spacedRune:o.spaced_rune??null,number:o.number??null,symbol:o.symbol??null,divisibility:o.divisibility??null,etchingBlock:o.block??null,etchingTxid:o.etching??null,premine:o.premine==null?null:String(o.premine),mints:s==null?null:String(s),burned:o.burned==null?null:String(o.burned),mintCap:a==null?null:String(a),mintProgressPct:a&&a>0&&s!=null?s/a*100:null,mintable:r?.mintable??null,amountPerMint:i.amount==null?null:String(i.amount),turbo:o.turbo??null,parent:r?.parent??null,raw:r}}j();var oD="https://hermes.pyth.network",$f={"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"},iD=/^[0-9a-fA-F]{64}$/;function WI(e={}){return String(e.baseUrl||process.env.PYTH_HERMES_URL||oD).replace(/\/$/,"")}function GI(e,t="feedId"){let n=String(e??"").trim();if(!n)throw new Error(`pyth-price-feeds: ${t} required`);let r=$f[n.toUpperCase()]||$f[`${n.toUpperCase()}/USD`];if(r)return r;let o=n.startsWith("0x")||n.startsWith("0X")?n.slice(2):n;if(!iD.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 Lf(e={}){let t=Number(e.price),n=Number(e.expo);return!Number.isFinite(t)||!Number.isFinite(n)?null:t*10**n}function Bf(e={}){let t=Lf({price:Number(e.price?.conf),expo:e.price?.expo}),n=Lf(e.price);return{id:e.id||null,price:n,confidence:t,confidenceBps:n&&t!=null?Math.round(t/Math.abs(n)*1e4):null,emaPrice:Lf(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 Mf(e,t={}){let n=new URL(`${WI(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"),A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3})}async function KI(e={}){try{let t=await Mf([$f["SOL/USD"]],e),r=(Array.isArray(t?.parsed)?t.parsed.map(Bf):[])[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 YI(e={},t={}){let n=GI(e.feedId||e.id||e.symbol,"feedId"),r=await Mf([n],t),o=Array.isArray(r?.parsed)?r.parsed.map(Bf):[],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 JI(e={},t={}){let n=Array.isArray(e)?e:e.feedIds||e.ids||e.symbols||[],r=[...new Set(n.map(l=>GI(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 Mf(l,t));let s=a.flatMap(l=>Array.isArray(l?.parsed)?l.parsed.map(Bf):[]),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 XI(e={},t={}){let n=new URL(`${WI(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 A(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}))}}j();var sD="https://relayscan.io",QI=new Set(["1h","12h","24h","7d"]);function Ff(e={}){return(e.baseUrl||process.env.RELAYSCAN_API_URL||sD).replace(/\/$/,"")}function ZI(e={}){let t=String(e.timespan||e.t||"24h").toLowerCase();if(!QI.has(t))throw new Error(`relayscan-mev: timespan must be one of ${[...QI].join(", ")}`);return t}function cD(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 Uf(e={},t={}){return A(`${Ff(t)}/overview/json?t=${ZI(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function e1(e={},t={}){return A(`${Ff(t)}/builder-profit/json?t=${ZI(e)}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}async function t1(e={},t={}){let n=cD(e);return A(`${Ff(t)}/stats/day/${n}/json`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3})}async function n1(e={}){let t=await Uf({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}}j();var uD="https://extra-api.sanctum.so",dD=30,pD=["jitoSOL","mSOL","bSOL","INF","hSOL","bonkSOL","jupSOL","dSOL"];function Df(e={}){return String(e.baseUrl||process.env.SANCTUM_API_URL||uD).replace(/\/$/,"")}function r1(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 mD(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function Tr(e,t,n={}){let r={},o={};for(let i of mD(t,dD)){let a=new URL(`${Df(n)}/v1/${e}`);for(let l of i)a.searchParams.append("lst",l);let s=await A(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 o1(e={}){try{let[t,n]=await Promise.all([A(`${Df(e)}/v1/lsts`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),Tr("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 qf(e={},t={}){let n=await A(`${Df(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 i1(e={},t={}){let n=e.lsts||e.symbols||null;e.all===!0&&(n=(await qf({},t)).lsts.map(c=>c.symbol).filter(Boolean)),(!Array.isArray(n)||!n.length)&&(n=pD);let r=[...new Set(n.map(s=>r1(s,"lsts[]")))],[o,i]=await Promise.all([Tr("apy/latest",r,t),Tr("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 a1(e={},t={}){let n=r1(e.lst||e.mint||e.symbol,"lst"),[r,o,i,a]=await Promise.all([Tr("apy/latest",[n],t),Tr("apy/inception",[n],t),Tr("tvl/current",[n],t).catch(()=>({values:{},errs:{}})),Tr("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}}j();var hD="https://api.save.finance",gD="4UpD2fh7xH3VP9QQaXtsS1YY3bxzWhtfpks7FatyKvdY",s1="CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6",yD=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function Hf(e={}){return String(e.baseUrl||process.env.SAVE_API_URL||process.env.SOLEND_API_URL||hD).replace(/\/$/,"")}function c1(e,t="address"){let n=String(e??"").trim();if(!yD.test(n))throw new Error(`solend-lending: ${t} must be a base58 public key`);return n}function l1(e){let t=Number(e);return Number.isFinite(t)?t:null}function wD(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 bD(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:l1(e.rates?.supplyInterest),borrowApyPct:l1(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 u1(e={}){try{let t=await A(`${Hf(e)}/v1/reserves?ids=${s1}`,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??15e3}),n=Array.isArray(t?.results)?t.results:[];return{ok:n.length>0,provider:"solend-lending",probeReserve:s1,reserves:n.length,exec:!1}}catch(t){return{ok:!1,provider:"solend-lending",error:String(t?.message||t),exec:!1}}}async function jf(e={},t={}){let n=new URL(`${Hf(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 A(n.toString(),{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??(e.scope==="all"?45e3:2e4)}),o=(Array.isArray(r)?r:[]).map(wD);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 d1(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=>c1(String(s).trim(),"reserve"));else{let a=c1(e.market||e.marketAddress||gD,"market"),c=(await jf({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 A(`${Hf(t)}/v1/reserves?ids=${n.join(",")}`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??25e3}),i=(Array.isArray(o?.results)?o.results:[]).map((a,s)=>({...bD(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 zf(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 Nr(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 Pa(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:zf(e.amount,"amount")}}function Vf(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 Ta(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 Wf(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 SD(e={},t={}){let n=Pa(e),r=Nr(e.slices??10,"slices",2,100),o=Nr(e.durationSec??3600,"durationSec",r,604800),i=Vf(n.total,Array(r).fill(1));return Ta(n,"TWAP",Wf(i,o,t.nowMs),{durationSec:o})}function kD(e={},t={}){let n=Pa(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=Nr(e.durationSec??3600,"durationSec",r.length,604800),i=Vf(n.total,r),a=r.reduce((c,l)=>c+l,0n),s=Wf(i,o,t.nowMs).map((c,l)=>({...c,volumeWeightBps:Number(r[l]*10000n/a)}));return Ta(n,"VWAP",s,{durationSec:o,requiresLiveVolumeValidation:!0})}function vD(e={}){let t=Pa(e),n=Nr(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=zf(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 Ta(t,"POV",o,{participationBps:n,residualAmount:String(r),requiresLiveVolumeValidation:!0})}function ED(e={}){let t=Pa(e),n=zf(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 Ta(t,"ICEBERG",r,{displayAmount:String(n),refillCount:r.length-1})}function AD(e={},t={}){let n=Pa(e),r=Nr(e.slices??10,"slices",2,100),o=Nr(e.durationSec??3600,"durationSec",r,604800),i=Nr(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=Vf(n.total,a);return Ta(n,"IS",Wf(s,o,t.nowMs),{durationSec:o,urgencyBps:i})}function p1(e={},t={}){let n=String(e.strategy||"").trim().toUpperCase();if(n==="TWAP")return SD(e,t);if(n==="VWAP")return kD(e,t);if(n==="POV")return vD(e,t);if(n==="ICEBERG")return ED(e,t);if(n==="IS"||n==="IMPLEMENTATION SHORTFALL")return AD(e,t);throw new Error("strategy must be TWAP, VWAP, POV, ICEBERG, or IS")}function m1(){return{ok:!0,provider:"execution-strategies",strategies:["TWAP","VWAP","POV","ICEBERG","IS"],execution:"plan-only",externalProtocol:!1}}ne();import{TypedDataEncoder as _D,getAddress as PD,isAddress as TD}from"ethers";var f1=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Gf=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"}]}),h1=/^(?:0|[1-9][0-9]*)$/;function kl(e,t){let n=String(e||"").trim();if(!TD(n))throw new Error(`limit-order: ${t} must be an address`);return PD(n)}function Kf(e,t){let n=String(e??"").trim();if(!h1.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 g1(){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 ND(e){let t=Number(e),n=f1[t];if(!n)throw new Error(`limit-order: unsupported chainId ${e}`);return{name:"1inch Limit Order Protocol",version:"4",chainId:t,verifyingContract:n}}function CD(e){let t=Number(e);if(!f1[t])throw new Error(`limit-order: unsupported chainId ${e}`);return`https://limit-orders.1inch.io/v4.0/${t}`}function OD(e={}){let t=kl(e.maker,"maker"),n=e.receiver?kl(e.receiver,"receiver"):t,r=kl(e.makerAsset,"makerAsset"),o=kl(e.takerAsset,"takerAsset");if(r.toLowerCase()===o.toLowerCase())throw new Error("limit-order: makerAsset and takerAsset must differ");let i=Kf(e.makingAmount,"makingAmount"),a=Kf(e.takingAmount,"takingAmount"),s=Kf(e.salt??String(BigInt(e.nowMs??Date.now())),"salt"),c=String(e.makerTraits??"0");if(!h1.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 y1(e={},t={}){let n=Number(e.chainId),r=ND(n),o=OD(e),i={types:Gf,domain:r,primaryType:"Order",message:o},a=_D.hash(r,Gf,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:CD(n),domain:r,types:Gf,message:o,typedData:i,digest:a})})}function w1(e={},t={}){let n=y1(e,t);return $({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 b1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=y1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}ne();var LD=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/,$D=/^(?:0|[1-9][0-9]*)$/;function Yf(e,t){let n=String(e||"").trim();if(!LD.test(n))throw new Error(`jupiter-dca: ${t} must be a base58 public key`);return n}function BD(e,t){let n=String(e??"").trim();if(!$D.test(n)||n==="0")throw new Error(`jupiter-dca: ${t} must be a positive integer`);return n}function x1(){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 S1(e={}){let t=Yf(e.owner,"owner"),n=Yf(e.inputMint,"inputMint"),r=Yf(e.outputMint,"outputMint");if(n===r)throw new Error("jupiter-dca: inputMint and outputMint must differ");let o=BD(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 k1(e={},t={}){let n=S1(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=Ci({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 Wd({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 v1(e={},t={}){let n=S1(e),r=null;return e.unsignedTx&&n.slices===1&&e.outAmount&&(r=k1(e,t)),$({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 E1(e={},t={}){let{queueOwnerAction:n}=await Promise.resolve().then(()=>(nc(),tc)),r=k1(e,t);return{...await n(r,t.env),envelope:r,execution:"armed-local",exec:!1}}j();var FD="protective-monitors",UD="read-only",DD=Object.freeze(["depeg","oracleDeviation","exploitFeed","goplus","liquidationLadder"]),qD="https://hermes.pyth.network",HD="https://coins.llama.fi",jD="https://api.llama.fi/hacks",zD="https://api.gopluslabs.io/api/v1/token_security",VD="https://api.v3.aave.com/user",WD=Object.freeze({USDT:"2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",USDC:"eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a"}),GD=Object.freeze({USDT:"coingecko:tether",USDC:"coingecko:usd-coin",DAI:"coingecko:dai"}),KD=Object.freeze(["is_honeypot","is_proxy","is_mintable","owner_change_balance","hidden_owner","selfdestruct","cannot_buy","cannot_sell_all","is_blacklisted"]),A1=Object.freeze({liquidatable:0,danger:1,critical:2,warning:3,healthy:4}),YD=/^0x[0-9a-fA-F]{40}$/,JD=/^[0-9a-fA-F]{64}$/;function $o(e,t={}){return{ok:!0,provider:FD,op:e,alertOnly:!0,execution:UD,exec:!1,...t}}function tt(e,t){throw new Error(`protective-monitors: ${e}${t?` ${t}`:""}`)}async function Na(e,t={}){return typeof t.http=="function"?t.http(e,t):typeof t.httpJson=="function"?t.httpJson(e,t):A(e,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??12e3,retries:t.retries??0})}function vl(e){return String(e||"USDT").trim().toUpperCase().replace(/\/USD$/,"")}function XD(e={}){if(e.feedId){let r=String(e.feedId).replace(/^0x/i,"");return JD.test(r)||tt("feedId must be a 32-byte hex id"),r.toLowerCase()}let t=vl(e.symbol),n=WD[t];return n||tt("unknown symbol",t),n}function QD(e={}){if(e.llamaCoin)return String(e.llamaCoin);let t=vl(e.symbol);return GD[t]||`coingecko:${t.toLowerCase()}`}function I1(e,t){let n=Number(e.thresholdBps??t);return(!Number.isFinite(n)||n<0)&&tt("thresholdBps must be a non-negative number"),n}function ZD(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))&&tt("no pyth price returned"),r<0?n/10**-r:n*10**r}function e5(e,t){let n=e?.coins?.[t]||e?.coins?.[String(t).toLowerCase()],r=Number(n?.price);return Number.isFinite(r)?r:null}function t5(e,t={}){let n=String(t.pythBaseUrl||qD).replace(/\/$/,""),r=new URL(`${n}/v2/updates/price/latest`);return r.searchParams.append("ids[]",e),r.searchParams.set("parsed","true"),r.toString()}function n5(e,t={}){return`${String(t.llamaCoinsBaseUrl||HD).replace(/\/$/,"")}/prices/current/${encodeURIComponent(e)}`}async function _1(e,t){let n=XD(e),r=await Na(t5(n,t),t),o=ZD(r);return o>0||tt("pyth price must be positive"),{id:n,price:o}}async function P1(e,t){let n=QD(e),r=await Na(n5(n,t),t);return{coin:n,price:e5(r,n)}}function T1(){return $o("health",{ok:!0,ops:[...DD],keyless:!0,note:"Alert-only depeg / deviation / exploit / goplus / liquidation. Second opinions, not gates."})}async function Jf(e={},t={}){let n=Number(e.peg??1);(!Number.isFinite(n)||n<=0)&&tt("peg must be a positive number");let r=I1(e,50),o=await _1(e,t),i=Math.round(Math.abs(o.price-n)*1e4),a={required:!1,llamaPrice:null};try{let s=await P1(e,t);a={required:!1,llamaPrice:s.price,llamaCoin:s.coin}}catch{a={required:!1,llamaPrice:null}}return $o("depeg",{symbol:vl(e.symbol),feedId:o.id,price:o.price,peg:n,thresholdBps:r,deviationBps:i,alert:i>r,crossCheck:a})}async function Xf(e={},t={}){let n=I1(e,100),r=await _1(e,t),o=await P1(e,t);o.price>0||tt("llama price required for oracleDeviation");let i=(r.price+o.price)/2,a=Math.round(Math.abs(r.price-o.price)/i*1e4);return $o("oracleDeviation",{symbol:vl(e.symbol),pythPrice:r.price,llamaPrice:o.price,mid:i,thresholdBps:n,deviationBps:a,alert:a>n})}function r5(e,t){return String(e.id||e.defillamaId||e.slug||`hack-${t}`)}function o5(e,t){return{id:r5(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 i5(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 N1(e){if(typeof e=="string"){let t=e.trim();if(t.startsWith("<"))return i5(t);try{return N1(JSON.parse(t))}catch{tt("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 a5(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 Qf(e={},t={}){let n=String(e.url||t.hacksUrl||jD),r=e.payload??await Na(n,t),o=a5(N1(r).map(o5));return $o("exploitFeed",{count:o.length,fingerprint:o.map(i=>i.id).join("|"),items:o,alert:o.length>0})}function s5(e){return e===!0||e===1||e==="1"}function c5(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 Zf(e={},t={}){e.asSoleGate===!0&&tt("goplus is a second opinion and must never be a sole gate");let n=String(e.address||e.token||"").trim();YD.test(n)||tt("goplus requires an EVM token address");let r=Number(e.chainId??1);(!Number.isInteger(r)||r<=0)&&tt("chainId must be a positive integer");let i=`${String(t.goplusBaseUrl||zD).replace(/\/$/,"")}/${r}?contract_addresses=${n}`,a=e.payload??await Na(i,t),s=c5(a,n);s||tt("goplus returned no result for",n);let c=KD.filter(l=>s5(s.token[l]));return $o("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 l5(e){let t=Number(e);return(!Number.isFinite(t)||t<0)&&tt("healthFactor must be a non-negative number"),t<1?"liquidatable":t<1.05?"danger":t<1.2?"critical":t<1.5?"warning":"healthy"}function u5(e,t){let n=Number(e.healthFactor??e.hf);Number.isFinite(n)||tt("position healthFactor required");let r=l5(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 eh(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||tt("liquidationLadder requires user or positions");let s=String(t.aaveUrl||`${VD}/${a}`);n=await Na(s,t)}let o=(Array.isArray(n?.positions)?n.positions:[]).map(u5),i=o.reduce((a,s)=>a?A1[s.rung]<A1[a]?s.rung:a:s.rung,null);return $o("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 BG=Object.freeze({depeg:Jf,oracleDeviation:Xf,exploitFeed:Qf,goplus:Zf,liquidationLadder:eh});import{existsSync as p5,readFileSync as m5}from"node:fs";import{dirname as f5,join as C1}from"node:path";import{fileURLToPath as h5}from"node:url";var El=Object.freeze({OK:"OK",FAILED:"FAILED"}),g5=Object.freeze({hl:9,dydx:10,binance:8}),O1=Object.freeze(["hl","dydx","binance"]),y5=C1(f5(h5(import.meta.url)),"../../../fixtures/funding-scanner");function R1(){return{ok:!0,provider:"funding-scanner",exec:!1,execution:"read-only",signed:!1,broadcast:!1,venues:[...O1],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 w5(e){let t=Ft(e);if(t==null)throw new Error("funding-scanner: funding rate required");return t*24*365*100}function b5(e,t){if(t&&Object.prototype.hasOwnProperty.call(t,e)){let n=Ft(t[e]);if(n!=null&&n>=0)return n}return Ft(g5[e])}function nh(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 x5({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=w5(o);return Object.freeze({venue:String(e),coin:String(t),hourly:o,annualizedPct:a,feeDragBps:i,netAnnualizedPct:a-i/100,quality:El.OK})}function th(e,t,n){return Object.freeze({venue:String(e||"unknown"),coin:null,hourly:null,annualizedPct:null,feeDragBps:Ft(n),netAnnualizedPct:null,quality:El.FAILED,error:String(t||"missing venue")})}function S5(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=nh(t[o]?.name),a=Ft(n[o]?.funding);!i||a==null||r.push({venue:"hl",coin:i,hourly:a})}return r}function k5(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=nh(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 v5(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 E5(e){let{intervalHours:t,entries:n}=v5(e),r=[];for(let o of n){let i=nh(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 A5=Object.freeze({hl:S5,dydx:k5,binance:E5});function I5(e,t){let n=C1(e,`${t}.json`);if(!p5(n))return{missing:!0,error:`missing fixture ${t}.json`};try{return{payload:JSON.parse(m5(n,"utf8"))}}catch(r){return{missing:!0,error:`unreadable fixture ${t}.json: ${String(r.message||r)}`}}}function _5(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 I5(n,e)}function P5(e,t){let n=A5[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 T5(e,t){let n=e.quality===El.FAILED||e.netAnnualizedPct==null,r=t.quality===El.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 L1(e={},t={}){let n=(Array.isArray(e.venues)?e.venues:O1).map(String),r=e.payloads||t.payloads||null,o=e.fixtureDir||t.fixtureDir||y5,i=e.feeDragBps||t.feeDragBps||null,a=[];for(let s of n){let c=b5(s,i),l=_5(s,r,o);if(l.missing){a.push(th(s,l.error,c));continue}let u=P5(s,l.payload);if(u.error||!Array.isArray(u.parsed)||u.parsed.length===0){a.push(th(s,u.error||"no parseable funding rows",c));continue}for(let d of u.parsed)try{a.push(x5({venue:s,coin:d.coin,hourly:d.hourly,feeDragBps:c}))}catch(p){a.push(th(s,p.message,c))}}return a.sort(T5),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 C5=Math.sqrt(2*Math.PI);function Al(e){return Math.exp(-.5*e*e)/C5}function O5(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 Gn(e){return .5*(1+O5(e/Math.SQRT2))}function $1({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*Gn(p)-s*f*Gn(m),g=s*f*Gn(-m)-a*Gn(-p),b=i==="put"?g:h,S=i==="put"?Gn(p)-1:Gn(p),w=Al(p)/(a*l*d),y=a*Al(p)*d/100,k=i==="put"?(-(a*Al(p)*l)/(2*d)+c*s*f*Gn(-m))/365:(-(a*Al(p)*l)/(2*d)-c*s*f*Gn(m))/365;return Object.freeze({kind:i,price:b,delta:S,gamma:w,vega:y,theta:k,d1:p,d2:m})}var HG=Object.freeze(["https://api.derive.xyz/trade","https://api.lyra.finance/trade"]);function Il(){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 _l(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=$1({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 B1(){return{ok:!0,provider:"holder-clusters",exec:!1,execution:"read-only",note:"Heuristic graph scores. Not Nansen. Not identity."}}function Ca(e){return String(e||"").trim().toLowerCase()}function L5(e){let t=0;for(let n of e){let r=Number(n);r>=0&&(t+=r*r)}return t}function M1({transfers:e=[],funding:t=[],supply:n}={}){let r=new Map;for(let d of e){let p=Ca(d.from),m=Ca(d.to),f=Number(d.amount);!(f>0)||!p||!m||(r.set(p,(r.get(p)||0)-f),r.set(m,(r.get(m)||0)+f))}let o=[...r.entries()].filter(([,d])=>d>0).sort((d,p)=>p[1]-d[1]),i=Number(n)>0?Number(n):o.reduce((d,[,p])=>d+p,0),a=i>0?o.map(([,d])=>d/i):[],s=L5(a),c=new Map;for(let d of t){let p=Ca(d.funder),m=Ca(d.wallet);!p||!m||(c.has(p)||c.set(p,new Set),c.get(p).add(m))}let l=[...c.entries()].map(([d,p])=>({funder:d,size:p.size,wallets:[...p].sort()})).filter(d=>d.size>=2).sort((d,p)=>p.size-d.size),u=t[0]?Ca(t[0].funder):null;return Object.freeze({ok:!0,execution:"read-only",exec:!1,holderCount:o.length,topShare:a[0]??0,hhi:s,concentrated:s>=.15,clusterCount:l.length,largestCluster:l[0]?.size??0,firstFunder:u,clusters:Object.freeze(l.slice(0,20))})}function F1(){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 U1(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 D1(){return{...Il(),provider:"derive-options",note:"Read/rank only. Prepare refused until official Derive domain+contract is pinned."}}function q1(e,t){return _l(e,t)}function H1(){return{ok:!0,provider:"limitless",exec:!1,execution:"read-only",note:"Public market catalog only. Prepare refused \u2014 no grant-bound decoder."}}function j1(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 U5=Object.freeze([]);function z1(){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 V1(e={}){let t=String(e.address||"").toLowerCase(),n=U5.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 W1(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 G1(){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 K1(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 q5(e=process.env){return String(e.ORACLE_KEEPER_MIRROR||"")==="1"}function Y1(e=process.env){return{ok:!0,provider:"keeper-mirror",enabled:q5(e),exec:!1,execution:"read-only",note:"Alert-mirror only. Off by default. No execute function exists."}}var H5=/^0x[0-9a-fA-F]{8}$/,J1=/^0x[0-9a-fA-F]{40}$/;function X1(e={}){let t=Number(e.chainId);if(!Number.isSafeInteger(t)||t<=0)throw new Error("erc7715: chainId required");let n=String(e.account||"");if(!J1.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(!J1.test(c))throw new Error("erc7715: target must be an address");for(let c of o)if(!H5.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 rh=/^0x[0-9a-fA-F]{40}$/;function Q1(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(!rh.test(n)||!rh.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||!rh.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 o_=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 n_(){return Object.freeze({tier:"ROUTE_ONLY",custody:"user",routeOnly:!0,fees:Object.freeze({oracle:"0",currency:"none"}),actions:Zm,adapters:Object.freeze(ef.adapters.map(e=>{let t=o_[e.id];return Object.freeze({...e,actions:Object.freeze(e.actions.filter(n=>t.operations[n])),surface:t})}))})}function oq(e,t={}){let n=lE(e,t),r=o_[n.adapterId],o=r?.operations[n.intent.action];if(!o)throw new ye(`adapter lacks ${n.intent.action}`,"unsupported-operation");return Object.freeze({...n,surface:Object.freeze({provider:r.provider,operation:o})})}var oh=new Map;function Tl(e={}){let t=e.filePath||void 0,n=t||"__default__";return oh.has(n)||oh.set(n,Nb(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),oh.get(n)}var ih=new Map;function ah(e={}){let t=e.filePath||void 0,n=t||"__default__";return ih.has(n)||ih.set(n,$b(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),ih.get(n)}var sh=new Map;function Oa(e={}){let t=e.filePath||void 0,n=t||"__default__";return sh.has(n)||sh.set(n,Ib(t?{filePath:t,clock:e.clock,idFactory:e.idFactory}:{clock:e.clock,idFactory:e.idFactory})),sh.get(n)}var iq={"hl-info":{health:e=>Cg(e),allMids:e=>tn(e),l2Book:(e,t={})=>zr(t.coin,e),outcomeMeta:e=>hi(e),clearinghouse:(e,t={})=>xs(t.user,e),userFills:(e,t={})=>Og(t.user,e),meta:e=>Ss(e),metaAndAssetCtxs:e=>bt(e),candleSnapshot:(e,t={})=>Vr(t,e),openOrders:(e,t={})=>Rg(t.user,e),frontendOpenOrders:(e,t={})=>Lg(t.user,e),userState:(e,t={})=>Wr(t.user,e),spotMeta:e=>vs(e)},"hl-vaults":{health:e=>Mg(e),summaries:(e,t={})=>Ju(t,e),details:(e,t={})=>Es(t,e),userEquities:(e,t={})=>Xu(t,e),tracker:(e,t={})=>Qu(t,e)},"hl-precompiles":{health:e=>Ug(e),read:(e,t={})=>Fg(t,e),l1BlockNumber:e=>As(e),markPx:(e,t={})=>td(t,e),oraclePx:(e,t={})=>nd(t,e),spotPx:(e,t={})=>rd(t,e),position:(e,t={})=>od(t,e),spotBalance:(e,t={})=>id(t,e),vaultEquity:(e,t={})=>ad(t,e),withdrawable:(e,t={})=>sd(t,e)},"hl-delta-neutral":{health:()=>cy(),scan:(e,t={})=>_d(t,e),quote:(e,t={})=>Pd(t,e),prepare:(e,t={})=>Td(t,e),loop:(e,t={})=>hy(t,e)},"lighter-delta-neutral":{health:()=>ky(),scan:(e,t={})=>Cd(t,e),quote:(e,t={})=>Od(t,e),prepare:(e,t={})=>Rd(t,e),loop:(e,t={})=>Ny(t,e)},"poly-public":{health:e=>Oy(e),time:e=>Ld(e),markets:(e,t={})=>Ry(t,e),book:(e,t={})=>Ly(t.tokenId,e),midpoint:(e,t={})=>$y(t.tokenId,e),spread:(e,t={})=>By(t.tokenId,e),price:(e,t={})=>My(t.tokenId,{side:t.side},e),events:(e,t={})=>Fy(t,e)},"evm-rpc":{health:(e,t={})=>Mr(t.chainId??1,e),healthAll:(e,t={})=>su({...e,chainIds:t.chainIds}),blockNumber:(e,t={})=>Yo(t.chainId??1,e),chainId:(e,t={})=>ou(t.chainId??1,e),getBalance:(e,t={})=>nr(t.chainId??1,t.address,e),call:(e,t={})=>V(t.chainId??1,t.method,t.params||[],e),erc20Allowance:(e,t={})=>au(t,e),erc20Balance:(e,t={})=>Jo(t,e),transactionReceipt:(e,t={})=>Xo(t,e)},portfolio:{health:e=>rv(e),balances:(e,t={})=>Xc(t,e),snapshot:(e,t={})=>kv(t,e),history:(e,t={})=>Mm(t,e),valueGraph:(e,t={})=>vv(t,e)},"nft-portfolio":{health:e=>uv(e),inventory:(e,t={})=>Eo(t,e),gallery:(e,t={})=>fv(t,e),pnl:(e,t={})=>mv(t,e),prepareList:(e,t={})=>dv(t,e),traitSnipe:(e,t={})=>pv(t,e)},"contract-risk":{health:e=>Ev(e),scan:(e,t={})=>Er(t,e)},"evm-token-sniper":{health:e=>_v(e),scan:(e,t={})=>Iv(t,e)},"evm-simulate":{health:e=>Tv(e),simulate:(e,t={})=>wa(t,e)},"nft-mint":{health:e=>Cv(e),discover:(e,t={})=>rl(t,e),prepare:(e,t={})=>Dm(t,e),priceGas:(e,t={})=>nl(t,e),createTrigger:(e,t={})=>TE(t,e),checkOpen:(e,t={})=>NE(t,e),evaluateMancerOs:(e,t={})=>RE(t,e)},"universal-mint-router":{health:()=>nE(),capabilities:()=>Xm(),prepare:(e,t={})=>rE(t,e)},"universal-nft-lifecycle":{health:()=>({provider:"universal-nft-lifecycle",status:"ok",prepareOnly:!1,routeOnly:!0,capabilities:n_()}),capabilities:()=>n_(),route:(e,t={})=>oq(t,e)},"erc8004-identity":{health:()=>Ex(),prepareIdentityRegistration:(e,t={})=>_x(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),prepareAgentURIUpdate:(e,t={})=>Px(t,{nowMs:e?.nowMs,expiresAtMs:e?.expiresAtMs}),inspectIdentity:(e,t={})=>Nx(t,e)},"universal-evm-nft-transfer":{health:()=>({provider:cl,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>pE(t,e)},"universal-solana-nft-transfer":{health:()=>({provider:ll,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>yE(t,e)},"universal-ordinals-transfer":{health:()=>({provider:ul,status:"ok",prepareOnly:!0}),prepare:(e,t={})=>PE(t,e)},"solana-rpc":{health:e=>Dy(e),latestBlockhash:(e,t={})=>Bd(t,e),getBalance:(e,t={})=>$s(t,e),tokenAccounts:(e,t={})=>Ti(t,e),simulate:(e,t={})=>qy(t,e)},"bitcoin-esplora":{health:e=>Hy(e),tipHeight:e=>jy(e),fees:e=>zy(e),address:(e,t={})=>Ms(t,e),utxos:(e,t={})=>Vy(t,e),tx:(e,t={})=>Wy(t,e),decode:(e,t={})=>Gy(t,e)},"bitcoin-meta":{health:e=>Yy(e),runeBalances:(e,t={})=>Us(t,e),inscriptions:(e,t={})=>eo(t,e),inscriptionInfo:(e,t={})=>Jy(t,e),inscriptionChildren:(e,t={})=>Xy(t,e),ordBlockInfo:(e,t={})=>Qy(t,e)},satflow:{health:e=>ew(e),collectionFloors:(e,t={})=>tw(t,e),collectionStats:(e,t={})=>nw(t,e),item:(e,t={})=>rw(t,e),walletContents:(e,t={})=>qs(t,e),floorListings:(e,t={})=>ow(t,e),preparePurchase:(e,t={})=>aw(t,e),prepareList:(e,t={})=>Hs(t,e)},jupiter:{health:e=>fw(e),venues:(e,t={})=>mw(t,e),quote:(e,t={})=>Vs(t,e),prepare:(e,t={})=>hw(t,e)},defillama:{health:e=>yw(e),prices:(e,t={})=>Ot(t.coins||[],e),pricesBySymbol:(e,t={})=>xw(t.symbols,e),protocols:e=>Gd(e),yields:(e,t={})=>ww(t,e),stablecoins:(e,t={})=>Ws(t,e),dexVolumes:(e,t={})=>bw(t,e)},lifi:{health:e=>Xd(e),quote:(e,t={})=>On(t,e),prepare:(e,t={})=>Qd(t,e),chains:e=>Zd(e)},dexscreener:{health:e=>_0(e),token:(e,t={})=>rr(t.address||t.tokenAddress,e),search:(e,t={})=>Qo(t.q||t.query,e),pair:(e,t={})=>P0(t.chainId,t.pairAddress,e)},"uniswap-v3":{health:(e,t={})=>bu({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Zt(t,e),prepare:(e,t={})=>wu(t,e),quotePath:(e,t={})=>yu(t,e),ethUsdc:(e,t={})=>rs(t,e),chains:()=>xu()},"uniswap-v4":{health:(e,t={})=>Ou({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Sn(t,e),inspectHook:(e,t={})=>Pu(t,e),prepare:(e,t={})=>Nu(t,e),chains:()=>Cu()},x402:{health:()=>sb(),inspect:(e,t={})=>ib(t),prepare:(e,t={})=>ab(t,e)},bankr:{health:e=>mb(e),wallet:e=>xp(e),portfolio:e=>db(e),swapQuote:(e,t={})=>pb(t,e)},aerodrome:{health:(e,t={})=>Nw({...e,chainId:t.chainId??8453}),quote:(e,t={})=>Ks(t,e),prepare:(e,t={})=>Tw(t,e),chains:()=>Cw()},zerox:{health:e=>tp(e),price:(e,t={})=>Js(t,e),quote:(e,t={})=>Ln(t,e),prepare:(e,t={})=>np(t,e)},across:{health:e=>Bw(e),suggestedFees:(e,t={})=>op(t,e)},hop:{health:e=>Mw(e),quote:(e,t={})=>ip(t,e)},relay:{health:e=>Fw(e),quote:(e,t={})=>Xs(t,e),prepare:(e,t={})=>Uw(t,e)},cowswap:{health:e=>up(e),quote:(e,t={})=>cn(t,e),prepareOrder:(e,t={})=>dp(t,e),order:(e,t={})=>sc(t,e),status:(e,t={})=>ac(t,e),chains:()=>mp()},oneinch:{health:e=>Zw(e),quote:(e,t={})=>Fi(t,e),prepare:(e,t={})=>eb(t,e),approveSpender:(e,t={})=>yp(t,e)},"hl-ws":{health:e=>fb(e),allMids:e=>hb(e),l2Book:(e,t={})=>gb(t.coin,e),snapshot:(e,t={})=>Di(t.subscription||t,e)},"poly-ws":{health:(e,t={})=>yb({...e,assetId:t.assetId}),book:(e,t={})=>wb(t.assetId||t.tokenId,e),snapshot:(e,t={})=>cc(t.assetIds||t.assets_ids||[t.assetId],e)},"opensea-nft":{health:e=>ag(e),collection:(e,t={})=>si(t.slug,e),floor:(e,t={})=>sg(t.slug,e),bestListings:(e,t={})=>Fu(t,e),bestListing:(e,t={})=>ds(t,e),bestOffer:(e,t={})=>ps(t,e),accountNfts:(e,t={})=>ci(t,e),accountPnl:(e,t={})=>ls(t,e),prepareBuy:(e,t={})=>bg(t,e),prepareSweep:(e,t={})=>xg(t,e),prepareMint:(e,t={})=>fs(t,e),prepareList:(e,t={})=>hs(t,e),prepareCancel:(e,t={})=>Sg(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={})=>Oa(e).createListing(t),listListings:(e,t={})=>Oa(e).listListings(t),cancelListing:(e,t={})=>Oa(e).cancelListing(t),createOffer:(e,t={})=>Oa(e).createOffer(t),armFill:(e,t={})=>Oa(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={})=>Tl(e).createIntent(t),listIntents:(e,t={})=>Tl(e).listIntents(t),cancelIntent:(e,t={})=>Tl(e).cancelIntent(t),armPayment:(e,t={})=>Tl(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={})=>ah(e).registerPack(t),listPacks:(e,t={})=>ah(e).listPacks(t),revokePack:(e,t={})=>ah(e).revokePack(t)},"anvil-nft":{health:(e,t={})=>bx(t,e),markets:(e,t={})=>so(t,e),quoteSpecificBuy:(e,t={})=>Ki(t,e),quoteSell:(e,t={})=>wc(t,e),scanCollection:(e,t={})=>bc(t,e),scanAllMarkets:(e,t={})=>dx(t,e),scanCrossVenueArb:(e,t={})=>Dp(t,e),scanAllMarketsArb:(e,t={})=>px(t,e),prepareSpecificBuy:(e,t={})=>ox(t,e),prepareSell:(e,t={})=>ix(t,e)},stonkbrokers:{health:(e,t={})=>xx(t,e),quoteBrokerBuy:(e,t={})=>xc(t,e),scanBrokerLoot:(e,t={})=>hx(t,e),prepareBrokerBuy:(e,t={})=>gx(t,e),brokerDesk:(e,t={})=>wx(t,e),clockInStatus:(e,t={})=>Yi(t,e),prepareClockIn:(e,t={})=>yx(t,e)},"hl-outcome":{list:e=>kS(e),prepareOrder:(e,t={})=>vS(t,e),prepareCancel:(e,t={})=>ES(t,e)},"protocol-templates":{health:()=>({ok:!0,templates:Dc().map(e=>e.id),nativeTemplates:ua().map(e=>e.id),families:["evm","solana","bitcoin"],firmAudit:!1}),list:()=>Dc(),listNative:()=>ua(),gate:(e,t={})=>ca(t.templateId||t.id,e),prepareDeploy:(e,t={})=>ZS(t,e),buildNative:(e,t={})=>da(t),eval:async()=>(await Promise.resolve().then(()=>(t_(),e_))).runContractsEval()},"poly-clob":{health:()=>FS(),prepareOrder:(e,t={})=>US(t||{},e)},"hl-perps":{health:e=>tm(e),assetInfo:(e,t={})=>Pn(t,e),prepareOrder:(e,t={})=>Jr(t,e),prepareCancel:(e,t={})=>Ai(t,e),prepareLeverage:(e,t={})=>vd(t,e),prepareIsolatedMargin:(e,t={})=>Ed(t,e),prepareBracket:(e,t={})=>Ad(t,e),prepareBuilderApproval:(e,t={})=>kd(t,e)},"hl-markets":{health:e=>tm(e),markets:(e,t={})=>Ic(t,e),leaderboards:(e,t={})=>Jx(t,e),coin:(e,t={})=>Xx(t,e),spot:(e,t={})=>Qx(t,e)},"hl-entry-state":{health:e=>wS(e),see:(e,t={})=>ra(t,e),qualify:(e,t={})=>bS(t,e),lock:(e,t={})=>xS(t,e),list:e=>om(e),watch:(e,t={})=>SS(t,e)},"magiceden-sol":{health:e=>Bx(e),stats:(e,t={})=>Gp(t,e),listings:(e,t={})=>Fx(t,e),tokenListings:(e,t={})=>Ux(t,e),prepareBuy:(e,t={})=>Dx(t,e),prepareList:(e,t={})=>Ec(t,e),prepareMint:(e,t={})=>qx(t,e)},"hl-staking":{health:e=>jx(e),validators:e=>Jp(e),delegatorSummary:(e,t={})=>Xp(t,e),delegations:(e,t={})=>Qp(t,e),rewards:(e,t={})=>zx(t,e),history:(e,t={})=>Vx(t,e),preflight:(e,t={})=>Yx(t,e),prepareStakeDeposit:(e,t={})=>Wx(t,e),prepareStakeWithdraw:(e,t={})=>Gx(t,e),prepareDelegate:(e,t={})=>Kx(t,e)},"hyperevm-dex":{health:e=>Ox(e),search:(e,t={})=>Rx(t.q||t.query||"HYPE",e),token:(e,t={})=>Lx(t.address||t.tokenAddress,e)},geckoterminal:{health:e=>uk(e),networks:(e,t={})=>mm(t,e),pool:(e,t={})=>sk(t,e),token:(e,t={})=>ck(t,e),ohlcv:(e,t={})=>lk(t,e)},curve:{health:e=>vk(e),openapi:e=>kk(e),pools:(e,t={})=>hm(t,e),quote:(e,t={})=>gm(t,e),prepare:(e,t={})=>Ek(t,e)},gmx:{health:e=>lS(e),tickers:(e,t={})=>wo(t,e),markets:(e,t={})=>sS(t,e),marketsInfo:(e,t={})=>rm(t,e),tokens:(e,t={})=>cS(t,e),prepareOrder:(e,t={})=>mS(t,e),positions:(e,t={})=>uS(t,e),orderStatus:(e,t={})=>dS(t,e),verifyOrder:(e,t={})=>pS(t,e)},morpho:{health:e=>Pk(e),markets:(e,t={})=>_k(t,e),vaults:(e,t={})=>bm(t,e),prepareVault:(e,t={})=>Tk(t,e)},balancer:{health:e=>Mk(e),pools:(e,t={})=>Bk(t,e),quote:(e,t={})=>km(t,e),prepare:(e,t={})=>Fk(t,e)},pendle:{health:e=>Dk(e),markets:(e,t={})=>Em(t,e),quote:(e,t={})=>qk(t,e),prepare:(e,t={})=>Am(t,e)},odos:{health:e=>Vk(e),chains:e=>_m(e),quote:(e,t={})=>jk(t,e),prepare:(e,t={})=>zk(t,e)},blockscout:{health:e=>Zk(e),stats:(e,t={})=>Nm(t,e),address:(e,t={})=>Yk(t,e),token:(e,t={})=>Jk(t,e)},paraswap:{health:e=>af(e),tokens:(e,t={})=>dl(t,e),price:(e,t={})=>gn(t,e),quote:(e,t={})=>gn(t,e),prepare:(e,t={})=>of(t,e)},rfq:{health:e=>KE(e),intent:(e,t={})=>WE(t,e),quote:(e,t={})=>GE(t,e)},"polygon-staking":{health:e=>kA(e),validators:(e,t={})=>xA(t,e),validatorDetail:(e,t={})=>SA(t,e)},"aave-v3":{health:e=>IA(e),markets:(e,t={})=>vA(t,e),marketReserves:(e,t={})=>EA(t,e),chains:e=>AA(e)},"babylon-staking":{health:e=>PA(e),stats:e=>TA(e),finalityProviders:e=>NA(e),delegations:(e,t={})=>CA(t,e)},"bisq-markets":{health:e=>RA(e),markets:e=>LA(e),ticker:(e,t={})=>$A(t,e),trades:(e,t={})=>BA(t,e)},"bob-rootstock":{health:(e,t={})=>FA(t.chainId,e),stats:(e,t={})=>kf(t,e),addressInfo:(e,t={})=>UA(t,e),tokenBalances:(e,t={})=>DA(t,e)},"braiins-insights":{health:e=>qA(e),priceStats:e=>HA(e),poolStats:e=>jA(e)},"cow-protocol":{health:e=>XA(e),auction:e=>KA(e),openOrders:(e,t={})=>YA(t,e),recentTrades:(e,t={})=>JA(t,e)},"hiro-stacks":{health:e=>QA(e),networkInfo:e=>ZA(e),stackingInfo:e=>eI(e),poxCycles:e=>tI(e),blocks:(e,t={})=>nI(t,e)},"jito-mev":{health:e=>iI(e),recentBundles:(e,t={})=>aI(t,e),tipFloor:e=>sI(e)},"kamino-strategies":{health:e=>lI(e),strategies:(e,t={})=>uI(t,e),strategyMetrics:(e,t={})=>dI(t,e)},"liquid-esplora":{health:e=>hI(e),tipHeight:e=>gI(e),addressInfo:(e,t={})=>yI(t,e),assetInfo:(e,t={})=>wI(t,e)},"magiceden-ordinals":{health:e=>SI(e),collectionStat:(e,t={})=>kI(t,e)},"mempool-lightning":{health:e=>EI(e),statistics:e=>AI(e),nodeRankings:(e,t={})=>II(t,e),nodeCountries:e=>_I(e)},"mempool-mining":{health:e=>NI(e),difficulty:e=>CI(e),poolShare:(e,t={})=>OI(t,e),hashrate:(e,t={})=>RI(t,e),rewardStats:(e,t={})=>LI(t,e)},"meteora-dlmm":{health:e=>MI(e),pools:(e,t={})=>FI(t,e),poolSearch:(e,t={})=>UI(t,e)},"ordinals-runes":{health:e=>qI(e),blockHeight:e=>HI(e),blockInfo:(e,t={})=>jI(t,e),satInfo:(e,t={})=>zI(t,e),runeInfo:(e,t={})=>VI(t,e)},"pyth-price-feeds":{health:e=>KI(e),latestPrice:(e,t={})=>YI(t,e),latestPrices:(e,t={})=>JI(t,e),feedDirectory:e=>XI(e)},"relayscan-mev":{health:e=>n1(e),overview:(e,t={})=>Uf(t,e),builderProfit:(e,t={})=>e1(t,e),dailyStats:(e,t={})=>t1(t,e)},"sanctum-lst":{health:e=>o1(e),lstList:e=>qf(e),apyAll:e=>i1(e),apyIndividual:(e,t={})=>a1(t,e)},"solend-lending":{health:e=>u1(e),markets:e=>jf(e),reserves:(e,t={})=>d1(t,e)},"execution-strategies":{health:()=>m1(),plan:(e,t={})=>p1(t)},"across-bridge":{health:e=>YE(e),pools:(e,t={})=>JE(t,e),suggestedFees:(e,t={})=>XE(t,e)},"beefy-yields":{health:e=>QE(e),apy:(e,t={})=>ZE(t,e),apyBreakdown:e=>eA(e)},"birdeye-tokens":{health:e=>nA(e),tokenList:(e,t={})=>rA(t,e)},"celestia-da":{health:e=>oA(e),stats:e=>iA(e),blockStats:(e,t={})=>aA(t,e)},"das-assets":{health:e=>sA(e),assetsByOwner:(e,t={})=>cA(t,e),searchAssets:(e,t={})=>lA(t,e),assetProof:(e,t={})=>uA(t,e)},"l2beat-tvl":{health:e=>dA(e),tvl:(e,t={})=>pA(t,e),activity:(e,t={})=>mA(t,e)},"spark-lend":{health:e=>fA(e),markets:(e,t={})=>hA(t,e)},"symbiotic-restaking":{health:e=>gA(e),vaults:(e,t={})=>yA(t,e),vaultDetail:(e,t={})=>wA(t,e)},"limit-order":{health:()=>g1(),prepare:(e,t={})=>w1(t,e),arm:(e,t={})=>b1(t,e)},"jupiter-dca":{health:()=>x1(),prepare:(e,t={})=>v1(t,e),arm:(e,t={})=>E1(t,e)},"protective-monitors":{health:()=>T1(),depeg:(e,t={})=>Jf(t,e),oracleDeviation:(e,t={})=>Xf(t,e),exploitFeed:(e,t={})=>Qf(t,e),goplus:(e,t={})=>Zf(t,e),liquidationLadder:(e,t={})=>eh(t,e)},"funding-scanner":{health:()=>R1(),scan:(e,t={})=>L1(t,e)},"onchain-options":{health:()=>Il(),rank:(e,t={})=>_l(t.listings||t,t)},"holder-clusters":{health:()=>B1(),score:(e,t={})=>M1(t)},kalshi:{health:()=>F1(),markets:(e,t={})=>U1(t)},"derive-options":{health:()=>D1(),rank:(e,t={})=>q1(t.listings||t,t)},limitless:{health:()=>H1(),markets:(e,t={})=>j1(t)},"dov-vaults":{health:()=>z1(),read:(e,t={})=>V1(t)},"prediction-match":{health:()=>({ok:!0,provider:"prediction-match",execution:"read-only",exec:!1}),match:(e,t={})=>W1(t.left||{},t.right||{})},"tee-attestation":{health:()=>G1(),verify:(e,t={})=>K1(t)},"keeper-mirror":{health:e=>Y1(e?.env)},"erc7715-permissions":{health:()=>({ok:!0,provider:"erc7715-permissions",execution:"read-only",exec:!1}),normalize:(e,t={})=>X1(t)},"erc7710-delegation":{health:()=>({ok:!0,provider:"erc7710-delegation",execution:"read-only",exec:!1}),inspect:(e,t={})=>Q1(t)}},r_=new Set(["prepareIdentityRegistration","prepareAgentURIUpdate","prepareBuilderApproval","prepareBracket","prepareIsolatedMargin","prepareLeverage","prepareCancel","prepareOrder","preparePurchase","prepareList","prepareSell","prepareBuy","prepareMint","prepare","prepareStakeDeposit","prepareStakeWithdraw","prepareDelegate","prepareSwap","prepareTransfer","createOrder","cancelOrder"]),i_=new Set(["hl-exec"]);function ch(e){return i_.has(String(e||""))}function aq(e,t,n={}){let r=String(t||""),o=`${e}.${r}`;if(i_.has(e))throw new Error(`data plane forbidden execution provider: ${e}`);let i=bs().find(a=>a.id===e);if(/sign|execute|broadcast|submit|send|write|place/i.test(r)&&!r_.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(r_.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 T(e,t,n={},r={}){if(ch(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.`);aq(e,t,n);let o=fi(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=iq[e];if(!i||typeof i[t]!="function")throw new Error(`No client implementation for ${e}.${t}`);return i[t](r,n)}async function lh({providers:e,fetchImpl:t,timeoutMs:n,includeRpc:r,includeWs:o,concurrency:i,healthCall:a}={}){let s=e||bs().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)=>T(d,"health",p,m),u={};return await ot(s,i??8,async d=>{if(!fi(d)){u[d]={ok:!1,ms:0,reason:"transport",error:"unknown provider"};return}let p=d==="evm-rpc"?{chainId:1}:{},m=await $e(()=>l(d,p,c));if(!m.ok){u[d]={ok:!1,ms:m.ms,reason:"transport",error:m.error};return}let f=m.data;if(f&&typeof f=="object"&&f.ok===!1){u[d]={ok:!1,ms:m.ms,reason:"provider",error:f.error||f.message||"provider reported unhealthy",detail:f};return}u[d]={ok:!0,ms:m.ms,detail:f}}),{when:new Date().toISOString(),plane:"data",exec:"local-signer",providers:u}}function a_(e){return Array.isArray(e.localSignerSurfaces)?e.localSignerSurfaces:[]}function sq(e){return e.execution==="prepare"&&a_(e).length?"armed-local":e.execution||"read-only"}function Nl(){return bs().map(e=>({id:e.id,venue:e.venue,chainIds:e.chainIds,auth:e.auth,ops:e.ops,execution:sq(e),localSignerSurfaces:a_(e),description:e.description}))}var s_={catalog:Nl,health:lh,call:T,hl:{health:e=>T("hl-info","health",{},e),allMids:e=>T("hl-info","allMids",{},e),l2Book:(e,t)=>T("hl-info","l2Book",{coin:e},t),outcomeMeta:e=>T("hl-info","outcomeMeta",{},e),clearinghouse:(e,t)=>T("hl-info","clearinghouse",{user:e},t),userFills:(e,t)=>T("hl-info","userFills",{user:e},t),meta:e=>T("hl-info","meta",{},e),metaAndAssetCtxs:e=>T("hl-info","metaAndAssetCtxs",{},e),candleSnapshot:(e,t)=>T("hl-info","candleSnapshot",e||{},t),openOrders:(e,t)=>T("hl-info","openOrders",{user:e},t),userState:(e,t)=>T("hl-info","userState",{user:e},t),spotMeta:e=>T("hl-info","spotMeta",{},e),vaults:{health:e=>T("hl-vaults","health",{},e),summaries:(e,t)=>T("hl-vaults","summaries",e||{},t),details:(e,t)=>T("hl-vaults","details",e||{},t),mine:(e,t)=>T("hl-vaults","userEquities",{user:e},t),track:(e,t)=>T("hl-vaults","tracker",e||{},t)},entryState:{see:(e,t)=>T("hl-entry-state","see",e||{},t),qualify:(e,t)=>T("hl-entry-state","qualify",e||{},t),lock:(e,t)=>T("hl-entry-state","lock",e||{},t),list:e=>T("hl-entry-state","list",{},e),watch:(e,t)=>T("hl-entry-state","watch",e||{},t)},staking:{health:e=>T("hl-staking","health",{},e),validators:e=>T("hl-staking","validators",{},e),summary:(e,t)=>T("hl-staking","delegatorSummary",{user:e},t),delegations:(e,t)=>T("hl-staking","delegations",{user:e},t),rewards:(e,t)=>T("hl-staking","rewards",{user:e},t),history:(e,t)=>T("hl-staking","history",{user:e},t),preflight:(e,t)=>T("hl-staking","preflight",{user:e},t),prepareStake:(e,t)=>T("hl-staking","prepareStakeDeposit",e||{},t),prepareUnstake:(e,t)=>T("hl-staking","prepareStakeWithdraw",e||{},t),prepareDelegate:(e,t)=>T("hl-staking","prepareDelegate",e||{},t)}},poly:{health:e=>T("poly-public","health",{},e),time:e=>T("poly-public","time",{},e),markets:(e,t)=>T("poly-public","markets",e||{},t),book:(e,t)=>T("poly-public","book",{tokenId:e},t),midpoint:(e,t)=>T("poly-public","midpoint",{tokenId:e},t),spread:(e,t)=>T("poly-public","spread",{tokenId:e},t),price:(e,t,n)=>T("poly-public","price",{tokenId:e,side:t},n),events:(e,t)=>T("poly-public","events",e||{},t)},polyClob:{prepareOrder:(e,t)=>T("poly-clob","prepareOrder",e||{},t)},rpc:{health:(e,t)=>T("evm-rpc","health",{chainId:e},t),healthAll:(e,t)=>T("evm-rpc","healthAll",e||{},t),blockNumber:(e,t)=>T("evm-rpc","blockNumber",{chainId:e},t),getBalance:(e,t,n)=>T("evm-rpc","getBalance",{chainId:e,address:t},n),call:(e,t,n,r)=>T("evm-rpc","call",{chainId:e,method:t,params:n},r)},evmSniper:{health:e=>T("evm-token-sniper","health",{},e),scan:(e,t)=>T("evm-token-sniper","scan",e||{},t)},portfolio:{balance:(e,t)=>T("portfolio","balances",e||{},t),snapshot:(e,t)=>T("portfolio","snapshot",e||{},t),history:(e,t)=>T("portfolio","history",e||{},t),valueGraph:(e,t)=>T("portfolio","valueGraph",e||{},t)},nft:{inventory:(e,t)=>T("nft-portfolio","inventory",e||{},t),gallery:(e,t)=>T("nft-portfolio","gallery",e||{},t),pnl:(e,t)=>T("nft-portfolio","pnl",e||{},t),prepareList:(e,t)=>T("nft-portfolio","prepareList",e||{},t),traitSnipe:(e,t)=>T("nft-portfolio","traitSnipe",e||{},t),floor:(e,t)=>T("opensea-nft","floor",{slug:e},t),collection:(e,t)=>T("opensea-nft","collection",{slug:e},t),bestListings:(e,t)=>T("opensea-nft","bestListings",e||{},t),prepareBuy:(e,t)=>T("opensea-nft","prepareBuy",e||{},t),prepareSweep:(e,t)=>T("opensea-nft","prepareSweep",e||{},t),prepareMint:(e,t)=>T("opensea-nft","prepareMint",e||{},t),prepareCancel:(e,t)=>T("opensea-nft","prepareCancel",e||{},t),lifecycle:{capabilities:e=>T("universal-nft-lifecycle","capabilities",{},e),route:(e,t)=>T("universal-nft-lifecycle","route",e||{},t)},mint:{health:e=>T("universal-mint-router","health",{},e),capabilities:e=>T("universal-mint-router","capabilities",{},e),prepare:(e,t)=>T("universal-mint-router","prepare",e||{},t)},send:{evm:(e,t)=>T("universal-evm-nft-transfer","prepare",e||{},t),solana:(e,t)=>T("universal-solana-nft-transfer","prepare",e||{},t),ordinals:(e,t)=>T("universal-ordinals-transfer","prepare",e||{},t)}},solana:{health:e=>T("solana-rpc","health",{},e),latestBlockhash:(e,t)=>T("solana-rpc","latestBlockhash",e||{},t),balance:(e,t)=>T("solana-rpc","getBalance",{address:e},t),tokenAccounts:(e,t)=>T("solana-rpc","tokenAccounts",e||{},t),simulate:(e,t)=>T("solana-rpc","simulate",e||{},t),jupiterQuote:(e,t)=>T("jupiter","quote",e||{},t),jupiterPrepare:(e,t)=>T("jupiter","prepare",e||{},t),nftStats:(e,t)=>T("magiceden-sol","stats",e||{},t),nftListings:(e,t)=>T("magiceden-sol","listings",e||{},t),nftTokenListings:(e,t)=>T("magiceden-sol","tokenListings",e||{},t),nftPrepareBuy:(e,t)=>T("magiceden-sol","prepareBuy",e||{},t),nftPrepareList:(e,t)=>T("magiceden-sol","prepareList",e||{},t),nftPrepareMint:(e,t)=>T("magiceden-sol","prepareMint",e||{},t)},bitcoin:{health:e=>T("bitcoin-esplora","health",{},e),tipHeight:e=>T("bitcoin-esplora","tipHeight",{},e),fees:e=>T("bitcoin-esplora","fees",{},e),address:(e,t)=>T("bitcoin-esplora","address",{address:e},t),utxos:(e,t)=>T("bitcoin-esplora","utxos",{address:e},t),tx:(e,t)=>T("bitcoin-esplora","tx",{txid:e},t),decode:(e,t)=>T("bitcoin-esplora","decode",e||{},t),metaHealth:e=>T("bitcoin-meta","health",{},e),runeBalances:(e,t)=>T("bitcoin-meta","runeBalances",{address:e},t),inscriptions:(e,t)=>T("bitcoin-meta","inscriptions",{address:e},t),satflowHealth:e=>T("satflow","health",{},e),satflowFloors:(e,t)=>T("satflow","collectionFloors",e||{},t),satflowWallet:(e,t)=>T("satflow","walletContents",{address:e},t)},prices:{health:e=>T("defillama","health",{},e),current:(e,t)=>T("defillama","prices",{coins:e},t),bySymbol:(e,t)=>T("defillama","pricesBySymbol",{symbols:e},t),protocols:e=>T("defillama","protocols",{},e)},lifi:{health:e=>T("lifi","health",{},e),quote:(e,t)=>T("lifi","quote",e||{},t),chains:e=>T("lifi","chains",{},e)},dex:{health:e=>T("dexscreener","health",{},e),token:(e,t)=>T("dexscreener","token",{address:e},t),search:(e,t)=>T("dexscreener","search",{q:e},t),pair:(e,t,n)=>T("dexscreener","pair",{chainId:e,pairAddress:t},n)},uni:{health:(e,t)=>T("uniswap-v3","health",e||{},t),quote:(e,t)=>T("uniswap-v3","quote",e||{},t),quotePath:(e,t)=>T("uniswap-v3","quotePath",e||{},t),ethUsdc:(e,t)=>T("uniswap-v3","ethUsdc",e||{},t),chains:e=>T("uniswap-v3","chains",{},e)},univ4:{health:(e,t)=>T("uniswap-v4","health",e||{},t),quote:(e,t)=>T("uniswap-v4","quote",e||{},t),inspectHook:(e,t)=>T("uniswap-v4","inspectHook",e||{},t),prepare:(e,t)=>T("uniswap-v4","prepare",e||{},t),chains:e=>T("uniswap-v4","chains",{},e)},x402:{inspect:(e,t)=>T("x402","inspect",e||{},t),prepare:(e,t)=>T("x402","prepare",e||{},t)},bankr:{wallet:e=>T("bankr","wallet",{},e),portfolio:e=>T("bankr","portfolio",{},e),swapQuote:(e,t)=>T("bankr","swapQuote",e||{},t)},bridges:{across:(e,t)=>T("across","suggestedFees",e||{},t),hop:(e,t)=>T("hop","quote",e||{},t),relay:(e,t)=>T("relay","quote",e||{},t)},cow:{quote:(e,t)=>T("cowswap","quote",e||{},t)},hlWs:{allMids:e=>T("hl-ws","allMids",{},e),l2Book:(e,t)=>T("hl-ws","l2Book",{coin:e},t)},polyWs:{book:(e,t)=>T("poly-ws","book",{assetId:e},t)}};import{homedir as uh}from"node:os";import{join as dh}from"node:path";var c_=process.env.ORACLE_PUBLIC_DESKTOP==="1",cq=c_?process.env.ORACLE_CONFIG_DIR||dh(uh(),".config","oracle"):dh(uh(),".config","oracle"),bK=c_?cq:dh(uh(),".config","mad-desk");function Ra(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}function ph(e,t,n=!1){return String(Ra(e,t,n?"1":"")).trim()==="1"}function mh(e,t){return String(Ra(e,t,""))}$c();var wn=Object.freeze({FULL:"FULL",NO_GAS:"NO_GAS",FAILED:"FAILED"}),u_={1:"coingecko:ethereum",10:"coingecko:ethereum",56:"coingecko:binancecoin",137:"coingecko:matic-network",8453:"coingecko:ethereum",42161:"coingecko:ethereum",43114:"coingecko:avalanche-2",999:"coingecko:ethereum"},La=e=>{try{return e==null||e===""?null:BigInt(String(e).split(".")[0])}catch{return null}};function l_(e){let{source:t,amountOut:n,minOut:r=null,gasUsd:o=null,feeUsd:i=null,oracleFeeBps:a=0,estimatedGas:s=null,liquidityUsd:c=null,error:l=null,executionReady:u=!1,meta:d={}}=e||{};if(l||n==null)return{source:t,quality:wn.FAILED,amountOut:null,error:l||"no amountOut returned"};let p=La(n);if(p==null||p<=0n)return{source:t,quality:wn.FAILED,amountOut:null,error:"non-positive amountOut"};let m=Number(a);return{source:t,quality:o==null?wn.NO_GAS:wn.FULL,amountOut:p.toString(),minOut:La(r)?.toString()??null,gasUsd:o,feeUsd:i,oracleFeeBps:Number.isFinite(m)&&m>0?Math.floor(m):0,estimatedGas:s==null?null:String(s),liquidityUsd:c==null?null:Number(c),executionReady:u,meta:d}}async function d_(e,t,{divisor:n=1000n}={}){let r=La(t);if(r==null||r<=0n)return null;let o=r/n>0n?r/n:1n;if(o>=r)return null;let i,a;try{[i,a]=await Promise.all([e(o),e(r)])}catch{return null}let s=La(i),c=La(a);if(s==null||c==null||s<=0n)return null;let l=Number(s)/Number(o),u=Number(c)/Number(r);return!Number.isFinite(l)||!Number.isFinite(u)||l<=0?null:{impactPct:(1-u/l)*100,probeAmountIn:o.toString(),probeAmountOut:s.toString(),fullAmountOut:c.toString()}}function p_(e,t,{maxImpactPct:n=25}={}){let r=[],o=[],i=(e.routes??[]).filter(s=>{let c=t?.[s.source];return c?c.impactPct>n?(r.push({source:s.source,impactPct:Number(c.impactPct.toFixed(2)),reason:`price impact ${c.impactPct.toFixed(1)}% exceeds ${n}% ceiling -- the venue cannot absorb this size near the quoted price`}),!1):!0:(o.push(s.source),!0)}),a=[...e.warnings??[]];return r.length&&a.push(`dropped ${r.length} route(s) on price impact: `+r.map(s=>`${s.source} (${s.impactPct}%)`).join(", ")),o.length&&a.push(`price impact NOT measured for: ${o.join(", ")}. These are unproven against thin liquidity, not proven safe.`),{...e,routes:i,best:i[0]??null,impactRejected:r,impactUnmeasured:o,warnings:a}}function m_(e,{destPriceUsd:t=null,destDecimals:n=null,liquidityFirst:r=!0,liquidityBandBps:o=50,gasPriceWei:i=null,nativePriceUsd:a=null}={}){let s=e.filter(E=>E.quality!==wn.FAILED),c=e.filter(E=>E.quality===wn.FAILED),l=t!=null&&t>0&&n!=null&&n>=0,u=Number(i),d=Number(a),p=Number.isFinite(u)&&u>0&&Number.isFinite(d)&&d>0,m=s.map(E=>{let _=BigInt(E.amountOut),P=0n,N=!1,I=!1,L=BigInt(E.oracleFeeBps??0),F=L>0n?_*L/10000n:0n;if(l){let R=E.gasUsd,U=Number(E.meta?.gasUnits??E.estimatedGas);if(R==null&&p&&Number.isFinite(U)&&U>0){let Y=U*u/1e18*d;Number.isFinite(Y)&&Y>=0&&(R=Y,I=!0)}let Q=(R??0)+(E.feeUsd??0);if(Q>0){let Y=Q/t*10**n;Number.isFinite(Y)&&Y>=0&&(P=BigInt(Math.floor(Y)),N=!0)}else R===0&&(N=!0)}let O=P+F,D=_>O?_-O:0n;return{...E,grossOut:_.toString(),netOut:D.toString(),costInDest:P.toString(),oracleFeeInDest:F.toString(),costAccounted:N,gasEstimated:I}}),f=Number(o)>0?Number(o):0,h=m.reduce((E,_)=>BigInt(_.netOut)>E?BigInt(_.netOut):E,0n),g=E=>h>0n?Number((h-BigInt(E))*10000n/h):0,b=[],S=m.slice().sort((E,_)=>BigInt(_.netOut)>BigInt(E.netOut)?1:-1)[0]??null;m.sort((E,_)=>{let P=g(E.netOut)<=f?0:1,N=g(_.netOut)<=f?0:1;if(r&&f>0&&P!==N)return P-N;if(r&&f>0){let I=E.liquidityUsd??-1,L=_.liquidityUsd??-1;if(I!==L)return L-I}return BigInt(_.netOut)>BigInt(E.netOut)?1:-1}),r&&f>0&&S&&m[0]&&m[0].source!==S.source&&b.push(`liquidity-first: chose ${m[0].source} (liquidity $${m[0].liquidityUsd??"unknown"}) over best-price ${S.source} within ${f} bps`);let w=m.filter(E=>!E.costAccounted).map(E=>E.source);l?w.length&&b.push(`gas not reported by: ${w.join(", ")}. These are ranked on gross output and may be overstated relative to gas-measured routes.`):b.push("destination price/decimals unavailable: ranked on GROSS output. Gas is not included, so a cheap-looking route may cost more to execute.");let y=m[0];if(l&&y&&y.costAccounted===!1){let E=m.find(_=>_.costAccounted&&g(_.netOut)<=f);E&&b.push(`winner ${y.source} has UNMEASURED gas; gas-measured ${E.source} is within ${f} bps and may net more once ${y.source}'s real gas is paid \u2014 prefer it if unsure.`)}let k=m.filter(E=>E.gasEstimated).map(E=>E.source);k.length&&b.push(`gas ESTIMATED (from gas units x current gas price, not measured) for: ${k.join(", ")}. Net includes this estimate so the ranking is gas-inclusive, but the on-chain gas may differ.`);let v=null,x=null;if(m.length>=2&&m[0].costAccounted&&m[1].costAccounted){let E=BigInt(m[0].netOut),_=BigInt(m[1].netOut);_>0n&&(v=Number((E-_)*10000n/_),x=`${m[0].source} vs ${m[1].source}`)}return{best:m[0]??null,routes:m,failed:c,improvementBps:v,spreadBasis:x,rankedOn:l?"net-of-cost":"gross",warnings:b}}async function fh(e,{timeoutMs:t=12e3}={}){let n=(o,i)=>Promise.race([o,new Promise((a,s)=>setTimeout(()=>s(new Error(`${i}: timeout`)),t))]);return(await Promise.allSettled(e.map(o=>n(Promise.resolve().then(o.run),o.source)))).map((o,i)=>{let a=e[i].source;return o.status==="rejected"?l_({source:a,error:String(o.reason?.message||o.reason)}):l_({source:a,...o.value})})}Oi();ka();Li();Bi();ir();Dr();var hh=e=>{let t=Number(e);return Number.isFinite(t)?t:null};function f_(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let o=hh(r?.amountUSD);o!=null&&(t+=o,n=!0)}return n?t:null}async function h_(e,t={}){let n=u_[Number(e)];if(!n)return null;try{let r=await Ot([n],t);return hh(r?.coins?.[n]?.price)}catch{return null}}var RK=Object.freeze({across:["across"],relay:["relaychain","relay"],lifi:["jumper-(li.fi-powered)","lifi"],stargate:["stargate-v2","stargate-v1","stargate"],hop:["hop-protocol","hop"],debridge:["debridge"],synapse:["synapse"],connext:["connext"],cbridge:["celer-bridge","celer-cbridge","cbridge"],celer:["celer-bridge","celer-cbridge","cbridge"],squid:["squid"],symbiosis:["symbiosis"],wormhole:["wormhole"],mayan:["mayan"],allbridge:["allbridge"],thorchain:["thorchain"]});function gh({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,decimalsIn:a,decimalsOut:s,nativePriceUsd:c=null,destDecimalsPromise:l=null,opts:u={}}){let d=[];return d.push({source:"lifi",run:async()=>{let p=await On({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r},u),m=p?.estimate??p?.[0]?.estimate;return{amountOut:m?.toAmount,minOut:m?.toAmountMin,gasUsd:f_(m?.gasCosts),feeUsd:f_(m?.feeCosts),oracleFeeBps:p?.oracleFee?.applies?p.oracleFee.bps:0,meta:{tool:p?.tool??p?.toolDetails?.name,oracleFee:p?.oracleFee??null}}}}),a!=null&&d.push({source:"paraswap",run:async()=>{let p=s??(await Promise.resolve(l))?.decimals;if(p==null)throw new Error("paraswap needs destination decimals; none supplied or resolvable");let m=await gn({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:a,destDecimals:p},u),f=m?.priceRoute;return{amountOut:f?.destAmount,gasUsd:hh(f?.gasCostUSD),oracleFeeBps:m?.oracleFee?.applies?m.oracleFee.bps:0,meta:{bestRoute:f?.bestRoute?.[0]?.swaps?.[0]?.swapExchanges?.[0]?.exchange,oracleFee:m?.oracleFee??null}}}}),process.env.ZEROX_API_KEY&&d.push({source:"0x",run:async()=>{let p=await Ln({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},u),m=null,f=p?.totalNetworkFee,h=await Promise.resolve(c);return f!=null&&h&&(m=Number(f)/1e18*h),{amountOut:p?.buyAmount,minOut:p?.minBuyAmount,gasUsd:m,meta:{source:p?.route?.fills?.[0]?.source}}}}),process.env.ONEINCH_API_KEY&&d.push({source:"1inch",run:async()=>{let p=await Fi({chainId:e,src:t,dst:n,amount:r},u),m=null;return p?.gas!=null&&c&&(m=null),{amountOut:p?.dstAmount,gasUsd:m,meta:{gasUnits:p?.gas}}}}),d.push({source:"cow",run:async()=>{let p=await cn({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},u),m=p?.quote??p,f=m?.feeAmount;return{amountOut:m?.buyAmount,gasUsd:0,meta:{intent:!0,feeAmountInSellToken:f,settlement:"solver-executed"}}}}),Fe[Number(e)]&&d.push({source:"uniswap-v3",run:async()=>{let p=await Zt({chainId:e,tokenIn:t,tokenOut:n,amountIn:r},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,fee:p?.fee,gasUnits:p?.gasEstimate,quoter:p?.quoter}}}}),ut[Number(e)]&&d.push({source:"uniswap-v4",run:async()=>{let p=await Sn({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i},u);return{amountOut:p?.amountOut,minOut:p?.minOut??p?.amountOutMinimum??null,gasUsd:null,liquidityUsd:p?.liquidityUsd??null,meta:{onchain:!0,venue:"uniswap-v4",fee:p?.fee,tickSpacing:p?.tickSpacing,poolId:p?.poolId,hooks:p?.hooks,gasUnits:p?.gasEstimate,quoter:p?.quoter,poolManager:p?.poolManager,prepareReady:p?.prepareReady===!0,executionReady:!1}}}}),d}Si();_e();var lq={1:"ethereum",10:"optimism",56:"bsc",137:"polygon",8453:"base",42161:"arbitrum",43114:"avax"};async function uq(e,t,n){let r=lq[Number(e)];if(!r)return{priceUsd:null,decimals:null};let o=`${r}:${t}`;try{let a=(await Ot([o],n))?.coins?.[o],s=Number(a?.price),c=Number(a?.decimals);return{priceUsd:Number.isFinite(s)?s:null,decimals:Number.isFinite(c)?c:null}}catch{return{priceUsd:null,decimals:null}}}async function y_(e,t={}){let{chainId:n,tokenIn:r,tokenOut:o,amountIn:i}=e;if(n==null||!r||!o||i==null)throw new Error("bestSwapRoute requires chainId, tokenIn, tokenOut, amountIn");let a=h_(n,t),s=uq(n,o,t),c=iu(n,t).catch(()=>null),l=gh({...e,nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}),[u,d,p]=await Promise.all([fh(l,{timeoutMs:t.timeoutMs??12e3}),s,c]);a.catch(()=>{});let m=await a.then(g=>g,()=>null),f=m_(u,{destPriceUsd:d.priceUsd,destDecimals:e.decimalsOut??d.decimals,liquidityBandBps:t.liquidityBandBps??50,gasPriceWei:p,nativePriceUsd:m}),h=t.maxImpactPct===void 0?25:t.maxImpactPct;if(h!=null&&f.best){let g=f.best.source,S=await d_(async w=>{let y=gh({...e,amountIn:w.toString(),nativePriceUsd:a,decimalsOut:e.decimalsOut,destDecimalsPromise:s,opts:t}).filter(v=>v.source===g);return y.length?(await fh(y,{timeoutMs:t.timeoutMs??12e3}))?.[0]?.amountOut??null:null},i);if(S){let w=p_(f,{[g]:S},{maxImpactPct:h});return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...w,sourcesTried:l.length,sourcesAnswered:u.filter(y=>y.quality!==wn.FAILED).length,note:g_(w,l.length),priceImpact:{[g]:Number(S.impactPct.toFixed(2))}}}}return{kind:"swap",chainId:n,tokenIn:r,tokenOut:o,amountIn:String(i),...f,sourcesTried:l.length,sourcesAnswered:u.filter(g=>g.quality!==wn.FAILED).length,note:g_(f,l.length)}}function dq(e){let t=e?.meta?.oracleFee;return t?.applies?` \xB7 ${Zg(t)}`:""}function g_(e,t){if(!e.best)return"no source returned a usable route";let n=e.routes.length,r=dq(e.best);if(n===1)return`only 1 of ${t} sources answered, so this is the ONLY route, not a proven best one. Treat it as unbenchmarked.`+r;if(e.improvementBps!=null){let o=e.improvementBps,i=o/100;if(o<.01)return`best of ${n} routes, ranked on ${e.rankedOn}: effectively tied with the runner-up (${e.spreadBasis}), inside quote noise. Re-quote before you size up.`+r;let a=i>=.01?`${i.toFixed(2)}%`:`${o.toFixed(2)}bps`;return`best of ${n} routes, ranked on ${e.rankedOn}: ${a} better than the runner-up (${e.spreadBasis})`+r}return`best of ${n} routes, ranked on ${e.rankedOn}. No spread quoted: the top routes report cost differently, so the margin is not comparable.`+r}ne();var Yn=Object.freeze({TRANSACTION:"unsigned-transaction",TYPED_DATA_ORDER:"typed-data-order"}),pq=100,yh={"uniswap-v3":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{uniV3PrepareExactIn:a}=await Promise.resolve().then(()=>(ir(),Su)),s=await a({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.amountOut??null,minOut:s.quote?.amountOutMinimum??null}},"uniswap-v4":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u)=>{let{uniV4PrepareExactIn:d}=await Promise.resolve().then(()=>(Dr(),Ru)),p=await d({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,recipient:o,slippageBps:i,deadlineSeconds:a,fee:s,tickSpacing:c,hooks:l},u);return{artifactKind:Yn.TRANSACTION,transaction:p.transaction,requiresApproval:p.requiresApproval,amountOut:p.quote?.amountOut??null,minOut:p.quote?.amountOutMinimum??null,prepareReady:!0,executionReady:!1}},lifi:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{lifiPrepare:a}=await Promise.resolve().then(()=>(Oi(),ep)),s=await a({fromChain:e,toChain:e,fromToken:t,toToken:n,fromAmount:r,fromAddress:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.estimate?.toAmount??null,minOut:s.quote?.estimate?.toAmountMin??null}},paraswap:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o,decimalsIn:i,decimalsOut:a},s)=>{let{paraswapPrepare:c}=await Promise.resolve().then(()=>(ka(),sf)),l=await c({chainId:e,srcToken:t,destToken:n,amount:r,srcDecimals:i,destDecimals:a,userAddress:o,side:"SELL"},s);return{artifactKind:Yn.TRANSACTION,transaction:l.transaction,requiresApproval:l.requiresApproval??null,amountOut:l.quote?.priceRoute?.destAmount??null,minOut:l.quote?.amountOutMinimum??null}},"0x":async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{zeroxPrepare:a}=await Promise.resolve().then(()=>(Li(),rp)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmount:r,taker:o},i);return{artifactKind:Yn.TRANSACTION,transaction:s.transaction,requiresApproval:s.requiresApproval??null,amountOut:s.quote?.buyAmount??null,minOut:s.quote?.minBuyAmount??null}},cow:async({chainId:e,tokenIn:t,tokenOut:n,amountIn:r,taker:o},i)=>{let{cowPrepareOrder:a}=await Promise.resolve().then(()=>(Bi(),fp)),s=await a({chainId:e,sellToken:t,buyToken:n,sellAmountBeforeFee:String(r),from:o},i);return{artifactKind:Yn.TYPED_DATA_ORDER,typedData:s.typedData,requiresApproval:{token:t,spender:s.vaultRelayer,amount:String(r),note:"CoW pulls funds via the vault relayer, not the settlement contract"},settlement:s.settlement,amountOut:s.quote?.quote?.buyAmount??null,minOut:null,submission:"sign the typed data, then submit the order to the CoW API"}}};var mq=new Set(["0x0000000000000000000000000000000000000000","0x000000000000000000000000000000000000dead","0x0000000000000000000000000000000000000001","0x00000000000000000000000000000000000a1ce5"].map(e=>e.toLowerCase())),fq=/^0x[0-9a-fA-F]{40}$/,hq=Object.freeze(["operation","exactOutput","amountOut","multihop","path","positionManager","modifyLiquidities","commands","actions"]);async function w_(e,t={}){if(hq.some(g=>Object.hasOwn(e,g)))throw new Error("unsupported operation shape is inspect/quote-only");if(e.hookData!=null&&String(e.hookData).toLowerCase()!=="0x")throw new Error("opaque hookData is inspect/quote-only");let{taker:n}=e;if(!n)throw new Error("prepareBestRoute requires taker: a prepared transaction is built FOR an address, and the quote-only placeholder must never end up in one");if(!fq.test(n))throw new Error(`taker must be a valid 20-byte address, got "${n}"`);if(mq.has(n.toLowerCase()))throw new Error(`taker "${n}" is a placeholder/burn address. It is valid for quoting but not for preparing -- that would build a transaction for an address nobody controls. Pass the real wallet that will sign.`);let r=await y_(e,t);if(!r.best){let g=r.impactRejected??[];return{ok:!1,reason:g.length?g[0].reason:"no source returned a usable route",priceImpactBlocked:g.length>0,impactRejected:g,comparison:r}}let o=e.source||r.best.source,i=r.routes.find(g=>g.source===o);if(!i)return{ok:!1,reason:`source "${o}" did not return a usable route`,comparison:r};let a=yh[o];if(!a){let g=r.routes.find(b=>yh[b.source]&&b.source!==o);return{ok:!1,reason:`${o} won the comparison but has no prepare path in this build. `+(g?`Next preparable route is ${g.source}; pass source:"${g.source}" to use it.`:"No route in this comparison can be prepared."),comparison:r,winner:o}}let s;try{s=await a(e,t)}catch(g){let b=typeof g?.body=="string"?g.body:g?.body?JSON.stringify(g.body):"",S=[String(g?.message||g),b].filter(Boolean).join(" :: "),w=/allowance/i.test(S),y=!w&&/not enough|insufficient|balance/i.test(S),k,v;w?(v="approval-required-first",k=`${o} will not build swap calldata until the token approval exists on-chain. Approve the spender first, then prepare again. Underlying: ${S}`):y?(v="taker-not-funded",k=`${o} refused to build the transaction: ${S}. This venue verifies the taker holds the input token. Quoting works for any address; preparing needs the real funded wallet.`):(v="provider-error",k=`${o} prepare failed: ${S}`);let x=r.routes.find(E=>yh[E.source]&&E.source!==o);return{ok:!1,reason:k,failureKind:v,...x?{alternative:x.source}:{},comparison:r}}let c=e.driftToleranceBps??pq,l=null,u=null;if(s.amountOut!=null&&i.grossOut!=null)try{let g=BigInt(i.grossOut),b=BigInt(s.amountOut);g>0n&&(l=Number((b-g)*10000n/g),l<-c&&(u=`route moved ${(l/100).toFixed(2)}% against you between the comparison and this prepare (tolerance ${(c/100).toFixed(2)}%). The ranking may no longer hold -- re-run the comparison before signing.`))}catch{}let d=r.routes.filter(g=>g.source!==o).map(g=>({source:g.source,netOut:g.netOut,gasUsd:g.gasUsd})),m=r.routes.map(g=>({source:g.source,liquidityUsd:g.liquidityUsd??null})).reduce((g,b)=>Math.max(g,b.liquidityUsd??0),0)||null,f=i.liquidityUsd??null,h=f!=null&&m>0?Math.round(f/m*100):null;return $({ok:!0,chosen:{source:o,wasWinner:o===r.best.source,netOut:i.netOut,grossOut:i.grossOut,gasUsd:i.gasUsd,liquidityUsd:i.liquidityUsd??null},liquidity:{chosenUsd:f,maxUsd:m,sharePct:h},priceImpact:r.priceImpact??null,impactUnmeasured:r.impactUnmeasured??[],...s,unsigned:!0,signedBy:"user-wallet",destination:s.artifactKind===Yn.TRANSACTION?s.transaction?.to??null:s.settlement??null,driftBps:l,warnings:[...u?[u]:[],...r.warnings||[],...s.artifactKind===Yn.TYPED_DATA_ORDER?["This is an ORDER to sign, not a transaction to broadcast. Signing it authorizes a solver to settle on your behalf."]:[]],runnersUp:d,comparison:{rankedOn:r.rankedOn,sourcesAnswered:r.sourcesAnswered,sourcesTried:r.sourcesTried,improvementBps:r.improvementBps},note:"UNSIGNED. Verify the destination address and minOut against a fresh quote immediately before signing -- a quote-time minimum is not a minimum at broadcast time."},{provider:"router",kind:"best-route"})}ir();var wh=/^0x[0-9a-fA-F]{40}$/,gq=24,b_=!1;function k_(){b_||(pi(),b_=!0)}var ze=class extends Error{constructor(t,n){super(n),this.status=t}};function yq(e){if(k_(),e==null||e==="")throw new ze(400,"chainId is required");let t=Number(e);if(Number.isFinite(t)&&Hr(t))return t;let n=ys().find(r=>r.key===String(e).toLowerCase());if(n)return n.chainId;throw new ze(400,`unknown chain "${e}"`)}function x_(e,t){if(typeof e!="string")throw new ze(400,`${t} is required`);let n=e.trim();if(n===""||n.length>gq)throw new ze(400,`${t} is invalid`);if(!/^[A-Za-z0-9._-]+$/.test(n)&&!wh.test(n))throw new ze(400,`${t} is invalid`);return n}function wq(e,t){let n=String(e).trim();if(!/^\d+(\.\d+)?$/.test(n))throw new ze(400,"sellAmount must be a positive decimal number");if(Number(n)<=0)throw new ze(400,"sellAmount must be greater than zero");let r=Number.isFinite(Number(t))?Number(t):18,[o,i=""]=n.split(".");if(i.length>r)throw new ze(400,`sellAmount has more precision than the token's ${r} decimals`);let a=i.padEnd(r,"0"),s=(BigInt(o)*10n**BigInt(r)+BigInt(a||"0")).toString();if(s==="0")throw new ze(400,"sellAmount rounds to zero at this token's precision");return s}async function S_(e,t){if(k_(),wh.test(t)){let l=await Hr(e).resolveToken(t).catch(()=>null),u=Number(l?.decimals);return{address:t,decimals:Number.isFinite(u)?u:null}}let n=Fe[e];if(!n)return null;let r=t.toLowerCase(),o=r==="usdc"?n.usdc:r==="weth"||r==="eth"?n.weth:null;if(!o)return null;let a=await Hr(e).resolveToken(o).catch(()=>null),s=Number(a?.decimals);return{address:o,decimals:Number.isFinite(s)?s:null}}async function v_(e={},t={}){let n=yq(e.chainId??e.chain),r=x_(e.sellSymbol??e.sellToken,"sellSymbol"),o=x_(e.buySymbol??e.buyToken,"buySymbol");if(r.toLowerCase()===o.toLowerCase())throw new ze(400,"sell and buy assets must differ");let i=typeof e.taker=="string"?e.taker.trim():"";if(!wh.test(i))throw new ze(400,"taker must be the wallet address that will sign");let[a,s]=await Promise.all([S_(n,r),S_(n,o)]);if(!a)throw new ze(400,`could not resolve sell asset "${r}" on chain ${n}`);if(!s)throw new ze(400,`could not resolve buy asset "${o}" on chain ${n}`);let c=wq(e.sellAmount,a.decimals),l=await w_({chainId:n,tokenIn:a.address||r,tokenOut:s.address||o,amountIn:c,taker:i,decimalsIn:a.decimals??null,decimalsOut:s.decimals??null,source:typeof e.source=="string"&&e.source.trim()!==""?e.source.trim():void 0},t);if(!l.ok)return{ok:!1,reason:l.reason,priceImpactBlocked:!!l.priceImpactBlocked,requiresWalletSignature:!0,backendSigner:!1};let u=s.decimals??18,d=l.minOut??l.chosen?.netOut??l.chosen?.grossOut??null;return{ok:!0,requiresWalletSignature:!0,backendSigner:!1,quote:{sellSymbol:r,buySymbol:o,sellAmount:String(e.sellAmount),buyAmount:d==null?null:String(d),buyAmountFormatted:d==null?null:(Number(d)/10**u).toString(),routeLabel:l.chosen?.source??null,priceImpactPct:Number.isFinite(Number(l.chosen?.priceImpactPct))?Number(l.chosen.priceImpactPct):null,slippageBps:Number.isFinite(Number(l.slippageBps))?Number(l.slippageBps):null,intentHash:l.intentHash??null,minOut:l.minOut??null,requiresApproval:l.requiresApproval??null,warnings:Array.isArray(l.warnings)?l.warnings:[]},transaction:l.transaction??null}}import{createHash as xq,randomBytes as A_}from"node:crypto";import{readFileSync as Sq,writeFileSync as kq,mkdirSync as vq,existsSync as Eq}from"node:fs";import{dirname as __,join as I_}from"node:path";import{fileURLToPath as Aq}from"node:url";var bq=new Set(["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","build:factory","agent:shadow","agent:execute"]),$a="agent:execute";var Bo=["read:markets","read:nfts","read:positions","watch:contracts","prepare:trade","prepare:mint","prepare:build","agent:shadow"];function E_(e){let t=Array.isArray(e)&&e.length?e:Bo,n=[...new Set(t.map(o=>String(o).trim()).filter(Boolean))],r=n.filter(o=>!bq.has(o));if(r.length)throw new Error(`Invalid scope: ${r.join(", ")}`);return n}function P_(e){return xq("sha256").update(String(e),"utf8").digest("hex")}function bh(){return{version:1,keys:[]}}function Ma(){if(process.env.ORACLE_AGENT_KEYS_PATH)return process.env.ORACLE_AGENT_KEYS_PATH;if(process.env.MAD_AGENT_KEYS_PATH)return process.env.MAD_AGENT_KEYS_PATH;let e=I_(__(Aq(import.meta.url)),"..","..");return I_(e,"data","agent-keys.json")}function Cl(e){if(!Eq(e))return bh();try{let t=JSON.parse(Sq(e,"utf8"));return!t||!Array.isArray(t.keys)?bh():t}catch{return bh()}}function xh(e,t){vq(__(e),{recursive:!0}),kq(e,JSON.stringify(t,null,2),{mode:384})}function Ba(e){return{id:e.id,owner:e.owner,name:e.name,scopes:e.scopes,tier:e.tier||null,createdAt:e.createdAt,revokedAt:e.revokedAt||null,lastUsedAt:e.lastUsedAt||null}}function Sh({owner:e,name:t="Agent key",scopes:n,tier:r=null,controllerAllowlist:o=[],storePath:i=Ma()}={}){let a=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(a))throw new Error("owner must be a 0x-prefixed 20-byte address");let s=E_(n);if(s.includes($a)){let d=o.length?o:String(process.env.MAD_EXECUTOR_CONTROLLERS||"").split(",").map(m=>m.trim()).filter(Boolean);if(!new Set(d.map(m=>String(m).toLowerCase())).has(a))throw new Error("Wallet is not an executor controller")}let c=`mad_${A_(24).toString("base64url")}`,l={id:A_(8).toString("hex"),owner:a,name:String(t).slice(0,80),scopes:s,tier:r,keyHash:P_(c),createdAt:new Date().toISOString(),revokedAt:null,lastUsedAt:null},u=Cl(i);return u.keys.push(l),xh(i,u),{key:c,record:Ba(l)}}function kh(e,{storePath:t=Ma(),includeRevoked:n=!1}={}){let r=String(e||"").toLowerCase();return Cl(t).keys.filter(i=>i.owner===r).filter(i=>n||!i.revokedAt).map(Ba)}function vh({owner:e,id:t,storePath:n=Ma()}={}){let r=String(e||"").toLowerCase(),o=Cl(n),i=o.keys.find(a=>a.owner===r&&a.id===t);if(!i)throw new Error("key not found");return i.revokedAt||(i.revokedAt=new Date().toISOString(),xh(n,o)),Ba(i)}function Eh(e,{storePath:t=Ma()}={}){if(!e)throw new Error("key required");let n=P_(e),r=Cl(t),o=r.keys.find(i=>i.keyHash===n&&!i.revokedAt);if(!o)throw new Error("invalid or revoked key");return o.lastUsedAt=new Date().toISOString(),xh(t,r),{...Ba(o),identity:{type:"scoped-key",owner:o.owner,scopes:o.scopes}}}var Ah={observer:{id:"observer",label:"Observer",description:"Read markets, NFTs, positions. No prepare/execute.",scopes:["read:markets","read:nfts","read:positions"],custody:"none",canExecute:!1},preparer:{id:"preparer",label:"Preparer",description:"Prepare trades/mints; user or operator co-signs. No live execute scope.",scopes:[...Bo].filter(e=>e!=="agent:shadow"),custody:"none",canExecute:!1},shadow:{id:"shadow",label:"Shadow agent",description:"Full prepare + agent:shadow paper loops. Still no live execute.",scopes:[...Bo],custody:"none",canExecute:!1},executor:{id:"executor",label:"Executor (controller)",description:"Live agent:execute on the owner's own wallet only. Owner must be an executor controller. Key is NOT a wallet key.",scopes:[...Bo,$a],custody:"none \u2014 scoped API key only; user wallet key never stored",canExecute:!0},local_signer:{id:"local_signer",label:"Local signer",description:"User keeps keys on their device. Desk issues prepare-only key; signing happens off our infra.",scopes:["read:markets","read:positions","prepare:trade","prepare:mint"],custody:"none \u2014 signing off-box",canExecute:!1,mintKey:!0}};function Ol(){return Object.values(Ah).map(e=>({id:e.id,label:e.label,description:e.description,scopes:e.scopes,custody:e.custody,canExecute:e.canExecute}))}function T_(e){let t=Ah[e];if(!t)throw new Error(`Unknown tier: ${e}`);return t}function Ih({owner:e,tier:t="observer",name:n,controllerAllowlist:r=[],storePath:o,scopes:i}={}){if(e&&typeof e=="object"&&e.privateKey)throw new Error("Refusing privateKey \u2014 non-custodial onboarding accepts owner address only");let a=T_(t),s=i||a.scopes,c=Sh({owner:e,name:n||`${a.label} key`,scopes:s,tier:a.id,controllerAllowlist:r,storePath:o});return{tier:a.id,custody:a.custody,canExecute:a.canExecute&&s.includes($a),key:c.key,record:c.record,nextSteps:a.id==="local_signer"?["Store the API key for prepare/read calls only","Keep your wallet key on your device / hardware signer","Submit prepared payloads to your local signer \u2014 never upload the key here"]:a.canExecute?["Store the API key securely","Live execute stays disabled until the separately installed operator enables it","This key can only act on YOUR owner wallet (custody firewall)"]:["Store the API key securely","Use with getSigner({ identity: auth.identity, venue }) after authenticateAgentKey"]}}function _h(e,t){return Eh(e,t)}function Ph(e,t){return kh(e,t)}function Th(e){return vh(e)}var Hl=Ra("ORACLE_DATA_HOST","MAD_DESK_HOST","127.0.0.1"),l0=Number(Ra("ORACLE_DATA_PORT","MAD_DESK_PORT",8787)),OP=ph("ORACLE_ONBOARD_HTTP","MAD_ONBOARD_HTTP",!1),RP=ph("ORACLE_PUBLIC_API_MODE","MAD_PUBLIC_API_MODE",!1),v8=zS(import.meta.url),E8=new Set(["127.0.0.1","localhost","::1","[::1]"]),ql=64*1024,A8=new Set(["bankr.swapQuote"]),I8=new Set(["local-marketplace","local-x402","local-pack-registry"]),_8=300,P8=1e4,Ga=new Map,T8=new Map([["/strategy/draft","draft"],["/strategy/validate","validate"],["/strategy/backtest","backtest"],["/strategy/optimize","optimize"],["/strategy/evidence","evidence"],["/strategy/shadow","shadow"],["/strategy/prepare-live","prepare"]]);if(!E8.has(String(Hl).toLowerCase()))throw new Error("oracle data server only binds loopback; use 127.0.0.1 and do not expose it through a reverse proxy");function N8(e){return new Set(String(e||"").split(",").map(t=>t.trim()).filter(Boolean))}function LP(e){return N8(mh("ORACLE_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS","MAD_PUBLIC_ALLOW_SERVER_KEY_PROVIDERS")).has(e)}function $P(e){return e&&e.auth&&e.auth!=="none"}function C8(){return Nl().filter(e=>!$P(e)||LP(e.id)).map(e=>e.id)}var fe=class extends Error{constructor(t,n,r){super(r||n),this.status=t,this.code=n}};function u0(e){let t=String(e||"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new fe(400,"invalid-owner","owner must be a 0x-prefixed address");return t}function O8(e){let t={},n=String(e||"").split(/\r?\n/).map(r=>r.trim()).filter(Boolean);if(n[0]!=="Oracle onboarding")throw new fe(401,"invalid-proof","wallet proof must be an Oracle onboarding challenge");for(let r of n.slice(1)){let o=r.indexOf(":");o<=0||(t[r.slice(0,o).trim()]=r.slice(o+1).trim())}return t}function R8(e=Math.floor(Date.now()/1e3)){for(let[t,n]of Ga)n.expiresAt<=e&&Ga.delete(t)}function L8({owner:e,action:t,tier:n,id:r}={}){let o=u0(e),i=String(t||"");if(!new Set(["onboard","list","revoke"]).has(i))throw new fe(400,"invalid-action","action must be onboard, list, or revoke");let a=n==null?null:String(n);if(i==="onboard"&&!a)throw new fe(400,"tier-required","onboard challenge requires tier");let s=r==null?null:String(r).trim();if(i==="revoke"&&!s)throw new fe(400,"id-required","revoke challenge requires key id");if(s&&s.length>256)throw new fe(400,"invalid-id","key id is too long");let c=Math.floor(Date.now()/1e3);if(R8(c),Ga.size>=P8)throw new fe(429,"challenge-capacity","too many pending wallet challenges");let l=c+_8,u=S8(32).toString("hex"),d=["Oracle onboarding",`owner: ${o}`,`action: ${i}`];a!=null&&d.push(`tier: ${a}`),s!=null&&d.push(`id: ${s}`),d.push(`nonce: ${u}`,`issuedAt: ${c}`,`expiresAt: ${l}`);let p=d.join(`
|
|
194
|
+
`);return Ga.set(u,{owner:o,action:i,tier:a,id:s,issuedAt:c,expiresAt:l,message:p,used:!1}),{message:p,issuedAt:c,expiresAt:l}}function c0(e={},{owner:t,action:n,tier:r,id:o}={}){let i=u0(t),a=e.proof||e.walletProof||{},s=a.message||e.message,c=a.signature||e.signature;if(!s||!c)throw new fe(401,"wallet-proof-required","wallet signature proof required");let l;try{l=k8(String(s),String(c)).toLowerCase()}catch{throw new fe(401,"invalid-proof","wallet proof signature is invalid")}if(l!==i)throw new fe(401,"owner-signature-mismatch","wallet proof signer does not match owner");let u=O8(s);if(u0(u.owner)!==i)throw new fe(401,"owner-proof-mismatch","wallet proof owner mismatch");let d=String(u.nonce||"");if(!/^[0-9a-f]{64}$/.test(d))throw new fe(401,"challenge-required","wallet proof must use a server-issued challenge");let p=Ga.get(d);if(!p)throw new fe(401,"challenge-required","wallet challenge is unknown or expired");if(p.used)throw new fe(401,"proof-replayed","wallet challenge was already used");if(String(s)!==p.message)throw new fe(401,"challenge-mismatch","wallet proof does not match the issued challenge");if(p.used=!0,p.owner!==i)throw new fe(401,"owner-proof-mismatch","wallet proof owner mismatch");if(p.action!==n||String(u.action||"")!==n)throw new fe(401,"action-proof-mismatch","wallet proof action mismatch");if(r!=null&&(p.tier!==String(r)||String(u.tier||"")!==String(r)))throw new fe(401,"tier-proof-mismatch","wallet proof tier mismatch");if(o!=null&&(p.id!==String(o)||String(u.id||"")!==String(o)))throw new fe(401,"id-proof-mismatch","wallet proof key id mismatch");let m=Math.floor(Date.now()/1e3),f=Number(u.issuedAt||0),h=Number(u.expiresAt||0);if(f!==p.issuedAt||h!==p.expiresAt)throw new fe(401,"proof-expiry-mismatch","wallet proof timestamps do not match the issued challenge");if(f>m+60)throw new fe(401,"proof-from-future","wallet proof issuedAt is in the future");if(h<=m)throw new fe(401,"proof-expired","wallet proof expired");if(h-f>600)throw new fe(401,"proof-window-too-long","wallet proof window must be <= 10 minutes");return{owner:i,recovered:l,action:n,expiresAt:h}}function de(e,t,n){let r=JSON.stringify(n);e.writeHead(t,{"content-type":"application/json; charset=utf-8","cache-control":"no-store","x-oracle-plane":"data+onboard","x-oracle-exec":"local-signer"}),e.end(r)}function Zn(e){return new Promise((t,n)=>{let r=Number(e.headers["content-length"]||0);if(Number.isFinite(r)&&r>ql){n(new fe(413,"body-too-large",`request body exceeds ${ql} bytes`));return}let o=[],i=0,a=!1;e.on("data",s=>{if(!a){if(i+=s.length,i>ql){a=!0,o.length=0,n(new fe(413,"body-too-large",`request body exceeds ${ql} bytes`));return}o.push(s)}}),e.on("end",()=>{if(a)return;let s=Buffer.concat(o).toString("utf8");if(!s)return t({});try{t(JSON.parse(s))}catch(c){n(c)}}),e.on("error",n)})}function $8(e){let t=String(e.socket?.remoteAddress||""),n=t.replace(/^::ffff:/,"");if(!(new Set(["127.0.0.1","::1"]).has(n)||n.startsWith("127.")))return`remote address ${t||"(unknown)"} is not loopback \u2014 this server only answers local callers`;let i=String(e.headers.host||"").toLowerCase(),a=i.replace(/:\d+$/,"").replace(/^\[|\]$/g,"");if(!new Set(["127.0.0.1","localhost","::1"]).has(a))return`unexpected Host header ${i||"(none)"} \u2014 this server only answers to loopback names`;let c=e.headers.origin;if(c==="null")return"opaque Origin null refused";if(c)try{let l=new URL(c),u=new URL(`http://${i}`).origin;if(l.origin!==u)return`cross-origin request from ${c} refused`}catch{return`malformed Origin ${c} refused`}return null}var B8=x8(async(e,t)=>{try{let n=$8(e);if(n)return de(t,403,{error:n});let r=new URL(e.url||"/",`http://${Hl}:${l0}`),o=r.pathname;if(e.method==="GET"&&o==="/health")return de(t,200,{ok:!0,service:"oracle",plane:"data+onboard",exec:"local-signer",version:v8.version,onboardHttp:OP});if(e.method==="GET"&&o==="/data/catalog")return de(t,200,{catalog:Nl()});if(e.method==="GET"&&o==="/data/health"){let a=await lh({timeoutMs:1e4,providers:RP?C8():void 0});return de(t,200,a)}let i=T8.get(o);if(i){let a;if(e.method==="GET"&&i==="shadow")a={action:"list"};else if(e.method==="POST")a=await Zn(e);else return de(t,405,{error:"method not allowed"});try{let{runStrategyOperation:s}=await Promise.resolve().then(()=>(CP(),NP)),c=await s(i,{...a,nowMs:a.nowMs??Date.now()});return de(t,200,c)}catch(s){return de(t,400,{error:s?.message||"strategy request rejected"})}}if(o==="/data/call"){if(e.method!=="POST")return de(t,405,{error:"data calls require POST"});if(String(e.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return de(t,415,{error:"data calls require application/json"});let s=await Zn(e),c=s.provider,l=s.op,u=s.args||{};if(!c||!l)return de(t,400,{error:"provider and op required"});if(I8.has(c))return de(t,403,{error:`${c} local state is not reachable through generic data calls`});if(ch(c))return de(t,403,{error:`${c} is an execution provider and is not served by the data plane; run the execution binary instead`});if(!A8.has(`${c}.${l}`)&&/sign|execute|broadcast|approve|submit|place|send|write|trade|order|swap/i.test(l))return de(t,403,{error:"sign/exec ops forbidden on data server"});let d=fi(c);if(RP&&$P(d)&&!LP(c))return de(t,403,{error:`public mode blocks ${c}.${l}: server API key providers are disabled unless explicitly allowlisted`});let p=await T(c,l,u,{timeoutMs:15e3});return de(t,200,{provider:c,op:l,result:p})}if(e.method==="POST"&&o==="/swap/prepare"){let a=await Zn(e);if(a.privateKey||a.secretKey||a.mnemonic)return de(t,400,{error:"do not send key material \u2014 taker address only"});try{let s=await v_(a);return de(t,200,s)}catch(s){if(s instanceof ze)return de(t,s.status,{error:s.message});throw s}}if(o.startsWith("/onboard")){if(!OP)return de(t,403,{error:"onboard HTTP disabled"});if(e.method==="GET"&&o==="/onboard/tiers")return de(t,200,{tiers:Ol()});if(e.method==="POST"&&o==="/onboard/challenge"){let a=await Zn(e);return de(t,200,L8(a))}if(e.method==="POST"&&o==="/onboard"){let a=await Zn(e);if(a.privateKey||a.secretKey)return de(t,400,{error:"do not send wallet private keys \u2014 owner address only"});let s=a.tier||"observer";c0(a,{owner:a.owner,action:"onboard",tier:s});let c=mh("ORACLE_EXECUTOR_CONTROLLERS","MAD_EXECUTOR_CONTROLLERS").split(",").map(u=>u.trim()).filter(Boolean),l=Ih({owner:a.owner,tier:s,name:a.name,controllerAllowlist:c});return de(t,201,l)}if(e.method==="POST"&&o==="/onboard/auth"){let a=await Zn(e),s=a.key||a.apiKey;if(!s)throw new fe(400,"key-required","key required");let c;try{c=_h(s)}catch{throw new fe(401,"invalid-key","invalid or revoked key")}return de(t,200,c)}if(e.method==="GET"&&o==="/onboard/keys")return r.searchParams.get("owner")?de(t,405,{error:"method not allowed",message:"use POST /onboard/keys with wallet proof"}):de(t,400,{error:"owner query required"});if(e.method==="POST"&&o==="/onboard/keys"){let a=await Zn(e);return c0(a,{owner:a.owner,action:"list"}),de(t,200,{keys:Ph(a.owner)})}if(e.method==="POST"&&o==="/onboard/revoke"){let a=await Zn(e);c0(a,{owner:a.owner,action:"revoke",id:a.id});let s=Th({owner:a.owner,id:a.id});return de(t,200,{revoked:s})}}return de(t,404,{error:"not found",routes:["/health","/data/catalog","/data/health","/data/call","POST /swap/prepare","/onboard/tiers","POST /onboard/challenge","POST /onboard","POST /onboard/auth","POST /onboard/keys","POST /onboard/revoke"]})}catch(n){if(n instanceof fe)return de(t,n.status,{error:n.code,message:n.message});console.error("desk-server internal error:",n&&n.stack?n.stack:n);let r=Number(n?.status);return Number.isInteger(r)&&r>=400&&r<600?de(t,502,{error:"upstream-error",upstreamStatus:r}):de(t,500,{error:"internal-error"})}});B8.listen(l0,Hl,()=>{console.log(JSON.stringify({listening:`http://${Hl}:${l0}`,plane:"data+onboard",exec:"local-signer",catalog:s_.catalog().map(e=>e.id),tiers:Ol().map(e=>e.id)}))});
|